Configura tu diseño preferido

En este documento, se explica el proceso para configurar el diseño de tu experimento con la biblioteca de Meridian GeoX. Aprende a preparar tus datos, establecer parámetros clave del experimento, utilizar opciones de configuración avanzadas, evaluar la viabilidad del diseño y visualizar y exportar el diseño que elijas.

Resumen y preparación de datos

Comienza por importar la biblioteca de Meridian GeoX y preparar el conjunto de datos previos a la prueba. Como se describe en Recopila y prepara tus datos, este conjunto de datos es el requisito previo para diseñar tu estudio de GeoX.

Tu conjunto de datos debe ser un DataFrame de Pandas, y las columnas obligatorias son las siguientes:

  • fecha: Por ejemplo, diariamente
  • ubicación: Por ejemplo, diferentes áreas de mercado
  • conversiones: Los datos de respuesta suelen ser recuentos de conversiones sin procesar o datos de ingresos, por lo general, de un CRM del anunciante
  • inversión: Son los datos de inversión de las campañas incluidas en el estudio. Esta columna es opcional. Para las configuraciones de experimentos de varias celdas, usa etiquetas de columnas distintas, como spend_cell_1 o spend_cell_2.

1. Diseño de experimentos

Esta es la interacción principal en la que defines los parámetros del próximo experimento. Para ilustrar este proceso paso a paso, se puede usar un ejemplo de un diseño de experimento de aumento de la inversión de 28 días con regresión basada en el tiempo (TBR) y muestreo estratificado.

  • DesignConfig: Se usa para establecer las bases de los experimentos:
    • experiment_duration: Es la duración del experimento, sin incluir los períodos de inactividad. Por lo general, la duración abarca al menos un ciclo de compra del producto.
    • cell_count: Es la cantidad de celdas de tratamiento en el experimento. El valor predeterminado es 1, lo que significa que un grupo de tratamiento se vincula con un grupo de control en el experimento. Si el valor es mayor que 1, diseña un estudio de varias celdas que contenga varias celdas de tratamiento.
    • experiment_types: Define la naturaleza de la prueba, como de aislamiento, supresión o aumento. Consulta Tipos de experimentos para obtener más detalles. En los experimentos de varias celdas, puedes establecer diferentes tipos de experimentos para las distintas celdas. Por ejemplo, {'cell_1': ExperimentType.GO_DARK, 'cell_2': ExperimentType.HEAVY_UP} indica que se debe ejecutar una supresión en una celda de tratamiento y un aumento en otra, lo que es una configuración muy común en los experimentos de varias celdas con presupuesto neutral.
    • methodology: Es el método de análisis elegido para la selección del diseño, como la regresión basada en el tiempo, el control sintético o la diferencia en diferencias sintéticas.
    • geo_assignment_rule: Se admite el muestreo aleatorio o estratificado.
    • design_output_count: Es la cantidad total de diseños recomendados clasificados que se incluirán en el resultado.

Puedes consultar más detalles sobre las opciones de metodología y reglas de asignación en Compara metodologías.

import datetime
import meridian_geox as geox

# Example: Specify a 28-day 'heavy-up' (increased spend) experiment using TBR
# and stratified sampling.
design_config = geox.DesignConfig(
    experiment_duration=datetime.timedelta(days=28),
    experiment_types=geox.ExperimentType.HEAVY_UP,
    methodology=geox.Methodology.TBR,
    geo_assignment_rule=geox.GeoAssignmentRule.STRATIFIED_SAMPLING,
    design_output_count=5
)
  • constraints: Te permite especificar los presupuestos máximos y otras restricciones relacionadas con el diseño. Casos de uso más avanzados, como incluir o excluir ubicaciones geográficas específicas o establecer umbrales de conversión. A continuación, se muestra una configuración de restricciones básica que solo incluye presupuestos máximos. Las restricciones más avanzadas se abordan en la siguiente sección.
# Limit the max experiment budget to be 100000.
constraints = geox.Constraints(
    budget_constraint=geox.Budget(budget=100000)
)
  • geox.run_design(): Es la función principal que toma el conjunto de datos previos a la prueba, los parámetros de configuración y las restricciones para generar un conjunto de diseños de experimentos potenciales, clasificados por el MDE.
# Generate Design
# 'design_data' should be your pre-test pandas dataframe.
design_set = geox.run_design(
    design_data,
    design_config,
    constraints
)

# Select the top-ranked design
selected_id = next(iter(design_set.designs))
selected_design = design_set.designs[selected_id]

DesignConfig también incluye parámetros que puedes ajustar para el diseño, pero puedes dejarlos en blanco, ya que hay valores predeterminados para ellos:

  • alpha (opcional): Es el nivel de significancia de la prueba. El valor predeterminado es 0.10 o 10%. También significa que la probabilidad de cobertura esperada del intervalo de confianza es 1 - alfa = 90%.
  • power (opcional): Es la probabilidad de detectar un efecto verdadero. El valor predeterminado es igual al 80%.
  • cost_per_incremental_conversion (CpIC, opcional): Se usa solo en experimentos de aislamiento. En este tipo de experimentos, el CpIC se usa para estimar el presupuesto mínimo, es decir, cuánto invertir en las campañas activadas recientemente. El valor predeterminado es 1, aunque es más práctico estimar tu CpIC como 1/iCPD (o 1/ROAS incremental), donde la estimación de iCPD (o ROAS incremental) proviene de un modelo de MMM de Meridian existente o de un estudio de incrementalidad anterior, como GeoX o la efectividad de conversiones de Google. Como solo es útil en los experimentos de aislamiento, el CpIC se ignora en los experimentos (o celdas) de supresión y de aumento, que miden las campañas activas existentes, y el presupuesto del experimento se proyecta con los datos históricos de inversión.
  • min_r2 (opcional): Es el umbral mínimo de puntuación de R cuadrado fuera de la muestra (bondad del ajuste) que se requiere para los diseños candidatos durante la fase de diseño. El valor predeterminado se establece en 0.8 (80%), lo que descarta los diseños candidatos en los que el ajuste del modelo previo a la prueba es inferior a este umbral.

2. Parámetros de configuración de diseño adicionales a través de restricciones

En esta sección, aprenderás a configurar el diseño de forma flexible pasando más restricciones de diseño, además de especificar solo un presupuesto máximo, como se mostró en la sección anterior. Todas estas restricciones son opcionales. Este es un ejemplo de cómo agregar algunas restricciones al diseño.

  • excluded_geos: Son las ubicaciones geográficas que se excluirán del diseño del experimento. Por lo general, estas ubicaciones geográficas son grandes áreas metropolitanas que no quieres incluir en un estudio de Meridian GeoX, ya que pueden causar una interrupción significativa de los medios.
  • excluded_dates: Son las fechas que se excluirán del diseño del experimento.
  • budget_percent: Es el cambio porcentual máximo del presupuesto para el diseño del experimento. Solo se puede usar si los datos de inversión se proporcionan por celda.
  • budget_constraint: Es la restricción de presupuesto para el diseño del experimento (por celda). Podría ser un importe de presupuesto total o un cambio en el porcentaje del presupuesto.
  • max_conversions_percent: Es la cantidad máxima de conversiones para el grupo de tratamiento. El valor predeterminado se establece en un 30%, ya que un GeoX común no debería afectar más del 30% de tus medios.
# 1. Define specific dates to exclude
dates_to_exclude = {
    pd.to_datetime('2024-12-31'),
    pd.to_datetime('2025-01-01'),
}

# 2. Add them to your Constraints object which specifies
# excluded geos, excluded dates, maximum conversion percentages
custom_constraints = geox.Constraints(
    excluded_geos={'loc1', 'loc2', 'loc3'},
    excluded_dates=dates_to_exclude,
    max_conversions_percent=0.2,
    budget_constraint=geox.Budget(budget=150000)
)

# 3. Use these constraints in a new design
custom_design_set = geox.run_design(
    design_data,
    design_config,
    custom_constraints
)

print("Design generated with date exclusions.")

3. Evaluación, visualización y exportación

Después de ejecutar geox.run_design(), el resultado contiene una lista de diseños candidatos. Para evaluar estos diseños, inspecciona las métricas clave en la tabla de resumen, como el coeficiente de determinación R cuadrado (\( R^2 \)), el MDE y el valor p de la prueba A/A. Todos los candidatos de diseño de la tabla de resumen se clasifican por MDE de forma ascendente.

design_id celda design_methodology r2 mde mde_abs p_value (AA) presupuesto design_implied_cpic treatment_conversions_pct treatment_geo_count
52456ea8 cell_1 STRATIFIED_SAMPLING-TBR 0.913 0.013 7085.925 0.394 7085.925 1 30.073 27
d42f5f69 cell_1 STRATIFIED_SAMPLING-TBR 0.917 0.014 7610.810 0.920 7610.810 1 29.820 29
6f8dc0bc cell_1 STRATIFIED_SAMPLING-TBR 0.897 0.014 7610.809 0.371 7610.809 1 29.325 29
06c83b68 cell_1 STRATIFIED_SAMPLING-TBR 0.945 0.015 7873.250 0.497 7873.250 1 30.064 30
cb3f10cd cell_1 STRATIFIED_SAMPLING-TBR 0.915 0.015 7873.249 0.169 7873.249 1 30.039 30

Evalúa la viabilidad del diseño

Para seleccionar un diseño adecuado y continuar con tu recorrido de Meridian GeoX, evalúa los candidatos según estos criterios:

  1. Umbral de R cuadrado (\( R^2 \)): Se recomienda seleccionar un diseño con\( R^2 \ge 0.8 \) . Un valor de \( R^2 < 0.5 \) indica que las ubicaciones geográficas de control son malas predictoras de las ubicaciones geográficas de tratamiento, lo que, en ciertas situaciones, puede hacer que el análisis posterior a la prueba no sea confiable.

  2. Validación de la prueba A/A: Asegúrate de que el diseño seleccionado supere la prueba A/A. El valor p de tu prueba A/A debe ser mayor que el nivel de significancia elegido (\( \alpha \)) para garantizar que no haya un sesgo preexistente significativo. Además, si un alto porcentaje de diseños candidatos no supera la prueba A/A, suele indicar una mala calidad de los datos previos a la prueba, como valores atípicos extremos, cambios geográficos repentinos o una alta volatilidad, o bien un ajuste deficiente del modelo. Ejecutar un experimento con esos datos hace que el análisis posterior a la prueba no sea confiable debido a un alto riesgo de descubrimientos falsos (detección de efectividad inexistente).

Ajuste del valor de R cuadrado

El \( R^2 \) mínimo requerido se controla con el parámetro min_r2 en geox.DesignConfig. De forma predeterminada, el valor mínimo de \( R^2 \) requerido es 0.8. Si la búsqueda de diseño no devuelve candidatos viables con un umbral de 0.8, tienes la posibilidad de flexibilizar el umbral, por ejemplo, ajustándolo a 0.75 o 0.70:

design_config = geox.DesignConfig(
    experiment_duration=datetime.timedelta(days=28),
    experiment_types=geox.ExperimentType.HEAVY_UP,
    methodology=geox.Methodology.TBR,
    min_r2=0.7,  # Adjust threshold if 0.8 yields no candidate designs
)

Soluciona problemas de las pruebas A/A

  1. Verifica si hay anomalías en los datos: Inspecciona los datos previos a la prueba para detectar errores de entrada de datos, días faltantes o aumentos repentinos extremos en ubicaciones geográficas específicas. Excluye estas fechas y ubicaciones geográficas anómalas con Constraints(excluded_dates=...excluded_geos=...).

  2. Aumenta el historial previo a la prueba: Proporciona un historial previo a la prueba más extenso (por ejemplo, de \( 3N \) a \( 6N \) o más) para brindarle al modelo más datos que le permitan aprender relaciones estables.

  3. Viabilidad del MDE: Compara el MDE del diseño con tus expectativas comerciales. El MDE es la efectividad mínima que puede detectar la prueba. Si esperas que tu campaña genere solo una efectividad del 5%, pero el diseño que elegiste tiene un MDE del 12%, el estudio no tiene la potencia suficiente y no deberías continuar sin aumentar el tamaño del grupo de tratamiento o la duración.

Visualiza el diseño

Usa geox.plot_design() para generar representaciones visuales del tratamiento y la situación contrafáctica.

Ejemplo de datos de conversiones totales observadas en comparación con las contrafácticas

Exporta el diseño

Al final, el diseño que elijas se puede exportar a JSON con .export_to_json() y volver a cargar más adelante con .load_from_json() para garantizar la coherencia entre las fases de diseño y análisis.

4. Diseño de varias celdas

Ten en cuenta que Meridian GeoX admite de forma nativa una variedad de experimentos de varias celdas. Por ejemplo, una opción popular, llamada prueba de presupuesto neutral, te permite probar los efectos de la supresión (reducción del presupuesto) y el aumento (aumento del presupuesto) en el mismo mercado al mismo tiempo, mientras que el presupuesto total en todas las ubicaciones geográficas sigue siendo neutral. Para diseñar una prueba de presupuesto neutral, puedes establecer cell_count en 2 y, luego, seleccionar los tipos de experimentos de las dos celdas de tratamiento para que sean GO_DARK y HEAVY_UP.

import datetime
import meridian_geox as geox

# Example design configuration for multi-cell budget neutral test.
multi_cell_design_config = geox.DesignConfig(
    cell_count=2,
    experiment_duration=datetime.timedelta(days=28),
    experiment_types={
        'cell_1': ExperimentType.GO_DARK,
        'cell_2': ExperimentType.HEAVY_UP,
    },
    methodology=geox.Methodology.TBR,
    geo_assignment_rule=geox.GeoAssignmentRule.STRATIFIED_SAMPLING,
    design_output_count=5,
)

Después de configurar las restricciones para la prueba de varias celdas, la función geox.run_design() debería devolver los diseños de varias celdas solicitados. Al igual que en la situación de una sola celda, los diseños candidatos se pueden recuperar según corresponda.

# Constraints for multi-cell test.
multi_cell_constraints = geox.Constraints(
      budget_constraint={
        'cell_1': geox.Budget(budget_pct=-1.0),
        'cell_2': geox.Budget(budget_pct=1.0),
    },
)
multi_cell_design_set = geox.run_design(
    design_data,
    multi_cell_design_config,
    multi_cell_constraints,
)

# Generates the candidate multi-cell designs.
print(f'Experiment design generated:')
multi_cell_selected_design_id = next(iter(multi_cell_design_set.designs))
pprint(multi_cell_design_set.designs[multi_cell_selected_design_id])