iBetter Books
수정

언제 대응표본 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]."