Короткий ответ
Ответ должен быть конструктивным: не просто отвергнуть корреляцию, а показать альтернативные объяснения, оценить риск обязательного включения и предложить дизайн проверки причинности.
Как это работает подробнее
Сначала сравните группы по признакам, измеренным до использования функции: tenure, прошлой активности, тарифу и платформе. Различия демонстрируют selection bias, но даже баланс по наблюдаемым признакам не исключает ненаблюдаемое смешение.
Лучший следующий шаг — рандомно предложить или включить функцию для части подходящих пользователей и заранее определить retention-метрику, guardrails и срок. Intent-to-treat сохраняет преимущества рандомизации.
Пример кода
pre_exposure_balance.sql
SELECT used_feature,
COUNT(*) AS users,
AVG(active_days_before) AS active_days_before,
AVG(tenure_days_before) AS tenure_days_before,
AVG(CASE WHEN retained_30d THEN 1.0 ELSE 0.0 END) AS retention_30d
FROM user_feature_cohorts
GROUP BY used_feature;Что использовать на практике
- Предложите эксперимент. Рандомизируйте доступ или предложение функции, а не само добровольное использование.
- Добавьте guardrails. Следите за отказами, поддержкой и негативным влиянием на сегменты.
- Разделите факт и интерпретацию. SQL надёжно описывает ассоциацию, но причинность зависит от дизайна.
Подводные камни
- Self-selection. Мотивированные пользователи одновременно чаще пробуют функцию и остаются.
- Immortal time bias. Чтобы попасть в группу пользователей функции, человек должен дожить до момента использования.
- Обязательный rollout без holdout. После запуска будет трудно измерить контрфактический результат.