언제 대응표본 t-검정을 쓰는가
독립표본 t-검정은 서로 다른 사람을 비교했습니다. 대응표본 t-검정(paired t-test)은 같은 사람(또는 같은 단위)을 두 번 측정한 경우에 사용합니다.
전형적인 상황입니다. 교육 프로그램 참여 전·후의 시험 점수를 비교합니다. 같은 환자에게 약 A와 약 B를 각각 투여한 결과를 비교합니다. 왼손과 오른손의 악력을 비교합니다.
"대응"이라는 말은 데이터 쌍(pair)이 있다는 뜻입니다. 10명이 있다면 사전 점수 10개, 사후 점수 10개가 서로 짝을 이룹니다.
이 장에서는 R 내장 데이터 sleep을 사용합니다. 10명의 피험자에게 수면제 1(group 1)과 수면제 2(group 2)를 투여했을 때 수면 증가 시간(extra)을 측정한 데이터입니다.
data(sleep)
print(sleep)
extra group ID
1 0.7 1 1
2 -1.6 1 2
...
11 1.9 2 1
12 0.8 2 2
...
같은 피험자(ID 1)가 group 1에서 0.7, group 2에서 1.9를 기록했습니다. 이 ID를 기준으로 쌍을 이루어야 합니다.
왜 대응표본 검정이 더 강력한가
독립표본 t-검정으로 sleep 데이터를 분석하면 개인차(individual difference)가 오차에 포함됩니다. 잠이 원래 많은 사람은 어느 약을 먹어도 수면 증가량이 클 수 있습니다. 이 개인차가 노이즈가 됩니다.
대응표본 t-검정은 각 쌍의 차이값(d_i = x_2i - x_1i)을 계산합니다. 개인차가 빠지고 순수한 약의 효과만 남습니다.
# 두 약의 수면 증가량 차이 계산
wide_sleep <- data.frame(
ID = 1:10,
g1 = sleep$extra[sleep$group == 1],
g2 = sleep$extra[sleep$group == 2]
)
wide_sleep$diff <- wide_sleep$g2 - wide_sleep$g1
print(wide_sleep)
ID g1 g2 diff
1 1 0.7 1.9 1.2
2 2 -1.6 0.8 2.4
3 3 -0.2 1.1 1.3
...
차이값의 평균이 수면제 2의 추가 효과입니다.
정규성 가정 확인
대응표본 t-검정에서는 차이값(diff)이 정규분포를 따르는지 확인합니다. 원래 값이 아니라 차이값의 정규성이 중요합니다.
# 차이값의 정규성 검정
shapiro.test(wide_sleep$diff)
Shapiro-Wilk normality test
data: wide_sleep$diff
W = 0.98498, p-value = 0.9827
p-값 = 0.983으로 정규성 가정을 위반하지 않습니다. 차이값이 정규분포를 따릅니다.
t.test()로 대응표본 검정 실행
paired = TRUE 인자를 추가합니다.
# 방법 1: 공식(formula) 형태 + 피험자 ID 활용
# sleep 데이터는 long 형식이므로 직접 paired 설정 필요
group1 <- sleep$extra[sleep$group == 1]
group2 <- sleep$extra[sleep$group == 2]
result <- t.test(group2, group1, paired = TRUE)
print(result)
Paired t-test
data: group2 and group1
t = 4.0621, df = 9, p-value = 0.002833
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
0.7001142 2.4598858
sample estimates:
mean difference
1.58
p-값 = 0.003으로 유의수준 0.05보다 매우 작습니다. 수면제 2가 수면제 1보다 평균 1.58시간 더 수면을 늘리는 효과가 통계적으로 유의합니다.
독립표본 vs 대응표본 비교
앞에서 독립표본으로 같은 데이터를 분석했을 때는 p = 0.079로 유의하지 않았습니다.
# 독립표본으로 분석 (잘못된 방법)
t.test(extra ~ group, data = sleep, paired = FALSE)$p.value
# 대응표본으로 분석 (올바른 방법)
t.test(group2, group1, paired = TRUE)$p.value
[1] 0.07939174 # 독립표본: 유의하지 않음
[1] 0.002833 # 대응표본: 유의함
같은 데이터인데 결과가 달라졌습니다. 대응 관계를 무시하면 개인차가 오차에 섞여 검정력이 떨어집니다. 데이터 구조에 맞는 검정 방법을 선택하는 것이 중요합니다.
효과크기 계산
# 차이값의 평균과 표준편차로 Cohen's d 계산
mean_diff <- mean(wide_sleep$diff)
sd_diff <- sd(wide_sleep$diff)
d <- mean_diff / sd_diff
cat("평균 차이:", round(mean_diff, 3), "\n")
cat("SD(차이):", round(sd_diff, 3), "\n")
cat("Cohen's d:", round(d, 3), "\n")
평균 차이: 1.58
SD(차이): 1.23
Cohen's d: 1.284
d = 1.28은 큰 효과입니다. 수면제 2가 수면제 1보다 효과가 상당히 크다는 것을 의미합니다.
시각화
library(ggplot2)
# 사전-사후 라인 플롯
long_data <- data.frame(
ID = rep(1:10, 2),
group = rep(c("수면제 1", "수면제 2"), each = 10),
extra = c(group1, group2)
)
ggplot(long_data, aes(x = group, y = extra, group = ID)) +
geom_line(alpha = 0.4, color = "gray50") +
geom_point(aes(color = group), size = 3) +
scale_color_manual(values = c("수면제 1" = "steelblue",
"수면제 2" = "tomato")) +
stat_summary(aes(group = 1), fun = mean, geom = "line",
color = "black", linewidth = 1.5, linetype = "dashed") +
labs(
title = "수면제별 수면 증가 시간 (대응표본)",
subtitle = "Paired t-test: t(9) = 4.06, p = .003, d = 1.28",
x = "수면제 종류",
y = "수면 증가 시간 (시간)",
color = "집단"
) +
theme_minimal()
각 피험자의 변화를 선으로 연결하면 대부분 수면제 2에서 수면이 늘어났음을 한눈에 확인할 수 있습니다. 굵은 점선은 평균을 나타냅니다.
보고 형식
"수면제 2 투여 후 수면 증가 시간(M = 2.33, SD = 2.00)이 수면제 1 투여 후(M = 0.75, SD = 1.79)보다 유의하게 컸다, t(9) = 4.06, p = .003, d = 1.28, 95% CI [0.70, 2.46]."