Устоявшийся подход среди маркетологов к моделированию маркетингового микса заключается в применении моделей линейной регрессии, которые предполагают, что связь между маркетинговыми активностями, такими как расходы на рекламу, и переменной отклика (продажи, выручка) является линейной.
Преобразование переменных медиаактивности
Прежде чем приступить к моделированию, переменные расходов на медиа должны пройти две необходимые трансформации, чтобы правильно учесть эффект переноса и эффект насыщения расходов на рекламу. Известно, что расходы на рекламу не являются линейными по отношению к переменной отклика и следуют закону убывающей доходности. Однако функциональная форма кривой насыщения заранее неизвестна. Поэтому разработчик модели должен сначала выдвинуть гипотезу о возможных функциях преобразования, которые должны быть применены к каждому каналу медиаактивности, чтобы соответствовать истинным отношениям между расходами и откликом.
В этой статье я показываю альтернативный подход к моделированию маркетингового микса с помощью сглаживающих сплайнов, который представляет собой способ моделирования нелинейной зависимости между зависимыми и независимыми переменными в рамках линейной модели. Следуя этому подходу, модель установит нелинейную зависимость между переменными медиаактивности и переменной отклика без необходимости преобразования этих независимых переменных для учёта нелинейных зависимостей.
Интуиция, стоящая за преобразованием переменных медиаактивности
Давайте разберёмся на примере, почему преобразование переменных медиаактивности является необходимым шагом в рамках линейной модели.
Я генерирую переменную медиа с расходами на рекламу, эффект насыщения которой описан функцией Хилла с двумя параметрами: γ, контролирующим точку перегиба, и α, определяющим форму кривой.
import numpy as np
spend = np.random.rand(1000, 1).reshape(-1)
noise = np.random.normal(size = 1000, scale = 0.2)
#hill transformation
alpha = 2
gamma = 0.1
spend_transformed = spend**alpha / (spend ** alpha + gamma ** alpha)
response = 1 + 3 * spend_transformed + noise
Для ознакомления с различными функциями преобразования, которые можно использовать для моделирования эффектов насыщения и убывающей доходности, вы можете ознакомиться со следующей статьёй:
Моделирование маркетингового микса с помощью PyMC3
Теперь посмотрим, что произойдёт, когда мы подгоним модель линейной регрессии, не преобразуя сначала нашу независимую переменную.
import statsmodels.api as sm
spend_with_intercept = sm.add_constant(spend)
ols_model = sm.OLS(response, spend_with_intercept)
ols_results = ols_model.fit()
ols_results.params
Как и ожидалось, линейная регрессия не может уловить нелинейную зависимость. Теперь в реальной ситуации нам нужно решить, какую функцию преобразования использовать и какие у неё параметры. Давайте преобразуем нашу переменную расходов, используя функцию Хилла с немного другими параметрами, которые использовались для моделирования переменной отклика, и подгоним модель линейной регрессии.
alpha = 2
gamma = 0.3
#hill transformation
spend_transformed = spend**alpha / (spend ** alpha + gamma ** alpha)
X_hill_transformed = sm.add_constant(spend_transformed)
ols_model_hill_transformed = sm.OLS(response, X_hill_transformed)
ols_results_hill_transformed = ols_model_hill_transformed.fit()
ols_results_hill_transformed.params
Модель теперь учитывает нелинейности, но в области меньших расходов наблюдается очевидное несоответствие. Давайте попробуем ещё раз с другими значениями параметров.
Моделирование маркетингового микса с помощью обобщённых аддитивных моделей
Стандартная (аддитивная) линейная модель имеет следующий вид:
где бета — коэффициенты, а эпсилон — член ошибки.
Обобщённая аддитивная модель расширяет линейную регрессию в следующей форме:
где f — гладкая функция. По сути, GAM добавляет сумму сглаживающих членов к сумме линейных членов. Существует довольно много подходов к сглаживанию функций, из которых для сглаживания рекомендуется использовать сглаживающие сплайны из-за их вычислительной эффективности.
Сглаживающие сплайны с штрафом работают следующим образом:
Сначала диапазон переменных данных делится на K отдельных регионов, имеющих K границ регионов, называемых узлами. Затем в каждом регионе подгоняются полиномиальные функции низкой степени. Эти полиномы низкой степени называются базовыми функциями. Сплайн представляет собой сумму взвешенных базовых функций, вычисленных по значениям данных. К функции потерь наименьших квадратов добавляется штраф, чтобы контролировать гладкость модели. Параметр сглаживания лямбда контролирует компромисс между гладкостью и извилистостью оценочной сглаживающей функции f. Низкие значения лямбда приводят к несглаженному сплайну, тогда как высокие значения лямбда приводят к линейной оценке.
Обобщённые аддитивные модели в Python
Вернёмся к предыдущему примеру и подгоним сглаживающие сплайны к данным о расходах и отклике.
В Python pyGAM — это пакет для построения обобщённых аддитивных моделей.
pip install pygam
Я моделирую линейную GAM с помощью функции LinearGAM. Термин сплайна определяется с помощью функции s, которая ожидает индекс переменной. n_splines контролирует, сколько базовых функций должно быть подогнано. Я устанавливаю лямбда на очень низкое значение 0,1, что означает, что я почти не штрафую извилистость сплайна.
from pygam import LinearGAM, s
gam_hill = LinearGAM(s(0, n_splines=10), lam = 0.1).fit(spend, response)
Давайте разберёмся с выводом модели:
gam_hill.summary()
Важные части, на которые стоит обратить внимание:
- Rank — количество сплайнов или базовых функций.
- Lambda — параметр сглаживания.
- EDoF — эффективные степени свободы. Более высокие EDoF предполагают более сложные сплайны. Когда EDoF близок к 1, это говорит о том, что лежащий в основе член является линейным.
Моделирование маркетингового микса с помощью обобщённых аддитивных моделей
Теперь, когда мы понимаем, как работает GAM, я покажу, как его можно включить в фреймворк MMM. Я буду использовать тот же фреймворк, который представил в следующей статье:
Улучшение моделирования маркетингового микса с помощью подходов машинного обучения
Изменения минимальны. Вместо Random Forest я использую GAM. Компонент SHAP, который был необходим для объяснения моделей чёрного ящика, больше не нужен. Из-за линейной аддитивности компонентов в GAM мы анализируем эффекты каждой сглаженной медиапеременной почти так же, как в линейных регрессионных моделях.
Данные
Как и в моих предыдущих статьях о MMM, я продолжаю использовать набор данных, предоставленный Robyn под лицензией MIT для бенчмаркинга, и следую тем же шагам подготовки данных, применяя Prophet для разложения тенденций, сезонности и праздников.
Набор данных состоит из 208 недель выручки (с 2015–11–23 по 2019–11–11) с:
- 5 каналами расходов на медиа: tv_S, ooh_S, print_S, VK_S, search_S;
- 2 каналами медиа, которые также имеют информацию об экспозиции (Impression, Clicks): VK_I, search_clicks_P (не используется в этой статье);
- Органическими медиа без расходов: newsletter;
- Контрольными переменными: events, holidays, sales of competitors (competitor_sales_B**).
Окно анализа составляет 92 недели с 2016–11–21 по 2018–08–20.
Моделирование
Шаги моделирования точно такие же, как я описал в предыдущей статье:
Улучшение моделирования маркетингового микса с помощью подходов машинного обучения
Я упомяну важные изменения, связанные с GAM.
pyGAM ожидает довольно нестандартное определение входных признаков. Я написал вспомогательную функцию, которая принимает два типа признаков: те, которые должны быть смоделированы как линейные, и те, которые должны быть смоделированы как сглаживающие сплайны. Кроме того, в качестве параметра предоставляется количество сплайнов.
def build_gam_formula(data,
base_features,
smooth_features,
n_splines = 20):
#set the first spline term
channel_index = data.columns.get_loc(smooth_features[0])
formula = s(channel_index,
n_splines,
constraints='monotonic_inc')
for smooth_channel in smooth_features[1:]:
channel_index = data.columns.get_loc(smooth_channel)
#smooth term
formula = formula + s(channel_index,
n_splines,
constraints='monotonic_inc')
for base_feature in base_features:
feature_index = data.columns.get_loc(base_feature)
#linear term
formula = formula + l(feature_index)
return formula
Итоговая формула, применённая к 6 медиаканалам и 5 контрольным переменным, выглядит так:
s(5) + s(6) + s(7) + s(8) + s(9) + s(10) + l(0) + l(1) + l(2) + l(3) + l(4)
s(5) означает применение сглаживающих сплайнов к переменной, чей столбец в наборе данных имеет индекс 5.
Обратите внимание на параметр constraints со значением monotonic_inc. В контексте линейной регрессии мы применяем некоторую согласованную бизнес-логику, связанную с эффектом насыщения и убывающей доходностью, ограничивая линейные коэффициенты положительными, чтобы увеличение расходов на рекламу не приводило к снижению отклика.
Оптимизация параметров
Наряду с 5 параметрами adstock я оптимизирую параметр сглаживания лямбда в диапазоне от 0,1 до 1000 для всех переменных.
Итоговая модель
Я построил итоговую модель, используя окно в 92 недели. Резюме модели показано ниже:
Эффект убывающей доходности / Эффект насыщения
Давайте построим график результирующей зависимости расходов от отклика. Вертикальная линия соответствует средним расходам в канале. Ось x — расходы на медиа. Ось y — эффект расходов на переменную отклика.
Как и ожидалось после просмотра итоговой модели, несколько медиаканалов (search_S, ooh_S) имеют линейный эффект.
Заключение
В этой статье я показал ещё один подход к моделированию маркетингового микса, применяя сглаживающие сплайны с штрафом к медиаканалам. Этот подход не требует преобразования переменных расходов на медиа для учёта нелинейностей убывающей доходности. Наконец, сглаживающие сплайны позволили получить более точную модель по сравнению с моделями линейной регрессии, что повышает уверенность в разложенных эффектах.
