이 글은 사전지식 기반 (교재 미확인 — agent 사전학습 기반). 핵심 인용 — Bojinov, Simchi-Levi, Zhao (2023), Bojinov & Shephard (2019), Hu & Wager (2022).
이 글은 J-SWITCH 시리즈의 두 번째 글. Switchback design 의 정통 — Bojinov 2023 — 을 다룬다.
1 진입 직관 — “같은 시장에서 시점만 바꾸기”
표준 A/B: unit 을 처치/대조 분리. 그러나 2-sided market 에서는 시장 균형 이 spillover.
Switchback 의 한 줄 원리: 전체 시장 에 처치 또는 대조 적용. 시점에 따라 무작위 전환. 같은 unit 이 시점에 따라 두 alg 모두 경험.
결과: spillover 시장 안에서 균등화. 시점 비교 로 효과 추정.
1.1 비유
식당의 메뉴 — 월/수/금 새 메뉴, 화/목/토 기존 메뉴 (무작위 전환). 전체 손님 이 시점에 따라 둘 다 경험. 두 시점 그룹의 매출 비교 — 메뉴의 효과.
표준 A/B: 손님을 처치/대조 분리 — 그러나 식당 전체 분위기 는 모든 손님에게 영향 (spillover).
2 Bojinov-Simchi-Levi-Zhao (2023)
2.1 의의
Switchback experiment 의 modern 정통. Uber 의 실제 적용 에서 motivated.
2.2 핵심 contribution
- 시점 단위 무작위 배정 의 정통화
- Carry-over effect 의 명시적 modeling
- Variance 의 분석 + block size 결정
3 시점 단위 무작위 배정
3.1 메커니즘
시간을 T 개 block 으로 분할. 각 block 의 처치 \(A_t \in \{0, 1\}\) 이 무작위 결정.
예: 1 시간을 6 개 10 분 block 으로 분할. 각 block 의 처치 fair coin 으로.
3.2 Outcome
\(Y_t\): block \(t\) 의 outcome (예: trip 수, 평균 ETA, GMV).
3.3 Estimator
\[ \hat{\tau} = \bar{Y}_{A=1} - \bar{Y}_{A=0} \]
처치 block 평균 - 대조 block 평균.
3.4 가정
- No spillover across markets: 한 도시의 switchback 이 다른 도시 영향 없음 (market isolation)
- Carry-over 짧음: 이전 block 의 처치 영향이 다음 block 에 제한적
4 Carry-Over Effect
4.1 정의
이전 block \(t-1\) 의 처치 \(A_{t-1}\) 이 현재 block \(t\) 의 outcome \(Y_t\) 에 영향. 시간적 spillover.
4.2 사례
Uber: 15:00~15:30 처치 (할증 ↑) → 운전자 과잉 공급 → 15:30~16:00 대조 시점에도 공급 잔류.
4.3 처리 1: Block size 충분히 크게
Carry-over 가 짧은 시간 만 지속하면 충분히 큰 block 사용. 다음 block 의 시작 부분 데이터 제외 (warm-up).
4.4 처리 2: Lag model
\[ Y_t = \alpha + \tau A_t + \gamma A_{t-1} + \varepsilon_t \]
\(\gamma\): lag-1 carry-over.
4.5 처리 3: First-block-only
매 block 의 첫 시점만 outcome 관측. Carry-over 영향 최소화.
5 Block Randomization
5.1 메커니즘
시간을 큰 block (예: 일) 으로 나누고 block 내에서 균형 무작위.
예: 하루 24 시간 — 12 시간 처치 + 12 시간 대조. 시점은 무작위.
5.2 장점
균형 (balance) 보장 — 처치/대조 시간 비율 정확.
5.3 단점
Carry-over 보정 어려움 — 12 시간 연속 처치 시 long-term effect 와 carry-over 혼동.
6 Variance Analysis (Bojinov 2023)
6.1 Naive variance
\[ \widehat{\text{Var}}(\hat{\tau}) = \frac{S_1^2}{T_1} + \frac{S_0^2}{T_0} \]
\(S_a^2\): 그룹 \(a\) 의 outcome variance, \(T_a\): 그룹 \(a\) 의 block 수.
6.2 문제
시계열 autocorrelation 무시. 실제 SE 가 과소 추정.
6.3 Bojinov 제안 — HAC SE
Heteroskedasticity and Autocorrelation Consistent (HAC) SE — autocorrelation 보정.
6.4 Block size 의 trade-off
- 작은 block: 무작위 균형 좋지만 carry-over 큼
- 큰 block: 균형 어렵지만 carry-over 작음 (warm-up 가능)
Optimal block size — Bojinov 의 분석.
7 Hu & Wager (2022) — Optimal Block Size
7.1 동기
Block size 의 optimal 결정. MSE 최소화.
7.2 결과
Carry-over 의 length scale 과 outcome variance 의 비율로 결정. 일반적 권장: 30 분 ~ 1 시간 block.
8 Uber 사례 — 실제 응용
8.1 시나리오
Surge pricing algorithm 변경 — 새 알고리즘 의 매출/대기 시간 효과.
8.2 표준 A/B 의 한계
일부 운전자에게 새 알고리즘 적용 시 나머지 운전자의 호출 도 영향 (spillover). 제어 그룹의 시장 균형 변화.
8.3 Switchback
전체 시장 에 5 분 단위 알고리즘 전환. 모든 운전자 가 두 알고리즘 모두 경험.
분석: 5 분 시점의 outcome (trips, ETA, GMV) 을 처치/대조 그룹으로 비교.
8.4 결과
Spillover 영향 최소화. 진짜 시장 효과 추정.
9 시뮬레이션 — Switchback
import numpy as np
np.random.seed(42)
# 시나리오: 24 시간 = 144 block (10 분 단위), 무작위 처치
T = 144
A = np.random.binomial(1, 0.5, T)
# Outcome (trips per block):
# - Baseline: 50
# - 직접 효과: +5
# - Spillover (전 시점의 30%): +2 if A_{t-1} = 1
# - Time-of-day variation: ±10
true_effect = 5.0
carry_over = 2.0
Y = np.zeros(T)
for t in range(T):
base = 50 + 10 * np.sin(2 * np.pi * t / T) # 시간대 변동
direct = true_effect * A[t]
co = carry_over * A[t-1] if t > 0 else 0
Y[t] = base + direct + co + np.random.normal(0, 3)
# Naive estimator (carry-over 무시)
naive = Y[A == 1].mean() - Y[A == 0].mean()
print(f"[Switchback 시뮬레이션]\n")
print(f"진짜 direct effect: {true_effect}")
print(f"Carry-over (lag-1): {carry_over}")
print(f"\nNaive estimate (carry-over 무시): {naive:.2f}")
print(f" → 진짜 효과 + 약간의 carry-over bias")
# Lag model
import statsmodels.api as sm
X = np.column_stack([A, np.roll(A, 1)])
X = sm.add_constant(X)
model = sm.OLS(Y[1:], X[1:]).fit() # 첫 row 제외 (lag undefined)
print(f"\n[Lag model (Y_t ~ A_t + A_{{t-1}})]")
print(f" Direct effect (β_1): {model.params[1]:.2f}")
print(f" Carry-over (β_2): {model.params[2]:.2f}")
print(f" → 진짜 direct effect {true_effect} 와 carry-over {carry_over} 분리")
# HAC SE
from statsmodels.stats.sandwich_covariance import cov_hac
hac_cov = cov_hac(model, nlags=3)
se_naive = model.bse[1]
se_hac = np.sqrt(hac_cov[1, 1])
print(f"\n[Variance 분석]")
print(f" Naive SE: {se_naive:.3f}")
print(f" HAC SE: {se_hac:.3f}")
print(f" → autocorrelation 보정 시 SE 가 약간 큼")10 결론
Switchback design 은 시간 단위 무작위 배정 으로 spillover 우회. Carry-over effect 가 핵심 도전 — block size + lag model 로 처리. Bojinov-Simchi-Levi-Zhao (2023) 의 estimator + variance 가 modern 정통. Uber 등 2-sided market 에서 표준.
핵심 메시지:
- Switchback = 시간 단위 무작위
- Carry-over effect: 시간적 spillover, 핵심 도전
- Bojinov 2023: estimator + variance 정통
- Block size: trade-off (균형 vs carry-over)
- HAC SE: autocorrelation 보정
- Hu-Wager 2022: optimal block size
- Uber 응용: 표준
다음 글: Geo Holdout.
11 관련 주제
선행 지식
- J-SWITCH-0 Overview
- (Phase F) F12-* — Client-side experiments
- (Phase F) Trustworthy A/B SUTVA
Phase J 후속 글
- Geo Holdout (placeholder)
- Spillover Detection (placeholder)
12 참고문헌
- Bojinov, I., Simchi-Levi, D., Zhao, J. (2023). Design and analysis of switchback experiments. Management Science 69, 3759-3777.
- Bojinov, I. & Shephard, N. (2019). Time series experiments and causal estimands: Exact randomization tests and trading. J. Amer. Statist. Assoc. 114, 1665-1682.
- Hu, Y. & Wager, S. (2022). Switchback experiments under geometric mixing. arXiv:2209.00197.
- Cooprider, J. & Nassiri, S. (2023). Science of price experimentation at Amazon. Amazon Tech Blog.
- Glynn, P. W., Johari, R., Rasouli, M. (2020). Adaptive experimental design with temporal interference. NeurIPS.