Короткий ответ
CUPED — это метод снижения дисперсии метрики в тесте с помощью известных до начала эксперимента (пре-экспериментальных) данных о том же пользователе, что позволяет либо обнаруживать тот же эффект при меньшей выборке, либо получать более узкие доверительные интервалы при том же объёме данных.
Как это работает подробнее
Как это работает: метрика корректируется вычитанием части её вариации, которая объясняется ковариатой, измеренной до теста и коррелирующей с итоговой метрикой (например, активность пользователя за предыдущий месяц), с коэффициентом, минимизирующим дисперсию скорректированной метрики; среднее значение по группам при этом не меняется, меняется только дисперсия оценки.
Упрощённая идея в псевдокоде:
Ожидаемый результат: var(metric_cuped) < var(metric) при наличии корреляции между metric и pre_metric; sanity check — среднее по группам metric_cuped должно совпадать (с точностью до шума) со средним исходной metric, меняется только разброс.
Пример кода
import numpy as np
theta = np.cov(metric, pre_metric)[0,1] / np.var(pre_metric)
metric_cuped = metric - theta * (pre_metric - pre_metric.mean())Что использовать на практике
- На практике: CUPED особенно полезен, когда метрика сильно вариативна между пользователями (например, revenue per user) и есть доступная предыдущая история поведения; выигрыш в точности тем больше, чем сильнее корреляция пре-метрики с метрикой теста.
Подводные камни
- Частые ошибки: использование в качестве ковариаты метрики, измеренной уже во время теста (после начала воздействия) вместо строго пре-экспериментального периода — это может внести смещение, так как сама ковариата могла быть затронута эффектом изменения.