이 실험 며칠 돌려야 하나: A/B 테스트 표본 크기와 검정력
들어가며
실험 세팅이 끝났다. 새 결제 버튼 디자인을 만들었고, 기존 버튼과 절반씩 나눠 보여주기로 했다. 트래킹도 붙였다. 다 준비됐는데, 릴리스 직전에 PM이 묻는다.
PM: “이거 며칠 돌려요?” 디자이너: “글쎄요, 한 일주일이면 되지 않을까요?” PM: “일주일이면 결론 나요? 어떻게 알아요?”
이 자리에서 정확히 답하는 사람이 드물다. 일주일이라는 숫자는 대개 감이다. 실험을 너무 짧게 끊으면 진짜 차이가 있어도 못 잡고, 너무 길게 끌면 열등한 디자인에 사용자를 오래 노출시킨다. 그 사이 어딘가에 적정한 기간이 있는데, 그걸 감으로 찍는다.
그런데 이 질문에는 계산으로 나오는 답이 있다. 며칠 돌려야 하는지는 몇 명을 모아야 하는지의 문제고, 몇 명을 모아야 하는지는 네 개의 값으로 정해진다. 이 글에서는 그 네 개가 무엇인지, 그중 왜 검정력(statistical power)이라는 개념을 먼저 이해해야 하는지, 그리고 R로 실제 표본 크기를 어떻게 뽑는지 정리한다. 마지막엔 들어가며의 질문으로 돌아와 실제 숫자를 낸다.
검정력이라는 감도
먼저 검정력이 뭔지부터 잡자. 검정력은 진짜 차이가 있을 때 그 차이를 통계적으로 잡아낼 확률이다. 조금 더 정확히 말하면, 대립가설이 참일 때 귀무가설(null hypothesis)을 기각할 확률이다. 실무에서는 보통 0.80을 목표로 잡는다. 진짜 차이가 있다면 열 번 중 여덟 번은 잡아낸다는 뜻이다.
금속 탐지기로 비유하면 쉽다. 모래밭에 동전이 하나 묻혀 있다고 하자. 여기서 동전은 두 디자인 사이의 진짜 차이다. 검정력은 이 탐지기의 감도다. 감도가 좋은 탐지기(검정력 0.80)는 묻힌 동전 위를 지나가면 대개 삑 하고 울린다. 감도가 나쁜 탐지기(검정력 0.30)는 동전 위를 지나가도 조용할 때가 많다. 동전이 없어서가 아니라 탐지기가 둔해서 못 잡는 거다.
여기서 두 가지 실수가 갈린다. 하나는 동전이 없는데 삑 울리는 경우다. 진짜 차이가 없는데 있다고 판정하는 거짓 경보다. 이걸 1종 오류(type I error)라 부르고, 그 확률을 유의수준(significance level) α로 잡는다. 보통 0.05다. 다른 하나는 동전이 있는데 조용한 경우다. 진짜 차이가 있는데 못 잡는 놓침이다. 이걸 2종 오류(type II error)라 부르고 그 확률을 β로 쓴다. 검정력은 바로 이 놓침의 반대편, 1 − β다. β가 0.20이면 검정력은 0.80이다.
들어가며의 실험으로 돌아오면, 검정력이 부족한 실험은 감도 나쁜 탐지기를 들고 모래밭을 걷는 것과 같다. 새 버튼이 정말 더 나은데도 무승부로 끝난다. 그리고 무승부라는 결과만 보면 진짜 차이가 없어서인지, 표본이 작아 못 잡은 건지 구분이 안 된다. 실험을 며칠 돌릴지 미리 계산하는 이유가 여기 있다. 감도를 충분히 확보한 뒤에 모래밭을 걸으려는 거다.
표본 크기를 정하는 네 개의 손잡이
필요한 표본 크기는 네 개의 값으로 정해진다. 이 넷을 손잡이라고 부르자. 어느 하나를 돌리면 필요한 표본이 늘거나 준다.
첫째 손잡이는 유의수준 α다. 거짓 경보를 얼마나 허용할지다. 보통 0.05로 두는데, 더 엄격하게 0.01로 조이면 삑 소리에 더 확실한 근거를 요구하는 셈이라 표본이 더 필요해진다.
둘째 손잡이는 검정력이다. 앞에서 본 탐지기 감도다. 0.80에서 0.90으로 올리면 진짜 차이를 놓칠 확률을 20%에서 10%로 줄이는 대신, 그만큼 표본을 더 모아야 한다.
셋째 손잡이는 기저 전환율(baseline conversion rate)이다. 지금 버튼의 전환율이 얼마인지다. 전환율이 50% 근처일 때 응답이 가장 흩어지고, 10%처럼 한쪽으로 치우칠수록 흩어짐이 줄어든다. 이 흩어짐의 정도가 표본 크기 계산에 그대로 들어간다. 그래서 지금 전환율을 알아야 계산을 시작할 수 있다.
넷째 손잡이가 제일 중요하다. 최소 검출 효과, 줄여서 MDE(minimum detectable effect)다. 우리가 놓치기 싫은 차이의 최소 크기를 미리 정하는 값이다. 예를 들어 전환율이 2%p 넘게 오르는 변화라면 반드시 잡고 싶다고 정하면, MDE가 2%p다. 그보다 작은 차이는 이번 실험에서 못 잡아도 괜찮다고 선을 긋는 거다.
MDE가 왜 제일 중요하냐면, 표본 크기를 가장 크게 좌우하기 때문이다. 잡고 싶은 차이를 절반으로 줄이면 필요한 표본은 대략 네 배로 뛴다. 작은 바늘일수록 더 촘촘한 그물이 필요한 것과 같다. 그런데 여기서 MDE를 아예 안 정하고 시작하는 실수가 흔하다. 아무리 작은 차이라도 다 잡고 싶다는 마음으로 실험을 열면, 필요한 표본이 사실상 무한대로 발산한다.
이 지점이 p-value 글에서 다룬 효과 크기 이야기와 정확히 맞닿는다. 표본을 아주 크게 모으면 통계적으로는 0.2%p 차이도 유의하게 잡힌다. 하지만 0.2%p는 디자인 관점에서 대개 아무 의미가 없다. 그러니 표본 크기를 계산하기 전에, 우리에게 실무적으로 의미 있는 최소 차이가 얼마인지를 먼저 정해야 한다. MDE는 통계 파라미터이기 전에 디자인 판단이다.
R로 표본 크기 계산하기
네 손잡이를 정했으면 계산은 R이 해준다. 이항 전환율 두 개를 비교하는 경우에는 base R에 들어 있는 power.prop.test가 바로 쓰인다. 들어가며의 시나리오로 값을 넣어보자. 지금 결제 버튼의 전환율은 10%다. 새 버튼이 2%p 넘게, 그러니까 12% 이상으로 올려주면 반드시 잡고 싶다. 유의수준은 0.05, 검정력은 0.80으로 둔다.
# 기저 전환율 10%, 2%p 상승(12%)을 최소 검출 효과로 잡을 때
# 유의수준 5%, 검정력 80%
power.prop.test(p1 = 0.10, p2 = 0.12,
sig.level = 0.05, power = 0.80)
돌리면 이렇게 나온다.
Two-sample comparison of proportions power calculation
n = 3840.847
p1 = 0.1
p2 = 0.12
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
여기서 제일 자주 헷갈리는 게 맨 아래 NOTE다. n은 두 군을 합친 수가 아니라 각 군에 필요한 수다. 그러니까 새 버튼에 약 3,841명, 기존 버튼에 약 3,841명, 합쳐서 약 7,682명을 모아야 한다. 이 페이지가 하루에 방문자 1,000명을 받고 절반씩 나눈다면 군당 하루 500명이니, 3,841 ÷ 500 ≈ 7.7, 약 8일 돌리면 된다. 드디어 며칠 돌려야 하는지에 숫자가 나왔다.
이제 손잡이를 돌려보자. 잡고 싶은 차이를 절반인 1%p로 줄이면(11%), 그리고 검정력을 0.90으로 올리면 표본이 어떻게 변하는지 보자.
# 잡고 싶은 차이를 절반으로 (2%p -> 1%p)
power.prop.test(p1 = 0.10, p2 = 0.11,
sig.level = 0.05, power = 0.80)
# 검정력을 90%로 (최소 검출 효과는 다시 2%p)
power.prop.test(p1 = 0.10, p2 = 0.12,
sig.level = 0.05, power = 0.90)
Two-sample comparison of proportions power calculation
n = 14750.79
p1 = 0.1
p2 = 0.11
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
Two-sample comparison of proportions power calculation
n = 5141.306
p1 = 0.1
p2 = 0.12
sig.level = 0.05
power = 0.9
alternative = two.sided
NOTE: n is number in *each* group
숫자가 앞 절의 설명과 그대로 맞는다. MDE를 2%p에서 1%p로 절반 줄였더니 군당 표본이 3,841명에서 14,751명으로, 거의 네 배로 뛴다. 하루 500명이면 30일, 한 달이다. 검정력을 0.80에서 0.90으로 올린 경우는 군당 5,141명이라 약 1.3배, 하루 500명이면 약 11일이다. 손잡이를 조금만 돌려도 실험 기간이 며칠에서 한 달로 벌어진다. 이 감각을 손에 쥐고 있으면 실험을 설계할 때 어디를 양보할지 판단이 선다.
참고로 pwr 패키지의 pwr.2p.test는 같은 계산을 각도 변환(arcsine) 기반으로 처리해서 값이 조금 다르게 나온다. 전환율 비교에서는 해석이 직관적인 power.prop.test 쪽을 기본으로 써도 충분하다.
표본이 크면 작은 차이도 유의해진다
넷째 손잡이 이야기를 숫자로 마저 확인하자. 앞에서 MDE를 작게 잡을수록 표본이 폭증한다고 했다. 극단으로 밀어보자. 10%에서 10.2%로, 겨우 0.2%p 차이를 80% 검정력으로 잡으려면 몇 명이 필요할까.
# 0.2%p 차이(10% -> 10.2%)를 80% 검정력으로 잡으려면
power.prop.test(p1 = 0.10, p2 = 0.102,
sig.level = 0.05, power = 0.80)
Two-sample comparison of proportions power calculation
n = 356334
p1 = 0.1
p2 = 0.102
sig.level = 0.05
power = 0.8
alternative = two.sided
NOTE: n is number in *each* group
군당 35만 6천 명이다. 하루 500명이면 약 713일, 2년 가까이 걸린다. 이만한 표본을 A/B 테스트로 모으는 건 대부분 비현실적이다.
그런데 이 계산을 뒤집으면 중요한 사실이 보인다. 만약 트래픽이 아주 많은 서비스라 군당 35만 명이 순식간에 쌓인다면, 그 실험은 0.2%p 차이도 80% 확률로 유의하게 잡아낸다. 다시 말해 표본이 충분히 크면, 실무적으로는 아무 의미 없는 차이까지 통계적으로 유의하게 찍힌다. p-value 글에서 정리한 그대로다. 통계적으로 유의하다는 말과 디자인 관점에서 의미 있다는 말은 다르다. 표본이 클수록 이 둘이 갈라진다.
그래서 표본이 큰 서비스일수록 오히려 MDE를 먼저 정하는 게 더 중요해진다. 그물이 촘촘하면 아무 바늘이나 다 걸리니까, 우리가 진짜로 건지고 싶은 바늘 크기를 사람이 먼저 정해줘야 한다. 유의성 하나만 보고 릴리스를 결정하면, 2년짜리 실험이 잡아낸 0.2%p에 팀 전체가 매달리는 일이 생긴다.
보고서에 옮길 때 자주 하는 실수
표본 크기 계산을 실험 설계와 보고서에 옮길 때 반복되는 실수가 몇 개 있다.
첫째, MDE를 정하지 않고 실험부터 연다. 앞에서 봤듯이 잡고 싶은 최소 차이가 없으면 필요한 표본이 정해지지 않는다. 실험을 열기 전에 “몇 %p 이상 오르면 채택한다"를 팀이 합의하고 시작해야, 며칠 돌릴지가 나온다.
둘째, 유의하게 나올 때까지 결과를 계속 들여다본다. 미리 정한 표본을 다 채우기 전에 매일 p-value를 확인하다가, 우연히 유의하게 뜬 날 실험을 멈추는 패턴이다. 이렇게 하면 거짓 경보 확률이 계획한 5%보다 훨씬 커진다. 계산으로 나온 표본 수를 채우고, 그 시점에 판단하는 규칙을 미리 정해두는 게 안전하다.
셋째, 검정력을 따지지 않고 짧게 돌린 뒤 무승부를 “차이 없음"으로 적는다. 감도 나쁜 탐지기로 잠깐 훑고 동전이 없다고 결론 내리는 격이다. 표본이 계획보다 적게 모였다면, 보고서에는 “차이가 없다"가 아니라 “이 표본에서는 유의한 차이를 잡을 만한 검정력이 부족했다"라고 적는 게 정확하다.
넷째, 군당 표본과 전체 표본을 헷갈린다. power.prop.test의 n은 각 군의 수다. 필요한 총 방문자는 그 두 배고, 실험 기간은 군당 수를 군당 하루 트래픽으로 나눠서 잡는다. 이 셋을 섞으면 기간이 절반으로 잘못 계산된다.
마무리
들어가며의 질문으로 돌아가자. “이거 며칠 돌려요?” 이 글의 답은 이렇다. 네 개의 손잡이만 정하면 숫자가 나온다. 지금 전환율 10%, 반드시 잡고 싶은 최소 차이 2%p, 유의수준 5%, 검정력 80%로 정하면 군당 약 3,841명이 필요하고, 하루 방문자 1,000명을 절반씩 나누는 페이지라면 약 8일이다.
중요한 건 이 숫자가 감이 아니라 계산에서 나온다는 점이다. 그리고 계산의 출발점은 통계가 아니라 디자인 판단이다. 며칠 돌릴지를 실제로 결정하는 건 α나 검정력 같은 기본값이 아니라, 우리가 놓치기 싫은 최소 차이를 얼마로 잡느냐다. 그 선을 먼저 긋는 게 실험 설계의 진짜 첫걸음이다. 표본 크기 계산기는 그 판단을 며칠이라는 숫자로 옮겨줄 뿐이다.