Em 7 de março de 2024, o Google lançou uma nova versão oficial do Bayesian MMM chamada Meridian . Meridian está atualmente com disponibilidade limitada para anunciantes selecionados. Visite este site ou entre em contato com seu representante do Google para obter mais informações. A versão LMMM será descontinuada assim que o Meridian atingir a disponibilidade geral.
Documentos • Introdução • Teoria • Primeiros passos • Referências • Destaque da comunidade
A Modelagem de Mix de Marketing (MMM) é usada pelos anunciantes para medir a eficácia da publicidade e informar as decisões de alocação de orçamento em canais de mídia. A medição baseada em dados agregados permite a comparação entre canais online e offline, além de não ser afetada por mudanças recentes no ecossistema (algumas relacionadas à privacidade) que podem afetar a modelagem de atribuição. O MMM permite que você:
Adotar uma abordagem bayesiana para MMM permite que um anunciante integre informações prévias na modelagem, permitindo:
O pacote LightweightMMM (construído usando Numpyro e JAX) ajuda os anunciantes a construir facilmente modelos Bayesianos MMM, fornecendo a funcionalidade para dimensionar dados adequadamente, avaliar modelos, otimizar alocações orçamentárias e traçar gráficos comuns usados em campo.
Um MMM quantifica a relação entre a atividade do canal de mídia e as vendas, enquanto controla outros fatores. Uma visão geral simplificada do modelo é mostrada abaixo e o modelo completo é apresentado na documentação do modelo. Um MMM normalmente é executado usando observações semanais (por exemplo, o KPI pode ser vendas por semana), no entanto, também pode ser executado diariamente.
Onde kpi é normalmente o volume ou valor das vendas por período de tempo,
O LightweightMMM pode ser executado usando dados agregados em nível nacional (abordagem padrão) ou usando dados agregados em nível geográfico (abordagem hierárquica subnacional).
Nível nacional (abordagem padrão). Esta abordagem é apropriada se os dados disponíveis forem agregados apenas a nível nacional (por exemplo, o KPI pode ser as vendas nacionais por período de tempo). Este é o formato mais comum usado em MMMs.
Nível geográfico (abordagem hierárquica subnacional). Esta abordagem é apropriada se os dados puderem ser agregados a nível subnacional (por exemplo, o KPI pode ser as vendas por período de tempo para cada estado dentro de um país). Esta abordagem pode produzir resultados mais precisos em comparação com a abordagem padrão porque utiliza mais pontos de dados para ajustar o modelo. Recomendamos a utilização de um modelo de nível subnacional para países maiores, como os EUA, se possível.
É provável que o efeito de um canal de comunicação social sobre as vendas possa ter um efeito desfasado que diminui lentamente ao longo do tempo. Nossa poderosa arquitetura de modelo Bayesiano MMM foi projetada para capturar esse efeito e oferece três abordagens diferentes. Recomendamos que os usuários comparem as três abordagens e usem a abordagem que funciona melhor. A abordagem que funciona melhor normalmente será aquela que tiver o melhor ajuste fora da amostra (que é um dos resultados gerados). As formas funcionais dessas três abordagens são brevemente descritas abaixo e estão totalmente expressas em nossa documentação do modelo.
A forma recomendada de instalar o Lightweight_mmm é através do PyPi:
pip install --upgrade pip
pip install lightweight_mmm
Se você quiser usar a versão mais recente e um pouco menos estável, você pode instalá-la no github:
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
Se você estiver usando o Google Colab, reinicie o tempo de execução após a instalação.
Aqui usamos dados simulados, mas presume-se que você tenha seus dados limpos neste momento. Os dados necessários serão:
# Let's assume we have the following datasets with the following shapes (we use
the `simulate_dummy_data` function in utils for this example ):
media_data , extra_features , target , costs = utils . simulate_dummy_data (
data_size = 160 ,
n_media_channels = 3 ,
n_extra_features = 2 ,
geos = 5 ) # Or geos=1 for national model
O dimensionamento é um pouco como uma arte, as técnicas bayesianas funcionam bem se os dados de entrada forem de pequena escala. Não devemos centralizar as variáveis em 0. Vendas e mídia devem ter um limite inferior de 0.
y
pode ser dimensionado como y / jnp.mean(y)
.media
pode ser dimensionada como X_m / jnp.mean(X_m, axis=0)
, o que significa que a média da nova coluna será 1. Fornecemos um CustomScaler
que pode aplicar multiplicações e escalas de divisão caso os escalonadores usados mais amplos não se ajustem ao seu caso de uso. Dimensione seus dados adequadamente antes de ajustar o modelo. Abaixo está um exemplo de uso deste CustomScaler
:
# Simple split of the data based on time.
split_point = data_size - data_size // 10
media_data_train = media_data [: split_point , :]
target_train = target [: split_point ]
extra_features_train = extra_features [: split_point , :]
extra_features_test = extra_features [ split_point :, :]
# Scale data
media_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
extra_features_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
target_scaler = preprocessing . CustomScaler (
divide_operation = jnp . mean )
# scale cost up by N since fit() will divide it by number of time periods
cost_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
media_data_train = media_scaler . fit_transform ( media_data_train )
extra_features_train = extra_features_scaler . fit_transform (
extra_features_train )
target_train = target_scaler . fit_transform ( target_train )
costs = cost_scaler . fit_transform ( unscaled_costs )
Caso você tenha uma variável com muitos 0s, você também pode escalar pela média de valores diferentes de zero. Por exemplo, você pode usar uma função lambda para fazer isso: lambda x: jnp.mean(x[x > 0])
. O mesmo se aplica ao escalonamento de custos.
O modelo requer os dados de mídia, os recursos extras, os custos de cada unidade de mídia por canal e o alvo. Você também pode passar quantas amostras gostaria de usar, bem como o número de cadeias.
Para executar múltiplas cadeias em paralelo, o usuário precisaria definir numpyro.set_host_device_count
como o número de cadeias ou o número de CPUs disponíveis.
Veja um exemplo abaixo:
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 )
Se você quiser alterar algum anterior no modelo (além do anterior da mídia que você já está especificando sempre), você pode fazer isso com custom_priors
:
# See detailed explanation on custom priors in our documentation.
custom_priors = { "intercept" : numpyro . distributions . Uniform ( 1 , 5 )}
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 ,
custom_priors = custom_priors )
Consulte nossa documentação sobre custom_priors para obter mais detalhes.
Você pode alternar entre dados diários e semanais ativando weekday_seasonality=True
e seasonality_frequency=365
ou weekday_seasonality=False
e seasonality_frequency=52
(padrão). No caso de dados diários temos dois tipos de sazonalidade: dias úteis discretos e anuais suaves.
Os usuários podem verificar as métricas de convergência dos parâmetros da seguinte forma:
mmm . print_summary ()
A regra geral é que os valores r_hat
para todos os parâmetros são menores que 1,1.
Os usuários podem verificar o ajuste entre o KPI verdadeiro e o KPI previsto:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
Se target_scaler
usado para preprocessing.CustomScaler()
for fornecido, o destino não será dimensionado. R-quadrado bayesiano e MAPE são mostrados no gráfico.
Os usuários podem obter a previsão dos dados de teste:
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
A previsão retornada são distribuições; se forem desejadas estimativas pontuais, os usuários podem calculá-las com base na distribuição fornecida. Por exemplo, se data_size
dos dados de teste for 20, number_samples
for 1000 e number_of_chains
for 2, mmm.predict
retornará 2.000 conjuntos de previsões com 20 pontos de dados. Os usuários podem comparar as distribuições com o valor real dos dados de teste e calcular as métricas como média e mediana.
Os usuários podem obter detalhes da estimativa dos parâmetros:
mmm . print_summary ()
O texto acima retorna a média, o desvio padrão, a mediana e o intervalo de credibilidade para cada parâmetro. Os gráficos de distribuição são fornecidos por:
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
especifica nomes de mídia em cada gráfico.
As curvas de resposta são fornecidas da seguinte forma:
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
Se media_scaler
e target_scaler
usados para preprocessing.CustomScaler()
forem fornecidos, os valores de mídia e de destino não serão dimensionados.
Para extrair a eficácia da mídia e a estimativa do ROI, os usuários podem fazer o seguinte:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
é a estimativa de eficácia da mídia e roi_hat
é a estimativa de ROI. Em seguida, os usuários podem visualizar a distribuição da estimativa da seguinte forma:
plot . plot_bars_media_metrics ( metric = media_effect_hat , channel_names = media_names )
plot . plot_bars_media_metrics ( metric = roi_hat , channel_names = media_names )
Para otimização maximizaremos as vendas alterando os insumos de mídia de forma que o custo somado da mídia seja constante. Também podemos permitir limites razoáveis em cada entrada de mídia (por exemplo, +- x%). Otimizamos apenas entre canais e não ao longo do tempo. Para executar a otimização são necessários os seguintes parâmetros principais:
n_time_periods
: o número de períodos que você deseja simular (por exemplo, otimizar para as próximas 10 semanas se você treinou um modelo com dados semanais).budget
que você deseja alocar para os próximos n_time_periods
.n_time_periods
.media_gap
refere-se à lacuna de dados de mídia entre o final dos dados de treinamento e o início da mídia fora da amostra fornecida. Por exemplo. se 100 semanas de dados foram usadas para treinamento e a previsão começa 2 meses após a conclusão dos dados de treinamento, precisamos fornecer as 8 semanas que faltam entre os dados de treinamento e os dados de previsão para que as transformações de dados (adstock, carryover, ...) possam ocorrer corretamente .Veja abaixo e exemplo de otimização:
# Run media optimization.
budget = 40 # your budget here
prices = np . array ([ 0.1 , 0.11 , 0.12 ])
extra_features_test = extra_features_scaler . transform ( extra_features_test )
solution = optimize_media . find_optimal_budgets (
n_time_periods = extra_features_test . shape [ 0 ],
media_mix_model = mmm ,
budget = budget ,
extra_features = extra_features_test ,
prices = prices )
Os usuários podem salvar e carregar o modelo da seguinte forma:
utils . save_model ( mmm , file_path = 'file_path' )
Os usuários podem especificar file_path
para salvar o modelo. Para carregar um modelo MMM salvo:
utils . load_model ( file_path : 'file_path' )
Para citar este repositório:
@software{lightweight_mmmgithub,
author = {Pablo Duque and Dirk Nachbar and Yuka Abe and Christiane Ahlheim and Mike Anderson and Yan Sun and Omri Goldstein and Tim Eck},
title = {LightweightMMM: Lightweight (Bayesian) Marketing Mix Modeling},
url = {https://github.com/google/lightweight_mmm},
version = {0.1.6},
year = {2022},
}
Jin, Y., Wang, Y., Sun, Y., Chan, D., & Koehler, J. (2017). Métodos bayesianos para modelagem de mix de mídia com efeitos de transferência e forma. Google Inc.
Chan, D. e Perry, M. (2017). Desafios e oportunidades na modelagem de mix de mídias.
Sun, Y., Wang, Y., Jin, Y., Chan, D. e Koehler, J. (2017). Modelagem de mix de mídia hierárquica bayesiana em nível geográfico.
Como o LMMM não é um produto oficial do Google, a equipe do LMMM só pode oferecer suporte limitado.
Para dúvidas sobre metodologia , consulte a seção Referências ou a página FAQ.
Para problemas de instalação ou uso do LMMM , sinta-se à vontade para publicá-los nas guias Discussões ou Problemas do repositório Github. A equipa do LMMM responde a estas questões no nosso tempo livre, pelo que infelizmente não podemos garantir uma resposta atempada. Também incentivamos a comunidade a compartilhar dicas e conselhos aqui!
Para solicitações de recursos , publique-as na guia Discussões do repositório do Github. Temos um roteiro interno para o desenvolvimento do LMMM, mas preste atenção às solicitações de recursos e aprecie-as!
Para relatórios de bugs , poste-os na guia Problemas do repositório Github. Se/quando pudermos resolvê-los, avisaremos você nos comentários sobre o seu problema.
Solicitações pull são apreciadas, mas são muito difíceis de mesclar, pois o código neste repositório está vinculado aos sistemas internos do Google e precisa passar por uma revisão interna. Se você enviar uma solicitação pull e tivermos recursos para ajudar a mesclá-la, entraremos em contato com você sobre isso!
Como Criar um Modelo de Marketing Mix com LightweightMMM por Mario Filho.
Como funciona o Google LightweightMMM e um passo a passo do LightweightMMM do Google por Mike Taylor.