CUPED простыми словами
alpha 0.05. В результате теста получили p-value 0.06. Какой вывод корректнее всего?Зачем это знать
CUPED — один из самых мощных инструментов в современных A/B-тестах. Microsoft, Netflix, Booking используют. Снижает дисперсию на 30-70% → нужно в 2-3 раза меньше выборки, чтобы задетектить тот же эффект.
На middle+ собесах в FAANG спрашивают CUPED. Без знания — минус очки.
Короткое объяснение
CUPED (Controlled-experiment Using Pre-Experiment Data) использует поведение пользователей до эксперимента, чтобы уменьшить шум в метрике.
Идея: если пользователь был тяжёлым до эксперимента, он и в эксперименте будет. Учитываем это — дисперсия падает.
Формула
Y_CUPED = Y - θ × (X - mean(X))Где:
- Y — метрика в эксперименте
- X — та же метрика в pre-experiment period (covariate)
- θ — коэффициент:
Cov(Y, X) / Var(X)(OLS slope)
Интерпретация: «очистить» Y от дисперсии, объяснённой X.
Пример
Метрика: revenue per user за эксперимент (2 недели).
Covariate: revenue per user за предыдущие 4 недели.
Сильная корреляция → θ высокий → больше снижение дисперсии.
Снижение дисперсии
Var(Y_CUPED) = Var(Y) × (1 - ρ²)Где ρ — корреляция Y и X.
Если ρ = 0.7 → дисперсия падает на 49%. Если ρ = 0.9 → на 81%.
Когда CUPED эффективен
- Метрики на уровне пользователя с данными до эксперимента.
- Стабильные пользователи (revenue, sessions, time-on-site).
- Не новые пользователи — нет истории до эксперимента.
Когда НЕ работает
- Новые пользователи (нет данных до эксперимента).
- Новые фичи (нет аналога в прошлом).
- Дискретные метрики вроде conversion — меньше выигрыш.
Как реализовать в SQL
WITH user_data AS (
SELECT
user_id,
SUM(CASE WHEN DATE BETWEEN '2026-04-01' AND '2026-04-14' THEN revenue END) AS y,
SUM(CASE WHEN DATE BETWEEN '2026-03-01' AND '2026-03-31' THEN revenue END) AS x
FROM transactions
GROUP BY user_id
),
theta AS (
SELECT covar_pop(y, x) / NULLIF(var_pop(x), 0) AS theta, avg(x) AS mean_x
FROM user_data
)
SELECT
u.user_id,
u.y - t.theta * (u.x - t.mean_x) AS y_cuped
FROM user_data u, theta t;Потом t-test на y_cuped между группами.
В Python
import numpy as np
def cuped(y, x):
theta = np.cov(y, x)[0, 1] / np.var(x)
return y - theta * (x - np.mean(x))
y_adjusted = cuped(y, x_pre_experiment)
# t-test на y_adjusted вместо yВажные детали
Рассчитывать θ на всей выборке
НЕ отдельно по control и treatment. Иначе bias.
Random assignment
CUPED работает только с рандомизированным treatment (обычный A/B).
Проверка баланса
Ковариата X до эксперимента должна быть сбалансирована между группами (ожидается при рандомизации).
Выигрыш в выборке
Если дисперсия упала в 2 раза → можно в 2 раза меньше выборки для той же статистической мощности. Или сократить тест вдвое по времени.
В компаниях со многими экспериментами — огромный выигрыш.
Альтернативы
- Stratification: разделить на страты, агрегировать.
- Regression adjustment: линейная модель с признаками.
- Double machine learning: для сложных ковариат.
CUPED — простейший, часто работает хорошо.
На собесе
«Что такое CUPED?» Метод уменьшения дисперсии через ковариату до эксперимента.
«Почему работает?» Убирает шум, объяснённый ковариатой.
«Какое условие?» Между Y и X должна быть корреляция.
«Выигрыш на практике?» 30-70% снижения дисперсии для метрик типа revenue.
Частые ошибки
Считать θ отдельно по группам
Смещение. Считайте только на общей выборке.
Применять на новых пользователях
Данных до эксперимента нет → X = 0 → выигрыша нет, результат может ввести в заблуждение.
Корреляция ковариаты с группой
Если X коррелирует с назначением в группу (чего не должно быть при рандомизации) — результат смещён.
Использовать pre-period внутри эксперимента
Ковариата должна считаться строго ДО старта теста. Если взять X из периода теста — утечёт информация о treatment.
Ковариата не та метрика
CUPED работает лучше всего, когда X — та же метрика, что и Y, только в предыдущем периоде. Случайная другая фича даёт меньший выигрыш.
Связанные темы
- A/B-тест простыми словами
- Stratification простыми словами
- Размер выборки для A/B
- p-value простыми словами
FAQ
Работает на conversion?
Да, но выигрыш меньше, чем на непрерывных метриках.
Нужна регрессия?
CUPED — простейшая form of regression adjustment.
Сложно внедрить?
Нет, пара строк кода. Требует только pre-experiment data.