Ответ
При разбиении существующих магазинов на тестовую и контрольную группы для A/B-теста моя главная цель — сделать группы максимально похожими по всем значимым параметрам, кроме внедряемого изменения. Я использую стратифицированную рандомизацию.
Практический подход (на Python):
-
Определяю ключевые страты (признаки): Это метрики, которые сильно влияют на целевую переменную (например, выручку). Обычно это:
- Географический регион / тип города.
- Формат и площадь магазина.
- Историческая средняя выручка за последний квартал.
- Трафик (среднее количество чеков).
-
Создаю страты и выполняю разбиение:
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split # df - DataFrame с данными магазинов # Создаю категориальную переменную 'strata', комбинируя ключевые признаки df['strata'] = ( df['region'].astype(str) + '_' + pd.qcut(df['historical_revenue'], q=4, labels=['q1','q2','q3','q4']).astype(str) ) # Стратифицированное разбиение. test_size=0.5 для двух равных групп. group_a, group_b = train_test_split( df, test_size=0.5, stratify=df['strata'], random_state=42 # для воспроизводимости ) -
Проверяю баланс: После разбиения обязательно проверяю, что распределение ключевых метрик (средняя выручка, медианная площадь) между группами статистически неразличимо (например, с помощью t-теста или визуализации). Если дисбаланс есть, повторяю разбиение.
Почему не простая случайная выборка? Прямой рандомизации недостаточно для магазинов, так как они сильно различаются. Стратификация гарантирует, что в каждой группе будет пропорциональное количество, например, маленьких магазинов в регионах и крупных в столице, что делает сравнение честным.