가설검정은 무죄 추정 원칙이다
법정에서 피고인은 유죄가 증명되기 전까지는 무죄로 간주합니다. "당신이 범인이 아님을 증명하시오"라고 요구하지 않습니다. 검사가 "이 사람이 범인이다"라는 충분한 증거를 제시해야 합니다. 증거가 부족하면 무죄입니다.
가설검정도 같은 논리입니다. 처음에는 "효과 없음"(무죄)을 가정하고, 데이터가 그것을 뒤집을 만큼 강한 증거를 제공하는지 검토합니다.
귀무가설과 대립가설
가설검정에는 두 개의 가설이 등장합니다.
귀무가설 H0 (null hypothesis)
"효과가 없다", "차이가 없다", "관계가 없다"는 보수적인 주장입니다. 우리가 반증하고 싶은 가설입니다.
- 예: "신약과 위약의 혈압 변화는 같다 (μ1 = μ2)"
- 예: "이 동전은 공평하다 (p = 0.5)"
대립가설 H1 (alternative hypothesis)
"효과가 있다", "차이가 있다", "관계가 있다"는 주장입니다. 우리가 증명하고 싶은 가설입니다.
- 예: "신약이 위약보다 혈압을 더 낮춘다 (μ1 < μ2)"
- 예: "이 동전은 불공평하다 (p ≠ 0.5)"
H0를 직접 증명하거나 반증하지는 않습니다. 단지 데이터가 H0와 얼마나 모순되는지를 평가합니다.
유의수준과 기각역
유의수준(significance level) α는 H0가 실제로 맞는데도 잘못 기각할 확률의 최대 허용값입니다. 관행적으로 α = 0.05를 씁니다.
기각역(rejection region)은 검정통계량이 이 영역에 들어오면 H0를 기각하는 범위입니다.
# 양측 t-검정에서의 기각역 시각화 (자유도 9)
x_vals <- seq(-4, 4, length.out = 300)
y_vals <- dt(x_vals, df = 9)
# 임계값: α = 0.05, 양측 검정
critical_value <- qt(0.975, df = 9)
cat("임계값 (±):", round(critical_value, 3), "\n")
# 데이터프레임으로 변환
df_plot <- data.frame(x = x_vals, y = y_vals)
library(ggplot2)
ggplot(df_plot, aes(x, y)) +
geom_line(color = "steelblue", linewidth = 1) +
geom_area(data = subset(df_plot, x < -critical_value),
fill = "tomato", alpha = 0.5) +
geom_area(data = subset(df_plot, x > critical_value),
fill = "tomato", alpha = 0.5) +
geom_vline(xintercept = c(-critical_value, critical_value),
linetype = "dashed", color = "red") +
annotate("text", x = -3.2, y = 0.05, label = "기각역\n(2.5%)",
color = "red", size = 3) +
annotate("text", x = 3.2, y = 0.05, label = "기각역\n(2.5%)",
color = "red", size = 3) +
annotate("text", x = 0, y = 0.2, label = "채택역 (95%)",
color = "steelblue", size = 3.5) +
labs(title = "t-분포의 기각역 (df=9, α=0.05, 양측검정)",
x = "t 통계량", y = "밀도") +
theme_minimal()
임계값 (±): 2.262
검정통계량 t가 2.262보다 크거나 -2.262보다 작으면 H0를 기각합니다.
1종 오류와 2종 오류
가설검정에서는 두 종류의 실수가 발생할 수 있습니다.
| H0가 참 | H0가 거짓 | |
|---|---|---|
| H0 채택 | 올바른 결정 | 2종 오류 (β) |
| H0 기각 | 1종 오류 (α) | 올바른 결정 |
1종 오류(Type I error): 실제로 효과가 없는데 "효과가 있다"고 잘못 결론내리는 오류입니다. 유의수준 α가 이 오류의 최대 허용 확률입니다. 억울하게 유죄 판결을 받는 것과 같습니다.
2종 오류(Type II error): 실제로 효과가 있는데 "효과가 없다"고 놓치는 오류입니다. 확률은 β로 표기합니다. 실제 범인을 무죄로 풀어주는 것과 같습니다.
두 오류는 상충(trade-off) 관계입니다. α를 줄이면 β가 커집니다. α = 0.05는 "억울한 유죄 판결"을 5% 이하로 제한하겠다는 약속입니다.
# sleep 데이터로 가설검정 실습
data(sleep)
# 가설 설정
# H0: 그룹 1과 그룹 2의 수면 증가량 평균이 같다 (μ1 = μ2)
# H1: 두 그룹의 수면 증가량 평균이 다르다 (μ1 ≠ μ2)
result <- t.test(extra ~ group, data = sleep)
print(result)
Welch Two Sample t-test
data: extra by group
t = -1.8608, df = 17.776, p-value = 0.07939
alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
95 percent confidence interval:
-3.3654832 0.2054832
sample estimates:
mean in group 1 mean in group 2
0.75 2.33
t 통계량이 -1.86이고, p-값이 0.079입니다. α = 0.05를 기준으로 하면 p-값이 0.05보다 크므로 H0를 기각하지 못합니다. "두 그룹의 평균이 같다는 가설을 기각할 충분한 증거가 없다"고 결론 내립니다.
단측 검정과 양측 검정
대립가설이 방향을 포함하는지에 따라 검정 방식이 달라집니다.
- 양측 검정: H1: μ1 ≠ μ2 (차이만 있으면 됨)
- 단측 검정(우측): H1: μ1 > μ2 (특정 방향으로 크다)
- 단측 검정(좌측): H1: μ1 < μ2 (특정 방향으로 작다)
# 양측 검정 (기본값)
t.test(extra ~ group, data = sleep, alternative = "two.sided")$p.value
# 단측 검정: 그룹 2가 그룹 1보다 크다는 가설
t.test(extra ~ group, data = sleep, alternative = "less")$p.value
[1] 0.07939174 # 양측: 유의하지 않음
[1] 0.03969587 # 단측: 유의함 (p < 0.05)
같은 데이터인데 단측 검정으로 바꾸니 p-값이 절반이 되어 유의해졌습니다. 그러나 단측 검정은 사전에 방향을 예측할 이론적 근거가 있을 때만 사용해야 합니다. 결과를 보고 나서 "더 작은 p-값이 나오도록" 검정 방향을 바꾸는 것은 p-hacking이라는 연구 부정직 행위입니다.
가설검정의 결론 표현
가설검정 결과를 표현할 때는 정확한 언어를 사용해야 합니다.
잘못된 표현과 올바른 표현을 비교합니다.
잘못된 표현: "귀무가설이 참임을 증명했다." 올바른 표현: "귀무가설을 기각할 충분한 증거가 없다."
잘못된 표현: "두 그룹이 완전히 같다는 것을 확인했다." 올바른 표현: "두 그룹 간 유의한 차이를 발견하지 못했다 (p = 0.079)."
가설검정은 "증명"이 아닙니다. 데이터가 특정 가설을 지지하거나, 기각할 증거를 제공하거나, 증거가 불충분하다는 것을 판단하는 절차입니다.