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

В отличие от инструментов отслеживания на уровне пользователя, MMM использует агрегированные данные временных рядов и поперечные данные для оценки того, как маркетинговые каналы влияют на ключевые показатели деятельности (KPI) компании. Развитие Байесовского моделирования с повышенной вычислительной мощностью вернул MMM в центр внимания маркетингового анализа.

На протяжении многих лет рекламодатели и медиа-агентства использовали Байесовский MMM для понимания вклада маркетинговых каналов и распределения бюджета маркетинга.

Роль генеративного ИИ в современном MMM

Все большее число компаний сейчас используют функции GenAI как улучшение к MMM несколькими способами:

  1. Подготовка данных и инженерия признаков
  2. Автоматизация конвейера: генерирование кода для конвейера MMM
  3. Объяснение insights – перевод инсайтов модели на простой деловой язык
  4. Сценарное планирование и оптимизация бюджета

Хотя эти возможности мощные, они полагаются на проприетарные движки MMM.

Цель этой статьи состоит не в демонстрации того, как работает Байесовский MMM, а в демонстрации потенциального открытого исходного кода и бесплатного системного проектирования, которое маркетологи могут исследовать без необходимости подписки на черный ящик MMM-стека, который предлагают поставщики индустрии.

Подход сочетает:

  1. Google Meridian как открытый исходный код Байесовского движка MMM
  2. Открытый исходный код большой языковой модели (LLM) – Mistral 7B как уровень инсайтов и взаимодействия поверх вывода Байесовского вывода Meridian.

Вот диаграмма архитектуры, которая представляет предложенное проектирование открытого исходного кода системы для маркетологов.

Эта диаграмма архитектуры была создана с помощью инструментов проектирования, усовершенствованных GenAI, для быстрого прототипирования.

Этот открытый исходный код рабочий процесс имеет несколько преимуществ:

  1. Демократизация Байесовского MMM: устраняет проблему черного ящика проприетарных инструментов MMM.
  2. Экономическая эффективность: снижает финансовый барьер для малых и средних компаний для доступа к передовой аналитике.
  3. Такое разделение сохраняет статистическую строгость, требуемую от движков MMM, и делает это просто более доступным.
  4. С уровнем GenAI insights аудитория не нуждается в понимании Байесовской математики, вместо этого они просто могут взаимодействовать с помощью запросов GenAI для изучения инсайтов модели о вкладе канала, ROI и возможных стратегиях распределения бюджета.
  5. Адаптивность к новым открытым инструментам: слой GenAI может быть заменен более новыми LLM по мере их открытого доступа для получения улучшенных инсайтов.

Практический пример реализации модели Google Meridian MMM с уровнем LLM

Для целей этой демонстрации я использовал открытый исходный код модель Mistral 7B, полученную локально с платформы Hugging Face, размещенную движком Llama.

Эта система предназначена для работы в различных областях, то есть могут использоваться любые альтернативные открытые модели MMM, такие как Robyn от Meta, PyMC и т.д., а также версии LLM для моделей GPT и Llama, в зависимости от масштаба и объема требуемых инсайтов.

Важное примечание:

  1. Был создан синтетический маркетинговый набор данных с KPI, таким как "Conversions" (Конверсии) и маркетинговыми каналами, такими как TV, Search, Paid Social, Email и OOH (Out-of-Home media).
  2. Google Meridian производит богатый вывод, такой как ROI, коэффициенты каналов и вклады в управление KPI, кривые отклика и т.д. Хотя эти выводы статистически обоснованы, они часто требуют специального опыта для интерпретации. Именно здесь LLM становится ценным и может использоваться как переводчик инсайтов.
  3. Примеры кода Python из Google Meridian использовались для запуска модели Meridian MMM на созданных синтетических маркетинговых данных. Для получения дополнительной информации о том, как запускать код Meridian, обратитесь к этой странице.
  4. Была использована модель открытого исходного кода LLM Mistral 7B благодаря ее совместимости с бесплатным уровнем ресурсов GPU Google Colab и также потому, что это адекватная модель для генерирования инсайтов на основе инструкций без необходимости доступа к API.

Пример: следующий фрагмент кода Python был выполнен на платформе Google Colab:

# Установка meridian: из PyPI @ последний релиз 
!pip install --upgrade google-meridian[colab,and-cuda,schema] 

# Установка зависимостей 
import IPython from meridian 
import constants from meridian.analysis 
import analyzer from meridian.analysis 
import optimizer from meridian.analysis 
import summarizer from meridian.analysis 
import visualizer from meridian.analysis.review 
import reviewer from meridian.data 
import data_frame_input_data_builder 
from meridian.model import model
from meridian.model import prior_distribution 
from meridian.model import spec 
from schema.serde import meridian_serde 
import numpy as np 
import pandas as pd

Был создан синтетический маркетинговый набор данных (не показан в этом коде), и как часть требования рабочего процесса Meridian, создается экземпляр построителя входных данных, как показано ниже:

builder = data_frame_input_data_builder.DataFrameInputDataBuilder( 
   kpi_type='non_revenue', 
   default_kpi_column='conversions', 
   default_revenue_per_kpi_column='revenue_per_conversion', 
   ) 

builder = ( 
   builder.with_kpi(df) 
  .with_revenue_per_kpi(df) 
  .with_population(df) 
  .with_controls( 
  df, control_cols=["sentiment_score_control", "competitor_sales_control"] ) 
  ) 

channels = ["tv","paid_search","paid_social","email","ooh"] 

builder = builder.with_media( 
  df, 
  media_cols=[f"{channel}_impression" for channel in channels], 
  media_spend_cols=[f"{channel}_spend" for channel in channels], 
  media_channels=channels, 
  ) 

data = builder.build() #Build the input data

Настройка и выполнение модели Meridian MMM:

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

roi_mu = 0.2  # Mu для приора ROI для каждого медиа-канала.
roi_sigma = 0.9  # Sigma для приора ROI для каждого медиа-канала.

prior = prior_distribution.PriorDistribution(
    roi_m=tfp.distributions.LogNormal(roi_mu, roi_sigma, name=constants.ROI_M)
)

model_spec = spec.ModelSpec(prior=prior, enable_aks=True)

mmm = model.Meridian(input_data=data, model_spec=model_spec)

mmm.sample_prior(500)
mmm.sample_posterior(
    n_chains=10, n_adapt=2000, n_burnin=500, n_keep=1000, seed=0
)

Этот фрагмент кода запускает модель meridian с определенными приорами для каждого канала на созданном наборе входных данных. Следующий шаг - оценить производительность модели. Хотя существуют параметры вывода модели, такие как R-squared, MAPE, P-Values и т.д., которые можно оценить, для целей этой статьи я включаю только пример визуальной оценки:

model_fit = visualizer.ModelFit(mmm)
model_fit.plot_model_fit()

Теперь, когда модель Meridian MMM была выполнена, у нас есть параметры вывода модели для каждого медиа-канала, такие как ROI, кривые отклика, коэффициенты модели, уровни расходов и т.д. Мы можем объединить всю эту информацию в один входной объект JSON, который может быть использован непосредственно в качестве входа для LLM для генерирования инсайтов:

import json

# Объединить все в один словарь
genai_input = {
    "roi": roi.to_dict(orient='records'),
    "coefficients": coeffs.to_dict(orient='records'),
    "priors": priors.to_dict(orient='records'),
    "response_curves": response_curves.to_dict(orient='records')
}

# Преобразовать в JSON-строку для LLM
genai_input_json = json.dumps(genai_input, indent=2)

Загрузка Mistral 7B LLM с платформы Hugging Face локально и установка требуемого движка Llama для выполнения LLM:

# Загрузить Mistral 7B llm с Hugging Face
!wget -O /content/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf \
https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q4_K_M.gguf

# Установить Llama для движка python
!pip install llama-cpp-python --upgrade

Выполнение Mistral LLM с использованием входного JSON с выводом Meridian MMM и включением надлежащего инструкционного запроса:

from llama_cpp import Llama

# Инициализация модели
llm = Llama(
    model_path="/content/models/mistral-7b-instruct-v0.2.Q4_K_M.gguf",
    n_ctx=2048,        
    n_gpu_la