CUPED простыми словами

Проверь себя · 1/3разбор после ответа
Вы заранее выбрали 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 между группами.

Подготовься к собесу по A/B и статистике
300+ вопросов с разбором: дизайн, размер выборки, p-value, ловушки
Тренировать A/B в Telegram

В 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, только в предыдущем периоде. Случайная другая фича даёт меньший выигрыш.

Связанные темы

FAQ

Работает на conversion?

Да, но выигрыш меньше, чем на непрерывных метриках.

Нужна регрессия?

CUPED — простейшая form of regression adjustment.

Сложно внедрить?

Нет, пара строк кода. Требует только pre-experiment data.