Фотография Натана Фертига на Unsplash
Вы можете определить важность темы по тому, сколько крупных компаний выпускают по ней пакеты программного обеспечения. В области моделирования маркетингового микса даже лучше, чем моделирование маркетингового микса, является байесовское моделирование маркетингового микса, которое предоставляют библиотеки Google и PyMC Labs. Хотя LMMM, безусловно, тоже интересна, сегодня мы сосредоточимся на PyMC Marketing.
В этой статье вы узнаете, насколько легко построить современную байесовскую модель маркетингового микса!
Если вам нужно освежить знания, ознакомьтесь с моей старой статьёй, в которой рассказывается о том, что такое байесовское моделирование маркетингового микса.
Байесовское моделирование маркетингового микса в Python через PyMC3
Ручной процесс
В моей старой статье (см. выше) я сам написал байесовскую модель маркетингового микса. Для этого мне нужно было определить функцию для эффекта переноса расходов на медиа, что было громоздко. Всё ещё используя более старую версию PyMC3, это выглядело так:
import theano.tensor as tt
def carryover(x, strength, length):
w = tt.as_tensor_variable(
[tt.power(strength, i) for i in range(length)]
)
x_lags = tt.stack(
[tt.concatenate([
tt.zeros(i),
x[:x.shape[0]-i]
]) for i in range(length)]
)
return tt.dot(w, x_lags)
Это работает, но его непросто разобрать, и он может быть менее эффективным. Кроме того, использование Theano в PyMC устарело, поскольку теперь мне пришлось бы использовать PyTensor, форк Aesara, основанный на Theano. Похоже, это сложная история.
Поэтому я сейчас полагаюсь на более профессиональный и общий код для достижения своих целей. Я многому научился, проверив, как они реализовали эффект переноса.
Прежде чем продолжить, убедитесь, что у вас установлены пакеты pymc и pymc-marketing. Я установил PyMC с помощью mamba, как описано на их GitHub, а затем установил pymc-marketing через
pip install pymc-marketing
PyMC Marketing
Давайте ещё раз рассмотрим наш старый пример из моей статьи о байесовском моделировании маркетингового микса. Начнём с импорта набора данных, который я создал синтетически.
import pandas as pd
data = pd.read_csv(
'https://raw.githubusercontent.com/Garve/datasets/4576d323bf2b66c906d5130d686245ad205505cf/mmm.csv',
parse_dates=['Date']
)
Данные выглядят так:
Определение модели
Теперь давайте представим нашу звезду и определим модель:
from pymc_marketing.mmm import DelayedSaturatedMMM
mmm = DelayedSaturatedMMM(
data=data,
target_column="Sales",
date_column="Date",
channel_columns=["TV", "Radio", "Banners"]
)
Это создаёт модель с насыщением и эффектом переноса по каналам, аналогично тому, что я делал вручную раньше. Поэтому я не буду вдаваться в подробности о том, как эта модель работает с математической точки зрения.
Мы можем визуализировать то, что создали:
import pymc as pm
pm.model_to_graphviz(model=mmm.model)
Здесь мы видим, что сначала применяется адсток (перенос), затем насыщение. У нас есть три параметра alpha, beta_channel и lam на канал, где:
alpha— это скорость переноса, которая находится между 0 и 1,lam— это скорость насыщения,beta_channel— это фактический коэффициент линейной регрессии.
Чтобы дать немного больше контекста, формула сокращённой модели:
где c пробегает по всем различным каналам.
Подгонка модели
Подгонка модели так же проста, как в scikit-learn:
mmm.fit()
Вывод модели
После обучения модели мы можем проверить параметры следующим образом:
import arviz as az
az.summary(
data=mmm.fit_result,
var_names=["intercept", "beta_channel", "alpha", "lam", "sigma"]
)
Я получил что-то вроде этого:
Судя по 1.0 в столбце r_hat, мы видим, что цепи, похоже, сошлась просто отлично, то есть результаты в остальной части таблицы надёжны.
Мы также можем проверить, какие значения модель считает правильными для всех параметров. Например, канал TV carryover alpha[TV] находится между 0,465 и 0,515 с вероятностью 94%, как видно в столбцах hdi_3% и hdi_97%. Если бы модель должна была выбрать одно число, это было бы 0,49, как вы можете видеть в столбце mean.
Примечание: для создания этого набора данных я использовал значения насыщения 0,5 для ТВ, 0,2 для радио и 0 для баннеров. Наша модель PyMC смогла подобрать их довольно прилично!
Для визуалов:
mmm.plot_channel_parameter(param_name="alpha", figsize=(9, 5))
Мы даже можем проверить вклад каналов, используя удобный метод
mmm.plot_channel_contribution_share_hdi()
Согласно модели, ТВ несёт ответственность примерно за 40% дополнительных продаж (дополнительно к базе), радио — примерно за 26%, а баннеры — примерно за 34%.
Проверка апостериорных предсказаний
Мы можем провести проверку апостериорных предсказаний, то есть выборку прогнозов (синий), и посмотреть, насколько хорошо они соответствуют модели (чёрный).
mmm.plot_posterior_predictive(original_scale=True)
Похоже на хорошую подгонку! Мы даже можем разложить сигнал на базовый уровень и вклад каналов через
mmm.plot_components_contributions()
Заключение
Байесовское моделирование маркетингового микса в настоящее время является лучшим способом узнать, какие из ваших маркетинговых каналов работают хорошо, а какие — нет. Создание такой модели не слишком сложно, но всё же далеко не так просто, как собрать модель scikit-learn.
К счастью, новый PyMC Marketing упрощает байесовское моделирование маркетингового микса по сравнению с тем, что нам приходилось кодировать вручную.
Не поймите меня неправильно, мне нравится программировать, и очень важно, чтобы вы тоже умели это делать. Но всё же приятно иметь хорошо поддерживаемый пакет, который, вероятно, будет получать ещё больше функций для маркетинговых миксов в будущем.
И я охватил лишь некоторые из функций. PyMC Marketing может даже:
- эффективно работать с контрольными переменными, передавая список столбцов через
control_columnsв классDelayedSaturatedMMM; - строить графики кривых насыщения через
mmm.plot_contribution_curves(); - рассчитывать ROAS, хотя это всё ещё ручная работа.
Для получения дополнительной информации ознакомьтесь с этим замечательным ноутбуком от людей из PyMC.
Надеюсь, вы узнали что-то новое, интересное и ценное сегодня. Спасибо за чтение!
Если у вас есть вопросы, напишите мне в LinkedIn!
И если вы хотите глубже погрузиться в мир алгоритмов, попробуйте мою новую публикацию Всё об алгоритмах! Я всё ещё ищу авторов!
