Causal / Uplift — CUPED and Individual Treatment Effects
Контекст
Обычный двухвыборочный t-тест отвечает только на вопрос «работает ли эффект в среднем» и не использует пред-период. Из-за этого эксперименты просят больше трафика, чем нужно, а retention-акции уходят всем, хотя реагирует лишь часть аудитории.
Проект закрывает оба пробела двумя методами:
- CUPED — снижение дисперсии по ковариате из пред-периода: тот же ATE, но уже CI, то есть меньше пользователей до нужной мощности.
- Uplift-моделирование — оценка индивидуального эффекта (ITE): таргетировать акции на тех, кто реально реагирует, а не на всех.
Оба метода работают на синтетическом рандомизированном эксперименте с известным гетерогенным эффектом, поэтому оценки можно сверить с ground truth.
Данные и метод
Данные синтетические и детерминированные (seed = 42), 20 000 пользователей в рандомизированном эксперименте:
segment—new(30%) /returning(70%) → гетерогенный эффект воздействия;x_pre— ковариата пред-периода, коррелированная с исходом (ρ ≈ 0.67);treatment— 50/50, независим от всего (чистая рандомизация);tau_true— истинный индивидуальный эффект (только для оценки);y_cont— непрерывный исход;y_bin— бинарная конверсия.
CUPED — та же оценка ATE, меньше дисперсия:
| Метод | ATE | SE | 95% CI |
|---|---|---|---|
| Naive | 0.270 | 0.019 | [0.232, 0.308] |
| CUPED | 0.276 | 0.014 | [0.247, 0.304] |
Точечная оценка не меняется (0.270 → 0.276, в пределах шума). Стандартная ошибка сжимается на ~26% (×0.74), CI сужается в 1.35×. Снижение дисперсии ~45% фактически против 55% теоретически (разрыв — ковариата является прокси пред-периода, а не самим исходом).
Uplift — индивидуальный эффект, T- и S-learner:
| Модель | AUUC | QINI | uplift@20% | corr(τ) |
|---|---|---|---|---|
| T-learner | 0.0043 | 0.0014 | 0.072 | 0.50 |
| S-learner | 0.0057 | 0.0029 | 0.041 | 0.66 |
| Random | 0.0014 | −0.0014 | −0.015 | 0.007 |
Оговорка о честности: латентная ground-truth τ равна 0.60 (new) / 0.08 (returning), но конверсионный uplift ~0.11 / 0.01, потому что сигмоида при высокой базовой конверсии (~71%) дампит большие латентные эффекты. Сравнивать предсказанный бинарный uplift с латентной τ было бы несовпадением шкал; мы приводим ранговую корреляцию (без масштаба) и по-сегментное эмпирическое восстановление (одна шкала).
Запуск
uv run --with pandas --with numpy python data/generate_data.py
uv run --with pandas --with numpy --with scikit-learn --with lightgbm --with matplotlib python run.py
uv run --with pandas --with numpy --with scikit-learn --with lightgbm --with matplotlib --with pytest pytest -q
Результаты: reports/metrics.json + reports/uplift.png (QINI-кривые + сегментный uplift против ground truth).
Что нашли
CUPED даёт мощность бесплатно: новый дизайн эксперимента не нужен, нужен лишь лучший оценщик на уже собранных данных — при условии, что есть ковариата из пред-периода.
Uplift отвечает на другой вопрос, чем A/B-тест: не «работает ли воздействие в среднем», а «на ком оно работает». Методы дополняют друг друга, а не заменяют.
Модель восстановила форму эффекта: «новые» пользователи реагируют ~10× сильнее «возвращающихся» — тот самый сигнал, по которому действовала бы скидочная кампания.
| Сегмент | Truth (binary uplift) | T-learner | S-learner |
|---|---|---|---|
| new | 0.110 | 0.126 | 0.120 |
| returning | 0.010 | 0.018 | 0.019 |
Синтетика с истинным гетерогенным эффектом — единственная причина, по которой восстановление вообще можно проверить: на реальных данных ITE не наблюдается никогда, и это фундаментальная проблема causal inference.
Эффект
- CUPED — та же оценка ATE, стандартная ошибка −26%, CI в 1.35× уже.
- Экономия трафика — 10k → ~5.6k пользователей на руку при той же мощности.
- Uplift — T- и S-learner бьют random по AUUC, Qini и uplift@20%.
- Таргетинг — восстановленный эффект «new ~10× returning» превращает скидки из «всем» в адресные.