"이 button 색 바꿨더니 conversion 5% ↑" — 진짜? 우연일 가능성? 통계의 마법으로 답하는 게 A/B test. 그러나 "peeking", randomization 의 잘못, network effect 등 함정이 즐비. 이 가이드는 A/B test 의 정확한 메커니즘과 함정을 정리한다.
Randomization — 핵심 마법
naive 비교:
v1 (전 주 데이터): conversion 3.5%
v2 (이번 주 데이터): conversion 4.0%
→ 0.5% 좋아짐?
문제:
- 시간대 차이 (주말 vs 평일)
- 외부 이벤트 (마케팅 캠페인, 명절)
- user mix 변화 (새 user 비율)
- 계절성
randomization 의 답:
같은 시점에 user 무작위로 두 group:
- control (A): v1 노출, 50%
- treatment (B): v2 노출, 50%
→ 두 group 의 평균이 (이론적으로) 같은 분포에서 sample
→ 차이는 v1/v2 의 영향 + random noise
→ statistical test 로 noise 와 진짜 차이 구분Statistical Significance — p-value
H0 (null hypothesis): "v1 = v2, 차이 없음"
H1 (alternative): "v1 ≠ v2, 차이 있음"
p-value = "H0 가 참일 때, 관찰된 차이 또는 더 큰 차이가 우연으로 발생할 확률"
예:
observed: v2 가 conversion 0.5% 높음
p-value = 0.03
해석: "v1 = v2 라면 이 정도 차이가 우연으로 발생할 확률 3%"
→ "v1 ≠ v2" 라고 결론 (significance level 5% 기준)
흔한 함정:
- p-value < 0.05 = "v2 가 더 좋다" 의 95% 확신? — 정확히 X
- 실제 의미: "H0 가 참일 때 이 차이 또는 더 큰 차이가 발생할 확률"
≠ "v2 가 더 좋을 확률"Peeking — 가장 큰 함정
A/B test 진행 중 매일 p-value 확인:
Day 1: p = 0.4
Day 3: p = 0.2
Day 5: p = 0.07
Day 7: p = 0.04 ← "유의미하다! 종료!"
문제: 매번 보면서 "유의미할 때까지" 기다리면 → 우연으로 통과할 확률 ↑
1 회 test: 5% 우연 통과 (significance level)
매일 보면서 1 주일: ~25% 우연 통과
매일 보면서 1 달: ~50% 우연 통과 (false positive)
해결:
1. 미리 sample size 정함 + 그 시점에만 결과 봄
2. Sequential testing (Wald's SPRT) — peek 허용 + threshold 조정
3. Bayesian — credible interval 의 직접 해석 (조심)
→ Netflix, Meta 등 큰 회사가 sequential / mSPRT 같은 advanced 사용.
대부분 작은 팀은 "미리 sample size 정하고 끝까지 wait" 으로 충분.Sample Size 계산
적절한 sample size 결정:
- baseline conversion: 3% (현재)
- minimum detectable effect (MDE): 0.3% (의미 있는 차이)
- significance level (α): 0.05
- power (1-β): 0.8 (80% 확률로 진짜 효과 발견)
공식 (대략):
n = 16 × baseline × (1-baseline) / MDE²
= 16 × 0.03 × 0.97 / 0.003²
≈ 51,733 per group
→ 약 10 만 user 필요. trafic 적으면 더 큰 effect 만 detect 가능.
도구:
- Evan Miller's calculator (online)
- Python statsmodels.stats.power
- R pwr package
trade-off:
- MDE 작게 (0.1%) → sample size 폭증
- MDE 크게 (1%) → 작은 효과 미발견Sequential Testing — 정상적 peek 허용
전통 A/B 는 "고정 sample size + 끝에 결정". sequential test 는 매 시점에
"계속 / 종료 / 결정 보류" 결정 가능 — statistical 정합.
도구:
- mSPRT (Sequential Probability Ratio Test) — Optimizely, Netflix
- Always Valid Inference — Microsoft
- Group Sequential Testing — 일정 시점마다 peek
- Bayesian early stopping — credible interval based
이점:
- 효과 큰 test 는 일찍 종료 → resource 절약
- 효과 작은 test 는 충분히 대기
- peek 의 statistical 정합 (FWER 보존)
도입:
- 가장 단순: 1주마다 5회 peek 허용 + α/5 = 0.01 으로 보수적
- 정형 mSPRT 는 더 efficient 이지만 구현 복잡Multi-armed Bandit — 다른 접근
A/B 의 약점: "test 진행 중에는 loser 에도 traffic 50%".
→ 명확히 나쁜 variant 인데도 sample 다 채울 때까지 그 traffic 손실.
Multi-armed bandit:
- 좋은 variant 의 traffic 자동 증가
- explore (다른 variant 도 가끔 노출) vs exploit (가장 좋은 것 위주)
- Thompson sampling 알고리즘이 표준
vs A/B:
- A/B: "확신 후 변경" — 학습 cost 크지만 통계 정합 강력
- Bandit: "학습하면서 활용" — opportunity cost ↓ but 통계적 분석 약함
사용:
- A/B: 새 feature 의 long-term 효과 측정 (causal)
- Bandit: 짧은 캠페인 / 추천 시스템 / headline 선택 (즉시 가치)흔한 함정
- peeking + 조기 종료 — false positive 폭증. 미리 sample size + sequential test.
- network effect — A 의 user 가 B 의 user 와 상호작용 (social network, marketplace) → A 와 B 의 효과 섞임. cluster-randomized 또는 다른 unit 으로 randomize.
- simpson's paradox — 전체로는 A 가 좋아 보이지만 모든 segment 에서는 B 가 좋음. segment 별 분석 + 가중 평균.
- multiple testing — 10 metric 동시 검정 → 1개는 우연으로 유의미. Bonferroni correction (α/n) 또는 primary metric 선언.
- conversion 외 metric 무시 — A 가 conversion 좋아도 retention 나쁠 수 있음. North Star metric + guardrail.
마무리
A/B testing 의 본질 — randomization 으로 confounder 제거 + statistical test 로 noise 와 진짜 차이 구분. peeking / multiple testing / network effect 등 함정 많음.
실용 — 처음엔 단순 (fixed sample, 1 metric, no peek). 큰 회사 면 Optimizely / VWO 같은 platform 또는 자체 platform + sequential test. ML model 비교는 A/B 또는 shadow 둘 다 검토.