iBetter Books
수정

통계적 유의 vs 실제적 유의

"p < 0.05, 유의합니다"라는 결론이 항상 "실제로 중요한 발견"을 의미하지는 않습니다. 앞 장에서 봤듯, 표본이 크면 아주 작은 차이도 유의해집니다.

반대로 "p ≥ 0.05, 유의하지 않습니다"라는 결론이 "효과가 없다"를 의미하지도 않습니다. 표본이 너무 작으면 실제로 큰 효과가 있어도 감지하지 못할 수 있습니다.

이 두 가지 문제를 해결하는 개념이 효과크기(effect size)와 검정력(statistical power)입니다.

효과크기 Cohen's d

Cohen's d는 두 집단의 평균 차이를 표준편차 단위로 표현한 효과크기입니다.

d=xˉ1xˉ2spooledd = \frac{\bar{x}_1 - \bar{x}_2}{s_{pooled}}

여기서 s_pooled는 두 집단의 합동 표준편차(pooled SD)입니다.

Jacob Cohen이 제안한 해석 기준은 다음과 같습니다.

d 값 효과 크기
0.2 미만 작음 (small)
0.2 ~ 0.5 작음-중간
0.5 중간 (medium)
0.5 ~ 0.8 중간-큼
0.8 이상 큼 (large)
# ToothGrowth: 저용량 vs 고용량의 효과크기 계산
data(ToothGrowth)
low  <- ToothGrowth$len[ToothGrowth$dose == 0.5]
high <- ToothGrowth$len[ToothGrowth$dose == 2.0]

# Cohen's d 함수 직접 구현
cohens_d <- function(x1, x2) {
  n1 <- length(x1); n2 <- length(x2)
  pooled_sd <- sqrt(((n1-1)*var(x1) + (n2-1)*var(x2)) / (n1+n2-2))
  d <- (mean(x1) - mean(x2)) / pooled_sd
  return(abs(d))
}

d <- cohens_d(low, high)
cat("Cohen's d:", round(d, 3), "\n")
cat("해석:", ifelse(d >= 0.8, "큰 효과",
            ifelse(d >= 0.5, "중간 효과", "작은 효과")), "\n")
Cohen's d: 2.770 
해석: 큰 효과

d = 2.77은 매우 큰 효과입니다. 두 집단이 2.77 표준편차만큼 떨어져 있다는 의미입니다.

ANOVA의 효과크기 η²

분산분석(ANOVA)에서는 에타 제곱(η², eta-squared)을 사용합니다.

η2=SSbetweenSStotal\eta^2 = \frac{SS_{between}}{SS_{total}}

전체 변동 중 집단 간 차이로 설명되는 비율입니다.

η² 값 효과 크기
0.01 작음
0.06 중간
0.14 이상
# iris 데이터: 종(Species)에 따른 꽃잎 길이 차이
data(iris)
aov_result <- aov(Petal.Length ~ Species, data = iris)
summary_aov <- summary(aov_result)

# η² 계산
ss_between <- summary_aov[[1]]$`Sum Sq`[1]
ss_total   <- sum(summary_aov[[1]]$`Sum Sq`)
eta_sq     <- ss_between / ss_total

cat("SS_between:", round(ss_between, 2), "\n")
cat("SS_total:", round(ss_total, 2), "\n")
cat("η²:", round(eta_sq, 4), "\n")
cat("해석:", ifelse(eta_sq >= 0.14, "큰 효과",
            ifelse(eta_sq >= 0.06, "중간 효과", "작은 효과")), "\n")
SS_between: 437.1 
SS_total: 464.33 
η²: 0.9414 
해석: 큰 효과

η² = 0.94는 꽃잎 길이 변동의 94%가 종(Species) 차이로 설명된다는 의미입니다.

검정력이란

검정력(statistical power)은 실제 효과가 존재할 때 H0를 정확하게 기각하는 확률입니다.

Power=1β\text{Power} = 1 - \beta

여기서 β는 2종 오류 확률(실제 효과가 있는데 놓치는 확률)입니다.

관례적으로 검정력 0.80(80%)을 목표로 삼습니다. 즉, 실제 효과가 있을 때 80% 확률로 탐지하겠다는 의미입니다.

검정력에 영향을 주는 4가지 요소는 다음과 같습니다.

  • 효과크기(d): 클수록 검정력 증가
  • 표본크기(n): 클수록 검정력 증가
  • 유의수준(α): 클수록 검정력 증가 (그러나 1종 오류도 증가)
  • 분산: 작을수록 검정력 증가

power.t.test()로 검정력 계산

R 내장 함수 power.t.test()로 t-검정의 검정력을 계산합니다.

# 시나리오 1: 표본 크기와 효과크기를 알 때 검정력 계산
power.t.test(
  n = 20,          # 집단당 표본 크기
  delta = 0.5,     # 탐지하고 싶은 효과크기 (평균 차이)
  sd = 1,          # 표준편차 (Cohen's d = delta/sd = 0.5)
  sig.level = 0.05,
  type = "two.sample",
  alternative = "two.sided"
)
     Two-sample t test power calculation 

              n = 20
          delta = 0.5
             sd = 1
      sig.level = 0.05
          power = 0.3378...
    alternative = two.sided

 NOTE: n is number in *each* group

n = 20, 중간 효과(d = 0.5)에서 검정력이 33.8%입니다. 10번 중 3번만 효과를 탐지합니다. 충분하지 않습니다.

필요 표본 크기 결정

연구 시작 전에 "얼마나 많은 참가자가 필요한가"를 결정하는 것이 표본크기 계획(sample size planning)입니다.

# 시나리오 2: 원하는 검정력(0.80)을 달성하기 위한 표본 크기 계산
power.t.test(
  delta = 0.5,       # 중간 효과크기 (Cohen's d = 0.5)
  sd = 1,
  sig.level = 0.05,
  power = 0.80,      # 목표 검정력
  type = "two.sample",
  alternative = "two.sided"
)
     Two-sample t test power calculation 

              n = 63.76561
          delta = 0.5
             sd = 1
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

중간 효과(d = 0.5)를 80% 검정력으로 탐지하려면 집단당 64명이 필요합니다.

pwr 패키지 활용

pwr 패키지는 다양한 검정 유형의 검정력 계산을 지원합니다.

# pwr 패키지 설치 (처음 한 번)
# install.packages("pwr")
library(pwr)

# t-검정 검정력 분석
pwr.t.test(d = 0.5, sig.level = 0.05, power = 0.80, type = "two.sample")

# ANOVA 검정력 분석 (3개 집단, 중간 효과)
pwr.anova.test(k = 3, f = 0.25, sig.level = 0.05, power = 0.80)

# 상관분석 검정력 분석 (r = 0.3)
pwr.r.test(r = 0.3, sig.level = 0.05, power = 0.80)
     Two-sample t test power calculation 
              n = 63.76561
              ...

     Balanced one-way analysis of variance power calculation 
              k = 3
              n = 52.39583
              ...

     approximate correlation power calculation (arctangh transformation) 
              n = 84.07364
              ...

효과크기별 필요 표본 크기 비교

# 효과크기 크기별 필요 표본 비교
library(pwr)

effect_sizes <- c(0.2, 0.5, 0.8)
effect_labels <- c("작음(d=0.2)", "중간(d=0.5)", "큼(d=0.8)")

required_n <- sapply(effect_sizes, function(d) {
  ceiling(pwr.t.test(d = d, sig.level = 0.05, power = 0.80,
                     type = "two.sample")$n)
})

data.frame(
  효과크기 = effect_labels,
  집단당_필요표본수 = required_n,
  전체_참가자수 = required_n * 2
)
       효과크기 집단당_필요표본수 전체_참가자수
1   작음(d=0.2)             197           394
2   중간(d=0.5)              64           128
3   큼(d=0.8)               26            52

작은 효과를 탐지하려면 집단당 197명, 총 394명이 필요합니다. 연구 예산이 제한되어 있다면 탐지 가능한 최소 효과크기가 무엇인지 미리 결정해야 합니다.

검정력 곡선 시각화

library(pwr)
library(ggplot2)

# 표본 크기에 따른 검정력 변화
n_seq <- seq(5, 200, by = 5)
effect_levels <- c(0.2, 0.5, 0.8)

power_df <- do.call(rbind, lapply(effect_levels, function(d) {
  powers <- sapply(n_seq, function(n) {
    pwr.t.test(n = n, d = d, sig.level = 0.05, type = "two.sample")$power
  })
  data.frame(n = n_seq, power = powers, effect = paste0("d = ", d))
}))

ggplot(power_df, aes(x = n, y = power, color = effect)) +
  geom_line(linewidth = 1) +
  geom_hline(yintercept = 0.80, linetype = "dashed", color = "gray50") +
  annotate("text", x = 190, y = 0.82, label = "목표 검정력 = 0.80",
           color = "gray50", size = 3) +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(
    title = "표본 크기와 검정력의 관계",
    x = "집단당 표본 크기 (n)",
    y = "검정력 (1 - β)",
    color = "효과크기"
  ) +
  theme_minimal()

이 그래프를 보면 효과크기가 클수록 적은 표본으로도 80% 검정력에 도달할 수 있음을 알 수 있습니다. 작은 효과(d = 0.2)를 탐지하려면 n이 200에 가까워도 검정력이 80%에 미치지 못합니다.

사후 검정력 분석의 함정

연구가 끝난 후 "이 연구의 검정력은 얼마였는가"를 계산하는 것을 사후 검정력 분석(post-hoc power analysis)이라고 합니다. 직관적으로 유용해 보이지만, 관측된 효과크기를 그대로 사용하면 p-값에서 직접 계산된 값이 나와 순환 논리가 됩니다.

사후 검정력 분석은 다음 상황에서만 의미가 있습니다. 선행 연구나 이론에 기반한 효과크기를 사용해서 "이 연구 설계가 충분했는가"를 평가할 때입니다. 관측된 효과크기로 계산한 사후 검정력은 오해를 부를 수 있어 많은 저널에서 보고를 권장하지 않습니다.

검정력 분석은 연구 계획 단계에서, 선행 연구 기반의 효과크기를 사용해서 수행하는 것이 올바른 방법입니다.