Как оценить акцию без A-B-теста: от простых способов к сложным. causal impact.. causal impact. causal inference.. causal impact. causal inference. Propensity.. causal impact. causal inference. Propensity. propensity score matching.. causal impact. causal inference. Propensity. propensity score matching. квазиэксперимент.. causal impact. causal inference. Propensity. propensity score matching. квазиэксперимент. Эдвард Де Боно. Научите себя думать. Самоучитель по развитию мышления. ТАК. Каков результат?. Оценка.

Как правило, акции оценивают через А/В-тесты. Но что если теста не было, а оценить эффекты надо? Разберём несколько способов: простой Diff-in-Diff и сложный Propensity score matching с подбором похожих клиентов в контрольную группу.

Итак, представьте: была проведена открытая акция для всех желающих — выделить группы заранее было невозможно. У нас есть пользователи, которые воспользовались акцией, или целевая группа, нам нужно подобрать для неё контроль.

Для чего нужен контроль?

Представьте, что акция была в предновогодний период. Если мы возьмём участников акции и сравним показатели до и после акции, то мы увидим прирост: людям свойственно наращивать покупки к Новому году. А если акция прошла в начале января, то картина будет противоположная: относительно Нового года в январе мы увидим спад.

Для того, чтобы понять, какие были бы показатели без акции, нам и нужен контроль. Относительно этого контроля мы и будем считать эффект от акции. Упрощённо схема выглядит таким образом: метрика целевой группы приросла на 5%, а контрольной — на 2%, то есть чистый прирост — 3%, это и есть влияние акции.

Простой способ: Diff-in-Diff против всех

В рамках этого способа будем сравнивать участников акции со всеми пользователями. Просто возьмём метрику целевой группы и сравним с метрикой всех пользователей? Нетушки.

Почему так нельзя? Допустим, наша метрика — это средний чек. Пусть у участников акции будет средний чек 3000 рублей, а у всех пользователей — 1500 рублей. Если мы будем сравнивать их в лоб, то не учтём, что акцией могли воспользоваться более активные и лояльные клиенты. У таких средний чек изначально выше, чем у нелояльных. Поэтому прироста в 100% в нашей акции на самом деле нет.

Поэтому воспользуемся методом Diff-in-Diff. Суть метода заключается в том, что мы берём динамику периода акции к периоду до акции по целевой группе, берём аналогичную динамику по контрольной группе и фиксируем разницу. Эта разница и будет отличием целевой группы от контрольной (то есть влиянием акции).

Diff-in-Diff наглядно

Diff-in-Diff наглядно

Однако применять метод мы будем не ко всем подряд, а к Like-for-Like (или LFL) пользователям. То есть только к тем пользователям, которые были активны и в период акции, и до акции. Таким образом мы исключаем влияние изменений, связанных с изменением количества пользователей (например, прирост метрики из-за притока новичков).

Итого, подход выглядит следующим образом:

  1. Мы берём LFL-пользователей, всех, выводим динамику периода акции к препериоду (аналогичный промежуток времени, когда акции ещё не было);

  2. Берём LFL-участников акции, выводим таким же образом динамику;

  3. Вычитаем из второго пункта первый, получаем эффект от акции.

Для примера, пусть будут такие данные:

Период

Средний чек целевой группы (участников акции)

Средний чек всех пользователей

До акции

2500 руб.

1350 руб.

В момент акции

3000 руб.

1500 руб.

Дельта

+20%

+11%

В данном примере прирост целевой группы составляет 9% (20-11).

Рассчитаем инкремент: для этого мы берём 3000 как факт под влиянием акции (то есть это 109%) и через пропорцию находим базу (то есть 100%). 3000 * 100 / 109= 2752.3. Фактический прирост составляет разница факта и базы: 3000 – 2752.3 = 247.7 руб.

Ахиллесовой пятой такого подхода является возможная непохожесть участников акции на всех пользователей в совокупности. Возможно такое, что динамика показателей участников акции сильно не совпадает с естественной динамикой всех пользователей (например, имеет полностью противоположную сезонность).

Простой способ: тематический Diff-in-Diff

А теперь представим, что проходила акция в оффлайне для всех желающих — скидка на пирожки.

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

Но всё равно что-то не то. А вдруг любители пирожков — это экономные клиенты, а любители пиццы — это клиенты, которые любят плотно поесть?

Более сложный способ: Propensity model matching

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

Для этого нужно выделить набор признаков, который характеризует пользовательское поведение на периоде до начала акции. Это и будут признаки, по которым мы выравниваем целевую и контрольную группы. В зависимости от задачи набор может варьироваться: например, это могут быть LTV, количество активных дней, средний чек, количество дней с регистрации клиента и т.д. — за более продолжительные и/или более короткий период времени — момент эвристики.

На основе выделенных признаков создаётся новый признак — propensity score. Если упрощать, то этот score — это коэффициент от 0 до 1, обобщающий совокупность признаков. Если немного усложнить, то score на основе признаков характеризует вероятность участия клиента в акции.

Обучаем модель на наших данных. Подаём ей набор признаков, один из которых — флаг участия в акции — скрываем от модели. После оценки модель формирует propensity score, которым мы можем орудовать для составления пар клиентов.

Сопоставить нужно наиболее близкие значения propensity score друг с другом — получатся пары клиентов, где один клиент целевой, а другой — контрольный. Можно это сделать, например, через метод k ближайших соседей (или knn). Объём потенциальных клиентов для контроля должен быть в несколько раз больше, чем объём целевой группы: чем больше разнообразных клиентов получит модель, тем более точные пары она сможет отыскать.

Propensity score matching наглядно

Propensity score matching наглядно

В коде это может выглядеть примерно так:

# определяем гиперпараметры модели подбора, можно усложнить и подбирать через optuna
model_params = {
    'objective': 'binary:logistic',
    'eval_metric': 'logloss',
    'learning_rate': 0.4,          
    'max_depth': 3,
    'min_child_weight': 10,        
    'subsample': 0.8,              
    'colsample_bytree': 0.8,       
    'lambda': 1.0,                 
    'alpha': 0.1,                  
    'random_state': seed,
    'n_estimators': 100            
}

# обучаем модель с бустингом
pm = GradientBoostedPropensityModel(early_stop=False, **model_params)
ps = pm.fit_predict(all_data[features], all_data['test'])

# объединяем в пары
matcher = NearestNeighborMatch(replace=False, ratio=1, random_state=seed)
all_data['score'] = ps
matched = matcher.match(all_data, 'test', ['score'])

# итоговые группы
matched[(matched['test'] == 0)].describe()
matched[(matched['test'] == 1)].describe()

Есть также различные метрики, характеризующие корректность результатов модели. Очевидно, что один из срезов для проверки — это показатели итоговых групп, они должны быть близкими. Другой показатель — это калибровка: если мы возьмём клиентов с propensity score 0.5, то среди них 50% пользователей должны быть участниками акции (если score 0.2 — 20% из них реальные участники и т.д.). Также можно проверить распределение показателей в обеих группах — оно должно быть похожим.

По итогу мы получаем 2 сопоставимые группы. Но можем ли мы обращаться с ними точно так же, как с группами А/В-теста? Скорее нет, чем да. Клиенты похожи, но целевая группа сформирована естественным путём, независимо от признаков: по воле судьбы определённые пользователи решили поучаствовать в акции. А контрольная группа оказалась параметрозависимой: фактически модель определила вероятность участия клиентов контрольной группы на основе закономерностей в признаках, которые были у целевой группы. Поэтому в данном случае также рекомендуется применять расчёт через Diff-in-Diff.

Слабые точки данного подхода:

  1. мы как бы подразумеваем, что раз набор определённых параметров у обеих групп похожий, то и в будущем они должны сохраняться похожими (на деле же с высокой вероятностью рано или поздно показатели разойдутся и без акции);

  2. если клиенты проживают в разных географических регионах, то большую роль может играть влияние сезонности;

  3. максимальный объём доступной потенциальной базы для контроля также может вызывать смещения: представьте, что у нас всего 500 тысяч клиентов, реальной физической возможностью поучаствовать в акции обладали 100 тысяч пользователей, из них поучаствовали 70 тысяч человек — мы имеем всего 30 тысяч человек, которые реально могли бы составить контроль, но подберём все 70 тысяч (ещё 40 тысяч будут подобраны из общей базы клиентов, несмотря на то, что они бы в любом случае не поучаствовали).

Итог

Propensity matching является наиболее продвинутым способом оценки различных кампаний. Способ приближает расчёт к дизайну А/В теста по своей сути, хотя всё ещё обладает рядом минусов, в том числе по части эвристики. Если у вас есть необходимый ресурс, то применяйте его. Если требуется быстрая и верхнеуровневая оценка, то применяйте простой Diff-in-Diff, сравнивая с другими пользователями без балансировки групп. Но при наличии возможности, конечно же, применяйте А/В-тесты.

Автор: Sigmoida

Источник

Rambler's Top100