베이지안 A/B 테스트와 톰슨 샘플링으로 실험 운영하기
베이지안 A/B 테스트와 Thompson Sampling 기반 멀티암드 밴딧의 의사결정 규칙, 트래픽 할당, 운영 안전장치를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
실험을 고정 배분으로만 운영하기 어려운 이유
전환율과 매출을 다루는 온라인 실험에서는 학습 속도와 손실 통제가 함께 요구된다. 고정 비율로 트래픽을 나누는 빈도주의 실험은 사전 샘플 크기 계산과 피킹 제약이 병목이 될 수 있다. 베이지안 A/B 테스트와 Thompson Sampling 기반 Multi-Armed Bandit은 확률적 판단과 동적 트래픽 배분으로 이 문제를 다룬다.
베이지안 방식은 결과에 대한 불확실성을 갱신하면서 승자 선택 시점을 판단한다. 밴딧은 관측되는 보상에 따라 더 나은 대안으로 트래픽을 옮기되, 아직 확신할 수 없는 대안도 탐색한다. 목적은 누적 후회(regret)를 줄이면서 빠르게 학습하는 데 있다.
사후분포로 판단하는 베이지안 A/B 테스트
베이지안 A/B 테스트는 사전분포(prior)에 관측 데이터를 결합해 사후분포(posterior)를 추정한다. 이 분포로 효과가 존재할 확률인 P(win), 기대 리프트, 신용구간(credible interval)을 해석하고 의사결정 규칙을 세운다.
이진 전환 지표에는 Beta-Bernoulli 결합이 흔히 쓰인다. 연속 지표에는 Normal-Gamma, Normal 등을 적용할 수 있다. 관측이 누적될 때마다 사후분포를 갱신하므로 선택적 중간 분석과 조기 종료를 허용할 수 있다.
사전분포는 비정보적 설정인 α=1, β=1로 시작하거나, 적은 prior weight를 둔 약한 정보 사전분포를 사용할 수 있다. 역사 데이터를 활용한다면 prior pseudo-count 형태의 정규화 사전분포도 고려 대상이다.
Thompson Sampling이 트래픽을 배분하는 방식
Multi-Armed Bandit은 여러 대안의 보상 분포를 순차적으로 학습한다. Thompson Sampling은 각 변형의 사후분포에서 표본을 뽑고, 가장 큰 표본값을 얻은 변형에 트래픽을 배정한다.
이 과정은 이미 좋은 것으로 보이는 변형을 활용하면서도, 불확실한 변형을 탐색하게 만든다. 구현이 비교적 단순하고 이론적 최적성을 갖는 점이 실무에서 활용되는 이유다.
사용자나 세션의 조건까지 반영하려면 Contextual Bandit을 사용할 수 있다. 이 경우 컨텍스트별 최적 팔을 선택하며, 오프폴리시 평가와 배치·온라인 학습의 결합이 필요하다.
운영 규칙은 성과 지표만으로 만들 수 없다
주요 지표 외에 취소율, 페이지 지연, 고객센터 접수 같은 Guardrail Metric을 제약 조건으로 둬야 한다. 가드레일이 무너지면 성과 지표가 좋아도 즉시 스로틀하거나 롤백할 수 있어야 한다.
베이지안 A/B 테스트에서는 P(B>A) ≥ θ, 최소 실질 리프트(MCID), 신용구간 폭 ≤ δ 같은 조건을 조합할 수 있다. 다중 비교가 필요한 경우에는 계층 모델이나 베이지안 모델 비교를 사용한다.
밴딧 운영에는 ε floor, 최대 트래픽 캡(cap), 최소 노출 보장, 후회 또는 수익 기준의 조기 수렴 규칙이 필요하다. 시즌성, 유입 변화, 드리프트처럼 분포가 고정되지 않는 상황에는 윈도우링, 가중 업데이트, 리셋 전략을 함께 설계한다.
이벤트 스키마와 사용자 식별 기준도 먼저 합의해야 한다. 유효 노출과 전환의 정의, 샘플 독립성, 봇·이상치·결측 데이터 처리가 흔들리면 사후분포와 트래픽 배분 모두 신뢰하기 어렵다.
전환율·매출·메시지 실험에 적용하는 경우
저유입 채널의 CTA나 랜딩 실험에는 베이지안 A/B 테스트를 적용해 불확실성을 빠르게 줄일 수 있다. 고유입 홈 트래픽처럼 누적 전환을 관리해야 하는 환경에는 Thompson Sampling으로 동적 배분을 고려할 수 있다.
가격과 매출 지표는 수익 분포의 꼬리가 두꺼울 수 있으므로 로그정규 또는 감마 모델을 적용한다. 고가치 사용자가 과대표집되는 문제를 줄이기 위해 최소 노출과 트래픽 캡을 병행한다.
CRM 캠페인이나 푸시 메시지는 세그먼트와 시간대를 컨텍스트로 포함하는 Contextual Bandit으로 개인화할 수 있다. 이때 해지율과 언서브스크라이브율은 가드레일 제약으로 둔다.
베이지안 시퀀셜 업데이트는 평균 2040% 빠른 종료를 달성할 수 있다. Thompson Sampling 도입은 고정 랜덤화와 비교해 후회 감소에 따라 310% 누적 전환 개선이 보고된 사례가 빈번하다. 피킹 제약 완화, 해석 용이성, 실험 실패 비용 제한, 비정상성 대응은 실험 문화와 자동화 운영 기반에도 영향을 준다.
설계부터 사후 평가까지의 운영 흐름
실험 설계에서는 전환율·매출 같은 1차 지표와 성능·불만·취소율 같은 가드레일을 정한다. MCID와 기대 리프트 범위, 사용자 단위의 랜덤화 방식, 표본 독립성 검증 계획도 이 단계에서 결정한다.
베이지안 방식이라면 사전분포, P(win) 임계치인 예: 0.95, 신용구간 폭, 조기 중단 조건을 명세한다. 밴딧은 최소 노출, 트래픽 캡, ε floor, 드리프트 감지 후 리셋 또는 가중 규칙을 정한다.
실행 중에는 노출·클릭·전환·매출 이벤트를 안정적으로 수집하고, 지연 전환 윈도우와 중복 제거 기준을 적용한다. 봇·프로도 필터, outlier cap, 지연 데이터 인입 시 보정 로직도 필요하다.
베이지안 A/B 테스트는 일정 주기로 posterior를 갱신하고 P(win)를 계산한다. 밴딧은 방문 시 팔별 사후분포에서 샘플링해 최대 표본의 팔을 노출하고, 보상을 관측한 뒤 파라미터를 업데이트한다.
승자를 정한 뒤에는 예: 10%→50%→100%의 단계적 램프를 진행하며 가드레일을 감시한다. 실험 로그와 리그레션 리포트는 보존하고, 사후 분석에서는 베이지안 추정치와 리프트 분포를 검토한다. 밴딧의 편향은 IPS/DR 같은 오프폴리시 평가로 보정하며 비정상성과 세그먼트 이질성도 점검한다.
고정 A/B와 베이지안·밴딧의 차이
| 방법 | 성능(결정 속도) | 확장성(팔/세그먼트) | 일관성/통제 | 안정성(비정상성) | 운영 편의 |
|---|---|---|---|---|---|
| 빈도주의 A/B | 중간, 사전 샘플 계산 의존 | 높음, 구현 단순 | 피킹 취약, Type I 통제 명확 | 낮음, 고정 할당 | 매우 높음, 해석 용이 |
| Bayesian A/B | 빠름, 시퀀셜로 조기 종료 | 높음, 모델만 확장 | 신용구간/결정확률로 명확 | 중간, 모델 업데이트 필요 | 높음, 스냅샷 리포팅 용이 |
| Bandit(Thompson) | 매우 빠름, 온라인 최적화 | 높음, 팔 증가 영향 적음 | 오프폴리시 평가 필요 | 높음, 동적 할당 | 중간, 운영 규칙 필요 |
베타-베르누이 모델로 P(B>A) 계산하기
전제조건: Python 3.10+, numpy, scipy 설치 필요
- pip install numpy scipy
import numpy as np
from scipy.stats import beta
# 관측 데이터
# A: 120/1000, B: 150/1000
A_success, A_total = 120, 1000
B_success, B_total = 150, 1000
# 비정보적 사전 Beta(1,1)
alpha_A, beta_A = 1 + A_success, 1 + (A_total - A_success)
alpha_B, beta_B = 1 + B_success, 1 + (B_total - B_success)
# P(B > A) 몬테카를로 근사
rng = np.random.default_rng(42)
samples = 200_000
pA = rng.beta(alpha_A, beta_A, size=samples)
pB = rng.beta(alpha_B, beta_B, size=samples)
p_win = np.mean(pB > pA)
# 95% 신용구간 길이(개별 팔)
ciA = np.percentile(pA, [2.5, 97.5])
ciB = np.percentile(pB, [2.5, 97.5])
print(f"P(B>A)={p_win:.4f}, A_CI={ciA}, B_CI={ciB}")
# 간단한 정지 규칙
theta = 0.95
ci_width_max = 0.01
stop = (p_win >= theta) and ((ciA[1]-ciA[0] <= ci_width_max) or (ciB[1]-ciB[0] <= ci_width_max))
print("조기 종료 여부:", stop)
Thompson Sampling으로 이진 보상 시뮬레이션하기
import numpy as np
rng = np.random.default_rng(0)
true_rates = np.array([0.10, 0.11, 0.13]) # 실제 전환율(미지)
K = len(true_rates)
alpha = np.ones(K) # Beta(1,1)
beta_ = np.ones(K)
T = 50_000
success = np.zeros(K, dtype=int)
trials = np.zeros(K, dtype=int)
for t in range(T):
# 사후에서 샘플링
theta = rng.beta(alpha, beta_)
arm = int(np.argmax(theta))
# 노출 및 보상 관측
reward = rng.random() < true_rates[arm]
trials[arm] += 1
if reward:
success[arm] += 1
alpha[arm] += 1
else:
beta_[arm] += 1
est = (alpha - 1) / (alpha + beta_ - 2)
print("노출 횟수:", trials)
print("추정 전환율:", np.round(est, 4))
print("최적 팔 비율:", trials[np.argmax(true_rates)] / T)
빠른 최적화와 통제 가능성 사이의 선택
각 팔에 초기 N회 강제 탐색을 적용하면 콜드스타트를 완화할 수 있다. 개별 팔의 최대 비율을 제한하는 트래픽 캡은 한 변형으로의 과도한 집중을 막는다. 지연 전환은 관측 윈도우 안에서 확정된 전환만 반영하고, 지연 추정치에는 가중 감쇠를 적용한다.
베이지안 A/B 테스트는 P(win)와 MCID를 함께 기준으로 두고, 가드레일을 베이지안 제약 모델에 포함할 수 있다. 세그먼트 이질성이 존재하면 계층 베이지안 모델이 대안이 된다.
밴딧은 ε floor, 최소 노출, 트래픽 캡, ADWIN 또는 변화점 기반 드리프트 검출과 사후 파라미터 리셋·감쇠를 조합한다. 로그 품질 감시와 오프폴리시 평가도 분리할 수 없는 운영 요소다.
A/B 테스트는 해석이 쉽지만 밴딧보다 온라인 최적화 측면에서 불리할 수 있다. 반대로 밴딧은 누적 성과 최적화에 유리하지만 오프라인 비교에서 편향이 발생한다. 엄격한 가드레일과 캡은 안정성을 높이는 대신 수렴 속도를 늦추며, 더 풍부한 베이지안 모델은 추정을 개선할 수 있지만 구현과 모니터링 부담을 늘린다.