비율 차이 A/B 테스트 분석

Python으로 배우는 A/B Testing

Moe Lotfy, PhD

Principal Data Science Manager

비율 차이 분석 프레임워크

귀무가설과 대립가설 분포의 시각적 표현

귀무/대립가설의 수식 표현

  • p-값 < $\alpha$이면
    • 귀무가설 기각
  • p-값 > $\alpha$이면

    • 귀무가설 기각 실패
  • 신뢰구간

    • 95% CI: 진짜 차이를 95% 확률로 포함하는 구간
    • 작살 대신 그물로 잡는 것과 유사
    • 처리군과 대조군의 관측된 차이를 중심으로 함
Python으로 배우는 A/B Testing

두 표본 비율 z-검정

from statsmodels.stats.proportion import proportions_ztest, proportion_confint
# 그룹 A와 B의 사용자 수 계산
n_A = checkout[checkout['checkout_page'] == 'A']['user_id'].nunique()
n_B = checkout[checkout['checkout_page'] == 'B']['user_id'].nunique()
print('Group A users:',n_A)
print('Group B users:',n_B)
Group A users: 2940
Group B users: 2938
# 각 그룹의 고유 구매자 수 계산
puchased_A = checkout[checkout['checkout_page'] == 'A'].groupby('user_id')['purchased'].max().sum()
purchased_B = checkout[checkout['checkout_page'] == 'B'].groupby('user_id')['purchased'].max().sum()
# 그룹 리스트 할당 
purchasers_abtest = [puchased_A, purchased_B]
n_abtest = [n_A, n_B]
Python으로 배우는 A/B Testing

두 표본 비율 z-검정

# p-값과 신뢰구간 계산
z_stat, pvalue = proportions_ztest(purchasers_abtest, nobs=n_abtest)
(A_lo95, B_lo95), (A_up95, B_up95) = proportion_confint(purchasers_abtest, nobs=n_abtest, alpha=0.05)
# p-값과 신뢰구간 출력
print(f'p-value: {pvalue:.4f}')
print(f'Group A 95% CI : [{A_lo95:.4f}, {A_up95:.4f}]')
print(f'Group B 95% CI : [{B_lo95:.4f}, {B_up95:.4f}]')
p-value: 0.0058
Group A 95% CI : [0.8072, 0.8349]
Group B 95% CI : [0.8349, 0.8608]
Python으로 배우는 A/B Testing

비율의 신뢰구간

# 재현성을 위한 시드 설정
np.random.seed(34)
# B 그룹의 평균 구매율 계산
pop_mean = checkout[checkout['checkout_page'] == 'B']['purchased'].mean()
print(pop_mean)
0.847
Python으로 배우는 A/B Testing

비율의 신뢰구간

# 크기 100인 무작위 표본 20개의 90% 신뢰구간 계산
for i in range(20):
    confidence_interval = proportion_confint(
        count = checkout[checkout['checkout_page'] == 'B'].sample(100)['purchased'].sum(), 
        nobs = 100, 
        alpha = (1 - 0.90))
    print(confidence_interval)
(0.7912669777384846, 0.9087330222615153)
(0.8385342148455946, 0.9414657851544054)
(0.8265485838585659, 0.9334514161414341)
(0.7568067872454262, 0.8831932127545737)
(0.8506543911914558, 0.9493456088085442)*
(0.8385342148455946, 0.9414657851544054)
(0.7230037568938057, 0.8569962431061944)
(0.8146830076144598, 0.9253169923855402)
(0.8029257122801267, 0.9170742877198733)
(0.8146830076144598, 0.9253169923855402)
(0.8506543911914558, 0.9493456088085442)*
(0.7454722433688197, 0.8745277566311804)
...
Python으로 배우는 A/B Testing

연습해 봅시다!

Python으로 배우는 A/B Testing

Preparing Video For Download...