Запрос «до/после» утверждает, что релиз вызвал падение DAU на 20%. Найдите и исправьте изъян в доказательстве причинности.
Релиз v5.0 вышел 2024-03-10. Аналитик приводит этот запрос как доказательство, что релиз вызвал падение DAU. Ограничения: раскатка постепенная по версии приложения (столбец app_version), а маркетинговый всплеск и государственный праздник пришлись на ту же неделю.
-- «Доказательство», что релиз v5.0 вызвал падение DAU:
SELECT
CASE WHEN event_date < DATE '2024-03-10' THEN 'before' ELSE 'after' END AS period,
COUNT(DISTINCT user_id) / 7.0 AS avg_dau
FROM events
WHERE event_date BETWEEN DATE '2024-03-03' AND DATE '2024-03-16'
GROUP BY 1;
Объясните, почему это не доказывает причинность, и перепишите как сравнение внутри одного окна.
Разбиение до/после смешивает релиз со всем остальным, что двигалось на неделе — праздником и маркетинговым всплеском — поэтому меньшее число «после» это корреляция, а не причина. Раз раскатка постепенная по версии, сравнивайте обновившихся против ещё не обновившихся в те же дни.
- ✗Читать разрыв до/после как причинность несмотря на совпавшие изменения
- ✗Править размер окна вместо добавления контрфактической группы
- ✗Резать то же сравнение до/после вместо сравнения когорт
- →Как поэтапная раскатка позволит оценить эффект релиза напрямую?
- →Что проверите, если все пользователи обновились в один день?
Разбиение «до/после» ставит границу на дату релиза, но на той же неделе изменился не только релиз: был праздник и маркетинговый всплеск. Поэтому меньшее среднее «после» — это корреляция, а не доказательство причинности. Раскатка постепенная по app_version, что даёт естественную контрольную группу: пользователи, ещё не обновившиеся на v5.0, в те же дни. Сравниваем их с обновившимися внутри одного окна — общие для всех праздник и кампания сокращаются.
-- Within-window: updated (v5.0) vs not-yet-updated, same days → isolates the release
SELECT
CASE WHEN app_version = '5.0' THEN 'updated' ELSE 'not_updated' END AS cohort,
event_date,
COUNT(DISTINCT user_id) AS dau
FROM events
WHERE event_date BETWEEN DATE '2024-03-10' AND DATE '2024-03-16'
GROUP BY 1, 2
ORDER BY event_date, cohort;
Если DAU падает только в когорте updated, а not_updated держится, релиз замешан. Если падают обе одинаково, причина — общий фактор (праздник/кампания), а не релиз.