Как не заблудиться в четырех соснах: выбираем способ найти причинно-следственную связь без экспериментов

37187e77f360b612eff8192ce3533d0f.png

Привет, я Паша — продуктовый аналитик во ВкусВилле, занимаюсь аналитикой коммуникаций. По долгу продукта касаюсь многих частей внутри мобильного приложения и почти всегда хочется знать как фактор X влияет на пользователя. Тут все вспомнили про AB тесты, но они не всегда возможны, поэтому в статье рассмотрим 4 метода исследований, которые помогут понять что делать, если выводы нужны, а рандомизации не случилось. 

Для нашей цели нужны квази эксперименты — это исследования ситуаций, когда выборка разделилась на группы по естественным (не обязательно случайным) причинам. В этой статье не будем детально разбирать математику и новейшие достижения методов, но посмотрим на идеи, кейсы и специфические предпосылки. Будет полезно тем, кто на вопросы вида «мы год назад запускали фичу, стало лучше?» не задумываясь говорит, что сказать нельзя.

Я искренний фанат структурированного текста, поэтому дальше будут 4 блока с методами и в каждом есть разделы: идея метода, специфические предпосылки, типичные примеры, мои наблюдения из практики. 

Целью статьи себе ставил сделать своего рода справочник, который бы помог продвинуться в начале изучения этой темы, а что вышло, предлагаю оценить самостоятельно. 

Difference in Differences (DiD)

Идея метода:  

Есть выборка, которая разделилась на группы по какому-то естественному критерию (гео, тип устройств, пол и т.д.), на одну из групп было влияние, остальные не трогали. Тогда мы можем найти группу без воздействия, которая в прошлом была похожа на целевую, и для обеих посчитать значение метрики до периода воздействия и после. 

В таком случае оценка эффекта от воздействия будет равна:  

$$\text{ATE} = \left[ E (Y (1) \,|\, T=1) — E (Y (1) \,|\, T=0) \right] — \left[ E (Y (0) \,|\, T=1) — E (Y (0) \,|\, T=0) \right]$$

Где Y (1), Y (0) — значение метрики на пост- и пре-периоде, T=0, T=1 — индикатор отсутствия или наличия воздействия. 

То есть для целевой группы мы прогнозируем значение метрики, если бы воздействия не было. Прогноз наивный — предполагаем, что к пост-периоду метрика в целевой группе изменится так же, как и в контрольной, затем смотрим разницу между реальным значением метрики и спрогнозированным. Картинка в помощь:

70147b3623dffad9f58ecdf3fd643c41.png

Предпосылки метода:  

  • Параллельность трендов. Если бы мы не воздействовали на группу B, то разница средних значений между группами A и B была бы одинаковой в периоды t0 и t1.

  • Несмещенность КГ. Ни на кого из контрольной группы не было воздействия. 

  • Постоянство воздействия. Эффект от воздействия остается постоянным на протяжении всего исследуемого периода.

Типичные примеры:

  • Продаем товары в нескольких регионах, в одном запустили оффлайн рекламу, хотим оценить эффективность.

  • Без A/B-теста выпустили фичу только на ios, надо проверить, улучшились ли метрики.

  • На одной из версий приложения что-то сломалось, надо оценить ущерб. 

Рассуждения из практики

Вообще штука хоть и простая, но очень мощная. Основная проблема в параллельности трендов, в небольших задачах для точеченого сравнения редко получается найти подходящую группу. Часто хорошие идеи для поиска сопоставимых групп приходят из естественных факторов пользователя (соц-дем, гео), а вот факторы взаимодействия с компанией у меня редко получалось успешно использовать. 

Regression discontinuity design (RDD)

Идея метода:  

В природе все изменения достаточно плавные, поэтому, когда мы находим разрывы значений, можно предполагать искусственное воздействие. Тогда, если есть какая-то точка, которая разделяет выборку на 2 группы, где одной доступно воздействие, а другой — нет, можно посмотреть на значение метрики в окрестности этой точки. Разница между оценкой слева и справа и будет оценкой эффекта, более формально она выражается так:

$$E (\text{ATE}|X=c) = \lim_{x \to c^+} E (Y_{\text{ti}}|X_i=x) — \lim_{x \to c^-} E (Y_{\text{ti}}|X_i=x)$$

Где с — это пороговое значение. 

Картинка помощи:  

b2a3df25e400ccead38e4f5e283b45c6.png

Предпосылки метода:  

  • Существование порогового значения. Самая частая ошибка с RDD — манипуляции с пороговым значением, поэтому нужно точно определить из контекста задачи, что считать порогом. 

  • Стабильность переменных в окрестности порогового значения. Ни у какой из переменных не должна возрастать дисперсия в окрестности порога. 

  • Локальность воздействия интервенции. Предполагается, что эффект от воздействия локален и измеряется только вблизи порога, а не на всей выборке.

Типичные примеры:

  • После 18 лет пользователю доступен больший ассортимент, хотим исследовать, как меняется его поведение. 

  • Через каждые 10 покупок в месяц пользователь получает новый уровень в программе лояльности, можно анализировать изменения в покупательском поведении вблизи этого порога.

  • При релизе фичи полезно посмотреть изменение поведения пользователя при первом контакте с ней. 

  • При использовании ML моделей важно смотреть различия между пользователями в окрестности порога классов. 

  • Если расположение пользователя влияет на условия доставки, то полезно изучить, как ведут себя пользователи на границе зон. 

Рассуждения из практики

Для этого метода критично важно аккуратно работать с пороговым значением. Тут чаще всего бывают 2 ошибки:  

  • Соблазн «подобрать» его — избитая история, помним, что каждая наша оценка параметров это ошибки 1 и 2 рода с заданной вероятностью, следовательно если хотим их на этом уровне сохранять на весь эксперимент надо четко ставить гипотезы, считать их число и использовать поправки. 

  • Поиск не «точки» перехода, а «полосы». Такое чаще всего случается, когда по задаче недостаточно данных и есть мысли в духе «на графике слева метрика низкая, справа высокая, значит посередине что-то есть». Для RDD критически важна оценка плотности данных вокруг предполагаемой точки перехода, например тестом маккрари, в случае нарушения этой предпосылки стоит изучать природу явления другими методами.  

Instrumental variables 

Идея метода:

Мы хотим оценить влияние какого-то фактора X на нашу метрику Y, но у нас нет данных по другим факторам, которые почти наверняка тоже влияют на метрику. Тогда можно постараться найти такой фактор (инструментальную переменную), который будет влиять только на X и не будет влиять напрямую на Y.

То есть мы хотим добиться такого вида связей в данных:

1756a459eaec0193a8a93fbda445165b.png

В таком случае мы можем оценить X через инструментальную переменную, тогда получим X^, на который не влияют скрытые факторы и используем его для оценки Y. В таком случае, будет следующая взаимосвязь данных:  

6bc61ff11522f78e4254b9df53825d73.png

Формулами выражается так:

Регрессия инструментальной переменной (Z) на X

$$\hat{X} = \pi_0 + \pi_1 Z + \epsilon,$$

Регрессия $$\hat{X}$$ на Y:

$$Y = \beta_0 + \beta_1 \hat{X} + u,$$

Предпосылки метода:  

  • Релевантность инструментальной переменной (IV). Переменная Z, которая служит инструментом, должна сильно коррелировать с эндогенной переменной X. 

  • Экзогенность инструментальной переменной. Инструментальная переменная Z не должна коррелировать с ошибками модели.

Типичные примеры:

  • Хотим исследовать воздействие скорости загрузки приложения на отток, возможный инструмент — параметры хостинга и инфраструктуры. 

  • Оцениваем влияние отзывов в сторах на установки приложения, варианты инструментов — параметры ранжирования отзывов, цикл деловой активности основной аудитории. 

  • Изучаем связь активности в приложении и перехода на новые версии, варианты инструмента — версия ОС, модель устройства, тип интернета. 

NB. Поиск хорошей инструментальной переменной — сложная творческая задача, поэтому готовых рецептов нет, а выше мы перечислили примеры, которые сами проверяли и получали приемлемый результат.

Рассуждения из практики

Главное наблюдение — искать хорошие инструментальные переменные очень сложно. Часто их берут из фактов внешней независимой среды — регуляторные ограничения, правила платформы или естественные катаклизмы. Вообще поиск хороших инструментов это искусство, есть интересный тред по теме на quora, а мои любимые оттуда — данные о состоянии дорог в колониальную эпоху для оценки экономического потенциала штата и данные о призывной кампании для оценки эффекта от образования. 

Matching

Идея метода:

Допустим, выборка как-то поделилась на группы, но группы друг с другом не сопоставимы: например, в ЦА чаще попадал более платежеспособный сегмент. В таком случае логично сравнивать не группы в среднем, а конкретные, похожие между собой наблюдения из разных групп и исследовать среднее значение такой попарной разницы схожих объектов.

Формально мы хотим получить следующую оценку:  

$$ATE = \frac{1}{N} \sum_{i=1}^{N} (Y_{i}^{T} — Y_{i}^{C})$$

Где $$Y_{i}^{T}$$ — значение из целевой группы, $$Y_{i}^{C}$$ — сопоставленное значение из контрольной.

То есть мы хотим найти среднее разниц ближайших объектов из разных групп. 

Картинка помощи:  

80d692a44dbb34f0870a372dd257776e.png

На картинке разные фигуры отражают тот факт, что пользователи в одной группе могут быть не похожими друг на друга. 

Предпосылки метода:  

  • Перекрытие. Для каждого наблюдения из экспериментальной группы есть похожее из контрольной. 

  • Возможность сопоставления. Мы можем надежно и адекватно для контекста задачи определять похожесть наблюдений.

  • Сбалансированность. Распределение наблюдаемых характеристик среди участников с воздействием и без должно быть схожим после процедуры сопоставления.

Рассуждения из практики

В общем виде, matching это не конкретный метод оценки разницы среднего, а подход к выравниванию перекосов в выборке. Т.е. Простыми словами matching позволяет не сопоставимые группы сделать сопоставимыми. Идея метода сопоставления может использоваться много где, даже в A/B-тестах. Поэтому типичных примеров для метода нет, т.к. он может использоваться практически со всеми остальными. 

Итоги:

Выявлять и оценивать причинно-следственные связи можно не только через классические рандомизированные эксперименты. Выше мы обсудили четыре популярных подхода, и еще стоит уточнить два важных момента:  

Во-первых, в статье приведены самые базовые идеи. На практике существует множество доработок и улучшений для каждого из подходов, поэтому, если вы поняли, что какой-то метод вам подходит, стоит подробнее с ним познакомиться. 

Во-вторых, стоит уделять особое внимание области применимости метода. Убедитесь на уровне бизнес-контекста, что метод решает именно ту задачу, которая вам нужна. А на уровне техники проверьте выполнение предпосылок метода, если они не будут выполняться, то и результат вы получите смещенный. 

Ну и самое главное -а как вы отвечаете на вопрос «сколько принесла фича из 2020 года»?)

Материалы, где можно ознакомиться с методами до наших статей о каждом:  

  1. https://nc233.com/2020/04/causal-inference-cheat-sheet-for-data-scientists/ 

  2. https://mixtape.scunning.com/

  3. https://matheusfacure.github.io/python-causality-handbook/

© Habrahabr.ru