1 도입 — 이진 outcome 의 흔함
A/B 테스트의 가장 흔한 outcome 은 이진 — 클릭/미클릭, 구매/미구매, 전환/미전환. 임상에서도 사망/생존, 회복/지속 등 이진 자료가 빈번. 이 글은 (a) 단일 비율, (b) 두 비율 차이의 표본 크기를 다룬다.
2 사례 3 — 단일 비율
2.1 공식
\(H_0: p = p_0\) vs \(H_1: p = p_1\) 검정.
\[ n = \frac{(z_{1-\alpha/2} \sqrt{p_0(1-p_0)} + z_{1-\beta} \sqrt{p_1(1-p_1)})^2}{(p_1 - p_0)^2} \]
이항 자료의 정규 근사 사용.
2.2 사례 — 흡연율 검사
지역 흡연율이 15 % 라고 알려져 있음. 새 정책 후 10 % 로 감소했는지 검정. \(\alpha = 0.05\) 양측, power = 0.80.
- \(p_0 = 0.15\), \(p_1 = 0.10\)
- \(z_{0.975} = 1.96\), \(z_{0.80} = 0.84\)
\[ n = \frac{(1.96 \sqrt{0.15 \cdot 0.85} + 0.84 \sqrt{0.10 \cdot 0.90})^2}{(0.10 - 0.15)^2} \]
\[ = \frac{(1.96 \cdot 0.357 + 0.84 \cdot 0.300)^2}{0.0025} = \frac{(0.700 + 0.252)^2}{0.0025} = \frac{0.906}{0.0025} \approx 363 \]
363 명 필요.
3 사례 4 — 두 비율 차이 (가장 흔한 사례)
3.1 공식
\(H_0: p_1 = p_2\) vs \(H_1: p_1 \neq p_2\).
일반 공식 (가장 흔한 형태):
\[ n_{\text{per group}} = \frac{(z_{1-\alpha/2} + z_{1-\beta})^2 [p_1(1-p_1) + p_2(1-p_2)]}{(p_1 - p_2)^2} \]
풀링 분산 공식 (귀무가설 하 분산):
\[ n_{\text{per group}} = \frac{(z_{1-\alpha/2} \sqrt{2 \bar{p}(1-\bar{p})} + z_{1-\beta} \sqrt{p_1(1-p_1) + p_2(1-p_2)})^2}{(p_1 - p_2)^2} \]
여기서 \(\bar{p} = (p_1 + p_2)/2\).
두 공식이 비슷한 결과. 풀링 공식이 약간 더 정확.
3.2 사례 — 신약 임상시험
대조군 사망률 \(p_C = 0.15\), 신약으로 \(p_T = 0.10\) (33 % 상대 감소). \(\alpha = 0.05\) 양측, power = 0.80.
\[ n_{\text{per}} = \frac{(1.96 + 0.84)^2 [0.10 \cdot 0.90 + 0.15 \cdot 0.85]}{(0.10 - 0.15)^2} \]
\[ = \frac{7.84 \cdot 0.2175}{0.0025} = \frac{1.7052}{0.0025} \approx 682 \]
각 그룹 682 명, 총 1364 명.
4 베이스라인의 영향
같은 상대 효과 (RR = 0.67) 라도 베이스라인 \(p_C\) 에 따라 \(n\) 이 변한다.
| \(p_C\) | \(p_T\) (RR=0.67) | \(n_{\text{per}}\) |
|---|---|---|
| 0.5 | 0.335 | 91 |
| 0.3 | 0.20 | 168 |
| 0.15 | 0.10 | 682 |
| 0.05 | 0.033 | 2362 |
| 0.01 | 0.0067 | 12000 |
베이스라인이 작을수록 같은 상대 효과 검출에 훨씬 큰 표본 필요. A/B 테스트의 낮은 베이스라인 클릭률 이 큰 표본을 요구하는 이유.
이항 자료의 분산은 \(p(1-p)\). 이는:
- \(p = 0.5\) 에서 최대 (0.25)
- \(p = 0.05\) 에서 작음 (0.0475)
작은 \(p\) 의 분산 이 작아 보이지만, signal-to-noise ratio 관점에서는 다르다.
- \(p = 0.5\) → \(p = 0.4\) (절대 0.1, 상대 20 % 감소)
- \(p = 0.05\) → \(p = 0.04\) (절대 0.01, 상대 20 % 감소)
같은 상대 감소지만 절대 차이가 50 배 작음. 검정 통계량이 절대 차이 에 비례하므로, 작은 베이스라인에서 훨씬 큰 표본 필요.
A/B 테스트의 함정: “1 % 클릭률에서 20 % lift 검출” 같은 작은 절대 효과는 수십만 명 표본 요구. 이 사실이 큰 IT 회사만 작은 효과를 검출할 수 있는 이유.
5 A/B 테스트의 표본 크기 계산기
대부분의 A/B 테스트 도구가 이 공식을 자동화:
| 도구 | 입력 |
|---|---|
| Optimizely Sample Size | 베이스라인 전환율, 검출 효과, α, power |
| Evan Miller | 동일 |
| G*Power | 두 비율 검정 |
Python statsmodels |
NormalIndPower, proportion_effectsize |
5.1 Cohen’s \(h\) 사용
A/B 테스트 도구가 자주 사용하는 Cohen’s \(h\):
\[ h = 2 (\arcsin\sqrt{p_1} - \arcsin\sqrt{p_2}) \]
이는 비율 차이를 표준화 한 효과 크기. 베이스라인에 덜 의존.
| Cohen’s \(h\) | 효과 크기 |
|---|---|
| 0.20 | small |
| 0.50 | medium |
| 0.80 | large |
표본 크기:
\[ n_{\text{per}} = \left(\frac{z_{1-\alpha/2} + z_{1-\beta}}{h}\right)^2 \]
이 공식은 베이스라인 무관 형태로 표본 크기를 표현.
6 비대칭 배정
비대칭 비율 \(r = n_T / n_C\) 일 때:
\[ n_C = \frac{(1 + 1/r)(z_{1-\alpha/2} + z_{1-\beta})^2 \bar{p}(1-\bar{p})}{(p_1 - p_2)^2} \]
균형 설계 (\(r = 1\)) 에서 \(1 + 1/r = 2\). 비대칭 시 검정력 손실.
7 상대위험 (RR) 직접 사용
RR 형태로 표본 크기 산정:
\[ n_{\text{per}} = \frac{(z_{1-\alpha/2} + z_{1-\beta})^2 [(1/p_C - 1) + 1/(R \cdot p_C) - 1]}{(\ln R)^2} \]
여기서 \(R\) 은 RR. 로그 변환으로 RR 직접 모형.
8 코드 예시 — 비율과 RR
import numpy as np
from scipy.stats import norm
from statsmodels.stats.power import NormalIndPower
from statsmodels.stats.proportion import proportion_effectsize
# 일반 공식
def n_two_proportions(p1, p2, alpha=0.05, power=0.80, two_sided=True):
z_a = norm.ppf(1 - alpha/2 if two_sided else 1 - alpha)
z_b = norm.ppf(power)
num = (z_a + z_b)**2 * (p1*(1-p1) + p2*(1-p2))
return num / (p1 - p2)**2
# 풀링 분산 공식
def n_two_proportions_pooled(p1, p2, alpha=0.05, power=0.80, two_sided=True):
z_a = norm.ppf(1 - alpha/2 if two_sided else 1 - alpha)
z_b = norm.ppf(power)
p_bar = (p1 + p2) / 2
num = (z_a * np.sqrt(2*p_bar*(1-p_bar)) +
z_b * np.sqrt(p1*(1-p1) + p2*(1-p2)))**2
return num / (p1 - p2)**2
# 사례
print("신약 시험 (p_C=0.15, p_T=0.10):")
n1 = n_two_proportions(0.10, 0.15)
n2 = n_two_proportions_pooled(0.10, 0.15)
print(f" 일반: n_per = {np.ceil(n1):.0f}")
print(f" 풀링: n_per = {np.ceil(n2):.0f}")
# 베이스라인 영향
print("\nBaseline 영향 (RR = 0.67 고정):")
for p_c in [0.50, 0.30, 0.15, 0.05, 0.01]:
p_t = p_c * 0.67
n = n_two_proportions(p_c, p_t)
print(f" p_C = {p_c:.2f}, p_T = {p_t:.4f}: n_per = {np.ceil(n):.0f}")
# Cohen's h 사용
print("\nA/B 테스트 클릭률 (statsmodels):")
power_analysis = NormalIndPower()
for baseline in [0.50, 0.10, 0.02]:
for relative_lift in [0.05, 0.10, 0.20]:
target = baseline * (1 + relative_lift)
h = proportion_effectsize(baseline, target)
n = power_analysis.solve_power(effect_size=h, alpha=0.05, power=0.80)
print(f" baseline = {baseline:.2f}, lift = {relative_lift:.2f}, h = {h:.3f}: n_per ≈ {int(n)}")9 사례 — A/B 테스트 표본 크기
9.1 시나리오 1 — 큰 베이스라인 + 큰 효과
- 베이스라인 30 % 클릭률
- 검출 효과: 5 % 절대 증가 (35 %)
- α = 0.05, power = 0.80
- \(n_{\text{per}}\) ≈ 약 1300
9.2 시나리오 2 — 작은 베이스라인 + 작은 효과
- 베이스라인 1 % 전환율
- 검출 효과: 0.1 % 절대 증가 (1.1 %)
- α = 0.05, power = 0.80
- \(n_{\text{per}}\) ≈ 약 78000
9.3 함의
A/B 테스트의 작은 효과 검출 은 매우 큰 표본 필요. 따라서:
- 큰 IT 회사 (Google, Meta) 만 작은 효과 검출 가능
- 작은 회사는 큰 효과 우선 또는 기간 확대
10 비율 검정의 변형
10.1 Likelihood Ratio Test (LRT)
이항 자료의 정확한 표본 크기는 Wald 또는 Score 검정 통계량 기반:
Wald: \[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}_1(1-\hat{p}_1)/n_1 + \hat{p}_2(1-\hat{p}_2)/n_2}} \]
Score (귀무가설 분산): \[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\bar{p}(1-\bar{p})(1/n_1 + 1/n_2)}} \]
여기서 \(\bar{p} = (n_1\hat{p}_1 + n_2\hat{p}_2)/(n_1+n_2)\).
Score 검정이 일반적으로 작은 표본에서 더 정확.
10.2 비율의 정확 검정
매우 작은 표본 또는 극단적 비율 에서 정규 근사 부정확. Fisher’s exact test 사용 (A-MAX2-1 참조).
10.3 Wilson Score Interval
표본 비율 CI 의 Wilson score (Newcombe-Wilson). Wald CI 보다 작은 비율 에서 정확.
from statsmodels.stats.proportion import proportion_confint
n, x = 100, 5 # 5 % 비율
ci_wald = proportion_confint(x, n, method='normal')
ci_wilson = proportion_confint(x, n, method='wilson')
ci_exact = proportion_confint(x, n, method='beta') # Clopper-Pearson
print(f"Wald CI: ({ci_wald[0]:.4f}, {ci_wald[1]:.4f})")
print(f"Wilson CI: ({ci_wilson[0]:.4f}, {ci_wilson[1]:.4f})")
print(f"Exact CI: ({ci_exact[0]:.4f}, {ci_exact[1]:.4f})")작은 베이스라인에서는 Wilson 또는 exact 권장.
11 Stratified Randomization 의 효과
사전 정의된 층 (stratum) 내에서 무작위 배정. 예: 신규/기존 사용자 각각 50:50.
장점: - 배정 균형 보장 (작은 표본에서 중요) - 분석 시 층화 분산 추정 → 검정력 향상
표본 크기 영향: - 일반적으로 5~15 % 절감 (층 효과에 의존) - 큰 시험에서는 무시할 수준
11.1 사례 — 사용자 segment 균형
A/B 테스트에서 사용자가 무작위 배정 시:
- 단순 무작위: 신규 사용자가 우연히 한쪽에 더 많을 수 있음
- Stratified: 신규 50 명, 기존 950 명 등 사전 결정된 비율
이 절차가 baseline imbalance 회피.
12 Cluster Randomization 의 표본 크기
A-WOO8-5 에서 자세히. 비율 검정의 cluster 보정:
\[ n_{\text{cluster}} = n_{\text{simple}} \cdot [1 + (m - 1) \cdot \text{ICC}] \]
ICC 가 비율 자료에서:
- 0.01 ~ 0.05 (대부분의 의료 cluster)
- 0.05 ~ 0.20 (학교, 강한 클러스터)
12.1 사례 — 학교 단위 백신 시험
설계: 학교 단위 무작위 배정. 학교당 평균 200 명 학생.
ICC = 0.03 (감염병 클러스터 효과)
DEFF = 1 + (200-1) * 0.03 = 6.97
단순 표본 산정: 5000 / 그룹
Cluster 보정: 5000 * 6.97 ≈ 34850 / 그룹
→ 학교 수: 34850 / 200 ≈ 174 / 그룹
매우 큰 영향. Cluster 시험 설계의 주의 필수.
13 A/B 테스트 표본 크기 도구 비교
| 도구 | 특징 | 적합 시점 |
|---|---|---|
| Optimizely Calculator | 단순, 웹 기반 | 빠른 추정 |
| Evan Miller | 학술적 정확 | 정밀 분석 |
| G*Power | 다양한 검정 | 다중 outcome |
| Python statsmodels | 자동화 가능 | 시뮬레이션 |
| R pwr | 표준 도구 | 학술 보고 |
| Optimizely Stats Engine | Sequential | Always-valid inference |
| Microsoft ExP | Big data 처리 | 대규모 운영 |
각 도구의 표본 크기 차이 가 약간 있음 (반올림, 가정 차이). 정확한 비교 시 공통 가정 사용 검증.
14 두 비율 검정의 함정
A/B 테스트의 흔한 시나리오:
가정:
베이스라인 1 % 클릭률
검출 효과: 0.1 % 절대 증가 (10 % relative lift)
α = 0.05, power = 0.80
표본 크기 산정: \[ n = \frac{(1.96 + 0.84)^2 [0.011 \cdot 0.989 + 0.01 \cdot 0.99]}{(0.001)^2} \approx 78400 \]
각 그룹 78400 명, 총 157000 명. 이 큰 표본이 작은 변화 검출 의 비용.
대안: - MCID 상향 — 0.5 % lift 이상만 의미 - 기간 확대 — 1 주일 대신 1 개월 - Stratified design — 높은 베이스라인 segment 우선 - Bayesian sequential — 적응적 분석
작은 베이스라인 + 작은 lift 의 결합이 근본적 한계.
15 후속 — Case-control 표본 크기
다음 글 A-WOO8-4 는 case-control 시험 의 표본 크기를 다룬다. matched 사례 포함.
16 관련 주제
선행 지식
후속 주제 (Phase A)
- A-WOO8-4 Case-control
- A-WOO8-5 복잡 표집 + 결론
다른 카테고리 연결