A partir del 7 de marzo de 2024, Google lanzó una nueva versión oficial de MMM bayesiano llamada Meridian . Meridian actualmente tiene disponibilidad limitada para anunciantes seleccionados. Visite este sitio o comuníquese con su representante de Google para obtener más información. La versión LMMM dejará de funcionar una vez que Meridian haya alcanzado la disponibilidad general.
Documentos • Introducción • Teoría • Primeros pasos • Referencias • Destacados de la comunidad
Los anunciantes utilizan el Marketing Mix Modeling (MMM) para medir la eficacia de la publicidad e informar las decisiones de asignación de presupuesto en todos los canales de medios. La medición basada en datos agregados permite la comparación entre canales en línea y fuera de línea, además de no verse afectada por cambios recientes en el ecosistema (algunos relacionados con la privacidad) que pueden afectar el modelado de atribución. MMM te permite:
Adoptar un enfoque bayesiano para MMM permite al anunciante integrar información previa en el modelado, lo que le permite:
El paquete LightweightMMM (creado con Numpyro y JAX) ayuda a los anunciantes a crear fácilmente modelos bayesianos MMM al proporcionar la funcionalidad para escalar datos de manera adecuada, evaluar modelos, optimizar las asignaciones presupuestarias y trazar gráficos comunes utilizados en el campo.
Un MMM cuantifica la relación entre la actividad del canal de medios y las ventas, controlando al mismo tiempo otros factores. A continuación se muestra una descripción general simplificada del modelo y el modelo completo se establece en la documentación del modelo. Un MMM normalmente se ejecuta utilizando observaciones a nivel semanal (por ejemplo, el KPI podría ser las ventas por semana); sin embargo, también se puede ejecutar a nivel diario.
Donde kpi suele ser el volumen o valor de las ventas por período de tiempo,
LightweightMMM se puede ejecutar utilizando datos agregados a nivel nacional (enfoque estándar) o utilizando datos agregados a nivel geográfico (enfoque jerárquico subnacional).
Nivel nacional (enfoque estándar). Este enfoque es apropiado si los datos disponibles sólo se agregan a nivel nacional (por ejemplo, el KPI podría ser las ventas nacionales por período). Este es el formato más común utilizado en MMM.
Nivel geográfico (enfoque jerárquico subnacional). Este enfoque es apropiado si los datos pueden agregarse a nivel subnacional (por ejemplo, el KPI podría ser las ventas por período de tiempo para cada estado dentro de un país). Este enfoque puede producir resultados más precisos en comparación con el enfoque estándar porque utiliza más puntos de datos para ajustar el modelo. Recomendamos utilizar un modelo de nivel subnacional para países más grandes como Estados Unidos, si es posible.
Es probable que el efecto de un canal de medios sobre las ventas tenga un efecto retardado que disminuya lentamente con el tiempo. Nuestra poderosa arquitectura de modelo Bayesiano MMM está diseñada para capturar este efecto y ofrece tres enfoques diferentes. Recomendamos a los usuarios que comparen los tres enfoques y utilicen el que funcione mejor. El enfoque que funciona mejor suele ser el que tiene el mejor ajuste fuera de la muestra (que es uno de los resultados generados). Las formas funcionales de estos tres enfoques se describen brevemente a continuación y se expresan completamente en la documentación de nuestro modelo.
La forma recomendada de instalar Lightweight_mmm es a través de PyPi:
pip install --upgrade pip
pip install lightweight_mmm
Si deseas utilizar la versión más reciente y un poco menos estable, puedes instalarla desde github:
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
Si está utilizando Google Colab, asegúrese de reiniciar el tiempo de ejecución después de la instalación.
Aquí utilizamos datos simulados, pero se supone que ya tiene sus datos limpios en este momento. Los datos necesarios serán:
# 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
El escalado es todo un arte, las técnicas bayesianas funcionan bien si los datos de entrada son de pequeña escala. No deberíamos centrar las variables en 0. Las ventas y los medios deberían tener un límite inferior de 0.
y
se puede escalar como y / jnp.mean(y)
.media
se pueden escalar como X_m / jnp.mean(X_m, axis=0)
, lo que significa que la media de la nueva columna será 1. Proporcionamos un CustomScaler
que puede aplicar multiplicaciones y divisiones en caso de que los escaladores más utilizados no se ajusten a su caso de uso. Escale sus datos en consecuencia antes de ajustar el modelo. A continuación se muestra un ejemplo de uso de este 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 )
En caso de que tenga una variable que tenga muchos ceros, también puede escalar según la media de valores distintos de cero. Por ejemplo, puede utilizar una función lambda para hacer esto: lambda x: jnp.mean(x[x > 0])
. Lo mismo se aplica al escalamiento de costos.
El modelo requiere los datos de los medios, las características adicionales, los costos de cada unidad de medios por canal y el objetivo. También puede pasar cuántas muestras le gustaría usar, así como la cantidad de cadenas.
Para ejecutar varias cadenas en paralelo, el usuario deberá configurar numpyro.set_host_device_count
en la cantidad de cadenas o en la cantidad de CPU disponibles.
Vea un ejemplo a continuación:
# 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 )
Si desea cambiar algún anterior en el modelo (además del medio anterior que ya está especificando siempre), puede hacerlo con 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 nuestra documentación sobre custom_priors para obtener más detalles.
Puede cambiar entre datos diarios y semanales habilitando weekday_seasonality=True
y seasonality_frequency=365
o weekday_seasonality=False
y seasonality_frequency=52
(predeterminado). En el caso de datos diarios tenemos dos tipos de estacionalidad: día laborable discreto y anual suave.
Los usuarios pueden verificar las métricas de convergencia de los parámetros de la siguiente manera:
mmm . print_summary ()
La regla general es que los valores r_hat
para todos los parámetros son inferiores a 1,1.
Los usuarios pueden comprobar el ajuste entre el KPI real y el KPI previsto mediante:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
Si se proporciona target_scaler
usado para preprocessing.CustomScaler()
, el objetivo no se escalará. En el gráfico se muestran el R cuadrado bayesiano y el MAPE.
Los usuarios pueden obtener la predicción de los datos de prueba de la siguiente manera:
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
Las predicciones devueltas son distribuciones; Si se desean estimaciones puntuales, los usuarios pueden calcularlas basándose en la distribución dada. Por ejemplo, si data_size
de los datos de prueba es 20, number_samples
es 1000 y number_of_chains
es 2, mmm.predict
devuelve 2000 conjuntos de predicciones con 20 puntos de datos. Los usuarios pueden comparar las distribuciones con el valor real de los datos de prueba y calcular métricas como la media y la mediana.
Los usuarios pueden obtener detalles de la estimación de parámetros mediante:
mmm . print_summary ()
Lo anterior devuelve la media, la desviación estándar, la mediana y el intervalo de credibilidad para cada parámetro. Los cuadros de distribución son proporcionados por:
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
especifica los nombres de los medios en cada gráfico.
Las curvas de respuesta se proporcionan de la siguiente manera:
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
Si se proporcionan media_scaler
y target_scaler
utilizados para preprocessing.CustomScaler()
, tanto los valores de medios como los de destino no se escalarán.
Para extraer la efectividad de los medios y la estimación del ROI, los usuarios pueden hacer lo siguiente:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
es la estimación de la efectividad de los medios y roi_hat
es la estimación del ROI. Luego los usuarios pueden visualizar la distribución de la estimación de la siguiente manera:
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 la optimización, maximizaremos las ventas cambiando los insumos de medios de modo que el costo sumado de los medios sea constante. También podemos permitir límites razonables en cada entrada de medios (por ejemplo, +- x%). Solo optimizamos a través de canales y no a lo largo del tiempo. Para ejecutar la optimización se necesitan los siguientes parámetros principales:
n_time_periods
: la cantidad de períodos de tiempo que desea simular (por ejemplo, optimizar para las próximas 10 semanas si entrenó un modelo con datos semanales).budget
que desea asignar para los próximos n_time_periods
.n_time_periods
.media_gap
se refiere a la brecha de datos de medios entre el final de los datos de entrenamiento y el comienzo de los medios sin muestra proporcionados. P.ej. Si se utilizaron 100 semanas de datos para el entrenamiento y la predicción comienza 2 meses después de finalizar los datos del entrenamiento, debemos proporcionar las 8 semanas que faltan entre los datos de entrenamiento y los datos de predicción para que las transformaciones de datos (adstock, transferencia, ...) puedan realizarse correctamente. .Vea a continuación un ejemplo de optimización:
# 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 )
Los usuarios pueden guardar y cargar el modelo de la siguiente manera:
utils . save_model ( mmm , file_path = 'file_path' )
Los usuarios pueden especificar file_path
para guardar el modelo. Para cargar un modelo MMM guardado:
utils . load_model ( file_path : 'file_path' )
Para citar este repositorio:
@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. y Koehler, J. (2017). Métodos bayesianos para modelado de mezclas de medios con efectos de forma y arrastre. Google Inc.
Chan, D. y Perry, M. (2017). Desafíos y oportunidades en el modelado de mezcla de medios.
Sun, Y., Wang, Y., Jin, Y., Chan, D. y Koehler, J. (2017). Modelado de mezcla de medios jerárquicos bayesianos a nivel geográfico.
Como LMMM no es un producto oficial de Google, el equipo de LMMM solo puede ofrecer soporte limitado.
Si tiene preguntas sobre metodología , consulte la sección de Referencias o la página de preguntas frecuentes.
Si tiene problemas al instalar o usar LMMM , no dude en publicarlos en las pestañas Discusiones o Problemas del repositorio de Github. El equipo de LMMM responde a estas preguntas en nuestro tiempo libre, por lo que lamentablemente no podemos garantizar una respuesta oportuna. ¡También animamos a la comunidad a compartir sugerencias y consejos entre sí aquí!
Para solicitudes de funciones , publíquelas en la pestaña Discusiones del repositorio de Github. Tenemos una hoja de ruta interna para el desarrollo de LMMM, ¡pero preste atención a las solicitudes de funciones y aprécielas!
Para informes de errores , publíquelos en la pestaña Problemas del repositorio de Github. Si podemos solucionarlos, se lo haremos saber en los comentarios de su problema.
Se agradecen las solicitudes de extracción , pero nos resulta muy difícil fusionarlas, ya que el código de este repositorio está vinculado a los sistemas internos de Google y debe pasar una revisión interna. Si envía una solicitud de extracción y tenemos recursos para ayudar a fusionarla, ¡nos comunicaremos con usted al respecto!
Cómo crear un modelo de marketing mix con LightweightMMM por Mario Filho.
Cómo funciona Google LightweightMMM y un tutorial de LightweightMMM de Google por Mike Taylor.