A/B Test의 통계적 질문은 다음과 같다. “두 집단의 모수가 통계적으로 유의미하게 다른가?“ 이 차이를 검정하기 위해 t-test 또는 z-test를 사용할 수 있다.
t-test는 주로 연속형 변수(ex. 체류시간, 장바구니 금액 등)에 대해 독립 표본 t-test를 사용하며, z-test에 경우 이진형 변수(ex. 전환 됨 vs 안됨)에 대해 두 집단 비율 z-test를 사용한다.
t-test (독립 표본) | z-test (proportions) | |
---|---|---|
데이터 종류 | 연속형 변수 | 이진형 변수 |
표본 수 조건 | 소 표본도 가능 | 큰 표본 |
모집단 분산 | 표본 표준편차 사용 | 알고 있는 값 or 이 충분히 크다면 근사 () 가능 |
분포 기반 | t-분포 | 정규분포 |
활용 | 평균 체류 시간 비교, 평균 매출 비교 등 | 전환률, 클릭률, 가입률 등 이진 비율 비교 |
# 예시: 두 웹페이지 버전의 평균 체류 시간을 비교한 A/B Test
import numpy as np
from scipy.stats import ttest_ind
# A 그룹: 기존 웹사이트 (평균 70초, 표준편차 10초)
group_a_time = np.random.normal(loc=70, scale=10, size=100)
# B 그룹: 새로운 웹사이트 (평균 74초, 표준편차 11초)
group_b_time = np.random.normal(loc=74, scale=11, size=100)
t_stat, p_val = ttest_ind(group_a_time, group_b_time, equal_var=False)
print("=== t-test 결과 (평균 체류 시간 비교) ===")
print(f"t 통계량: {t_stat:.3f}")
print(f"p-value: {p_val:.4f}")
# 결과) t 통계량: -3.808, p-value: 0.0002
# 귀무가설을 기각할 수 있음
# 예시: 두 웹페이지 버전의 구매 전환 여부를 비교한 A/B Test
import numpy as np
from statsmodels.stats.proportion import proportions_ztest
# 성공(구매 전환) 수
successes = np.array([50, 65])
# 전체 사용자 수
sample_sizes = np.array([1000, 1000])
z_stat, p_val = proportions_ztest(count=successes, nobs=sample_sizes)
print("=== z-test 결과 (전환률 비교) ===")
print(f"Z 통계량: {z_stat:.3f}")
print(f"p-value: {p_val:.4f}")
# 결과) Z 통계량: -1.441, p-value: 0.1496
# 귀무가설을 기각하지 못함