Собесов

Сценарий A/B: switchback-тест для двустороннего маркетплейса

A/B-тестыСложные дизайныСложнаяSenior

Условие

Тестируем алгоритм матчинга курьеров и заказов. Эффект 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_окон, не пользователей. Часто нужно несколько недель × десятки регионов.

Подводные камни

  1. Carry-over effect: эффект treatment влияет на следующее окно через накопленные заказы. Решение — burn-in минут в начале каждого окна (отбрасываем).
  2. Сезонность дня — учитываем как fixed effect (hour-of-day, day-of-week), иначе она поглотит сигнал.
  3. Малое число регионов → нестабильный cluster SE; компенсируем длинным горизонтом.
  4. Если treatment меняет поведение постоянно (например, push-уведомление), switchback не подходит — это не reversible intervention.

Эталонный ответ

Switchback: рандомизация по time × region windows вместо пользователей, агрегация на уровне окна, cluster SE по region. Решает SUTVA-проблему spillover в маркетплейсах. Требует reversible intervention, burn-in для carry-over и контроль hour-of-week.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти