Введение
Масштабируемые интернет-бизнесы зависят от маркетинга для стимулирования роста. Конечно, не только это, но при определённом масштабе очень немногие компании могут позволить себе неэффективность в привлечении клиентов. Две горячие темы, в которые компании вкладывают значительные средства, — это внедрение возможностей искусственного интеллекта (ИИ) в маркетинг: моделирование медиамиксов (МММ) и прогнозирование пожизненной ценности клиента (LTV). Оба направления направлены на повышение рентабельности инвестиций, которые организации вкладывают в маркетинг. В этой статье рассматривается, что такое МММ, и лучшие практики его применения.
Моделирование медиамиксов: что это?
МММ расширяет возможности организаций по всему миру, измеряя эффективность их рекламных каналов и обеспечивая прозрачность того, как расходы на медиа влияют на продажи. Эти модели играют важную роль в поддержке процесса принятия решений о распределении бюджета по каналам за счёт оптимизации целевой переменной, такой как продажи, возврат инвестиций в рекламу (ROAS), выручка, конверсия, LTV и т. д.
За последние годы было проведено множество исследований, и было предложено несколько моделей, чтобы попытаться смоделировать влияние расходов на интересующие переменные [1]. Эти модели основаны на еженедельных или ежемесячных данных, агрегированных географически.
Байесовские методы для моделирования медиамиксов
Байесовские методы могут быть определены для учёта эффектов насыщения/формы и переноса/лагов.
Перед тем как углубиться в детали модели, давайте определим гипотетический набор данных для лучшего понимания того, какие переменные принимает модель. Предположим, у нас есть еженедельные данные на уровне страны, где каждая строка представляет неделю (t), а каждый столбец представляет либо медиаканал (m), либо управляющую переменную (c), такую как сезонность или цену продукта. Расходы на рекламу по каналу m за неделю t определяются как Xt,m, а управляющая переменная за ту же неделю определяется как Zt,c.
Таблица 1. Гипотетический еженедельный набор данных с 3 медиаканалами, одной управляющей переменной и целевой переменной (продажи).
Эффект переноса (Lag or Carryover Effect)
Эффект переноса моделируется с помощью функции, называемой adstock [1]. Эта функция создаёт кумулятивный эффект расходов в конкретном канале. Она преобразует свой временной ряд через средневзвешенное значение расходов на рекламу с текущей недели и предыдущих L-1 недель. L — это максимальная продолжительность эффекта переноса для конкретного медиаканала, и она играет важную роль в оценке веса Wm в уравнении средневзвешенного значения.
Уравнение 1. Функция adstock, моделирующая эффект переноса.
L может быть задано по-разному для медиаканалов. Это гиперпараметр, который должен быть определён экспертом. Если для конкретного канала нет предварительной информации, авторы советуют установить L на большое число, например, 13, чтобы учесть потенциально сильно запаздывающие эффекты.
Уравнение, определяющее вес, может иметь две разные формы:
- Непосредственный/геометрический adstock [2], когда пик рекламного эффекта происходит в то же время, что и экспозиция рекламы, то есть у нас пик продаж в той же неделе, когда мы увеличили расходы на медиаканал. В уравнении 2 αm — это коэффициент удержания эффекта рекламы.
Уравнение 2. Функция геометрического затухания.
- Задержанный adstock [1], когда для достижения пика рекламного эффекта требуется больше времени, и он не сразу влияет на продажи. В уравнении 3 θm — это задержка пика эффекта.
Уравнение 3. Функция задержанного adstock.
Давайте возьмём наш гипотетический набор данных и рассчитаем непосредственный и задержанный adstock для канала VK. Для начала мы добавили ещё 5 недель в набор данных. Мы рассматриваем коэффициент удержания (αm) равным 80% и задержку пика (θm) в 5 недель. После этого мы вычисляем вес для непосредственного эффекта и вес для задержанного эффекта, чтобы получить окончательное значение непосредственного и задержанного adstock на 8-й неделе.
Таблица 2. Расчёт непосредственного и задержанного adstock для VK.
Рисунок 3 показывает, какой вклад вносит каждая неделя расходов в объём продаж на 8-й неделе.
Рисунок 3. Непосредственный и задержанный эффект adstock для наших гипотетических расходов на VK (изображение автора).
Эффект насыщения или формы (Saturation or Shape Effect)
Эффект насыщения или формы моделируется путём преобразования расходов на рекламу через функцию кривизны, такую как логистическая функция насыщения [3]. Она определяется следующим образом:
Уравнение 3. Логистическая функция насыщения.
где x представляет расходы на рекламу, а λ контролирует крутизну кривой насыщения, то есть определяет, как быстро эффект расходов на рекламу насыщается. Мы можем интерпретировать низкое значение λ как более постепенное увеличение функции отклика, что означает, что расходы на рекламу оказывают заметное влияние в широком диапазоне значений. Напротив, более высокие значения λ приведут к уменьшению отдачи от расходов. На рисунке 4 эти различные варианты поведения показаны очень чётко.
Рисунок 4. Логистические функции насыщения, основанные на разных параметрах (источник).
Сложно сказать, какие параметры мы должны использовать для модели, поскольку они весьма специфичны для каждого канала. Тем не менее в байесовском подходе эти параметры оцениваются с помощью предварительных распределений. Следовательно, модель выбирает наиболее вероятные параметры значений для заданных данных. Поэтому мы должны задать распределение, а не одно значение.
Объединение эффекта переноса и формы
Как упоминалось в предыдущих двух разделах, для моделирования эффекта переноса и формы необходимо применить преобразования к расходам на рекламу каждого канала. Возникает вопрос, какое преобразование следует применить первым. Авторы предлагают:
- Эффект формы следует за переносом, если расходы на рекламу в значительной степени сконцентрированы на определённых периодах.
- Перенос следует за эффектом формы, если расходы на рекламу равномерно распределены по нескольким временным периодам.
Поскольку организации обычно склонны концентрировать свою маркетинговую деятельность, наиболее распространённым подходом является комбинация переноса → эффект формы.
Таким образом, зависимая переменная продаж y на неделе t может быть смоделирована с помощью линейной комбинации расходов на рекламу и управляющих переменных. Мы также используем коэффициент регрессии β для моделирования различных эффектов для разных медиаканалов.
Уравнение 4. Моделирование продаж с учётом комбинации переноса → эффект формы и управляющих переменных.
где 𝛂 — это точка пересечения. Функция f (xm,t) кодирует вклад медиа в целевую переменную с учётом adstock (перенос) и эффектов насыщения. γc — это эффект управляющей переменной Zt,c, а et — белый шум.
Байесовская модель
Байесовский подход начинается с определения предварительных распределений для параметров модели, отражающих первоначальные убеждения до учёта данных. По мере поступления новых данных вычисляется функция правдоподобия, которая представляет вероятность наблюдения данных с учётом параметров. В этом контексте данные включают медиаканалы X и управляющие переменные Z, которые объясняют зависимую переменную y. Используя теорему Байеса, апостериорное распределение получается путём объединения предварительных распределений и функции правдоподобия.
Авторы полагаются на метод Гиббса [4] из-за его эффективности при выборе значений параметров для каждого медиаканала (X) и управляющей переменной (Z).
Уравнение 6. Максимизация правдоподобия вектора параметров (Φ) с учётом медиаканалов (X), управляющих переменных (Z) и зависимой переменной (y).
Помните, что модель в меньшей степени полагается на предварительные распределения для оценки параметров, когда данные содержат достаточно информации и имеют чёткие закономерности.
Тем не менее авторы оставили несколько рекомендаций по определению предварительных распределений для каждого из параметров:
- Коэффициент удержания (α) ограничен на [0, 1[ и должен иметь предварительное определение на [0, 1[ такое как бета- или равномерное распределение.
- Параметр задержки (θ) обычно ограничен на [0, L -1] и должен иметь предварительное определение, такое как равномерное или масштабированное бета-распределение.
- Гамма (γ) и точка пересечения обычно моделируются с помощью нормального распределения.
- Лямбда (λ) обычно моделируется с помощью гамма-распределения.
- Коэффициенты регрессии (β) обычно моделируются с помощью неотрицательных априорных значений, таких как нормальное распределение, поскольку расходы на рекламу не оказывают негативного влияния на y.
Байесовское моделирование медиамиксов с помощью PyMC
В этом разделе реализована байесовская модель на общедоступном наборе данных с Kaggle под лицензией CC0: Public Domain. Этот набор данных содержит информацию о расходах на три разных медиаканала (телевидение, радио и газеты) и объёмы продаж за тот же период.
Набор данных состоит из следующих столбцов:
ID— идентифицирует строку;TV Ad Budget ($)— расходы на рекламу по телевидению;Radio Ad Budget ($)— расходы на рекламу по радио;Newspaper Ad Budget ($)— расходы на рекламу в газетах;Sales ($)— целевая переменная.
Подготовленная байесовская модель поможет нам рассчитать ROAS, удержание и эффект насыщения по каналам. Кроме того, она поможет нам оптимизировать распределение бюджета на будущие недели.
Чтобы оценить надёжность модели, мы оценим, насколько хорошо она может моделировать зависимую переменную на невидимых данных, основанных на расходах по каждому медиаканалу и управляющим переменным. Мы прибегаем к регрессионным метрикам, таким как средняя абсолютная ошибка (MAE). В качестве эталона мы используем наивную модель, которая всегда предсказывает среднее значение обучающих данных. Кстати, компании часто полагаются на это, когда MMM недоступен.
Мы начинаем с импорта библиотек:
%matplotlib inline
%load_ext autoreload
%autoreload 2
import arviz as az
import datetime
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import utils
from pymc_marketing.mmm.delayed_saturated_mmm import DelayedSaturatedMMM
from sklearn.metrics import mean_absolute_error
Затем мы загружаем набор данных и выполняем некоторые базовые задачи предварительной обработки. Мы упростили имена столбцов и добавили новый столбец даты на основе идентификатора. Это помогает обогатить набор данных управляющими переменными, такими как сезонность и тренд.
df = pd.read_csv('data/data.csv')
df = df.rename(columns={'Unnamed: 0': 'id', 'TV Ad Budget ($)':'tv', 'Radio Ad Budget ($)': 'radio', 'Newspaper Ad Budget ($)': 'newspaper', 'Sales ($)': 'sales'})
df['ds'] = df['id'].apply(lambda x: pd.to_datetime("2024-02-26")-datetime.timedelta(weeks=len(df)-x))
После этого мы проводим некоторый исследовательский анализ данных, чтобы понять корреляции внутри данных:
- Мы оцениваем корреляцию между зависимой переменной и каждым медиаканалом.
- TV — это наиболее коррелированная функция с продажами, в то время как Newspaper — наименее коррелированная.
corr_matrix = df[['sales', 'tv', 'radio', 'newspaper']].corr()
sns.heatmap(corr_matrix, annot=True, cmap='Blues')
plt.show()
- Мы строим графики продаж по сравнению с каждым медиаканалом, чтобы оценить, существует ли какой-либо эффект переноса между пиком расходов и пиком продаж:
- Нет чёткой тенденции или сезонности в продажах.
- Эффект от рекламы на телевидении, по-видимому, оказывает немедленное влияние на продажи.
- Эффект от рекламы на радио также, по-видимому, оказывает немедленное влияние на продажи. Например, в неделях 1, 2 и 3 в 2022 году, когда расходы на телевидение были ниже, мы видим 2 пика продаж, которые соответствуют пикам по радио.
- Эффект от рекламы в газетах, по-видимому, имеет 1–2-недельный лаг, но это трудно сказать, поскольку телевидение и радио реклама проводилась одновременно.
utils.line_plot(df.copy(), ['sales'], 'Sales over Time')
utils.line_plot(df.copy(), ['sales', 'tv'], 'Sales vs TV over Time')
utils.line_plot(df.copy(), ['sales', 'radio'], 'Sales vs Radio over Time')
utils.line_plot(df.copy(), ['sales', 'newspaper'], 'Sales vs Newspaper over Time')
С завершением EDA мы можем приступить к подготовке части моделирования:
- Разделение данных на обучающие и тестовые:
train_df = df.sort_values(by='ds').iloc[:-5,:]
test_df = df.sort_values(by='ds').iloc[-5:,:]
- Используйте еженедельные данные, которые мы создали ранее, чтобы извлечь управляющие переменные, такие как тренд и сезонность.
- Мы прибегаем к модели временных рядов Prophet от VK, чтобы разложить наш временной ряд на тренд и сезонность, и используем их в качестве управляющих переменных.
seasonality, trend = utils.extract_trend_seasonality(train_df, 'sales', 5)
train_df.loc[:, 'seasonality'] = seasonality[:-5]
test_df.loc[:,'seasonality'] = seasonality[-5:]
train_df.loc[:,'trend'] = trend[:-5]
test_df.loc[:,'trend'] = trend[-5:]
- Установите различные гиперпараметры для модели. Эти параметры могут быть определены с помощью традиционного поиска гиперпараметров ML. Мы оптимизируем некоторые регрессионные метрики, изменяя значения dist, mu и sigma. Помните, что более высокие значения стандартного отклонения (sigma) дают модели больше свободы при поиске оптимального параметра.
my_model_config = {'intercept': {'dist': 'Normal', 'kwargs': {'mu': 0, 'sigma': 2}},
'beta_channel': {'dist': 'HalfNormal', 'kwargs': {'sigma': 2}},
'alpha': {'dist': 'Beta', 'kwargs': {'alpha': 1, 'beta': 3}},
'lam': {'dist': 'Gamma', 'kwargs': {'alpha': 3, 'beta': 1}},
'likelihood': {'dist': 'Normal',
'kwargs': {'sigma': {'dist': 'HalfNormal', 'kwargs': {'sigma': 2}}}},
'gamma_control': {'dist': 'Normal', 'kwargs': {'mu': 0, 'sigma': 2}},
'gamma_fourier': {'dist': 'Laplace', 'kwargs': {'mu': 0, 'b': 1}}}
Теперь, когда мы определили обучающие и тестовые наборы и конфигурацию модели, мы можем инициировать байесовскую модель и подогнать её к обучающим данным.
- Каналы СМИ: [“tv”, “radio”, “newspaper”]
- Управляющие переменные: [“seasonality”, “trend”]
- Из EDA максимальная задержка adstock (параметр задержки) не кажется выше 2.
mmm = DelayedSaturatedMMM(
model_config=my_model_config,
sampler_config={"progressbar": True},
date_column="ds",
channel_columns=["tv", "radio", "newspaper"],
control_columns=["seasonality", "trend"],
adstock_max_lag=2,
)
mmm.fit(X=train_df[['ds', 'tv', 'radio', "newspaper", "seasonality", "trend"]], y=train_df['sales'], target_accept=0.95, chains=4, random_seed=42)
После подгонки модели мы можем проверить, насколько хорошо она соответствует обучающим данным, сравнив выборку прогнозов (синий) и истинные значения (чёрный). В нашем случае они хорошо согласованы.
mmm.sample_posterior_predictive(train_df[['ds', 'tv', 'radio', "newspaper", "seasonality", "trend"]], extend_idata=True, combined=True)
mmm.plot_posterior_predictive(original_scale=True);
Теперь мы можем начать интерпретировать модель, используя несколько подходов:
- Проверка оценки параметров:
- Radio, по-видимому, имеет наибольшую отдачу от инвестиций, поскольку его коэффициент (бета) является самым высоким (1.185), за ним следуют TV и Newspaper.
- Коэффициент удержания α составляет 3,2% для TV, 2,3% для Radio и 23,9% для Newspaper.
az.summary(data=mmm.fit_result,
var_names=[
"intercept",
"likelihood_sigma",
"beta_channel",
"alpha",
"lam",
"gamma_control",
],
)
- Проверка вклада канала и ROAS:
- ROAS рассчитывается путём установки расходов одного из медиаканалов равными нулю, чтобы оценить, что произойдёт с прогнозируемыми продажами по сравнению с текущими продажами. Например, если мы установим расходы на рекламу в газете равными нулю, мы не ожидаем большого падения продаж. Следовательно, его ROAS будет низким.
- Хотя TV имеет наибольший вклад, поскольку у него были более высокие расходы, мы видим, что модель прогнозирует более высокий ROAS для Radio.
fig = mmm.plot_channel_contribution_share_hdi(figsize=(7, 5))
utils.plot_ROAS(mmm, train_df, ["tv", "radio", "newspaper"])
- Наконец, мы также можем оценить, что произойдёт, если мы увеличим расходы на рекламу в каждом канале на 50%, приняв во внимание эффект переноса и насыщения.
- Ось X представляет процентный уровень входных данных по каналам:
- При =1 мы имеем входные данные модели.
- При =1.5 мы имеем, сколько вклад был бы, если бы мы увеличили расходы на 50%.
plt.rcParams["figure.figsize"] = (20,5)
mmm.plot_channel_contributions_grid(start=0, stop=1.5, num=12);
Чтобы понять, верны ли наши выводы, мы можем использовать наш тестовый набор для оценки способности нашей модели прогнозировать будущие продажи на основе медиаканалов и управляющих переменных. Для этого мы используем MAE и сравниваем его с наивной моделью.
- У нас был MAE 2,01 для целевого среднего значения 13,8.
- У нас ошибка на 58% ниже, чем у базовой линии.
y_out_of_sample = mmm.sample_posterior_predictive(X_pred=test_df[['ds', 'tv', 'radio', "newspaper", "seasonality", "trend"]], extend_idata=False)
y_pred = [np.median(x) for x in y_out_of_sample['y']]
print(f"MAE: {mean_absolute_error(test_df['sales'], y_pred)} for an average target of {test_df['sales'].mean()}")
print(f"MASE: {mean_absolute_error(test_df['sales'], y_pred)/mean_absolute_error(test_df['sales'], [train_df['sales'].mean()]*5)}")
Распределение бюджета
Поскольку мы предполагаем, что эффект расходов на продажи не является линейным, он насыщается в какой-то момент. Поэтому нам нужно определить, какая функция насыщения лучше всего подходит для наших данных. У нас есть два варианта функции:
- Сигмовидная функция, где α (альфа) — это точка насыщения, что означает, что увеличение расходов не увеличит продажи, а λ (лямбда) влияет на наклон кривой, где более высокие значения делают кривую более крутой.
- Функция Михаэлиса-Ментен, где α (альфа) — это максимальный вклад, который может внести канал, а λ (лямбда) — это момент, когда кривая корректирует своё направление, то есть наклон.
Чтобы определить, какая кривая лучше всего подойдёт для наших данных, мы будем использовать наш подогнанный MMM для расчёта параметров для каждой функции. После этого мы построим их и визуально проверим, какая из них обеспечивает лучшее соответствие.
- Для нашего конкретного случая сигмовидная функция работала лучше.
sigmoid_response_curve_fig = mmm.plot_direct_contribution_curves(show_fit=True)
sigmoid_params = mmm.compute_channel_curve_optimization_parameters_original_scale(method='sigmoid')
mm_response_curve_fig = mmm.plot_direct_contribution_curves(show_fit = True, method='michaelis-menten')
mm_params = mmm.compute_channel_curve_optimization_parameters_original_scale(method='michaelis-menten')
Теперь, когда у нас есть параметры сигмовидной функции для каждого канала, мы знаем точку насыщения каждого канала. Таким образом, дополнительные расходы не увеличат отдачу, в то время как сумма, инвестированная в другой канал, может иметь желаемый эффект.
Мы можем использовать алгоритм для оптимизации распределения бюджета на основе кривой насыщения, общего бюджета и бюджетных ограничений для каждого канала. PyMC имеет реализацию последовательного наименьших квадратов квадратичного программирования (SLSQP). Он максимизирует общий вклад всех каналов с учётом всех трёх переменных:
- Общее ограничение бюджета;
- Минимальные и максимальные лимиты расходов для каждого канала;
- Кривая насыщения.
result_sigmoid = mmm.optimize_channel_budget_for_maximum_contribution(
method = 'sigmoid',
total_budget = 500,
parameters = sigmoid_params,
budget_bounds = {'tv': [75, 296], 'radio': [10, 300], 'newspaper': [1, 25]}
)
Распределение бюджета в условиях рыночной неопределённости
В нынешней экономике мы сталкиваемся с большой неопределённостью. Таким образом, мы должны разработать стратегию распределения бюджета, которая учитывает различные сценарии.
Давайте рассмотрим три разных сценария:
- Начальный: экономика остаётся стабильной, и распределение бюджета такое же, как рассчитано в предыдущем разделе.
- Сценарий 2: экономика переживает период рецессии, и наш бюджет сокращается на 40%.
- Сценарий 3: экономика становится более благоприятной и начинает расти, и наш бюджет увеличивается на 20%.
Мы будем использовать ту же подогнанную модель MMM и те же параметры сигмовидной функции модели для оптимизации распределения бюджета в рамках этих различных сценариев. Мы будем использовать тот же код, что и раньше, но на этот раз мы будем перебирать разные сценарии, чтобы уменьшить или увеличить доступный бюджет.
scenarios_result = []
total_budget = 500
channels = ['tv', 'radio', 'newspaper']
for scenario in np.array([0.6, 1.2]):
scenarios_result.append(
mmm.optimize_channel_budget_for_maximum_contribution(
method="sigmoid", # define saturation function
total_budget=total_budget * scenario,
parameters=sigmoid_params,
budget_bounds={
channel: [1, total_budget * scenario] for channel in channels
},
).to_dict()
)
_ = mmm.plot_budget_scenearios(
base_data=result_sigmoid, method="sigmoid", scenarios_data=scenarios_result
)
Как показано на рисунке 19, в условиях рецессионного сценария бюджет, выделенный на TV, значительно уменьшается по сравнению с начальным сценарием. Это ожидаемо, поскольку Radio имеет более высокий ROAS, как мы видели ранее. С другой стороны, бюджет, выделенный на TV и Radio, увеличивается аналогичным образом в условиях сценария роста.
Рисунок 19. Распределение бюджета в разных сценариях (изображение автора).
Заключение
ИИ для моделирования медиамиксов может стать разницей между получением положительной рентабельности инвестиций и привлечением ценных и лояльных клиентов или истощением наших финансовых ресурсов в неправильном медиаканале с неправильными клиентами.
В этой статье мы разработали байесовскую структуру для моделирования маркетинговых миксов, которая может обеспечить прозрачность и оценить дальнейший потенциал каждого медиаканала компании для привлечения новых клиентов. В нашем подходе знания предметной области от маркетинговых команд могут быть включены путём установки предварительных распределений. Это способствует улучшению способности модели понимать взаимосвязь между медиаканалами и зависимой переменной интереса (например, продажами). Наконец, стратегия распределения бюджета может быть оптимизирована в зависимости от способности компании инвестировать в привлечение новых клиентов. В сегодняшних макроэкономических сценариях компании могут прибегать к прибыльности и, таким образом, сокращать доступный бюджет для инвестиций в рост. Мы показали, как принять решение на основе данных о том, где сократить расходы с минимальными потерями. И наоборот, мы покажем, куда инвестировать, если сценарий более позитивен, и компания хочет направить больше ресурсов для более быстрого роста.
Об авторе
Серийный предприниматель и лидер в области ИИ. Я разрабатываю ИИ-продукты для бизнеса и инвестирую в стартапы, ориентированные на ИИ.
Основатель @ ZAAI | LinkedIn | X/Twitter
Ссылки
[1] Yuxue Jin, Yueqing Wang, Yunting Sun, David Chan, Jim Koehler. (2017). Bayesian Methods for Media Mix Modeling with Carryover and Shape Effects.
[2] Dominique M. Hanssens , Leonard J. Parsons , Randall L. Schultz. (2003). Market response models: econometric and time series analysis. Springer Science & Business Media.
[3] Hill, A. V. (1910). The possible effects of the aggregation of the molecules of haemoglobin on its dissociation curves. Journal of Physiology, 40 (suppl), iv–vii. doi:10.1113/jphysiol.1910. sp001386.
[4] Gelfand, A. E. & Smith, A. F. (1990). Sampling-based approaches to calculating marginal densities. Journal of the American statistical association, 85 (410), 398–409
