매개변수 추정에서 가설 검정까지: 베이지안 A/B 검정 구축
이메일에서 이미지를 제거하면 클릭률이 증가할 것이라는 믿음과 이미지를 제거하면 클릭률이 감소할 것이라는 믿음을 검정해 보겠습니다. …
이미 알려지지 않은 단일 매개변수를 추정하는 방법을 알고 있으므로 검정을 위해 해야 할 일은 두 매개변수, 즉 각 이메일의 전환율을 추정하는 것뿐입니다. 그런 다음 몬테카를로 시뮬레이션을 실행하고 어느 가설이 더 나은 성과를 낼 가능성이 있는지 확인합니다. 즉, A 또는 B 중 어느 변형이 더 우수한지 확인합니다. A/B 검정은 t-검정과 같은 고전적인 통계 기법을 사용하여 수행할 수 있지만 베이지안 방식으로 검정을 구축하면 각 부분을 직관적으로 이해하고 더 유용한 결과도 얻을 수 있습니다.
베이지안 A/B 검정 설정
검정을 위해 평소처럼 이미지가 있는 변형 하나와 이미지가 없는 변형 하나를 보냅니다. 이 테스트는 A/B 테스트라고 불리는데, 어느 쪽이 더 나은 성과를 보이는지 확인하기 위해 변형 A(이미지 있음)와 변형 B(이미지 없음)를 비교하기 때문입니다.
테스트할 300명은 A와 B라는 두 그룹으로 나뉩니다. 그룹 A는 상단에 큰 그림이 있는 일반적인 이메일을 받고, 그룹 B는 그림이 없는 이메일을 받습니다. 더 간단한 이메일이 "스팸"처럼 느껴지지 않고 사용자가 콘텐츠를 클릭하도록 장려하기를 바랍니다.
사전 확률 찾기
우리는 매주 이메일 캠페인을 진행했으므로, 해당 데이터에서 주어진 이메일에서 블로그 링크를 클릭할 확률은 약 30%가 될 것이라는 합리적인 기대를 합니다. … 사전 확률 분포에 대해 Beta(3,7)을 정하겠습니다. 이 분포를 사용하면 평균이 0.3인 베타 분포를 나타낼 수 있지만, 광범위한 가능한 대체 비율이 고려됩니다.
import numpy as np
import pandas as pd
from scipy import stats, special
import itertools
from sympy import *
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")
def decorate_plot(xlab, ylab, title=None, size=(4,3)):
plt.figure(figsize=size)
plt.xlabel(xlab)
plt.ylabel(ylab)
plt.title(title)
convRate=np.linspace(0, 1, 100)
prior=stats.beta.pdf(convRate, 3, 7)
decorate_plot("Conv. Rate","Density","Prior")
plt.plot(convRate, prior)
plt.show()
A와 B에 대해 수집된 데이터는 다음과 같습니다.
| Clicked | Not clicked | Observed conversion rate | |
|---|---|---|---|
| A | 36 | 114 | 0.24 |
| B | 50 | 100 | 0.33 |
위 사전확률의 분포에서 A, B의 데이터의 매개변수들을 합하여 사후 베타분포를 작성하면 다음과 같습니다.
- A ⇒ α:3+36, β: 7+114, Beta(39, 121)
- B ⇒ α:3+50, β: 7+100, Beta(53, 107)
convRate=np.linspace(0, 1, 100)
post_A=stats.beta.pdf(convRate, 39, 121)
post_B=stats.beta.pdf(convRate, 53, 107)
decorate_plot("Conv. Rate","Density","Posterior")
plt.plot(convRate, post_A, label="A")
plt.plot(convRate, post_B, label="B")
plt.legend(loc="best", labelcolor="linecolor")
plt.show()
B가 더 좋아 보이지만 중복이 있습니다. B가 더 나은 변형이라고 얼마나 확신할 수 있을까요? 여기서 몬테카를로 시뮬레이션이 등장합니다.
몬테카를로 시뮬레이션
몬테카를로 시뮬레이션은 문제를 해결하기 위해 무작위 샘플링을 사용하는 모든 기술입니다. 이 경우, 우리는 두 분포에서 무작위로 샘플링할 것입니다. 각 샘플은 분포에서의 확률에 따라 선택되므로 높은 확률 영역의 샘플이 더 자주 나타납니다.
사후 분포는 각 전환율에 대한 우리의 현재 믿음 상태에 따라 존재할 수 있는 모든 세계를 나타낸다고 상상할 수 있습니다. 다음 코드는 A와 B의 사후 베타분포에서 무작위로 100000개의 전환율(x 축의 값으로 확률)을 선택한 결과에 B의 값이 큰 경우의 확률을 계산한 것입니다.
n=100000 prior_a, prior_b=3, 7 Samples_A=stats.beta.rvs(36+prior_a, 114+prior_b, size=n, random_state=3 ) Samples_B=stats.beta.rvs(50+prior_a, 100+prior_b, size=n, random_state=3 ) b_superior=np.sum(Samples_B>Samples_A)/n b_superior
0.96919
여기서 우리가 보는 것은 100,000번의 시도 중 약 97%에서 변형 B가 더 우수했다는 것입니다. 우리는 이것을 100,000개의 가능한 세계를 보는 것으로 상상할 수 있습니다.
위 결과로 B가 더 우수한 변형이라는 것을 얼마나 확신하는지 정확하게 말할 수 있습니다. … 우리는 마지막 시뮬레이션의 정확한 결과를 가져와 B 샘플이 A 샘플보다 몇 배 더 큰지 살펴보면서 변형 B가 얼마나 더 나을 가능성이 있는지 테스트할 수 있습니다.
ratio=Samples_B/Samples_A
decorate_plot("B/A", "Frequency" )
plt.hist(ratio)
plt.show()
위 결과로 B가 A보다 약 40% 개선될 가능성이 가장 높음을 알 수 있습니다. 누적 분포 함수(CDF)는 결과에 대한 추론에 히스토그램보다 훨씬 더 유용합니다. 다음은 B/A에 대한 경험적누적분포(ECDF)를 작성한 것입니다.
decorate_plot("B/A","CDF")
plt.ecdf(ratio)
plt.ylim(-0.01, 1.01)
plt.show()
위 결과는 B의 효과가 더 크다는 것을 명확하게 나타냅니다. 즉, B/A < 1인 경우의 확률은 매우 낮습니다. 반면에 50% 이상의 효과를 나타낼 가능성은 약 20%입니다.




댓글
댓글 쓰기