MMM#

class pymc_marketing.mmm.mmm.MMM(date_column=FieldInfo(annotation=NoneType, required=True, description='Column name of the date variable.'), channel_columns=FieldInfo(annotation=NoneType, required=True, description='Column names of the media channel variables.', metadata=[MinLen(min_length=1)]), adstock=FieldInfo(annotation=NoneType, required=True, description='Type of adstock transformation to apply.'), saturation=FieldInfo(annotation=NoneType, required=True, description='Type of saturation transformation to apply.'), time_varying_intercept=FieldInfo(annotation=NoneType, required=False, default=False, description='Whether to consider time-varying intercept.'), time_varying_media=FieldInfo(annotation=NoneType, required=False, default=False, description='Whether to consider time-varying media contributions.'), model_config=FieldInfo(annotation=NoneType, required=False, default=None, description='Model configuration.'), sampler_config=FieldInfo(annotation=NoneType, required=False, default=None, description='Sampler configuration.'), validate_data=FieldInfo(annotation=NoneType, required=False, default=True, description='Whether to validate the data before fitting to model'), control_columns=None, yearly_seasonality=None, adstock_first=FieldInfo(annotation=NoneType, required=False, default=True, description='Whether to apply adstock first.'), dag=FieldInfo(annotation=NoneType, required=False, default=None, description='Optional DAG provided as a string Dot format for causal identification.'), treatment_nodes=FieldInfo(annotation=NoneType, required=False, default=None, description='Column names of the variables of interest to identify causal effects on outcome.'), outcome_node=FieldInfo(annotation=NoneType, required=False, default=None, description='Name of the outcome variable.'), scaling=FieldInfo(annotation=NoneType, required=False, default=None, description='Scaling configuration for the model.'))[fuente]#

Modelo de Mezcla de Medios, Adstock Retrasado y saturación logística como inicialización predeterminada (ver [R08ddd2af69d5-1]__).

Dada una variable objetivo de series temporales \(y_{t}\) (por ejemplo, ventas en conversiones), variables mediáticas \(x_{m, t}\) (por ejemplo, impresiones, clics o costos) y un conjunto de covariables de control \(z_{c, t}\) (por ejemplo, días festivos, eventos especiales), consideramos un modelo lineal bayesiano de la forma:

\[y_{t} = \alpha + \sum_{m=1}^{M}\beta_{m}f(x_{m, t}) + \sum_{c=1}^{C}\gamma_{c}z_{c, t} + \varepsilon_{t},\]

donde \(\alpha\) es la intersección, \(f\) es una función de transformación de medios y \(\varepsilon_{t}\) es el término de error que asumimos está distribuido normalmente. La función \(f\) codifica la contribución de los medios en la variable objetivo. Típicamente consideramos dos tipos de transformación: adstock (traslado) y efectos de saturación.

Notas

Aquí hay algunas notas importantes sobre el modelo:

1. Before fitting the model, we scale the target variable and the media channels using the maximum absolute value of each variable. This enable us to have a more stable model and better convergence. If control variables are present, we do not scale them! If needed please do it before passing the data to the model.

2. We allow to add yearly seasonality controls as Fourier modes. You can use the yearly_seasonality parameter to specify the number of Fourier modes to include.

  1. Esta clase también nos permite calibrar el modelo utilizando:

    • Priors personalizados para los parámetros a través del parámetro model_config. También puede establecer la distribución de verosimilitud.

    • Agregando pruebas de elevación a la función de probabilidad a través del método add_lift_test_measurements.

Para obtener detalles sobre una implementación básica en PyMC, consulte [2].

Referencias

[1]

Jin, Yuxue, et al. “Métodos bayesianos para la modelización de mezcla de medios con efectos de arrastre y de forma.” (2017).

Ejemplos

Aquí hay un ejemplo de cómo instanciar el modelo con la configuración predeterminada:

import numpy as np
import pandas as pd

from pymc_marketing.mmm import (
    GeometricAdstock,
    LogisticSaturation
    MMM,
)
from pymc_marketing.paths import data_dir

file_path = data_dir / "mmm_example.csv"
data = pd.read_csv(file_path, parse_dates=["date_week"])

mmm = MMM(
    date_column="date_week",
    channel_columns=["x1", "x2"],
    adstock=GeometricAdstock(l_max=8),
    saturation=LogisticSaturation(),
    control_columns=[
        "event_1",
        "event_2",
        "t",
    ],
    yearly_seasonality=2,
)

Ahora podemos ajustar el modelo con los datos:

# Set features and target
X = data.drop("y", axis=1)
y = data["y"]

# Fit the model
idata = mmm.fit(X, y)

También podemos definir priors personalizados para el modelo:

import numpy as np

from pymc_marketing.mmm import (
    GeometricAdstock,
    LogisticSaturation
    MMM,
)
from pymc_extras.prior import Prior

my_model_config = {
    "saturation_beta": Prior("LogNormal", mu=np.array([2, 1]), sigma=1),
    "likelihood": Prior("Normal", sigma=Prior("HalfNormal", sigma=2)),
}

mmm = MMM(
    date_column="date_week",
    channel_columns=["x1", "x2"],
    adstock=GeometricAdstock(l_max=8),
    saturation=LogisticSaturation(),
    control_columns=[
        "event_1",
        "event_2",
        "t",
    ],
    yearly_seasonality=2,
    model_config=my_model_config,
)

Como puede ver, podemos configurar todas las distribuciones previas y de verosimilitud a través de model_config.

El método fit acepta argumentos de palabra clave que se pasan al método de muestreo de PyMC. Por ejemplo, para cambiar el número de muestras y cadenas, y utilizando una implementación de JAX de NUTS, podemos hacer:

sampler_kwargs = {
    "draws": 2_000,
    "target_accept": 0.9,
    "chains": 5,
    "random_seed": 42,
}

idata = mmm.fit(X, y, nuts_sampler="numpyro", **sampler_kwargs)

Métodos

MMM.__init__([date_column, channel_columns, ...])

Defina el método constructor.

MMM.add_lift_test_measurements(df_lift_test)

Agregue pruebas de elevación al modelo.

MMM.approximate_fit(X[, y, barra de progreso, ...])

Ajuste un modelo utilizando Inferencia Variacional y devuelva InferenceData.

MMM.attrs_to_init_kwargs(attrs)

Convertir atributos a kwargs de inicialización.

MMM.build_from_idata(idata)

Construir el modelo a partir del objeto InferenceData.

MMM.build_model(X, y, **kwargs)

Construya un modelo probabilístico utilizando PyMC para el modelado de mezcla de marketing.

MMM.channel_contribution_forward_pass(...[, ...])

Evalúe la contribución del canal para unos datos de canal dados y un modelo ajustado, es decir.

MMM.compute_channel_contribution_original_scale([previo])

Calcule las contribuciones del canal en la escala original de la variable objetivo.

MMM.compute_mean_contributions_over_time([...])

Obtenga las contribuciones de cada canal a lo largo del tiempo.

MMM.create_fit_data(X, y)

Cree el grupo fit_data basado en los datos de entrada.

MMM.create_idata_attrs()

Cree atributos para los datos de inferencia.

MMM.fit(X[, y, barra_de_progreso, semilla_aleatoria])

Ajuste un modelo utilizando los datos pasados como parámetro.

MMM.format_recovered_transformation_parameters([...])

Formatee los parámetros de transformación recuperados para cada canal.

MMM.forward_pass(x)

Transformar la entrada del canal en las contribuciones objetivo de cada canal.

MMM.get_channel_contribution_forward_pass_grid(...)

Generar una cuadrícula de contribuciones de canal escaladas para una cuadrícula dada de valores compartidos.

MMM.get_channel_contribution_share_samples([anterior])

Obtenga la participación de las contribuciones del canal en la escala original de la variable objetivo.

MMM.get_errors([original_scale])

Obtener la distribución posterior de errores del modelo.

MMM.get_target_transformer()

Devuelve la tubería del transformador objetivo utilizada para el preprocesamiento de la variable objetivo.

MMM.get_ts_contribution_posterior(...[, ...])

Obtenga la distribución posterior de las contribuciones de la serie temporal de una variable dada.

MMM.graphviz(**kwargs)

Obtenga la representación graphviz del modelo.

MMM.idata_to_init_kwargs(idata)

Cree la configuración del modelo y la configuración del muestreador a partir de InferenceData a argumentos de palabra clave.

MMM.load(fname[, check])

Cree una instancia de ModelBuilder a partir de un archivo.

MMM.load_from_idata(idata[, verificar])

Cree una instancia de ModelBuilder a partir de un objeto InferenceData.

MMM.max_abs_scale_channel_data(datos)

MaxAbsScaler para los datos del canal.

MMM.max_abs_scale_target_data(datos)

MaxAbsScaler para los datos objetivo.

MMM.new_spend_contributions([gasto, ...])

Devuelva las contribuciones próximas para un gasto dado.

MMM.optimize_budget(presupuesto, num_periodos[, ...])

Optimice el presupuesto dado en función de la función de utilidad especificada durante un período de tiempo determinado.

MMM.plot_allocated_contribution_by_channel(muestras)

Trace la contribución asignada por canal con intervalos de incertidumbre.

MMM.plot_budget_allocation(samples[, ...])

Trace la asignación del presupuesto y las contribuciones de los canales.

MMM.plot_channel_contribution_grid(inicio, ...)

Trace una cuadrícula de contribuciones de canal escaladas para una cuadrícula dada de valores de acciones.

MMM.plot_channel_contribution_share_hdi([...])

Trace la participación de las contribuciones del canal en un gráfico de bosque.

MMM.plot_channel_parameter(param_name, ...)

Trace la distribución posterior de un parámetro específico para cada canal.

MMM.plot_components_contributions([...])

Trace la variable objetivo y los componentes del modelo predictivo posterior.

MMM.plot_direct_contribution_curves([...])

Trace las curvas de contribución directa para cada canal de marketing.

MMM.plot_errors([escala_original, ax])

Grafique los errores del modelo tomando la diferencia entre los valores verdaderos y los predichos.

MMM.plot_grouped_contribution_breakdown_over_time([...])

Trace un gráfico de área de series temporales para todas las contribuciones del canal.

MMM.plot_new_spend_contributions(monto_gasto)

Grafique las ventas futuras para una cantidad de gasto dada.

MMM.plot_posterior_predictive([...])

Trace la distribución predictiva posterior a partir del ajuste del modelo.

MMM.plot_prior_predictive([escala_original, ...])

Trace la distribución predictiva previa a partir del ajuste del modelo.

MMM.plot_prior_vs_posterior(var_name[, ...])

Trace la distribución previa frente a la distribución posterior para una variable especificada en un diseño de cuadrícula de 3 columnas.

MMM.plot_waterfall_components_decomposition([...])

Cree un gráfico de cascada.

MMM.post_sample_model_transformation()

Transformación del modelo posterior a la muestra para almacenar el estado de HSGP a partir del ajuste.

MMM.predict([X, extend_idata])

Utilice un modelo para predecir sobre datos no vistos y devuelva la predicción puntual de todas las muestras.

MMM.predict_posterior([X, extend_idata, ...])

Generar muestras predictivas posteriores en datos no vistos.

MMM.predict_proba([X, extend_idata, combined])

Alias para predict_posterior, para mantener la consistencia con los estimadores probabilísticos de scikit-learn.

MMM.preprocess(objetivo, datos)

Preprocese los datos proporcionados de acuerdo con el objetivo especificado.

MMM.sample_posterior_predictive([X, ...])

Muestra de la distribución predictiva posterior del modelo.

MMM.sample_prior_predictive([X, y, muestras, ...])

Muestra de la distribución predictiva previa del modelo.

MMM.sample_response_distribution(...)

Generar un conjunto de datos sintético y muestrear la predicción posterior basada en la asignación.

MMM.save(fname, **kwargs)

Guarde los datos de inferencia del modelo en un archivo.

MMM.set_idata_attrs([idata])

Establecer atributos en un objeto InferenceData.

MMM.table(**model_table_kwargs)

Obtenga la tabla resumen del modelo.

MMM.validate(objetivo, datos)

Valide los datos de entrada según el tipo de destino especificado.

MMM.validate_channel_columns(datos)

Valide las columnas del canal.

MMM.validate_control_columns(datos)

Valide las columnas de control.

MMM.validate_date_col(datos)

Valide la columna de fecha.

MMM.validate_target(datos)

Valide la columna objetivo.

Atributos

default_model_config

Defina la configuración del modelo predeterminado.

default_sampler_config

Configuración de muestreador predeterminada para el modelo.

fit_result

Obtenga el resultado de ajuste posterior fit_result.

id

Generar un valor hash único para el modelo.

methods

Obtenga todos los métodos del objeto.

output_var

Defina la variable objetivo para el modelo.

posterior

posterior_predictive

predictions

preprocessing_methods

Una propiedad que proporciona métodos de preprocesamiento para las características ("X") y la variable objetivo ("y").

prior

prior_predictive

validation_methods

Una propiedad que proporciona métodos de validación para las características ("X") y la variable objetivo ("y").

version

target_transformer

channel_columns

control_columns

model

idata

sampler_config

model_config

date_column