Моделирование маркетингового комплекса с использованием сглаживающих сплайнов

Автор: Дмитрий Иванов [Команда P9X]

~8 минут чтения

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

Преобразование переменных медиаактивности

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

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

Интуиция, стоящая за преобразованием переменных медиаактивности

Давайте разберёмся на примере, почему преобразование переменных медиаактивности является необходимым шагом в рамках линейной модели.

Я генерирую переменную медиа с расходами на рекламу, эффект насыщения которой описан функцией Хилла с двумя параметрами: γ, контролирующим точку перегиба, и α, определяющим форму кривой.

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) имеют линейный эффект.

Заключение

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