GMV Drop RCA — разбор падения на реальных данных
Ситуация
Алерт: «GMV упал на 10% месяц к месяцу». На реальных транзакциях UCI Online Retail II.
Общий спад не отвечает на главный вопрос — где теряются деньги. Одна и та же цифра одинаково правдоподобно объясняется обвалом одного крупного сегмента, изменением ассортимента и уходом гостевых покупок. Пока причина не разложена по сегментам, любое действие — догадка.
Задача
Мне нужно было разложить падение до конкретного сегмента и доказать, что атрибуция полная, а не удобная нарезка.
Действия
Инъекция. Внедрил детерминированное падение: dropped_gmv 470070.1, customers 544, dropped_invoices 537, target_mom 0.9 (ground_truth.json). Ground truth фиксирует не только размер, но и тир сегментов, внутри которого обязан оказаться вердикт RCA.
Дерево метрик. GMV_total = GMV_named + GMV_guest и GMV_named = users × orders_per_user × AOV. Все три фактора описывают именованную популяцию (NOT is_cancellation AND customer_id IS NOT NULL); гостевая выручка никогда не входит в AOV и orders_per_user.
Декомпозиция. Сегменты — country × дециль GMV до окна, на той же именованной популяции, что и дерево. Вклады сегментов считаются Shapley-разложением, а не разностью «стало минус было»: только так аддитивность держится при взаимодействии факторов.
Дашборд. Executive-отчёт с findings: реконсиляция, дерево, топ-сегменты и оговорки о популяциях.
Проверки. Восемь тестов: Σ factors + residual == ΔGMV_named, GMV_named + GMV_guest == GMV_total, пиннинг headline-чисел с допусками, попадание вердикта в инъецированный тир и регресс, который падает, если база дерева снова загрязнится гостями.
Результат
- Реконсиляция (ноябрь против октября): именованные £1 039 318,79 → £691 747,28 (−£347 571,51); гости £115 660,51 → £347 678,95 (+£232 018,44); итог £1 154 979,30 → £1 039 426,23 (−£115 553,07, −10,0%). Оба тождества держатся с точностью до float: остаток £0,00.
- Дерево на именованной базе: users +£58 313,86, orders/user +£24 719,26, AOV −£430 402,20; срединный остаток −£202,43 (0,06% именованного падения) — показан, а не спрятан.
- AOV: £538,79 → £326,14 (−39,5%) — инъекция убрала крупнейшие счета, поэтому обвал среднего чека и есть подпись причины.
- Корень: United Kingdom, дециль-1, −£195 218,25 = 56,2% именованного падения и 36,9% падения дециль-вселенной.
- Доля отмен не замаскировала вывод: 7,87% в октябре → 4,81% в ноябре.
- Полная атрибуция без остатка: дециль-вселенная −£529 190,59 + новые клиенты окна +£181 619,08 + гости +£232 018,44 = −£115 553,07. Децильная нарезка не видит две последние группы — теперь они явные адденды, а не «необъяснённый разрыв».
- Исправленная ошибка: раньше дерево смешивало популяции (
usersиorders— именованные, AOV — весь GMV,orders_per_user— с гостями), поэтому старое разложение описывало несвязную популяцию. Headline «169% падения» — тот же дефект: £195 218,25 / £115 553,07. По именованной базе это 56,2%, по дециль-вселенной — 36,9%.
Ограничения
Данные реальные, но падение внедрённое и seeded: кейс проверяет корректность метода RCA, а не воспроизводит реальный инцидент.
Децильная нарезка по определению не видит гостей и клиентов, впервые купивших в окне, — они вынесены аддендами, поэтому итог сходится, а разрез «по причине» остаётся неполным внутри одной таблицы.
Shapley-вклады аддитивны на выбранной популяции; переносить их на всю базу без аддендов нельзя.
Срединный остаток дерева −£202,43 (0,06%) — свойство точечной декомпозиции, а не ошибка: он отчётный и покрыт тестом с допуском.
Документация
PRD.md— постановка и критерии приёмки (лежит в корне проекта).- Быстрый старт:
uv sync→uv run python scripts/inject_drop.py→uv run python scripts/rca.py→uv run python scripts/build_dashboard.py. uv run pytest— 8 тестов, включая проверку сходимости и ground-truth тира.