Условие
Тестируем алгоритм матчинга курьеров и заказов. Эффект treatment на курьеров влияет на доступность для users (spillover). Опишите switchback-дизайн.
Решение
Подход
В двусторонних рынках классическое user-level A/B нарушает SUTVA (stable unit treatment value assumption): treatment одного пользователя через предложение влияет на другого. Switchback — рандомизация во времени и пространстве:
- разбиваем сетку «гео × временное окно» (например, город × 30 мин);
- каждое окно случайно получает control или treatment;
- метрика агрегируется на уровне окна.
Реализация
import pandas as pd
import numpy as np
def design_switchback(regions, dates, window_min=30, seed=42):
rng = np.random.default_rng(seed)
rows = []
for region in regions:
for date in dates:
for h in range(24):
for m in range(0, 60, window_min):
grp = 'c' if rng.random() < 0.5 else 't'
rows.append({'region':region, 'ts': f"{date} {h:02d}:{m:02d}",
'group': grp})
return pd.DataFrame(rows)
# Анализ: GLS или OLS с cluster SE по region
import statsmodels.formula.api as smf
model = smf.ols("metric ~ group + C(region) + C(hour)",
data=window_df).fit(
cov_type='cluster', cov_kwds={'groups': window_df['region']}
)Тонкости
- Длина окна: должна быть больше времени релаксации системы (10-20 мин для доставки), но достаточно мала, чтобы было много переключений.
- Border effects: заказ, начавшийся в окне control, завершается в окне treatment → отбрасывайте edge orders или приписывайте по времени старта.
- Cluster SE по region × date: окна внутри одного региона/дня скоррелированы.
Sample size
N_effective = N_окон, не пользователей. Часто нужно несколько недель × десятки регионов.
Подводные камни
- Carry-over effect: эффект treatment влияет на следующее окно через накопленные заказы. Решение — burn-in минут в начале каждого окна (отбрасываем).
- Сезонность дня — учитываем как fixed effect (hour-of-day, day-of-week), иначе она поглотит сигнал.
- Малое число регионов → нестабильный cluster SE; компенсируем длинным горизонтом.
- Если treatment меняет поведение постоянно (например, push-уведомление), switchback не подходит — это не reversible intervention.
Эталонный ответ
Switchback: рандомизация по time × region windows вместо пользователей, агрегация на уровне окна, cluster SE по region. Решает SUTVA-проблему spillover в маркетплейсах. Требует reversible intervention, burn-in для carry-over и контроль hour-of-week.