A/B Test란?
처리군과 대조군의 비교 - 즉, 새로운 처리법이 더 나은가?
일반적으로 데이터 분석 현장에서는 얼마나 유의미하게 클릭율 / 전환율 등이 향상되었는가?를 확인.
A/B 테스트의 여러 주의사항.
- 한 번에 한 가지 요인에 대해서만 테스트 -> 외부 변수는 모두 같은 조건이 되게 통제 필요
- 분석대상 Page에 대해 방문자 충분히 유입되어야 한다.
- 페이지의 개선사항에 체크를 해서 가설 설정 필요
- A, B 집단은 임의적으로 할당해야 한다. 또한 실험은 조기 중단X, 과거 결과는 맹신하지 말아야 한다.
O A, B 집단의 할당은 계통추출법을 활용하여 mod2로 분배하거나, 아예 NRU만 실험 대상으로 써도 문제 없을 것.
- 임의로 숫자를 보고 판단하는 것이 아니라, t-test를 실시하는 등, 통계적인 방법에 대해 고려 필요
* NRU만 고려하면 좋은 점 : 과거의 경험이 반영되어 있지 않아, 데이터에 혼선이 X
Remarks.
적당한 표본 수치를 잡기는 사실상은 어려움. 이론적으로는 p-value 뿐만 아니라 검정력을 도입하여 "정말로 그 변화가 유의미하게 전환율/매출/클릭율 등을 높히는가"에 대해 고려 필요.
다수의 집단에 대해서는 A/B Test를 고려하기어려워 Multi-Aramed Bandit 등에 대해 고려 할 수 있음.
Code
import scipy.stats as stats
import numpy as np
# case 1 : chi_2 square 이용
# 범주형에서 쉽게 사용 가능
def click_abtest(a_click, total_a, b_click, total_b):
click = [a_click, b_click]
no_click = [total_a-a_click, total_b-b_click]
chi2, p, dof, expected = stats.chi2_contingency([click, no_click])
return p
print(click_abtest(50, 1000, 140 ,2222))
# case 2 : ttest_ind 사용
set_A = np.random.normal(loc=10, scale=2, size=1000)
set_B = np.random.normal(loc=12, scale=2, size=1000)
# 검정 코드 실시
print(stats.ttest_ind(set_A,
set_B,
equal_var=False).pvalue)
# case 3 : 아예 밑바닥부터 계산하기
# 이산형 case에서 z값을 계산
# 등분산 보장이 없어, 합동 표본표준편차 계산이 필요
click_a = 2500
total_a = 120000
click_b = 2580
total_b = 123000
rate_diff = click_b/total_b - click_a/total_a
total_prob = (click_a+click_b) / (total_a + total_b)
std = (total_prob * (1 - total_prob) * (1/total_a + 1/total_b))**0.5
z_val = rate_diff/std
print(rate_diff) # 0.0001 정도로 매우 작음
print(z_val)
rv = stats.norm(0, 1)
p_val = 1 - rv.cdf(z_val)
print(p_val) # 약 0.4로 귀무가설 기각 불가. 유의미 차이 X
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] Retention (2) | 2024.01.15 |
---|---|
[Data] CLV (0) | 2024.01.13 |
[Data] Logistic Regression의 이탈도, 성능 측정 (0) | 2022.07.27 |
[Data] 군집화 결과 평가 (0) | 2022.07.15 |
[Data] 시계열 분석 - AR, MA, ARMA, ARIMA (0) | 2022.04.07 |