A/B 테스트 시스템은 런타임 시스템과 분석 시스템 두 개로
구성되는데 이에 대해 살펴보자
Production DB에 저장되는 정보들을 Data Warehouse로 적재했다고 가정
raw_data.user_event


raw_data.user_variant


raw_data.user_metadata


이제 각 테이블을 조인해서
고객별
총 impression
총 click
총 purchase
총 revenue
등을 한번에 볼 수 있는 요약 테이블을 만들어보자.
CREATE TABLE analytics.variant_daily_sessions AS
SELECT
variant_id,
user_id,
datestamp,
count(distinct item_id) num_of_items, -- 총 impression
sum(clicked) num_of_clicks, -- 총 click
sum(purchased) num_of_purchases, -- 총 purchase
sum(paidamount) revenue -- 총 revenue
FROM raw_data.user_event ue
JOIN raw_data.user_variant uv ON ue.user_id = uv.user_id
GROUP by 1, 2, 3;

variant_daily_sessions.groupby('variant_id').size()
출력값
variant_id
control 82526
test 83116
dtype: int64
해당 두 값이 95% 신뢰구간에 따라 50:50이어야 된다.
z-score 또는 p-value로 파악
variant_daily_sessions.groupby('variant_id')["revenue"].mean() #매출평
출력값
variant_id
control 5.590990
test 5.570203
Name: revenue, dtype: float64
두 값이 동일해야 됨.
이는 t-test를 통해 파악할 수 있다.
근데 딱 봐도 동일해 보임.
이후에는 해당 데이터를 기반으로 t-score를 계산하는 방식을 진행해보자
두 개의 값을 비교할때 사용하는 테스트
결과값은 t-score로 나옴.
샘플의 크기가 크다면 z-score와 동일한 결과가 나온다.
위에서 추출한
variant_id 별 사용자 가 50:50으로 잘 나누어져 있나 확인해 보자.

scipy.stats.ttest_ind를 이용한 t-score 계산 진행!
그러기 위해서는 variant_id 별 비교 데이터가 배열 또는 리스트의 형태로 있어야 된다.
from scipy import stats
# control 그룹에 속한 매출액 정보를 numpy 배열로 받아오기
a = variant_daily_sessions[variant_daily_sessions["variant_id"]=="control"]["revenue"].to_numpy()
# test 그룹에 속한 매출액 정보를 numpy 배열로 받아오기
b = variant_daily_sessions[variant_daily_sessions["variant_id"]=="test"]["revenue"].to_numpy()

stats.ttest_ind() 를 통해 t-score와 p-value를 계산# ttest_ind 함수를 사용해서 두 그룹의 값들을 비교
# 이 함수는 t-score (사실상 z-score)와 p value를 계산해서 리턴해줌
t, p = stats.ttest_ind(b, a)
print(t, p)
추출값 : -0.30893666944286313 0.7573700906452349
Python의 경우 함수가 있기에 쉽게 계산이 가능하지만,
테블로와 같은 BI툴에 적용하기 위해서는 직접 식을 사용할 줄 알아야 된다.
n_a = 82526
n_b = 83116
mean_a = 5.590990
mean_b = 5.570203
square_a = 219.259967
square_b = 217.960044
import math
var_a = (square_a - mean_a*mean_a)
var_b = (square_b - mean_b*mean_b)
print(var_a, var_b)
출력값 : 188.0007978199 186.932882538791
t_score = (mean_b - mean_a)/math.sqrt(var_a/n_a+var_b/n_b)
print(t_score)
출력값 : -0.3089440714048208