4.7Kпросмотров
90.0%от подписчиков
5 декабря 2025 г.
📷 ФотоScore: 5.2K
Diff-in-Diff на самом деле Вокруг методов квазиэкспериментов (diff-in-diff, regression discontinuity, Propensity Score Matching и тд), которые применяются в случае, когда A/B невозможен, есть некая атмосфера крутизны. Считается, что обычные A/B тесты это база, которую умеют делать все, а вот методы причинного вывода это реально сложно и интересно. Хотя все понимают (надеюсь), что с точки зрения валидности и надежности выводов правильно задизайненный и проведенный A/B тест опережает все вышеперечисленное. Все остальные квазиэксперименты это "A/B для бедных". Тем не менее, иногда действительно нет возможности провести A/B тест по разным причинам. Например, он технически невозможен или этически недопустим, однако эффект все равно оценить нужно, тогда без квазиэкспериментов никак. У меня самой было в планах наконец-то разобраться с этими методами, так как это интересно, а еще про это любят спрашивать на собеседованиях 😏. И вот оно: по работе возникла задача посчитать влияние уже внедренной фичи, которую запускали сразу на 100% без A/B (были на это причины). Это как раз типичный кейс применения diff-in-diff. Я обрадовалась возможности с этим разобраться на реальных данных (ооо наконец-то сложные методы), так что поставила задачку на себя и пошла читать статьи как это работает. Оказалось, что аналитики в очередной раз назвали умными словами обычную линейную регрессию с двумя факторами и взаимодействием. Основная сложность метода не в формуле, а как обычно в наличии качественных данных и в умении правильно их приготовить. Например, нужно выбрать подходящую контрольную группу или построить синтетическую, проверить выполняются ли параллельные тренды до вмешательства, при необходимости добавить ковариаты, но это уже детали. Общую идею метода неплохо объяснили в статье на хабре, но мне немного показалось, что в статье есть то самое "назвать простое сложным". Сама формула: y = β0 + β1treat + β2post + β3(treat × post) + ε Как видите, это обычная формула линейной регрессии с взаимодействием, где β0 (Intercept) – значение интересующего показателя, например конверсии, в контрольной группе до воздействия. β1 – значение показателя в тестовой группе до воздействия. β2 – значение показателя в контрольной группе после воздействия. β3 – тот самый эффект взаимодействия, Diff-in-Diff, дополнительное изменение конверсии в тестовой группе после воздействия по сравнению с контрольной группой. Никакой сложной математики, старая добрая линейная регрессия в тренде 😎 Пример кода на 🖥 # предварительно уже создан df, в комментарии пришлю как сгенерировать model <- lm(y ~ treatpost, data = data) summary(model) Пример кода на 🐍 # предварительно уже создан df, в комментарии пришлю как сгенерировать import statsmodels.formula.api as smf # ключевой import для работы с Diff-in-Diff df['did'] = df['treat'] * df['post'] # создание переменной взаимодействия model = smf.ols("y ~ treat + post + did", data=df).fit() print(model.summary()) Самое главное для применения метода подобрать подходящий контроль с соблюдением параллельности трендов до воздействия, а дальше сама формула занимает буквально две строчки. И необязательно делать вид, что это что-то супер сложное и крутое, потому что по сравнению с моделями, с которыми сталкиваются ученые, это совсем не рокет саенс 🤓 Вот еще несколько полезных ссылок: 1) Статья из книги Causal Inference for the Brave and True 2) Небольшая заметка на kaggle 3) Хорошая статья от X5 на хабре 👇В комментарии приложила пример кода для генерации подходящих под Diff-in-Diff данных на R и Python #analytics #stats
4.7K
просмотров
3601
символов
Да
эмодзи
Да
медиа

Другие посты @stats_for_science

Все посты канала →
Diff-in-Diff на самом деле Вокруг методов квазиэкспериментов — @stats_for_science | PostSniper