A/B Testing
Definition
A/B 테스트는 무작위 대조 실험(RCT)의 온라인 응용으로, 두 가지 이상의 변형(variants)을 무작위로 사용자에게 노출시켜 인과 효과를 추정하는 방법입니다.
- Control (A): 기존 버전
- Treatment (B): 새로운 버전
무작위 배정으로 인해 단순 평균 차이가 인과 효과의 불편 추정량이 됩니다.
Intuitive Understanding
A/B 테스트는 “인과 관계를 밝히는 황금 표준”입니다.
관측 데이터에서는 가격과 수요의 상관관계가 교란 변수에 의해 왜곡될 수 있지만, 무작위 실험에서는 처리와 모든 교란 변수 사이의 상관관계가 제거됩니다.
Key Properties
왜 실험인가?
| 접근법 | 가정 | 위험 |
|---|---|---|
| 관측 연구 | 비교란성, 배제 제한 | 가정 위반 시 편향 |
| A/B 테스트 | SUTVA만 필요 | 윤리적/비용 제약 |
가격 실험의 특수성
| 도전 | 설명 | 완화 전략 |
|---|---|---|
| 윤리적 우려 | 동일 제품에 다른 가격은 불공정 | 지역/시간 기반 실험 |
| 간섭 | 고객 간 정보 공유 | 클러스터 랜덤화 |
| 장기 효과 | 브랜드, 충성도 효과 | 장기 추적 |
| 표본 오염 | 다중 장치/계정 | 결정론적 할당 |
결정론적 무작위 할당
def randomize(user_id, experiment_name, treatment_prob=0.5):
"""해시 기반 결정론적 할당"""
hash_value = hash(f"{user_id}_{experiment_name}") % 100
return 'treatment' if hash_value < treatment_prob * 100 else 'control'
동일 사용자는 항상 같은 그룹에 배정되어 일관된 경험을 제공합니다.
Example
가격 A/B 테스트
class PricingExperiment:
def __init__(self, control_price, treatment_price):
self.control_price = control_price
self.treatment_price = treatment_price
self.results = {'control': [], 'treatment': []}
def get_price(self, user_id):
group = self.randomize(user_id)
return self.treatment_price if group == 'treatment' else self.control_price
def analyze(self):
from scipy import stats
control = np.array(self.results['control'])
treatment = np.array(self.results['treatment'])
t_stat, p_value = stats.ttest_ind(treatment, control)
effect = treatment.mean() - control.mean()
return {'effect': effect, 'p_value': p_value}
결과 분석
- 전환율 차이:
- 통계적 유의성: p-value < 0.05
- 실용적 유의성: 효과 크기가 비즈니스적으로 의미있는가?
Related Concepts
- Statistical Power - 샘플 사이즈 결정
- CUPED - 분산 감소 기법
- Design Effect - 클러스터 랜덤화의 영향
- ATE - 추정 대상
References
- Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online Controlled Experiments.
- Comprehensive Personalized Pricing Guide, Part V, §13