Tae Hyun Kim (Lowell)

A/B Testing

2분 읽기 #experiments#rct#ab-testing

Definition

A/B 테스트는 무작위 대조 실험(RCT)의 온라인 응용으로, 두 가지 이상의 변형(variants)을 무작위로 사용자에게 노출시켜 인과 효과를 추정하는 방법입니다.

  • Control (A): 기존 버전
  • Treatment (B): 새로운 버전

ATE=E[Y(1)Y(0)]=YˉBYˉAATE = E[Y(1) - Y(0)] = \bar{Y}_B - \bar{Y}_A

무작위 배정으로 인해 단순 평균 차이가 인과 효과의 불편 추정량이 됩니다.

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}

결과 분석

  • 전환율 차이: τ^=YˉBYˉA\hat{\tau} = \bar{Y}_B - \bar{Y}_A
  • 통계적 유의성: p-value < 0.05
  • 실용적 유의성: 효과 크기가 비즈니스적으로 의미있는가?

References

  • Kohavi, R., Tang, D., & Xu, Y. (2020). Trustworthy Online Controlled Experiments.
  • Comprehensive Personalized Pricing Guide, Part V, §13

연결 그래프