Собесов

Karpov ДЗ: Просадка выручки на 20% — план расследования

Продуктовая аналитикаAnomaly investigationСредняяMiddle

Условие

Утром CFO пишет: «Вчера выручка упала на 20% относительно среднего за прошлую неделю». Опишите план расследования. Какие гипотезы рассмотрите в первую очередь? Как декомпозируете метрику?

Решение

Подход: «MECE-декомпозиция»

Выручка = ∑(транзакций × средний чек). Раскладываем:

Revenue = Users × Conversion × AOV
        = Users × Sessions/User × CR_session × AOV

И смотрим, какой компонент просел.

План

Шаг 1. Данные ли?

  • ETL-падение, дубли, потерянные события — проверить freshness и row counts по источникам.
  • Сравнить вчерашнюю партицию с предыдущими по объёму строк.
  • Тест: данные обновились = реально ли вчера было меньше заказов.

Если ETL-проблема — фикс и эта задача всё.

Шаг 2. Кто просел? Декомпозиция по сегментам — найти, где «дырка»:

Срез Сравнение Что искать
Платформа (iOS/Android/Web) вчера vs avg-7d падение в одной платформе → багов в релизе
Город / гео то же проблемы с конкретной площадкой / регионом
Канал привлечения то же блокировка рекламной кампании
Новые vs returning то же падение в new → проблема onboarding
Cohort by signup_week то же старая cohort выгорела
Категория товара то же проблемы с одной категорией / поставщиком
Час дня hour-of-day pattern проблема в peak hours (часто = инфра)

Шаг 3. Что сломалось?

  • Релиз? Проверить deploy-таймлайн — incident timeline overlay.
  • Платёжный шлюз — payment_status распределение, доля fail.
  • Сеть / CDN — Sentry alerts, доля network_error событий.
  • Внешние факторы: праздники, погода, конкуренты (демпинг), новости.
  • Маркетинг: остановили платный канал?

Шаг 4. Конверсия или объём?

  • Если трафик упал, CR ок — маркетинг / внешние факторы.
  • Если трафик ок, CR упал — продуктовая проблема (баг, UX).
  • Если CR ок, AOV упал — скидки/промокоды / cross-sell сломан.

Шаг 5. Подтверждение root cause

  • Воспроизвести проблему на staging / в логах.
  • Smoke-тест: восстановили ли метрику после fix?
  • A/B-сравнение с group, где фикс уже выкачан (если возможно).

SQL для быстрой декомпозиции

WITH yesterday AS (
    SELECT segment, COUNT(*) AS sessions, SUM(amount) AS revenue,
           SUM(amount) / NULLIF(COUNT(DISTINCT user_id), 0) AS arpu
    FROM events e
    WHERE dt = CURRENT_DATE - 1
    GROUP BY 1
),
baseline AS (
    SELECT segment, AVG(revenue) AS avg_rev, STDDEV(revenue) AS sd_rev
    FROM (
        SELECT dt, segment, SUM(amount) AS revenue
        FROM events
        WHERE dt BETWEEN CURRENT_DATE - 8 AND CURRENT_DATE - 2
        GROUP BY 1, 2
    ) t
    GROUP BY 1
)
SELECT y.segment, y.revenue, b.avg_rev,
       (y.revenue - b.avg_rev) / NULLIF(b.avg_rev, 0) * 100 AS pct_change,
       (y.revenue - b.avg_rev) / NULLIF(b.sd_rev, 0)        AS z_score
FROM yesterday y JOIN baseline b USING (segment)
ORDER BY pct_change;

Коммуникация с CFO

«Расследуем. Через 30 мин дам первое чтение: данные ли, какой сегмент просел, версия первой гипотезы. Готовый разбор — к концу дня».

Никогда не отвечать «не знаю, давайте смотреть час». Дать ETA.

Подводные камни

  1. «Просто посмотреть avg-7d»: если за неделю был спецаль или выходной — baseline смещён. Лучше WoW (тот же день прошлой недели).
  2. Сезонность (день недели, праздники, погода) — не аномалия, а норма. Проверить календарный эффект.
  3. stddev > 50% от mean делает z-score бесполезным — нужна логнормализация или robust метрики (median + MAD).
  4. Простой total без сегментов скрывает причину: всё в порядке кроме одного канала. Декомпозируйте сразу.
  5. «Виноват релиз» — частое предположение. Проверьте deploy-таймлайн и сравните с минутной разрезкой выручки.
  6. «Фикс работает» != «инцидент закрыт». Должен быть post-mortem и улучшение мониторинга.
  7. Не путать correlation с causation: маркетинг отключил кампанию и была погода — что именно сработало?

Эталонный ответ

План: (1) проверить целостность данных (ETL/freshness/row count); (2) декомпозировать по сегментам — платформа, гео, канал, new/return, час дня; (3) проверить релизы, платёжный шлюз, внешние факторы; (4) определить — упал трафик, конверсия или AOV; (5) подтвердить root cause и зафиксировать восстановление.

Коммуникация: дать CFO ETA первого результата (30 мин), потом расширенный разбор (конец дня). Избегать avg-7d с спецалями — использовать WoW сравнения с тем же днём.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти