1 도입 — 왜 표본 크기 결정이 중요한가
Woodward 의 시작 메시지:
“역학 연구를 계획할 때 항상 등장하는 질문: 몇 명을 포함할 것인가. 너무 많으면 자원 낭비, 너무 적으면 결정적 결과 검출 실패.” (Woodward 2014, Ch.8.1)
이 글은 (a) 표본 크기 결정의 중요성, (b) Power 의 정의와 계산, (c) 콜레스테롤 사례의 구체적 도출을 정리한다.
2 너무 큰 \(n\) 의 위험
표본이 과대 한 경우:
- 통계적 유의 가 임상적 무의미 — 매우 작은 RR (예: 1.05) 도 유의해짐
- 자원 낭비 — 시간, 비용, 참가자 부담
- 윤리적 우려 — 불필요한 실험 노출
A-SCH11-2 에서 다룬 Schulz 의 비판과 같은 맥락. 0.05 이하 라도 효과 크기가 임상적으로 무의미 하면 의미 없음.
3 너무 작은 \(n\) 의 위험
표본이 과소 한 경우:
- 진정한 효과 검출 실패 (Type II error 증가)
- 결과 미확정 — “효과 없음” 결론을 “효과 있을 수도” 와 구분 못함
- 연구 무용 — 결정적 자료 생산 못함
3.1 Frieman et al. 1978 의 발견
Woodward 가 인용:
“71 개 부정적 개입 시험 (효과 미발견) 분석. 약 2/3 가 50 % 진정한 개선 을 검출할 검정력 70 % 미만. 50 % 개선이 의학적으로 무의미 한 경우는 거의 없으므로, 이 시험들은 중요한 정보를 놓칠 위험이 큼.”
이 발견이 Schulz Ch.11 의 Chalmers 1978 와 같은 맥락. underpowered trials 의 광범위한 문제.
4 정확한 표본 크기 — Trade-off
n 결정의 원리:
연구 가설 → 검출하고 싶은 효과 크기 결정
↓
α, power 결정 (관습 또는 분야별)
↓
분산 또는 비율 추정 (이전 자료에서)
↓
공식 적용 → 최소 n 산정
↓
실현 가능성 점검 → 진행 또는 재검토
이 절차의 주관성 은 효과 크기 결정 에 집중. 다른 입력은 비교적 객관적.
5 Power 의 공식 정의
귀무가설이 실제로 거짓일 때 그것을 기각할 확률.
\[ \text{Power} = \Pr(\text{기각} \mid H_1 \text{ 참}) = 1 - \beta \]
확률 또는 백분율 모두 사용. 일반적으로:
- Power \(= 0.80\) → 80 %
- Power \(= 0.90\) → 90 %
- Power \(= 0.99\) → 99 %
5.1 Power 의 4 결정 요인
A-WOO8-0 에서 다뤘지만 다시:
- 표본 크기 \(n\) — 클수록 power 큼
- 효과 크기 — 클수록 power 큼
- 분산 (또는 비율의 분산) — 작을수록 power 큼
- 유의 수준 \(\alpha\) — 클수록 power 큼
이 4 가지가 서로 trade-off. 한 가지를 고정하면 나머지 결정 가능.
6 Power 계산 — 단일 평균 사례
6.1 설정
귀무가설:
\[ H_0: \mu = \mu_0 \]
대립가설 (한 측):
\[ H_1: \mu > \mu_0 \]
검정 통계량 (표본 평균):
\[ T = \frac{\bar{X} - \mu_0}{\sigma / \sqrt{n}} \]
(분산 \(\sigma\) 가 알려져 있다고 가정. 모르면 \(s\) 로 대체하고 t 분포 사용.)
6.2 기각 영역
\(\alpha = 0.05\) 한 측에서 \(H_0\) 기각: \(T > z_{1 - \alpha} = 1.6449\).
6.3 Power 의 도출
\(H_1\) 이 참인 경우 (\(\mu = \mu_1\) 가정):
\[ \text{Power} = \Pr(T > 1.6449 \mid \mu = \mu_1) \]
표본 평균은 \(H_1\) 하에서 \(\mu_1\) 중심:
\[ T = \frac{\bar{X} - \mu_0}{\sigma / \sqrt{n}}, \quad \bar{X} \sim N(\mu_1, \sigma^2 / n) \]
이를 \(Z\) 분포로 표준화:
\[ T \sim N\left(\frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}}, 1\right) \]
따라서:
\[ \Pr(T > 1.6449) = \Pr\left(Z > 1.6449 - \frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}}\right) \]
대칭성으로:
\[ \boxed{\text{Power} = \Pr\left(Z < \frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}} - z_{1 - \alpha}\right)} \tag{8.1} \]
이 식이 Power 계산의 기본 공식.
식 (8.1) 의 우변을 풀어 본다.
- \(\frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}}\) — 표준화된 효과 크기 (effect size in SE units)
- \(z_{1 - \alpha}\) — 임계값 (significance threshold)
차이 \(\left(\frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}} - z_{1 - \alpha}\right)\) 가 얼마나 효과가 임계값보다 멀리 있는가.
이 차이가 클수록 power 큼. 차이를 키우는 4 가지 방법:
- \(n\) 크게 → \(\sqrt{n}\) 분모 작아짐 → 효과의 표준화 값 큼
- \(\sigma\) 작게 → 효과의 표준화 값 큼 (자료가 정밀)
- \(\mu_1 - \mu_0\) 크게 → 자명
- \(\alpha\) 크게 → 임계값 \(z_{1-\alpha}\) 작음 → 차이 큼
이 4 가지 trade-off 가 power calculation 의 직관.
7 Woodward Ex 8.1 — 콜레스테롤 사례
7.1 문제
“한 발전도상국 남성의 평균 혈청 총 콜레스테롤이 10 년 전 5.5 mmol/L. 최근 서구 식품 수입 증가로 상승했을 가능성. 50 명 표본 조사 계획. 의학적으로 의미 있는 상승은 6.0 mmol/L (즉 0.5 증가). 표준편차 1.4 가정. 6.0 으로 상승 시 검출 확률 은?”
7.2 입력
- \(\mu_0 = 5.5\) mmol/L (귀무가설)
- \(\mu_1 = 6.0\) mmol/L (대립가설, 검출하고 싶음)
- \(\sigma = 1.4\) mmol/L
- \(n = 50\)
- \(\alpha = 0.05\) (한 측)
- \(z_{1 - 0.05} = 1.6449\)
7.3 계산
식 (8.1) 에 대입:
\[ \text{Power} = \Pr\left(Z < \frac{6.0 - 5.5}{1.4 / \sqrt{50}} - 1.6449\right) \]
\[ = \Pr\left(Z < \frac{0.5}{0.198} - 1.6449\right) = \Pr(Z < 2.5254 - 1.6449) \]
\[ = \Pr(Z < 0.8805) \approx 0.8107 \]
따라서 약 81 % 검정력. 6.0 으로 상승했을 때 검출 확률 81 %.
7.4 시각화
표준 정규 곡선 두 개:
H_0 분포: 평균 0, 임계값 = 1.6449 (오른쪽 꼬리 5 %)
H_1 분포: 평균 2.5254, 임계값 = 1.6449
Power = H_1 분포에서 임계값 이상의 면적
= Φ(2.5254 - 1.6449) = Φ(0.8805) ≈ 0.81
이 시각화가 power 의 본질을 보여준다.
8 \(n\) 의 영향 — 콜레스테롤 사례 변형
같은 효과 크기에서 \(n\) 이 변할 때:
| \(n\) | \(\frac{\mu_1 - \mu_0}{\sigma/\sqrt{n}}\) | Power |
|---|---|---|
| 25 | 1.786 | \(\Pr(Z < 0.141) \approx 0.56\) |
| 50 | 2.525 | \(\approx 0.81\) |
| 100 | 3.571 | \(\approx 0.97\) |
| 200 | 5.051 | \(\approx 1.00\) |
\(n\) 을 두 배로 하면 power 가 극단적으로 증가. 그러나 수확체감 — \(n = 200\) 에서는 power 이미 ~ 1.
9 \(\alpha\) 의 영향
같은 \(n = 50\), 같은 효과에서 \(\alpha\) 변화:
| \(\alpha\) | \(z_{1-\alpha}\) | Power |
|---|---|---|
| 0.10 | 1.282 | \(\Pr(Z < 1.243) \approx 0.89\) |
| 0.05 | 1.645 | \(\approx 0.81\) |
| 0.01 | 2.326 | \(\Pr(Z < 0.199) \approx 0.58\) |
\(\alpha\) 를 줄이면 power 도 줄어듦. trade-off 명확.
10 표본 크기 산정 — Power 의 역산
Power \(= 1 - \beta\) 를 고정 하고 \(n\) 을 풀면:
식 (8.1) 에서 \(z_{1-\beta}\) 를 power 분위수 로 두면:
\[ z_{1-\beta} = \frac{\mu_1 - \mu_0}{\sigma / \sqrt{n}} - z_{1-\alpha} \]
\(n\) 에 대해 풀면:
\[ \boxed{n = \left(\frac{(z_{1-\alpha} + z_{1-\beta}) \sigma}{\mu_1 - \mu_0}\right)^2} \]
이 공식이 단일 평균 표본 크기 결정 (사례 1).
10.1 콜레스테롤 사례 — Power 0.90 을 위한 \(n\)
\(z_{1 - 0.05} = 1.6449\), \(z_{1 - 0.10} = 1.2816\). (Power 0.90 → \(1 - \beta = 0.90\), \(z_{0.90} = 1.2816\)).
\[ n = \left(\frac{(1.6449 + 1.2816) \cdot 1.4}{0.5}\right)^2 = \left(\frac{2.9265 \cdot 1.4}{0.5}\right)^2 = (8.194)^2 \approx 67 \]
50 명에서 67 명으로 늘려야 power 0.90 달성.
11 양측 vs 한 측 검정
11.1 양측 (\(H_1: \mu \neq \mu_0\))
\(z_{1-\alpha/2}\) 사용 (예: 0.05 양측 → 1.96).
\[ n = \left(\frac{(z_{1-\alpha/2} + z_{1-\beta}) \sigma}{\mu_1 - \mu_0}\right)^2 \]
11.2 한 측 (\(H_1: \mu > \mu_0\) 또는 \(\mu < \mu_0\))
\(z_{1-\alpha}\) 사용 (예: 0.05 한 측 → 1.6449).
11.3 Schulz 의 권고
A-SCH11-2 에서 다룬 Schulz: 한 측 검정으로 표본 절감은 evidence 표준 약화. 권장: 양측 0.05.
12 사후 검정력 — 다시 무용성
연구 종료 후 관측 효과 로 power 재계산:
관측 결과:
관측 효과 = 0.4 (예상 0.5 보다 작음)
결과: p = 0.07 (미유의)
사후 power 계산:
관측 효과 0.4 사용 → power ≈ 0.65
결론?
"Power 부족이라 효과 못 잡음" — *순환 논리*
A-SCH11-2 와 동일한 비판. 사후 power 는 p 값과 함수. 새 정보 X.
대안: 관측 효과의 95 % CI 보고.
13 코드 예시 — Power 와 \(n\) 산정
import numpy as np
from scipy.stats import norm
# Woodward Ex 8.1 자료
mu0, mu1, sigma = 5.5, 6.0, 1.4
n, alpha = 50, 0.05
# Power 계산 (한 측)
z_alpha = norm.ppf(1 - alpha)
effect_z = (mu1 - mu0) / (sigma / np.sqrt(n))
power = norm.cdf(effect_z - z_alpha)
print(f"Ex 8.1: μ0={mu0}, μ1={mu1}, σ={sigma}, n={n}")
print(f"Power = Φ({effect_z:.4f} - {z_alpha:.4f}) = {power:.4f}")
# n 에 따른 power 곡선
print("\nn 에 따른 power:")
for n in [25, 50, 75, 100, 150, 200]:
eff_z = (mu1 - mu0) / (sigma / np.sqrt(n))
p = norm.cdf(eff_z - z_alpha)
print(f" n = {n:3d}: power = {p:.4f}")
# Power 0.80 또는 0.90 을 위한 n 산정
def n_for_power(target_power, mu0, mu1, sigma, alpha=0.05, two_sided=False):
z_a = norm.ppf(1 - alpha/2 if two_sided else 1 - alpha)
z_b = norm.ppf(target_power)
return ((z_a + z_b) * sigma / abs(mu1 - mu0))**2
n_80 = n_for_power(0.80, mu0, mu1, sigma)
n_90 = n_for_power(0.90, mu0, mu1, sigma)
n_99 = n_for_power(0.99, mu0, mu1, sigma)
print(f"\nPower 별 필요 n (한 측 α=0.05):")
print(f" Power 0.80: n = {np.ceil(n_80):.0f}")
print(f" Power 0.90: n = {np.ceil(n_90):.0f}")
print(f" Power 0.99: n = {np.ceil(n_99):.0f}")14 Power Curve 의 시각적 분석
Power \(1 - \beta\) 와 효과 크기의 관계:
Power
1.0 ┤ __________________
│ /
0.8 ┤- - - / - - - - - - - - - - -
│ /
0.5 ┤ /
│ /
0.0 ┤_/____________________________
0 δ_min δ_target δ
이 S 곡선 의 의미:
- \(\delta = 0\): Power = \(\alpha\) (Type I error 만)
- \(\delta\) 증가: Power 가 \(\alpha\) 에서 1 로 증가
- \(\delta_{\text{min}}\): Power 0.50 (절반 검출)
- \(\delta_{\text{target}}\): Power 0.80 (표준)
이 곡선이 MCID 결정의 시각 도구. “이 \(n\) 으로 어떤 효과까지 검출 가능?” 의 답.
14.1 Power Curve 그리기
import numpy as np
from scipy.stats import norm
mu0 = 5.5
sigma = 1.4
n = 50
alpha = 0.05
z_alpha = norm.ppf(1 - alpha)
# 효과 크기 범위
deltas = np.linspace(0, 1.5, 100)
powers = []
for delta in deltas:
eff_z = delta / (sigma / np.sqrt(n))
power = norm.cdf(eff_z - z_alpha)
powers.append(power)
# 출력
print(f"Power Curve (n={n}, σ={sigma}):")
for delta, power in zip(deltas[::20], powers[::20]):
print(f" δ={delta:.2f}: power = {power:.3f}")15 Effect Size 결정의 어려움
15.1 Cohen 의 관습 vs 분야 표준
Cohen 1988 의 관습:
| Cohen’s \(d\) | 효과 |
|---|---|
| 0.2 | small |
| 0.5 | medium |
| 0.8 | large |
분야 적용:
- 심리학: 정확
- 임상: 작은 효과 (d = 0.2) 도 임상적 의미
- A/B 테스트: d < 0.05 도 의미 (큰 표본 가정)
- 교육학: 보통 d > 0.4 가 의미
각 분야의 MCID 가 Cohen 관습과 다를 수 있음.
15.2 Pilot Study 의 효과 추정 함정
Pilot study (n=30) 효과 추정의 95 % CI 가 매우 넓음.
예: 진짜 효과 d = 0.3 일 때:
- Pilot 관측 효과: -0.2 ~ +0.8 사이 (변동성 큼)
- 극단값 인 0.7 을 main effect 가정 시 → main study 부족 검정력
해법: - Pilot 효과의 상한 사용 보수적 - 또는 문헌 효과 우선
16 Sequential Power Analysis
연구 진행 중 적응적 로 검정력 평가.
16.1 Conditional Power
interim 까지 자료 + 가정 효과로 최종 검정력.
def conditional_power(z_obs, info_fraction, target_alpha=0.05):
"""interim 의 conditional power"""
z_alpha = norm.ppf(1 - target_alpha/2)
info_remaining = 1 - info_fraction
# 가정 효과로 최종 z
z_final_under_h1 = z_obs * np.sqrt(1/info_fraction) # 정보 비율 보정
cp = norm.cdf(z_final_under_h1 - z_alpha * np.sqrt(1/info_fraction))
return cp16.2 사용 시점
- Interim 미유의 + low CP → 시험 중단 (무용성)
- Interim 미유의 + high CP → 진행 (효능 likely)
이 절차가 adaptive 시험 의 핵심 도구.
17 A/B 테스트의 Power Analysis 자동화
import numpy as np
from scipy.stats import norm
def ab_test_sample_size(baseline, mde_relative, alpha=0.05, power=0.80):
"""A/B 테스트 표본 크기 (관계식)"""
z_a = norm.ppf(1 - alpha/2)
z_b = norm.ppf(power)
p_c = baseline
p_t = baseline * (1 + mde_relative)
num = (z_a + z_b)**2 * (p_c*(1-p_c) + p_t*(1-p_t))
n_per = num / (p_t - p_c)**2
return int(np.ceil(n_per))
# A/B 테스트 시나리오
scenarios = [
{'baseline': 0.05, 'mde_relative': 0.10}, # 5 % → 5.5 %
{'baseline': 0.05, 'mde_relative': 0.05}, # 5 % → 5.25 %
{'baseline': 0.05, 'mde_relative': 0.02}, # 5 % → 5.1 %
{'baseline': 0.10, 'mde_relative': 0.10}, # 10 % → 11 %
{'baseline': 0.30, 'mde_relative': 0.05}, # 30 % → 31.5 %
]
for s in scenarios:
n = ab_test_sample_size(**s)
print(f"Baseline {s['baseline']*100:.1f} %, "
f"MDE +{s['mde_relative']*100:.1f} %: n = {n} / 그룹")이 코드가 A/B 테스트 표본 크기 계산기 의 핵심.
18 후속 — 두 그룹 평균 차이
다음 글 A-WOO8-2 는 두 그룹 평균 차이 의 표본 크기 (사례 2) 를 다룬다. 이는 임상시험·A/B 테스트의 연속 메트릭 비교 에 직접 적용.
19 관련 주제
선행 지식
후속 주제 (Phase A)
- A-WOO8-2 평균과 평균 차이
- A-WOO8-3 비율과 상대위험
다른 카테고리 연결