B가 이길 확률 95%는 어디서 나온 숫자일까?
베이지안으로 읽는 A/B
같은 데이터에서 p값은 0.088이 나오고 B가 이길 확률은 95.6%가 나옵니다. 둘은 모순이 아니라 다른 질문의 답이고, 사전분포를 바꾸면 95.6%는 71.2%까지 내려갑니다.
들어가며
첫 칼럼의 버튼 실험으로 돌아가 보겠습니다. 각 그룹 1,000명, A안 전환율 5.0%(50명), B안 6.8%(68명). 두 비율 z검정의 양측 p값은 0.088이었고, 결론은 이 데이터로는 우연과 구별하지 못했다였습니다.
그런데 요즘 실험 도구 화면에는 다른 숫자가 같이 뜹니다. B가 이길 확률 95.6%. 같은 데이터인데 한쪽은 판단 보류이고 다른 쪽은 거의 확실해 보입니다.
이번 글에서는 이 확률이 어떻게 계산되는지, 왜 95.6%라는 값이 나오는지, 그리고 결정에 쓸 때 무엇을 미리 정해야 하는지를 보겠습니다.
두 숫자는 다른 질문에 답합니다
p값과 방향 확률은 세로선(∣) 앞뒤가 바뀐 확률입니다.
| 식 | 질문 | 이 실험에서 | |
|---|---|---|---|
| p값 | P(관측 결과 ∣ 두 안이 같음) | 두 안이 같다면, 50명 대 68명만큼 또는 그보다 큰 차이가 나올 확률 | 0.088 (양측) |
| 방향 확률 | P(B가 더 좋음 ∣ 관측 결과) | 50명 대 68명이라는 결과를 보고 난 뒤, B가 더 좋을 확률 | 95.6% |
그림 1. 같은 데이터, 다른 질문. 설명을 위해 만든 가상 예시입니다.
p값은 차이가 없다는 가정에서 출발해 데이터가 얼마나 어색한지를 잽니다. 방향 확률은 반대로 데이터에서 출발해 B가 더 좋을 확률을 바로 말합니다. 후자가 우리가 실제로 묻고 싶은 질문에 가깝습니다.
다만 그 답을 내려면 데이터 말고 하나가 더 필요합니다. 데이터를 보기 전에 전환율이 어느 정도일 거라고 믿었는지, 즉 사전분포입니다.
방향 확률은 우리가 묻고 싶은 질문의 답이지만, 그 답은 데이터와 사전 믿음을 합쳐서 나옵니다.
방향 확률은 이렇게 계산합니다
전환율 같은 비율에는 베타분포를 씁니다. 아무 정보가 없다는 뜻으로 Beta(1, 1), 즉 0%부터 100%까지 모든 전환율이 똑같이 그럴듯하다는 사전분포에서 시작하겠습니다.
데이터가 들어오면 사전분포는 사후분포로 바뀌는데, 베타분포에서는 성공 수와 실패 수를 더하는 것으로 끝납니다. A안은 Beta(1 + 50, 1 + 950), B안은 Beta(1 + 68, 1 + 932)입니다.
그다음은 두 분포에서 전환율을 20만 번씩 뽑아 B가 A보다 큰 비율을 세는 것입니다.
import numpy as np
rng = np.random.default_rng(seed=2026)
a = rng.beta(1 + 50, 1 + 950, 200_000) # A안: 1,000명 중 50명 전환, 사전분포 Beta(1,1)
b = rng.beta(1 + 68, 1 + 932, 200_000) # B안: 1,000명 중 68명 전환
lift = (b - a) / a
print(f"B가 A보다 좋을 확률 : {(b > a).mean()*100:.1f}%")
print(f"상대 개선의 기댓값 : {lift.mean()*100:+.1f}% (95% 구간 {np.percentile(lift, 2.5)*100:+.1f}% ~ {np.percentile(lift, 97.5)*100:+.1f}%)")
print(f"B를 택했을 때 기대 손실 : {np.maximum(a - b, 0).mean()*100:.3f}%p")
# B가 A보다 좋을 확률 : 95.6%
# 상대 개선의 기댓값 : +37.9% (95% 구간 -4.5% ~ +93.5%)
# B를 택했을 때 기대 손실 : 0.019%p
B가 A보다 좋을 확률은 95.6%입니다. 그런데 같은 출력의 둘째 줄에 있는 상대 개선의 95% 구간은 −4.5%에서 +93.5%까지입니다. B가 조금 나쁠 수도 있고 두 배 가까이 좋을 수도 있다는 뜻입니다. 방향은 꽤 확실하지만 크기는 거의 모르는 상태입니다.
95.6%라는 숫자만 보면 이 폭이 보이지 않습니다.
방향 확률이 높다는 것은 B가 좋다는 뜻이지, 얼마나 좋은지를 안다는 뜻이 아닙니다.
95.6%는 어디서 왔나
같은 데이터의 단측 p값은 0.044입니다. 1에서 빼면 0.956입니다. 우연의 일치가 아닙니다. 아무 정보가 없는 평평한 사전분포에서 출발하면 방향 확률은 단측 p값을 1에서 뺀 값과 거의 같아집니다.
도구가 보여 주는 95.6%는 p값 0.088과 다른 데이터에서 나온 숫자가 아니라, 같은 데이터를 다른 방향에서 읽은 숫자입니다.
| 그룹당 인원 (비율은 동일) | 양측 p값 | B가 이길 확률 |
|---|---|---|
| 1,000명 | 0.088 | 95.6% |
| 3,000명 | 0.003 | 99.9% |
| 10,000명 | <0.001 | 100.0% |
그림 3. 전환율은 5.0%와 6.8%로 고정하고 인원만 늘렸을 때. 두 숫자는 같은 방향으로 함께 움직입니다. 평평한 사전분포 기준입니다.
그래서 p값이 0.05를 넘는 실험을 방향 확률 95%로 채택한다면, 다른 증거를 찾은 것이 아닙니다. 기준을 단측 0.05로 바꾼 것입니다. 바꾸는 것 자체는 선택할 수 있지만, 결과를 본 뒤에 바꾸면 결과에 맞춰 기준을 고르는 일이 되고, 그러면 어떤 기준도 의미가 없습니다.
평평한 사전분포의 방향 확률은 새 증거가 아니라 단측 p값의 다른 표현입니다.
사전분포가 답을 바꿉니다
방향 확률이 p값과 실제로 달라지는 지점은 사전분포입니다. 이 서비스의 전환율이 오랫동안 5% 근처였다는 걸 알고 있다면, 그 지식을 사전분포에 넣을 수 있습니다. 과거 데이터를 몇 명 분량으로 믿느냐에 따라 결과가 이렇게 달라집니다.
| 사전분포 | 뜻 | B가 이길 확률 | 기대 개선 |
|---|---|---|---|
| Beta(1, 1) | 아무 정보 없음 | 95.6% | +37.9% |
| Beta(5, 95) | 전환율 5%를 100명 분량만큼 믿음 | 95.0% | +35.1% |
| Beta(50, 950) | 전환율 5%를 1,000명 분량만큼 믿음 | 89.5% | +19.1% |
| Beta(500, 9,500) | 전환율 5%를 10,000명 분량만큼 믿음 | 71.2% | +3.5% |
그림 4. 같은 데이터(각 1,000명)에 사전분포만 바꿨을 때. 설명을 위해 만든 가상 예시입니다.
표의 3행처럼 과거 1,000명 분량의 경험을 반영하면 방향 확률은 89.5%로 내려가고 기대 개선은 +19.1%로 줄어듭니다. 1,000명짜리 실험이 보여 준 +36%는 과거 경험에 비춰 보면 과하다는 판단이 숫자에 들어간 것입니다.
4행처럼 과거를 10,000명 분량으로 믿으면 이번 실험은 거의 영향을 주지 못합니다.
어느 줄이 맞는지는 통계가 정해 주지 않습니다. 실험 도구는 보통 첫 줄이나 그 근처를 기본값으로 쓰고, 그 설정은 화면에 잘 보이지 않습니다. 같은 데이터로 도구마다 다른 확률이 나오는 이유입니다.
도구가 보여 주는 확률 뒤에는 보이지 않는 사전분포가 있고, 그 설정이 95.6%와 71.2%의 차이를 만듭니다.
실제 데이터에서는 어떻게 보이나
가상 예시 대신 공개 데이터로 같은 계산을 해 보겠습니다. Kaggle에 CC0으로 공개된 마케팅 A/B 테스트 데이터입니다. 광고를 본 그룹 564,577명과 공익광고를 본 대조군 23,524명의 구매 전환율이 들어 있습니다.
전체로 계산하면 2.555% 대 1.785%, 양측 p값은 10−13 수준이고 방향 확률은 사전분포와 무관하게 100%입니다. 차이가 너무 분명해서 계산 방식의 차이가 드러나지 않습니다.
그래서 두 그룹에서 2,000명씩 무작위로 뽑아 작은 실험처럼 만들었습니다. 대조군은 2,000명 중 40명(2.00%), 광고 그룹은 2,000명 중 64명(3.20%)이 전환했습니다. 전체 데이터는 답지로 남겨 둡니다.
| 계산 방식 (각 2,000명) | 결과 | 상대 개선 (광고 − 대조군) |
|---|---|---|
| 두 비율 z검정 | 양측 p = 0.017, 단측 p = 0.009 | +60.0% (+1.20%p) |
| 방향 확률, 사전분포 Beta(1, 1) | 광고 그룹이 높을 확률 99.2% | +62.4% (+8.7% ~ +136.0%) |
| 방향 확률, 사전분포 1,000명 분량 (2.5%) | 97.6% | +38.9% |
| 방향 확률, 사전분포 10,000명 분량 (2.5%) | 83.8% | +8.6% |
| 답지: 전체 588,101명 | 100.0% | +43.1% (+30.0% ~ +57.5%) |
그림 5. 같은 4,000명의 부분표본을 네 가지 방식으로 읽은 결과와 전체 데이터의 답. 사전분포 중심 2.5%는 이 서비스의 과거 전환율에 해당하는 값(전체 합동 전환율)입니다. 출처는 Kaggle의 Marketing A/B Testing(CC0)이고 집계는 이 글에서 직접 했습니다.
가상 예시의 결론이 그대로 나타납니다. 평평한 사전분포의 방향 확률 99.2%는 단측 p값을 1에서 뺀 0.991과 같습니다. 그 99.2% 뒤의 상대 개선 구간은 +8.7%에서 +136.0%까지라 크기는 거의 모르는 상태입니다.
답지와 비교하면 하나가 더 보입니다. 평평한 사전분포의 기대 개선 +62.4%는 실제 +43.1%보다 크게 부풀려졌고, 과거 전환율을 1,000명 분량으로 반영한 +38.9%가 답에 가장 가깝습니다. 반대로 10,000명 분량은 +8.6%로 지나치게 눌렀습니다.
사전분포는 쓰지 않으면 작은 표본의 출렁임을 그대로 믿게 되고, 너무 세게 쓰면 새 데이터를 무시하게 됩니다.
실제 데이터에서도 방향 확률은 단측 p값의 다른 표현이고, 사전분포는 적당히 쓰면 답에 가까워지고 세게 쓰면 답에서 멀어집니다.
결정에 쓰려면 미리 정할 것
방향 확률 하나로 결정하기보다 기대 손실을 함께 봅니다. B를 택했는데 사실 A가 더 좋았을 때 잃는 전환율의 기댓값입니다. 이 실험에서는 B를 택했을 때 기대 손실이 0.019%p, A를 유지했을 때 기대 손실이 1.817%p입니다.
틀렸을 때 잃는 것이 B 쪽이 약 95배 작습니다. 되돌리기 쉬운 결정이라면 이 숫자만으로 B를 택할 수 있습니다.
| 결정 규칙 | 이 실험에서 | 미리 정할 것 |
|---|---|---|
| 양측 p < 0.05 | 0.088, 보류 | 유의수준, 표본 수 |
| B가 이길 확률 > 95% | 95.6%, 채택 | 사전분포, 기준 확률 |
| 기대 손실 < 허용선 | 0.019%p, 허용선이 0.05%p라면 채택 | 사전분포, 허용선 |
그림 6. 세 가지 결정 규칙. 어느 것을 쓰든 결과를 보기 전에 정해야 합니다.
세 규칙 모두 쓸 수 있고, 같은 데이터에서 결론이 갈릴 수도 있습니다. 문제는 규칙이 아니라 순서입니다. 결과를 보고 나서 유리한 규칙을 고르면 어떤 규칙도 의미가 없습니다.
또 하나, 베이지안 방법은 결과를 매일 들여다봐도 괜찮다는 말이 있는데 조건이 붙습니다. 사전분포가 실제 효과 분포를 잘 반영할 때만 그렇고, 평평한 사전분포로 매일 확인하며 멈추면 p값과 같은 문제가 생깁니다[2].
방향 확률과 사후분포가 주는 진짜 이점은 따로 있습니다. 효과의 크기와 불확실성을 한 분포로 보여 주고, 기대 손실처럼 결정에 바로 쓰이는 양을 계산할 수 있다는 점입니다[1]. 95.6%라는 숫자 하나로 줄이면 그 이점이 사라집니다.
결정 규칙은 p값이든 방향 확률이든 기대 손실이든 쓸 수 있지만, 셋 다 결과를 보기 전에 정했을 때만 규칙입니다.
나가며
- p값 0.088과 B가 이길 확률 95.6%는 같은 데이터의 다른 질문입니다. 평평한 사전분포에서 방향 확률은 단측 p값을 1에서 뺀 값과 거의 같습니다.
- 방향 확률은 사전분포에 따라 달라집니다. 같은 데이터에서 과거 전환율을 1,000명 분량만큼 믿으면 89.5%, 10,000명 분량이면 71.2%입니다. 도구의 기본 설정이 어느 줄에 해당하는지 확인해야 합니다.
- 결정에는 방향 확률보다 기대 손실이 쓸모 있습니다. 이 실험에서 B를 택했을 때 기대 손실은 0.019%p였습니다. 어느 규칙이든 결과를 보기 전에 정합니다.
참고
- Kruschke, J. K. (2013). Bayesian estimation supersedes the t test. Journal of Experimental Psychology: General, 142(2), 573-603. https://doi.org/10.1037/a0029146
- Deng, A., Lu, J., & Chen, S. (2016). Continuous monitoring of A/B tests without pain: Optional stopping in Bayesian testing. 2016 IEEE International Conference on Data Science and Advanced Analytics (DSAA), 243-252. https://doi.org/10.1109/DSAA.2016.33
본문의 모든 수치는 설명을 위해 만든 가상 예시를 직접 계산한 값입니다. 데이터는 첫 칼럼과 같은 각 그룹 1,000명, 전환 50명과 68명입니다. 방향 확률과 기대 손실은 베타 사후분포에서 20만 번 표본을 뽑아 구했고(시드 2026), p값은 두 비율 z검정으로 계산했습니다. 사전분포 표의 네 줄은 A안과 B안에 같은 사전분포를 적용한 결과입니다. 그림 5의 실제 데이터는 Kaggle의 Marketing A/B Testing(faviovaz, CC0 Public Domain, https://www.kaggle.com/datasets/faviovaz/marketing-ab-testing)이며, 부분표본은 두 그룹에서 각 2,000명을 무작위로 뽑았습니다(시드 7). 사전분포의 중심 2.5%는 전체 588,101명의 합동 전환율 2.524%입니다. 유저 단위 원본은 싣지 않았습니다. 코드 실행 환경은 Python 3.12, NumPy 2.5.3, SciPy 1.18.1입니다.