This is an R Markdown
Notebook for hypothesis testing the means and variances of two
populations.
We begin by loading the necessary libraries.
# Load necessary libraries
library(stats) # Statistical functions
library(ggplot2) # Plots
library(ggpubr) # Publication quality plots
library(car) # Statistical tests
library(dplyr) # Data manipulation
library(boot) # Bootstrap confidence intervals
library(qqplotr) # Normal probability plots
Load Data
Next we read the .csv file and randomly select a sample from both the
male and female populations.
# Read the CSV file
data <- read.csv("heights-by-gender.csv")
# Set Gender as a categorical factor
data$Sex <- as.factor(data$Sex)
# Set sample size
sample_size <- 1000
# Randomly select 30 males and 30 females
set.seed(321) # Setting a seed for reproducibility
male_heights <- data %>%
filter(Sex == 'Male') %>%
sample_n(sample_size)
set.seed(654) # Setting a different seed for the female sample
female_heights <- data %>%
filter(Sex == 'Female') %>%
sample_n(sample_size)
Normal Probability Plots
Normal probability plots are useful to visually assess if the data is
approximately normally distributed. In a perfectly normal distribution,
the data points would form a straight line. Significant deviations from
this line suggest departures from normality.
# Create and display the QQ plots
ggplot(data = rbind(male_heights,female_heights), aes(sample = Height)) +
stat_qq_band(alpha=0.2, conf=0.95, qtype=1, bandType = "boot") +
stat_qq_line(identity=TRUE,alpha=0.6) +
stat_qq_point(col="blue", size=0.5) +
facet_wrap(~Sex) +
ggtitle(paste("Normal Probability Plot for Sample")) +
labs(x = "Theoretical Values", y = "Sample Values") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
![](data:image/png;base64,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)
Sample Means and Sample Variances
Now we calculate the sample means and sample variances.
# Calculate Means and Variances
male_mean <- mean(male_heights$Height)
male_variance <- var(male_heights$Height)
female_mean <- mean(female_heights$Height)
female_variance <- var(female_heights$Height)
# Display the calculated values
cat(" Male Mean:\t\t\t\t\t", male_mean, "\n",
"Male Variance:\t\t\t\t", male_variance, "\n",
"Male Standard Deviation:\t", sqrt(male_variance), "\n\n",
"Female Mean:\t\t\t\t", female_mean, "\n",
"Female Variance:\t\t\t", female_variance, "\n",
"Female Standard Deviation:\t", sqrt(female_variance), "\n")
Male Mean: 171.1412
Male Variance: 102.7636
Male Standard Deviation: 10.13724
Female Mean: 149.8925
Female Variance: 122.6704
Female Standard Deviation: 11.07567
Equality Test of Population Variances
Now we apply a robust test for approximately normal data to test the
null hypothesis that the male and female populations have the same
variance.
# Levene test is robust for approximately normal data
levene_test_result <- leveneTest(Height ~ Sex,
data = rbind(male_heights, female_heights))
# F_test_result <- var.test(Height ~ Sex,
# data = rbind(male_heights, female_heights),
# alternative="two.sided")
print(levene_test_result)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 1 6.1769 0.01302 *
1998
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Equality Test of Population Means
Finally we apply a Welch’s t-test for equality of means, assuming
unequal variance.
# Perform Welch's t-test for Equality of Means (for unequal variances)
t_test_result <- t.test(Height ~ Sex,
data = rbind(male_heights, female_heights),
var.equal = FALSE)
print(t_test_result)
Welch Two Sample t-test
data: Height by Sex
t = -44.753, df = 1982.5, p-value < 2.2e-16
alternative hypothesis: true difference in means between group Female and group Male is not equal to 0
95 percent confidence interval:
-22.17989 -20.31757
sample estimates:
mean in group Female mean in group Male
149.8925 171.1412
LS0tDQp0aXRsZTogIlN0YXRpc3RpY2FsIEFuYWx5c2lzIG9mIEhlaWdodCBEaWZmZXJlbmNlcyBieSBHZW5kZXIiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2sgZm9yIGh5cG90aGVzaXMgdGVzdGluZyB0aGUgbWVhbnMgYW5kIHZhcmlhbmNlcyBvZiB0d28gcG9wdWxhdGlvbnMuDQoNCldlIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMuDQoNCmBgYHtyIGVjaG89VFJVRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoc3RhdHMpICAgICMgU3RhdGlzdGljYWwgZnVuY3Rpb25zDQpsaWJyYXJ5KGdncGxvdDIpICAjIFBsb3RzDQpsaWJyYXJ5KGdncHVicikgICAjIFB1YmxpY2F0aW9uIHF1YWxpdHkgcGxvdHMNCmxpYnJhcnkoY2FyKSAgICAgICMgU3RhdGlzdGljYWwgdGVzdHMNCmxpYnJhcnkoZHBseXIpICAgICMgRGF0YSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoYm9vdCkgICAgICMgQm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQpsaWJyYXJ5KHFxcGxvdHIpICAjIE5vcm1hbCBwcm9iYWJpbGl0eSBwbG90cw0KYGBgDQoNCmBgYHtyIHdyYXAtaG9vaywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQojIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRleHQgd3JhcHBpbmcgd2hlbiBrbml0dGluZyB0byBQREYNCmhvb2tfb3V0cHV0ID0ga25pdF9ob29rcyRnZXQoJ291dHB1dCcpDQprbml0X2hvb2tzJHNldChvdXRwdXQgPSBmdW5jdGlvbih4LCBvcHRpb25zKSB7DQogICMgdGhpcyBob29rIGlzIHVzZWQgb25seSB3aGVuIHRoZSBsaW5ld2lkdGggb3B0aW9uIGlzIG5vdCBOVUxMDQogIGlmICghaXMubnVsbChuIDwtIG9wdGlvbnMkbGluZXdpZHRoKSkgew0KICAgIHggPSB4ZnVuOjpzcGxpdF9saW5lcyh4KQ0KICAgICMgYW55IGxpbmVzIHdpZGVyIHRoYW4gbiBzaG91bGQgYmUgd3JhcHBlZA0KICAgIGlmIChhbnkobmNoYXIoeCkgPiBuKSkgeCA9IHN0cndyYXAoeCwgd2lkdGggPSBuKQ0KICAgIHggPSBwYXN0ZSh4LCBjb2xsYXBzZSA9ICdcbicpDQogIH0NCiAgaG9va19vdXRwdXQoeCwgb3B0aW9ucykNCn0pDQpgYGANCg0KIyMgTG9hZCBEYXRhDQoNCk5leHQgd2UgcmVhZCB0aGUgLmNzdiBmaWxlIGFuZCByYW5kb21seSBzZWxlY3QgYSBzYW1wbGUgZnJvbSBib3RoIHRoZSBtYWxlIGFuZCBmZW1hbGUgcG9wdWxhdGlvbnMuDQoNCmBgYHtyfQ0KIyBSZWFkIHRoZSBDU1YgZmlsZQ0KZGF0YSA8LSByZWFkLmNzdigiaGVpZ2h0cy1ieS1nZW5kZXIuY3N2IikNCg0KIyBTZXQgR2VuZGVyIGFzIGEgY2F0ZWdvcmljYWwgZmFjdG9yDQpkYXRhJFNleCA8LSBhcy5mYWN0b3IoZGF0YSRTZXgpDQoNCiMgU2V0IHNhbXBsZSBzaXplDQpzYW1wbGVfc2l6ZSA8LSAxMDAwDQoNCiMgUmFuZG9tbHkgc2VsZWN0IDMwIG1hbGVzIGFuZCAzMCBmZW1hbGVzDQpzZXQuc2VlZCgzMjEpICAjIFNldHRpbmcgYSBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkNCm1hbGVfaGVpZ2h0cyA8LSBkYXRhICU+JSANCiAgICAgICAgICAgICAgIGZpbHRlcihTZXggPT0gJ01hbGUnKSAlPiUgDQogICAgICAgICAgICAgICBzYW1wbGVfbihzYW1wbGVfc2l6ZSkNCg0Kc2V0LnNlZWQoNjU0KSAgIyBTZXR0aW5nIGEgZGlmZmVyZW50IHNlZWQgZm9yIHRoZSBmZW1hbGUgc2FtcGxlDQpmZW1hbGVfaGVpZ2h0cyA8LSBkYXRhICU+JSANCiAgICAgICAgICAgICAgICAgZmlsdGVyKFNleCA9PSAnRmVtYWxlJykgJT4lIA0KICAgICAgICAgICAgICAgICBzYW1wbGVfbihzYW1wbGVfc2l6ZSkNCg0KYGBgDQoNCiMjIE5vcm1hbCBQcm9iYWJpbGl0eSBQbG90cw0KDQpOb3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgYXJlIHVzZWZ1bCB0byB2aXN1YWxseSBhc3Nlc3MgaWYgdGhlIGRhdGEgaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4gSW4gYSBwZXJmZWN0bHkgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgdGhlIGRhdGEgcG9pbnRzIHdvdWxkIGZvcm0gYSBzdHJhaWdodCBsaW5lLiBTaWduaWZpY2FudCBkZXZpYXRpb25zIGZyb20gdGhpcyBsaW5lIHN1Z2dlc3QgZGVwYXJ0dXJlcyBmcm9tIG5vcm1hbGl0eS4NCg0KYGBge3IsIGZpZy53aWR0aCA9IDEwfQ0KIyBDcmVhdGUgYW5kIGRpc3BsYXkgdGhlIFFRIHBsb3RzDQpnZ3Bsb3QoZGF0YSA9IHJiaW5kKG1hbGVfaGVpZ2h0cyxmZW1hbGVfaGVpZ2h0cyksIGFlcyhzYW1wbGUgPSBIZWlnaHQpKSArDQogICAgICAgIHN0YXRfcXFfYmFuZChhbHBoYT0wLjIsIGNvbmY9MC45NSwgcXR5cGU9MSwgYmFuZFR5cGUgPSAiYm9vdCIpICsNCiAgICAgICAgc3RhdF9xcV9saW5lKGlkZW50aXR5PVRSVUUsYWxwaGE9MC42KSArDQogICAgICAgIHN0YXRfcXFfcG9pbnQoY29sPSJibHVlIiwgc2l6ZT0wLjUpICsNCiAgICAgICAgZmFjZXRfd3JhcCh+U2V4KSArDQogICAgICAgIGdndGl0bGUocGFzdGUoIk5vcm1hbCBQcm9iYWJpbGl0eSBQbG90IGZvciBTYW1wbGUiKSkgKw0KICAgICAgICBsYWJzKHggPSAiVGhlb3JldGljYWwgVmFsdWVzIiwgeSA9ICJTYW1wbGUgVmFsdWVzIikgKw0KICAgICAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KYGBgDQoNCiMjIFNhbXBsZSBNZWFucyBhbmQgU2FtcGxlIFZhcmlhbmNlcw0KDQpOb3cgd2UgY2FsY3VsYXRlIHRoZSBzYW1wbGUgbWVhbnMgYW5kIHNhbXBsZSB2YXJpYW5jZXMuDQoNCmBgYHtyfQ0KIyBDYWxjdWxhdGUgTWVhbnMgYW5kIFZhcmlhbmNlcw0KbWFsZV9tZWFuIDwtIG1lYW4obWFsZV9oZWlnaHRzJEhlaWdodCkNCm1hbGVfdmFyaWFuY2UgPC0gdmFyKG1hbGVfaGVpZ2h0cyRIZWlnaHQpDQoNCmZlbWFsZV9tZWFuIDwtIG1lYW4oZmVtYWxlX2hlaWdodHMkSGVpZ2h0KQ0KZmVtYWxlX3ZhcmlhbmNlIDwtIHZhcihmZW1hbGVfaGVpZ2h0cyRIZWlnaHQpDQoNCiMgRGlzcGxheSB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMNCmNhdCgiIE1hbGUgTWVhbjpcdFx0XHRcdFx0IiwgbWFsZV9tZWFuLCAiXG4iLCANCiAgICAiTWFsZSBWYXJpYW5jZTpcdFx0XHRcdCIsIG1hbGVfdmFyaWFuY2UsICJcbiIsDQogICAgIk1hbGUgU3RhbmRhcmQgRGV2aWF0aW9uOlx0Iiwgc3FydChtYWxlX3ZhcmlhbmNlKSwgIlxuXG4iLA0KICAgICJGZW1hbGUgTWVhbjpcdFx0XHRcdCIsIGZlbWFsZV9tZWFuLCAiXG4iLA0KICAgICJGZW1hbGUgVmFyaWFuY2U6XHRcdFx0IiwgZmVtYWxlX3ZhcmlhbmNlLCAiXG4iLA0KICAgICJGZW1hbGUgU3RhbmRhcmQgRGV2aWF0aW9uOlx0Iiwgc3FydChmZW1hbGVfdmFyaWFuY2UpLCAiXG4iKQ0KYGBgDQoNCiMjIEVxdWFsaXR5IFRlc3Qgb2YgUG9wdWxhdGlvbiBWYXJpYW5jZXMNCg0KTm93IHdlIGFwcGx5IGEgcm9idXN0IHRlc3QgZm9yIGFwcHJveGltYXRlbHkgbm9ybWFsIGRhdGEgdG8gdGVzdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1hbGUgYW5kIGZlbWFsZSBwb3B1bGF0aW9ucyBoYXZlIHRoZSBzYW1lIHZhcmlhbmNlLg0KDQpgYGB7cn0NCiMgTGV2ZW5lIHRlc3QgaXMgcm9idXN0IGZvciBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkYXRhDQpsZXZlbmVfdGVzdF9yZXN1bHQgPC0gbGV2ZW5lVGVzdChIZWlnaHQgfiBTZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmJpbmQobWFsZV9oZWlnaHRzLCBmZW1hbGVfaGVpZ2h0cykpDQoNCiMgRl90ZXN0X3Jlc3VsdCA8LSB2YXIudGVzdChIZWlnaHQgfiBTZXgsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYmluZChtYWxlX2hlaWdodHMsIGZlbWFsZV9oZWlnaHRzKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpDQoNCnByaW50KGxldmVuZV90ZXN0X3Jlc3VsdCkNCmBgYA0KDQojIyBFcXVhbGl0eSBUZXN0IG9mIFBvcHVsYXRpb24gTWVhbnMNCg0KRmluYWxseSB3ZSBhcHBseSBhIFdlbGNoJ3MgdC10ZXN0IGZvciBlcXVhbGl0eSBvZiBtZWFucywgYXNzdW1pbmcgdW5lcXVhbCB2YXJpYW5jZS4NCg0KYGBge3IsIGxpbmV3aWR0aD04MH0NCiMgUGVyZm9ybSBXZWxjaCdzIHQtdGVzdCBmb3IgRXF1YWxpdHkgb2YgTWVhbnMgKGZvciB1bmVxdWFsIHZhcmlhbmNlcykNCnRfdGVzdF9yZXN1bHQgPC0gdC50ZXN0KEhlaWdodCB+IFNleCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYmluZChtYWxlX2hlaWdodHMsIGZlbWFsZV9oZWlnaHRzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIuZXF1YWwgPSBGQUxTRSkNCnByaW50KHRfdGVzdF9yZXN1bHQpDQpgYGANCg==