언제 독립표본 t-검정을 쓰는가
두 집단의 평균이 다른지 비교할 때 사용합니다. "독립(independent)"이라는 말은 두 집단이 서로 다른 사람으로 구성되었다는 의미입니다.
전형적인 상황입니다. 실험군(신약 투여)과 대조군(위약 투여)의 혈압을 비교합니다. 남성과 여성의 시험 점수를 비교합니다. OJ와 VC 방법으로 비타민 C를 투여했을 때 치아 성장을 비교합니다.
이 장에서는 R 내장 데이터 ToothGrowth를 사용합니다. 기니피그에게 두 가지 방법(OJ: 오렌지주스, VC: 아스코르브산)으로 비타민 C를 투여했을 때 치아 성장(len)을 비교한 데이터입니다.
data(ToothGrowth)
str(ToothGrowth)
table(ToothGrowth$supp)
'data.frame': 60 obs. of 3 variables:
$ len : num 4.2 11.5 7.3 5.8 6.4 ...
$ supp: Factor w/ 2 levels "OJ","VC": 2 2 2 2 2 2 ...
$ dose: num 0.5 0.5 0.5 0.5 0.5 0.5 ...
OJ VC
30 30
1단계. 가정 확인 — 정규성 검정
t-검정을 적용하려면 두 가지 가정이 필요합니다. 정규성(데이터가 정규분포를 따름)과 독립성(관측치가 서로 독립)입니다.
정규성은 shapiro.test()로 확인합니다. H0는 "데이터가 정규분포를 따른다"이므로, p ≥ 0.05이면 정규성 가정을 위반하지 않는다고 판단합니다.
# 두 집단으로 분리
oj <- ToothGrowth$len[ToothGrowth$supp == "OJ"]
vc <- ToothGrowth$len[ToothGrowth$supp == "VC"]
# Shapiro-Wilk 정규성 검정
shapiro.test(oj)
shapiro.test(vc)
Shapiro-Wilk normality test
data: oj
W = 0.91, p-value = 0.0227
Shapiro-Wilk normality test
data: vc
W = 0.966, p-value = 0.4284
OJ의 p-값이 0.023으로 0.05보다 작습니다. 엄격하게 적용하면 정규성 가정이 의심됩니다. 하지만 실제에서는 표본이 30 이상이면 중심극한정리에 의해 t-검정이 상당히 견고합니다. 여기서는 확인 후 진행합니다.
2단계. 가정 확인 — 등분산 검정
두 집단의 분산이 같은지 확인합니다. var.test()를 사용합니다. H0는 "두 집단의 분산이 같다"입니다.
var.test(len ~ supp, data = ToothGrowth)
F test to compare two variances
data: len by supp
F = 0.6386, num df = 29, denom df = 29, p-value = 0.2331
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.3039868 1.3421579
sample estimates:
ratio of variances
0.6385879
p-값 = 0.233으로 0.05보다 크므로 등분산 가정을 위반하지 않습니다.
3단계. t.test() 실행
등분산 여부에 따라 var.equal 인자를 설정합니다.
# 등분산 가정 충족 → var.equal = TRUE (Student's t-test)
result_equal <- t.test(len ~ supp, data = ToothGrowth, var.equal = TRUE)
# 등분산 가정 불확실 → var.equal = FALSE (Welch's t-test, 기본값)
result_welch <- t.test(len ~ supp, data = ToothGrowth, var.equal = FALSE)
print(result_equal)
Two Sample t-test
data: len by supp
t = 1.9153, df = 58, p-value = 0.06039
alternative hypothesis: true difference in means between group OJ and group VC is not equal to 0
95 percent confidence interval:
-0.1670064 7.5670064
sample estimates:
mean in group OJ mean in group VC
20.66333 16.96333
등분산인 경우(var.equal = TRUE)에도 p-값이 0.060으로 α = 0.05 기준으로 유의하지 않습니다.
실제 분석에서는 등분산 검정 결과에 상관없이 Welch's t-test(var.equal = FALSE)를 기본으로 사용하는 것이 더 안전합니다. Welch t-검정은 등분산이든 아니든 항상 적용 가능하고, 두 검정의 결과 차이는 대부분 미미합니다.
4단계. 결과 해석
# 평균, 표준편차 확인
tapply(ToothGrowth$len, ToothGrowth$supp, mean)
tapply(ToothGrowth$len, ToothGrowth$supp, sd)
OJ VC
20.66333 16.96333
OJ VC
6.605561 8.266029
OJ 집단의 평균 치아 성장(M = 20.66, SD = 6.61)이 VC 집단(M = 16.96, SD = 8.27)보다 크지만, 이 차이가 통계적으로 유의하지 않습니다(t(58) = 1.92, p = .060).
5단계. 효과크기 계산
통계적 유의성에 관계없이 효과크기를 보고합니다.
# Cohen's d 계산
n1 <- length(oj); n2 <- length(vc)
pooled_sd <- sqrt(((n1-1)*var(oj) + (n2-1)*var(vc)) / (n1+n2-2))
d <- (mean(oj) - mean(vc)) / pooled_sd
cat("Cohen's d:", round(d, 3), "\n")
Cohen's d: 0.495
d = 0.495로 중간 효과에 가깝습니다. 표본 크기(n = 30)가 더 컸다면 유의한 결과가 나왔을 수 있습니다.
6단계. 논문 보고 형식
APA 형식으로 결과를 보고합니다.
"OJ 집단(M = 20.66, SD = 6.61)과 VC 집단(M = 16.96, SD = 8.27) 사이에 통계적으로 유의한 차이는 없었다, t(58) = 1.92, p = .060, d = 0.50, 95% CI [-0.17, 7.57]."
시각화로 결과 확인
library(ggplot2)
ggplot(ToothGrowth, aes(x = supp, y = len, fill = supp)) +
geom_boxplot(alpha = 0.7, outlier.shape = NA) +
geom_jitter(width = 0.15, alpha = 0.5, size = 2) +
scale_fill_manual(values = c("OJ" = "steelblue", "VC" = "tomato")) +
labs(
title = "비타민 C 투여 방법에 따른 치아 성장",
subtitle = "t(58) = 1.92, p = .060, d = 0.50",
x = "투여 방법",
y = "치아 성장 (mm)",
fill = "방법"
) +
theme_minimal()
박스플롯과 개별 데이터 점을 함께 표시하면 분포의 형태와 이상치를 한눈에 확인할 수 있습니다.