Causal Inference: как оценивать эффект, когда A/B — не вариант (Ч. 4)
Causal Inference: как оценивать эффект, когда A/B — не вариант (Ч. 4)
В прошлых частях разобрали DiD, PSM и
Causal Impact . Сегодня — про гео-тесты (geo-lift) и синтетический контроль (Synthetic Control, SCM) . Сразу дисклеймер: как всегда, не истина в последней инстанции — если есть чем дополнить/поспорить, велком в комменты
👇 Что такое гео-тест
❓ Иногда воздействие невозможно раскатить на случайных юзеров — оно живет на уровне географии . Из классических — ценообразование/маркетинг:
➖ отключаем платный digital в нескольких городах
➖ меняем цену / промо в отдельных регионах
➖ запускаем ТВ / наружную рекламу по гео
Рандомизировать людей внутри города нельзя, поэтому единица эксперимента — сам город . Берем несколько тест-городов, а остальные остаются контролем.
А дальше вопрос ровно тот же, что и во всей серии:
👉 «А что было бы с продажами в тест-городе, если бы мы ничего не меняли?»
И тут предлагаю сначала задаться вопросом —
Причем тут Synthetic Control (SCM)
❓ Проблема гео-тестов: честной контрольной группы обычно нет.
Возьмем, например, РФ — Москву не с чем сравнить один-в-один, а взять «средний город» значит поймать кучу смещений.
Идея SCM: не искать один похожий город, а собрать контрфакт из взвешенной комбинации остальных.
То есть синтетический контроль — это «виртуальный город», склеенный из донорских городов с весами так, чтобы до вмешательства он максимально повторял динамику тестового.
Эффект = Факт − Синтетический контроль (после старта теста)
Чем это отличается от Causal Impact из Ч. 3
❓ По факту оба подхода строят контрфакт, но по-разному:
➖ Causal Impact — прогноз ряда во времени (BSTS): учим модель на истории самого тест-города и продлеваем в будущее. (это мы обсуждали выше)
➖ Synthetic Control — комбинация других объектов (доноров) в тот же момент времени.
На практике их можно и смешивать.
Как это работает по шагам
❓ 1 Готовим панель — дневные/недельные продажи по городам (город × время).
2 Отбираем доноров.
Из всех городов выбираем те, что хорошо объясняют тестовый на pre-периоде . Тут важно не только сходство трендов, но и чтобы доноры не были коллинеарны друг другу и сами не были затронуты воздействием.
3 Строим синтетику.
Подбираем веса доноров так, чтобы синтетический ряд повторял тестовый до старта теста (по сути — регрессия на pre-периоде).
4 Считаем эффект.
После старта смотрим разрыв между фактом и синтетикой. Устойчиво выходит за доверительный интервал — эффект скорее всего есть.
5 Проверяем значимость.
Bootstrap по остаткам → p-value, плюс placebo-тесты : «подкладываем» фиктивное воздействие в контрольные города и смотрим, не даёт ли метод ложных срабатываний. Плюс считаем
MDE — какой минимальный эффект вообще реально поймать при таком дизайне.
Что важно держать в голове
❗️ ➖ Хорошее качество на pre-периоде — обязательно. Если синтетика плохо повторяет историю, доверять оценке нельзя.
➖ Ошибка на pre-периоде должна быть заметно меньше ожидаемого эффекта.
➖ Доноры не должны быть затронуты тем же вмешательством (иначе эффект «утечет» в контроль и оценка занизится).
➖ Никаких других крупных событий в тест-городах в тот же момент.
Что дальше
В самом SCM есть куча важных деталей (часть из них касаются в целом A/B тестов), которые не влезут в один пост — поэтому дальше планирую разобрать более подробно темы:
➖ A/A-тест — как валидировать дизайн ещё до старта эксперимента
➖ MDE — как заранее понять, какой минимальный эффект вообще реально поймать
➖ placebo-тесты — как он помогает в A/A и как получить честный p-value через фиктивные воздействия
➖ Как происходит отбор доноров, что такое бутстрап и др...
❤️🔥 Подписывайтесь и поддержите канал бустом
↗️ Менторю и помогаю выйти на оффер
❓ Работали с гео-тестами? Расскажите про ваши кейсы в комментах
@data_driven_bogdan
Откликнуться в Telegram →
⚠️ Никогда не платите «за оформление» или «гарантию трудоустройства» — это признак мошенников. Работа ТРУ не несёт ответственности за содержание вакансии.