Короткий ответ
Использую квазиэкспериментальный метод, например difference-in-differences, сравнивая изменение метрики у затронутых клиентов с изменением у похожей контрольной группы (например, из региона/сегмента, где изменение не применялось или применилось позже), явно проверяя допущение параллельных трендов.
Как это работает подробнее
diff-in-diff сравнивает не абсолютный уровень метрики после изменения, а разницу в изменении метрики между «обработанной» и контрольной группами до и после события, что позволяет вычесть общие для обеих групп тренды (сезонность, макроэффекты) и приблизиться к причинной оценке при отсутствии рандомизации.
Пример кода
analysis.py
import statsmodels.formula.api as smf
# df: колонки metric, treated (0/1), post (0/1) и их взаимодействие
model = smf.ols('retention ~ treated * post', data=df).fit()
print(model.summary()) # коэффициент treated:post — DiD-оценка эффектаЧто использовать на практике
- На практике: ищу валидную контрольную группу — похожую по характеристикам и по динамике метрики до изменения (проверяю допущение параллельных трендов на историческом периоде); если такой группы нет, рассматриваю альтернативы (synthetic control, regression discontinuity, если изменение вводилось по порогу). Явно документирую все допущения и ограничения метода в итоговом отчёте для стейкхолдеров.
- Проверка: построить график средней метрики по группам (treated vs control) по месяцам до изменения — если тренды визуально параллельны до события, допущение diff-in-diff правдоподобно; расхождение трендов до изменения подрывает достоверность оценки.
Подводные камни
- Частые ошибки: сравнивать метрику «до и после» без контрольной группы, приписывая весь эффект изменению, хотя часть могла быть вызвана сезонностью или другими одновременными событиями; выбирать контрольную группу без проверки параллельности трендов до изменения; выдавать результат квазиэксперимента за такую же надёжную причинную оценку, как у рандомизированного теста, не проговаривая разницу в уровне уверенности.