몇 명이 모이면 실험을 끝낼 수 있을까?
A/B 테스트나 설문 전에 표본 수를 정하는 방법. MDE와 검출력을 숫자 예시로 설명.
표본 수는 실험이 끝난 뒤에 세는 숫자가 아니라 시작 전에 정하는 숫자입니다. 이 숫자가 없으면 “유의하지 않다”가 무슨 뜻인지도 해석할 수 없습니다.
들어가며
지난 칼럼에서 결과를 매일 들여다보며 멈추면 아무 차이 없는 실험도 22.1%가 승리로 나온다고 했습니다. 대안은 “표본 수를 미리 정하고 그 시점에 한 번 판정한다”였습니다. 그러면 그 숫자는 어떻게 정할까요.
전환율 5%인 버튼을 5.5%로 올리는 개선이 있다고 해 보겠습니다. 이 개선을 확인하려면 각 그룹에 31,234명이 필요합니다. 이번 글에서는 이 숫자가 어디서 나오는지 보겠습니다. 트래픽이 정해져 있을 때 거꾸로 무엇을 계산하는지, 인원이 모자란 채로 끝낸 실험이 어떻게 비틀리는지도 다룹니다.
표본 수는 네 개의 숫자가 함께 정합니다
필요 인원은 통계가 혼자 정해 주지 않습니다. 아래 네 가지를 먼저 정해야 계산이 시작됩니다.
| 정할 것 | 뜻 | 보통 쓰는 값 | 누가 정하나 |
|---|---|---|---|
| 기저 전환율 | 지금 A안의 성적 | 최근 4주 실측값 | 데이터가 알려 준다 |
| 잡고 싶은 최소 차이 | 이만큼 좋아지면 채택하겠다는 선 | 상대 10~30% | 사업 판단 |
| 유의수준 (α) | 없는 차이를 있다고 할 확률의 상한 | 0.05 양측 | 관례, 결정의 무게에 맞춰 조정 |
| 검출력 (1−β) | 진짜 차이가 있을 때 잡아낼 확률 | 0.80 | 관례 |
그림 1. 표본 수 계산에 들어가는 네 가지 입력.
두 번째 줄이 핵심입니다. “얼마나 좋아지면 채택할 것인가”는 통계 문제가 아니라 사업 판단입니다. 개발 비용과 되돌리는 비용을 생각해서 정하는 선이고, 이 선을 정하지 않으면 나머지 계산이 불가능합니다.
네 숫자가 정해지면 필요 인원이 따라 나옵니다[1]. 반대로 트래픽이 이미 정해져 있다면 거꾸로 계산해서 “이 인원으로 잡을 수 있는 가장 작은 차이”를 구합니다. 이 값을 MDE(최소 검출 가능 효과, minimum detectable effect)라고 부릅니다.
표본 수는 통계가 정해 주는 숫자가 아니라, 무엇을 얼마나 확실하게 잡고 싶은지 먼저 정해야 나오는 숫자입니다.
5%를 5.5%로 올리는 개선, 몇 명이 필요할까요
기저 전환율 5%, 유의수준 0.05 양측, 검출력 80%로 고정하고 잡고 싶은 차이만 바꿔 가며 계산해 보겠습니다.
import numpy as np
from scipy.stats import norm
def n_per_group(p1, p2, alpha=0.05, power=0.80):
"""두 비율을 비교할 때 그룹당 필요한 인원 (양측 검정)"""
za, zb = norm.isf(alpha / 2), norm.isf(1 - power)
pbar = (p1 + p2) / 2
num = (za * np.sqrt(2 * pbar * (1 - pbar)) + zb * np.sqrt(p1 * (1 - p1) + p2 * (1 - p2))) ** 2
return num / (p2 - p1) ** 2
for rel in (0.05, 0.10, 0.20, 0.50):
p2 = 0.05 * (1 + rel)
print(f"상대 +{rel*100:>2.0f}% (5.00% -> {p2*100:.2f}%) : 그룹당 {np.ceil(n_per_group(0.05, p2)):>9,.0f}명")
# 상대 + 5% (5.00% -> 5.25%) : 그룹당 122,124명
# 상대 +10% (5.00% -> 5.50%) : 그룹당 31,234명
# 상대 +20% (5.00% -> 6.00%) : 그룹당 8,158명
# 상대 +50% (5.00% -> 7.50%) : 그룹당 1,471명
| 잡고 싶은 개선 | 전환율 | 차이 | 그룹당 필요 인원 | 하루 2,000명이면 |
|---|---|---|---|---|
| 상대 +50% | 5.00% → 7.50% | +2.50%p | 1,471명 | 2일 |
| 상대 +30% | 5.00% → 6.50% | +1.50%p | 3,780명 | 4일 |
| 상대 +20% | 5.00% → 6.00% | +1.00%p | 8,158명 | 9일 |
| 상대 +10% | 5.00% → 5.50% | +0.50%p | 31,234명 | 32일 |
| 상대 +5% | 5.00% → 5.25% | +0.25%p | 122,124명 | 123일 |
그림 2. 기저 전환율 5%에서 잡고 싶은 차이별 필요 인원. 맨 오른쪽은 하루 방문자 2,000명을 두 그룹에 절반씩 나눌 때의 기간입니다.
표를 아래에서 위로 읽어 보십시오. 잡고 싶은 차이가 절반이 될 때마다 필요 인원은 약 4배가 됩니다. 상대 +20%에서 +10%로 목표를 낮추면 8,158명이 31,234명이 되고, 기간은 9일에서 32일로 늘어납니다. 필요 인원이 차이의 제곱에 반비례하기 때문입니다.
작은 개선을 확인하는 비용은 선형이 아니라 제곱으로 늘어납니다.
거꾸로 묻기, 우리 트래픽으로는 무엇을 잡을 수 있나
현실에서는 인원을 마음대로 늘릴 수 없습니다. 이럴 때는 질문을 뒤집습니다. “이 인원으로 잡을 수 있는 가장 작은 차이는 얼마인가”, 즉 MDE를 구합니다.
| 그룹당 인원 | MDE (상대) | 전환율로 보면 | 차이 |
|---|---|---|---|
| 1,000명 | 62.0% | 5.00% → 8.10% | +3.10%p |
| 5,000명 | 25.9% | 5.00% → 6.29% | +1.29%p |
| 20,000명 | 12.6% | 5.00% → 5.63% | +0.63%p |
| 50,000명 | 7.9% | 5.00% → 5.39% | +0.39%p |
| 100,000명 | 5.5% | 5.00% → 5.28% | +0.28%p |
그림 4. 그룹당 인원별 MDE. 기저 전환율 5%, 유의수준 0.05 양측, 검출력 80% 기준입니다.
그룹당 5,000명을 모을 수 있다면 이 실험의 MDE는 상대 25.9%입니다. 버튼 색을 바꿔서 전환율이 26% 오를 가능성은 높지 않습니다. 그렇다면 이 실험은 돌리기 전에 결과가 거의 정해져 있습니다. 유의하게 나오지 않을 것이고, 그때 보고서에 “차이가 없었다”고 적으면 사실이 아닙니다. 정확한 문장은 “이 인원으로는 확인할 수 없었다”입니다.
MDE를 먼저 계산하면 세 가지 선택지가 보입니다. 기간을 늘리거나, 더 큰 변화를 시도하거나, 실험 대신 다른 방법으로 판단하는 것입니다. 어느 쪽이든 돌려 보고 나서 아는 것보다 낫습니다.
MDE보다 작은 효과를 노리는 실험은 시작하기 전에 이미 결론을 내지 못하는 실험입니다.
인원이 모자란 채 유의하게 나오면 생기는 일
여기까지는 “유의하게 안 나온다”는 이야기였습니다. 더 성가신 문제는 그 반대쪽에 있습니다. 인원이 모자라도 가끔은 유의하게 나오는데, 그렇게 나온 결과는 효과를 부풀립니다.
진짜로 상대 +10% 개선이 존재하는 상황을 가정하고, 인원만 바꿔 가며 4만 번씩 실험해 보았습니다.
| 그룹당 인원 | 검출력 (실측) | 유의하게 이긴 실험의 평균 추정 개선 | 실제의 몇 배 |
|---|---|---|---|
| 3,000명 | 14.1% | 31.4% | 3.1배 |
| 8,000명 | 29.8% | 19.0% | 1.9배 |
| 31,000명 | 79.9% | 11.4% | 1.1배 |
그림 5. 진짜 효과가 상대 +10%일 때, 인원별로 4만 번 실험한 결과. 설명을 위해 만든 가상 실험입니다.
그룹당 3,000명짜리 실험에서 유의하게 이긴 경우, 평균 추정 개선은 31.4%였습니다. 실제 효과의 3.1배입니다. 분포를 그려 보면 이유가 보입니다.
인원이 적으면 추정치가 넓게 흩어집니다. 그 넓은 분포에서 유의 기준을 넘는 것은 오른쪽 끝뿐입니다. 유의한 결과만 모아 보고하면 그 끝만 골라 보는 셈이 됩니다. 같은 실험에서 유의하게 나온 것의 1.8%는 방향까지 반대였습니다. B가 사실 더 좋은데 A가 유의하게 이긴 것입니다.
실무에서 이 문제는 숫자를 곱할 때 드러납니다. 작은 실험에서 나온 “+31% 개선”을 연간 매출에 그대로 곱하면, 실제로는 세 배 부풀린 계획을 세우게 됩니다. 이런 과대추정은 검출력이 낮을수록 커집니다[2].
인원이 모자란 실험은 틀린 답만 주는 것이 아니라, 맞힐 때조차 효과를 부풀려 줍니다.
실험을 시작하기 전에 적어 둘 것
계산 자체는 함수 하나입니다. 중요한 것은 결과를 보기 전에 적어 두는 일입니다.
| 적을 것 | 예시 | 이유 |
|---|---|---|
| 기저 전환율 | 최근 4주 5.0% | 계산의 출발점 |
| 잡고 싶은 최소 차이 | 상대 +20% (5.0% → 6.0%) | 채택 기준을 미리 못 박는다 |
| 유의수준과 검출력 | 0.05 양측, 80% | 결과를 보고 바꾸지 않기 위해 |
| 그룹당 필요 인원 | 8,158명 | 언제 끝낼지가 여기서 정해진다 |
| 예상 기간 | 하루 2,000명 기준 9일 | 일정 합의 |
| 판정 시점 | 9일차에 한 번 | 훔쳐보기를 막는다 |
| 중단 규칙 | 배정 비율 이상, 오류율 급등일 때만 | 멈추는 기준을 유불리에 두지 않는다 |
그림 7. 실험 설계서에 들어갈 최소 항목.
이 표를 실험 시작 전에 채우면 지난 칼럼의 훔쳐보기와 이번 칼럼의 과대추정을 한 번에 막습니다. 채우다가 막히는 칸이 있다면, 그 칸이 바로 아직 합의되지 않은 부분입니다.
실험 설계서는 통계 문서가 아니라 결과를 보기 전에 맺는 합의문입니다.
나가며
- 전환율 5%에서 상대 +10% 개선을 검출력 80%로 확인하려면 그룹당 31,234명이 필요합니다. 잡고 싶은 차이를 절반으로 낮추면 인원은 약 4배가 됩니다.
- 트래픽이 정해져 있다면 거꾸로 MDE를 구하십시오. 그룹당 5,000명의 MDE는 상대 25.9%입니다. 그보다 작은 효과를 노리는 실험은 시작 전에 이미 답을 내지 못합니다.
- 인원이 모자라면 유의하게 나온 결과조차 효과를 부풀립니다. 그룹당 3,000명 실험에서 유의하게 이긴 경우의 평균 추정 개선은 실제의 3.1배였습니다.
참고
- Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences (2nd ed.). Lawrence Erlbaum Associates.
- Gelman, A., & Carlin, J. (2014). Beyond power calculations: Assessing Type S (sign) and Type M (magnitude) errors. Perspectives on Psychological Science, 9(6), 641-651. https://doi.org/10.1177/1745691614551642
본문의 모든 수치는 설명을 위해 만든 가상 실험을 직접 계산하고 시뮬레이션한 값입니다. 필요 인원은 두 비율 비교의 합동분산 공식 n = (zα/2√(2p̄(1−p̄)) + zβ√(p₁(1−p₁)+p₂(1−p₂)))² / (p₂−p₁)² 으로 계산했고, 유의수준 0.05 양측과 검출력 80%를 썼습니다. MDE는 같은 식을 이분법으로 역산한 값입니다. 그림 5와 그림 6의 시뮬레이션은 조건당 4만 회, 시드 2026 기준입니다. 소수점 자리에서 반올림했으므로 계산기마다 한두 명 차이가 날 수 있습니다. 코드 실행 환경은 Python 3.12, NumPy 2.5.3, SciPy 1.18.1입니다.