← Volta Neobank

Causal · проект 23 из 23

DiD-проверка: фикс KYC причинно поднял M3-удержание на +9,09 п.п. (95% ДИ [+6,21; +11,96]) — pre-trends плоские, placebo ≈ 0, max |SMD| 0,157 < 0,2.

Ситуация
Фикс KYC совпал с ростом удержания, но pre/post-тест даёт корреляцию, а не причинную оценку: он игнорирует общий месячный тренд
Задача
Получить причинную оценку эффекта KYC-фикса против корреляции от pre/post-теста через дизайн difference-in-differences
Действия
Treated — in-app KYC против партнёрского, naive pre/post, DiD и covariate-adjusted DiD, диагностики parallel trends, placebo, SMD
Результат
M3-удержание: DiD ATT +9,09 п.п. (95% ДИ [+6,21; +11,96]); активация naive +6,29 п.п. против DiD +4,92 п.п.
Стек
Pythonpandas / NumPySciPy / Statsmodelsscikit-learnMatplotlib / Seabornuv + ruff
Содержание
  1. Ситуация
  2. Задача
  3. Действия
  4. Результат
  5. Рекомендации
  6. Документация

Volta — Причинная валидация KYC (DiD)

Ситуация

Project 3 показал, что фикс KYC совпал с ростом удержания, но pre/post Welch t-test — корреляция, а не причинная оценка: он игнорирует общий месячный тренд. Этот проект проверяет то же утверждение дизайном difference-in-differences против потока, на который фикс не действовал.

Задача

Мне нужно было получить причинную оценку эффекта KYC-фикса, а не корреляцию, которую дал pre/post-тест. От меня требовалось построить дизайн difference-in-differences против потока, на который фикс не действовал.

Действия

  • Дизайн: treated — in-app KYC (на него действует прогресс-бар), comparison — партнёрский KYC (агентский, фикс не применяется), cutoff 2024-09.
  • N = 84 000 (50 400 treated / 33 600 comparison), 24 когорты регистрации (2023-01 … 2024-12).
  • Оценки: naive pre/post, 2×2 DiD и covariate-adjusted DiD (возраст, устройство, pre-activity) с SE, кластеризованными по когорте.
  • Диагностики: parallel trends (наклон разрыва в pre-периоде), placebo на фейковом cutoff 2024-01, covariate balance (SMD), propensity overlap.
  • Данные синтетические: генератор закладывает известный ATT (+5,7 / +8,5 / +9,0 п.п.), поэтому это проверка метода — оценщик должен восстановить эффект.

Результат

  • M3-удержание: DiD ATT +9,09 п.п. (95% ДИ [+6,21; +11,96], p<0,001) — причинная оценка совпадает с Project 3 (+9,2 п.п.).
  • Активация: naive +6,29 п.п. → DiD +4,92 п.п. (95% ДИ [+4,07; +5,77]) — pre/post завышает эффект, потому что не вычитает общий тренд.
  • M1-удержание: DiD +7,49 п.п. (95% ДИ [+5,92; +9,05]).
  • Диагностики пройдены: pre-trends плоские (p = 0,70 / 0,36 / 0,29), placebo ≈ 0 (все ДИ накрывают 0), max |SMD| = 0,157 < 0,2.
  • Recovery: 3/3 95% ДИ накрывают заложенный эффект — оценщик восстанавливает истину.

Рекомендации

  • Разделять доказательства: рандомизированный A/B (+5,72 п.п.) — для ship-решения; DiD — для причинной валидации наблюдательных утверждений (retention).
  • Pre/post-числа помечать как корреляцию: naive активация +6,29 п.п. против DiD +4,92 п.п. — pre/post завышает.
  • Держать диагностический гейт (parallel trends + placebo + SMD < 0,2) перед публикацией любого causal-вывода.

Документация

Аналитика

Данные: github.com/NikitaBoyarkin/volta-banking — 22 projects; figures recomputed from the repo's own datasets (data/*.csv) via its analysis scripts. Funnel counts from data/volta_funnel_data.csv (10,000 users); A/B, retention, segmentation, churn, RFM, CLV, attribution, anomalies, spend, support, NPS, JTBD, unit economics, premium, KYC deep-dive, referral, assisted CAC, FX sourcing, premium offers, anchor CAC and dormant win-back follow the published project narrative (README + part pages).

Naive pre/post против DiD по исходам

Оценка эффекта KYC-фикса тремя способами: naive pre/post, 2×2 DiD и covariate-adjusted DiD. Pre/post не вычитает общий месячный тренд.

0 5 10 Активация — Naive pre/post: 6.29 6.29 M1 retention — Naive pre/post: 7.59 7.59 M3 retention — Naive pre/post: 7.6 7.6 Активация — 2×2 DiD: 4.99 4.99 M1 retention — 2×2 DiD: 7.57 7.57 M3 retention — 2×2 DiD: 9.16 9.16 Активация — Covariate-adjusted DiD: 4.92 4.92 M1 retention — Covariate-adjusted DiD: 7.49 7.49 M3 retention — Covariate-adjusted DiD: 9.09 9.09 Активация M1 retention M3 retention Исход Эффект, п.п. Naive pre/post 2×2 DiD Covariate-adjusted DiD
Выводы
  • M3-удержание: DiD ATT +9,09 п.п. против naive +7,60 п.п. — причинная оценка выше и подтверждает Project 3.
  • Активация: naive +6,29 п.п. против DiD +4,92 п.п. — pre/post завышает эффект на ~1,4 п.п.

Recovery: DiD восстанавливает заложенный эффект

Заложенный генератором ATT против DiD-оценки: 3/3 95% ДИ накрывают истину — оценщик специфицирован корректно.

0 5 10 Активация — Injected (truth): 5.7 5.7 M1 retention — Injected (truth): 8.5 8.5 M3 retention — Injected (truth): 9 9 Активация — Recovered (DiD): 4.92 4.92 M1 retention — Recovered (DiD): 7.49 7.49 M3 retention — Recovered (DiD): 9.09 9.09 Активация M1 retention M3 retention Исход ATT, п.п. Injected (truth) Recovered (DiD)
Выводы
  • DiD-оценки близки к истине: расхождение 0,78 / 1,01 / 0,09 п.п., все ДИ накрывают заложенный эффект.
  • Метод валиден: 3/3 ДИ накрывают истину — дизайн пригоден для реальных данных.

Карта подпроектов Volta

Обзор Volta →

Causal

  • Volta — Причинная валидация KYC (DiD)