How to use this document. Run the code along with
me. Comments start with #. Each section mirrors the live
lab; code chunks show the command and its output together.
Today’s plan
- Clean environment + setup
- Import & understand College data
- Prepare variables (coercion)
- CI + one-sample t-test for
UGradPerThou (\(\mu = 55\))
- CI + one-sample t-test for
Undergrads
- Quick practice
- Wrap-up
Clean Environment +
Setup
rm(list = ls()) # clean environment
# Load the packages
library(dplyr)
library(ggplot2)
library(stats)
In the live session we set the working directory with
setwd(...). In this document the data file
Collegedata.csv sits next to the .Rmd, so no
setwd() is needed.
Import & Understand
College Data
college <- read.csv("Collegedata.csv")
# In RStudio you would run View(college); here we preview the first rows.
knitr::kable(head(college), caption = "First rows of the College data")
First rows of the College data
| New Jersey |
326358 |
8640218 |
37.77196 |
| Nevada |
100760 |
2484196 |
40.56041 |
| Alaska |
27463 |
676301 |
40.60766 |
| Georgia |
378947 |
9318715 |
40.66516 |
| Connecticut |
142926 |
3487896 |
40.97771 |
| Tennessee |
250974 |
6068306 |
41.35816 |
Prepare Variables
(Coercion)
Variable types in R
- Numeric (
num): numbers with
decimals
- Integer (
int): whole numbers (add
L to force integer)
- Character (
chr): text / string
values
- Factor: categorical variables (stored as integers
with labels)
name <- "Subin"
class(name) # "character"
#> [1] "character"
gender <- factor(c("Male", "Female", "Male"))
class(gender) # "factor"
#> [1] "factor"
levels(gender) # "Female" "Male"
#> [1] "Female" "Male"
# Make sure numeric (coercion turns non-numeric values into NA)
college$UGradPerThou <- as.numeric(college$UGradPerThou)
college$Undergrads <- as.numeric(college$Undergrads)
# Quick check
summary(college$UGradPerThou)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 37.77 45.73 49.43 51.45 54.46 77.13
summary(college$Undergrads)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 27463 90659 203641 302136 333223 2172354
CI & t-test for
UGradPerThou (\(\mu =
55\))
Step 1 — Point estimate (sample mean).
mean(college$UGradPerThou, na.rm = TRUE)
#> [1] 51.45116
Step 2 — One-sample t-test (test whether
the mean equals 55).
t.test(college$UGradPerThou, mu = 55)
#>
#> One Sample t-test
#>
#> data: college$UGradPerThou
#> t = -2.856, df = 49, p-value = 0.006276
#> alternative hypothesis: true mean is not equal to 55
#> 95 percent confidence interval:
#> 48.95411 53.94821
#> sample estimates:
#> mean of x
#> 51.45116
Step 3 — Extract the 95% CI bounds (for
plotting).
ci_ugpt <- t.test(college$UGradPerThou, conf.level = 0.95)$conf.int
ci_ugpt # lower and upper bounds
#> [1] 48.95411 53.94821
#> attr(,"conf.level")
#> [1] 0.95
Step 4 — Visualize the distribution with CI
lines.
ggplot(college, aes(x = UGradPerThou)) +
geom_histogram(binwidth = 5, fill = "gray", color = "black") +
geom_vline(xintercept = ci_ugpt, linetype = "dashed", color = "red") +
labs(
title = "Undergrads Per Thousand (95% CI)",
x = "Undergrads Per Thousand",
y = "Count"
)

CI & t-test for
Undergrads
Step 1 — Point estimate.
mean(college$Undergrads, na.rm = TRUE)
#> [1] 302135.9
Step 2 — One-sample t-test (\(H_0\): true mean \(= 300{,}000\)).
t.test(college$Undergrads, mu = 300000)
#>
#> One Sample t-test
#>
#> data: college$Undergrads
#> t = 0.042133, df = 49, p-value = 0.9666
#> alternative hypothesis: true mean is not equal to 3e+05
#> 95 percent confidence interval:
#> 200262.8 404008.9
#> sample estimates:
#> mean of x
#> 302135.9
Step 3 — Extract 95% CI bounds.
ci_ug <- t.test(college$Undergrads, conf.level = 0.95)$conf.int
ci_ug
#> [1] 200262.8 404008.9
#> attr(,"conf.level")
#> [1] 0.95
Step 4 — Visualize.
ggplot(college, aes(x = Undergrads)) +
geom_histogram(binwidth = 100000, fill = "lightblue", color = "black") +
geom_vline(xintercept = ci_ug, linetype = "dashed", color = "red") +
labs(
title = "Undergrads (95% Confidence Interval)",
x = "Undergrads",
y = "Count"
)

Quick Practice
P1) Change the confidence level to 90% and 99% for
UGradPerThou. Compare how the interval widths
change. Which one is the widest? Why?
ci_90 <- t.test(college$UGradPerThou, conf.level = 0.90)$conf.int
ci_99 <- t.test(college$UGradPerThou, conf.level = 0.99)$conf.int
ci_90
#> [1] 49.36792 53.53440
#> attr(,"conf.level")
#> [1] 0.9
#> [1] 48.12111 54.78120
#> attr(,"conf.level")
#> [1] 0.99
P2) Run a 95% CI for Population and plot the
histogram with dashed red lines for the lower and upper CI
bounds.
ci_pop <- t.test(college$Population, conf.level = 0.95)$conf.int
ggplot(college, aes(x = Population)) +
geom_histogram(binwidth = 1500000, fill = "lightblue", color = "black") +
geom_vline(xintercept = ci_pop, linetype = "dashed", color = "red") +
labs(
title = "Population (95% CI)",
x = "Population",
y = "Count"
)

P3) Compare one-sample t-tests for
UGradPerThou using different null values (50
vs. 60). Report the test statistic, p-value, and conclusion for
each. Which null hypothesis is more likely to be rejected?
t.test(college$UGradPerThou, mu = 60)
#>
#> One Sample t-test
#>
#> data: college$UGradPerThou
#> t = -6.8799, df = 49, p-value = 1.018e-08
#> alternative hypothesis: true mean is not equal to 60
#> 95 percent confidence interval:
#> 48.95411 53.94821
#> sample estimates:
#> mean of x
#> 51.45116
t.test(college$UGradPerThou, mu = 50)
#>
#> One Sample t-test
#>
#> data: college$UGradPerThou
#> t = 1.1679, df = 49, p-value = 0.2485
#> alternative hypothesis: true mean is not equal to 50
#> 95 percent confidence interval:
#> 48.95411 53.94821
#> sample estimates:
#> mean of x
#> 51.45116
Wrap-up
Key takeaways
- Use
t.test(x, conf.level = ...) for a CI;
t.test(x, mu = ...) for a one-sample test.
- Extract the CI with
$conf.int, then draw vertical lines
on histograms.
- Always check coercion to numeric and NA counts
before inference.
- Wider CIs correspond to higher confidence levels.
- Smaller p-values give stronger evidence against \(H_0\).
- Store intermediate results before using them in plots.
LS0tCnRpdGxlOiAiTGFiIDcg4oCUIENvbmZpZGVuY2UgSW50ZXJ2YWxzICYgT25lLVNhbXBsZSB0LXRlc3QiCnN1YnRpdGxlOiAiUXVhbnRpdGF0aXZlIFJlYXNvbmluZyDCtyBMQUIgNDEzIgphdXRob3I6ICJJbnN0cnVjdG9yOiBTdWJpbiBOYSIKZGF0ZTogIk9jdG9iZXIgMjIsIDIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwKICBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDQuMiwKICBjb21tZW50ID0gIiM+IgopCmBgYAoKPiAqKkhvdyB0byB1c2UgdGhpcyBkb2N1bWVudC4qKiBSdW4gdGhlIGNvZGUgYWxvbmcgd2l0aCBtZS4gQ29tbWVudHMgc3RhcnQgd2l0aCBgI2AuCj4gRWFjaCBzZWN0aW9uIG1pcnJvcnMgdGhlIGxpdmUgbGFiOyBjb2RlIGNodW5rcyBzaG93IHRoZSBjb21tYW5kIGFuZCBpdHMgb3V0cHV0IHRvZ2V0aGVyLgoKKipUb2RheSdzIHBsYW4qKgoKMS4gQ2xlYW4gZW52aXJvbm1lbnQgKyBzZXR1cAoyLiBJbXBvcnQgJiB1bmRlcnN0YW5kIENvbGxlZ2UgZGF0YQozLiBQcmVwYXJlIHZhcmlhYmxlcyAoY29lcmNpb24pCjQuIENJICsgb25lLXNhbXBsZSAqdCotdGVzdCBmb3IgYFVHcmFkUGVyVGhvdWAgKCRcbXUgPSA1NSQpCjUuIENJICsgb25lLXNhbXBsZSAqdCotdGVzdCBmb3IgYFVuZGVyZ3JhZHNgCjYuIFF1aWNrIHByYWN0aWNlCjcuIFdyYXAtdXAKCi0tLQoKIyBDbGVhbiBFbnZpcm9ubWVudCArIFNldHVwCgpgYGB7ciBjbGVhbi1zZXR1cH0Kcm0obGlzdCA9IGxzKCkpICAgIyBjbGVhbiBlbnZpcm9ubWVudAoKIyBMb2FkIHRoZSBwYWNrYWdlcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3RhdHMpCmBgYAoKPiBJbiB0aGUgbGl2ZSBzZXNzaW9uIHdlIHNldCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2l0aCBgc2V0d2QoLi4uKWAuIEluIHRoaXMKPiBkb2N1bWVudCB0aGUgZGF0YSBmaWxlIGBDb2xsZWdlZGF0YS5jc3ZgIHNpdHMgbmV4dCB0byB0aGUgYC5SbWRgLCBzbyBubwo+IGBzZXR3ZCgpYCBpcyBuZWVkZWQuCgojIEltcG9ydCAmIFVuZGVyc3RhbmQgQ29sbGVnZSBEYXRhCgpgYGB7ciBpbXBvcnR9CmNvbGxlZ2UgPC0gcmVhZC5jc3YoIkNvbGxlZ2VkYXRhLmNzdiIpCgojIEluIFJTdHVkaW8geW91IHdvdWxkIHJ1biBWaWV3KGNvbGxlZ2UpOyBoZXJlIHdlIHByZXZpZXcgdGhlIGZpcnN0IHJvd3MuCmtuaXRyOjprYWJsZShoZWFkKGNvbGxlZ2UpLCBjYXB0aW9uID0gIkZpcnN0IHJvd3Mgb2YgdGhlIENvbGxlZ2UgZGF0YSIpCmBgYAoKIyBQcmVwYXJlIFZhcmlhYmxlcyAoQ29lcmNpb24pCgoqKlZhcmlhYmxlIHR5cGVzIGluIFIqKgoKMS4gKipOdW1lcmljKiogKGBudW1gKTogbnVtYmVycyB3aXRoIGRlY2ltYWxzCjIuICoqSW50ZWdlcioqIChgaW50YCk6IHdob2xlIG51bWJlcnMgKGFkZCBgTGAgdG8gZm9yY2UgaW50ZWdlcikKMy4gKipDaGFyYWN0ZXIqKiAoYGNocmApOiB0ZXh0IC8gc3RyaW5nIHZhbHVlcwo0LiAqKkZhY3RvcioqOiBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgKHN0b3JlZCBhcyBpbnRlZ2VycyB3aXRoIGxhYmVscykKCmBgYHtyIHR5cGVzfQpuYW1lIDwtICJTdWJpbiIKY2xhc3MobmFtZSkgICAgICMgImNoYXJhY3RlciIKCmdlbmRlciA8LSBmYWN0b3IoYygiTWFsZSIsICJGZW1hbGUiLCAiTWFsZSIpKQpjbGFzcyhnZW5kZXIpICAgIyAiZmFjdG9yIgpsZXZlbHMoZ2VuZGVyKSAgIyAiRmVtYWxlIiAiTWFsZSIKYGBgCgpgYGB7ciBjb2VyY2V9CiMgTWFrZSBzdXJlIG51bWVyaWMgKGNvZXJjaW9uIHR1cm5zIG5vbi1udW1lcmljIHZhbHVlcyBpbnRvIE5BKQpjb2xsZWdlJFVHcmFkUGVyVGhvdSA8LSBhcy5udW1lcmljKGNvbGxlZ2UkVUdyYWRQZXJUaG91KQpjb2xsZWdlJFVuZGVyZ3JhZHMgICA8LSBhcy5udW1lcmljKGNvbGxlZ2UkVW5kZXJncmFkcykKCiMgUXVpY2sgY2hlY2sKc3VtbWFyeShjb2xsZWdlJFVHcmFkUGVyVGhvdSkKc3VtbWFyeShjb2xsZWdlJFVuZGVyZ3JhZHMpCmBgYAoKIyBDSSAmIHQtdGVzdCBmb3IgYFVHcmFkUGVyVGhvdWAgKCRcbXUgPSA1NSQpCgoqKlN0ZXAgMSDigJQgUG9pbnQgZXN0aW1hdGUgKHNhbXBsZSBtZWFuKS4qKgoKYGBge3IgdWdwdC1tZWFufQptZWFuKGNvbGxlZ2UkVUdyYWRQZXJUaG91LCBuYS5ybSA9IFRSVUUpCmBgYAoKKipTdGVwIDIg4oCUIE9uZS1zYW1wbGUgKnQqLXRlc3QqKiAodGVzdCB3aGV0aGVyIHRoZSBtZWFuIGVxdWFscyA1NSkuCgpgYGB7ciB1Z3B0LXR0ZXN0fQp0LnRlc3QoY29sbGVnZSRVR3JhZFBlclRob3UsIG11ID0gNTUpCmBgYAoKKipTdGVwIDMg4oCUIEV4dHJhY3QgdGhlIDk1JSBDSSBib3VuZHMqKiAoZm9yIHBsb3R0aW5nKS4KCmBgYHtyIHVncHQtY2l9CmNpX3VncHQgPC0gdC50ZXN0KGNvbGxlZ2UkVUdyYWRQZXJUaG91LCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQKY2lfdWdwdCAgICMgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcwpgYGAKCioqU3RlcCA0IOKAlCBWaXN1YWxpemUgdGhlIGRpc3RyaWJ1dGlvbiB3aXRoIENJIGxpbmVzLioqCgpgYGB7ciB1Z3B0LXBsb3R9CmdncGxvdChjb2xsZWdlLCBhZXMoeCA9IFVHcmFkUGVyVGhvdSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUsIGZpbGwgPSAiZ3JheSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpX3VncHQsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVW5kZXJncmFkcyBQZXIgVGhvdXNhbmQgKDk1JSBDSSkiLAogICAgeCA9ICJVbmRlcmdyYWRzIFBlciBUaG91c2FuZCIsCiAgICB5ID0gIkNvdW50IgogICkKYGBgCgojIENJICYgdC10ZXN0IGZvciBgVW5kZXJncmFkc2AKCioqU3RlcCAxIOKAlCBQb2ludCBlc3RpbWF0ZS4qKgoKYGBge3IgdWctbWVhbn0KbWVhbihjb2xsZWdlJFVuZGVyZ3JhZHMsIG5hLnJtID0gVFJVRSkKYGBgCgoqKlN0ZXAgMiDigJQgT25lLXNhbXBsZSAqdCotdGVzdCoqICgkSF8wJDogdHJ1ZSBtZWFuICQ9IDMwMHssfTAwMCQpLgoKYGBge3IgdWctdHRlc3R9CnQudGVzdChjb2xsZWdlJFVuZGVyZ3JhZHMsIG11ID0gMzAwMDAwKQpgYGAKCioqU3RlcCAzIOKAlCBFeHRyYWN0IDk1JSBDSSBib3VuZHMuKioKCmBgYHtyIHVnLWNpfQpjaV91ZyA8LSB0LnRlc3QoY29sbGVnZSRVbmRlcmdyYWRzLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQKY2lfdWcKYGBgCgoqKlN0ZXAgNCDigJQgVmlzdWFsaXplLioqCgpgYGB7ciB1Zy1wbG90fQpnZ3Bsb3QoY29sbGVnZSwgYWVzKHggPSBVbmRlcmdyYWRzKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTAwMDAwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpX3VnLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlVuZGVyZ3JhZHMgKDk1JSBDb25maWRlbmNlIEludGVydmFsKSIsCiAgICB4ID0gIlVuZGVyZ3JhZHMiLAogICAgeSA9ICJDb3VudCIKICApCmBgYAoKIyBRdWljayBQcmFjdGljZQoKKipQMSkgQ2hhbmdlIHRoZSBjb25maWRlbmNlIGxldmVsIHRvIDkwJSBhbmQgOTklIGZvciBgVUdyYWRQZXJUaG91YC4qKgpDb21wYXJlIGhvdyB0aGUgaW50ZXJ2YWwgd2lkdGhzIGNoYW5nZS4gV2hpY2ggb25lIGlzIHRoZSB3aWRlc3Q/IFdoeT8KCmBgYHtyIHAxfQpjaV85MCA8LSB0LnRlc3QoY29sbGVnZSRVR3JhZFBlclRob3UsIGNvbmYubGV2ZWwgPSAwLjkwKSRjb25mLmludApjaV85OSA8LSB0LnRlc3QoY29sbGVnZSRVR3JhZFBlclRob3UsIGNvbmYubGV2ZWwgPSAwLjk5KSRjb25mLmludApjaV85MApjaV85OQpgYGAKCioqUDIpIFJ1biBhIDk1JSBDSSBmb3IgYFBvcHVsYXRpb25gIGFuZCBwbG90IHRoZSBoaXN0b2dyYW0qKiB3aXRoIGRhc2hlZCByZWQgbGluZXMKZm9yIHRoZSBsb3dlciBhbmQgdXBwZXIgQ0kgYm91bmRzLgoKYGBge3IgcDJ9CmNpX3BvcCA8LSB0LnRlc3QoY29sbGVnZSRQb3B1bGF0aW9uLCBjb25mLmxldmVsID0gMC45NSkkY29uZi5pbnQKCmdncGxvdChjb2xsZWdlLCBhZXMoeCA9IFBvcHVsYXRpb24pKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTAwMDAwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpX3BvcCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQb3B1bGF0aW9uICg5NSUgQ0kpIiwKICAgIHggPSAiUG9wdWxhdGlvbiIsCiAgICB5ID0gIkNvdW50IgogICkKYGBgCgoqKlAzKSBDb21wYXJlIG9uZS1zYW1wbGUgKnQqLXRlc3RzIGZvciBgVUdyYWRQZXJUaG91YCB1c2luZyBkaWZmZXJlbnQgbnVsbCB2YWx1ZXMqKgooNTAgdnMuIDYwKS4gUmVwb3J0IHRoZSB0ZXN0IHN0YXRpc3RpYywgKnAqLXZhbHVlLCBhbmQgY29uY2x1c2lvbiBmb3IgZWFjaC4KV2hpY2ggbnVsbCBoeXBvdGhlc2lzIGlzIG1vcmUgbGlrZWx5IHRvIGJlIHJlamVjdGVkPwoKYGBge3IgcDN9CnQudGVzdChjb2xsZWdlJFVHcmFkUGVyVGhvdSwgbXUgPSA2MCkKdC50ZXN0KGNvbGxlZ2UkVUdyYWRQZXJUaG91LCBtdSA9IDUwKQpgYGAKCiMgV3JhcC11cAoKKipLZXkgdGFrZWF3YXlzKioKCi0gVXNlIGB0LnRlc3QoeCwgY29uZi5sZXZlbCA9IC4uLilgIGZvciBhIENJOyBgdC50ZXN0KHgsIG11ID0gLi4uKWAgZm9yIGEgb25lLXNhbXBsZSB0ZXN0LgotIEV4dHJhY3QgdGhlIENJIHdpdGggYCRjb25mLmludGAsIHRoZW4gZHJhdyB2ZXJ0aWNhbCBsaW5lcyBvbiBoaXN0b2dyYW1zLgotIEFsd2F5cyBjaGVjayBjb2VyY2lvbiB0byBudW1lcmljIGFuZCBOQSBjb3VudHMgKipiZWZvcmUqKiBpbmZlcmVuY2UuCi0gV2lkZXIgQ0lzIGNvcnJlc3BvbmQgdG8gaGlnaGVyIGNvbmZpZGVuY2UgbGV2ZWxzLgotIFNtYWxsZXIgKnAqLXZhbHVlcyBnaXZlIHN0cm9uZ2VyIGV2aWRlbmNlIGFnYWluc3QgJEhfMCQuCi0gU3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgYmVmb3JlIHVzaW5nIHRoZW0gaW4gcGxvdHMuCg==