Configurer votre conception préférée

Ce document vous explique, étape par étape, comment configurer votre test à l'aide de la bibliothèque Meridian GeoX. Découvrez comment préparer vos données, définir les paramètres clés du test, utiliser des configurations avancées, évaluer la viabilité de la conception, et visualiser et exporter la conception choisie.

Récapitulatif et préparation des données

Pour commencer, importez la bibliothèque Meridian GeoX et préparez l'ensemble de données de prétest. Comme expliqué dans la section Collecter et préparer vos données, cet ensemble de données constitue un prérequis pour la conception de votre étude GeoX.

Votre ensemble de données doit être un DataFrame Pandas, et les colonnes requises sont les suivantes :

  • date : par exemple, tous les jours
  • location : par exemple, différentes zones de marché
  • conversions : les données de réponse correspondent généralement à des nombres bruts de conversions ou à des données sur les revenus, et proviennent le plus souvent du CRM d'un annonceur.
  • spend : données sur les dépenses pour les campagnes incluses dans l'étude. Cette colonne est facultative. Pour les configurations de tests multicellulaires, utilisez des libellés de colonne distincts, tels que spend_cell_1 ou spend_cell_2.

1. Conception de tests

Il s'agit de l'interaction principale au cours de laquelle vous définissez les paramètres du test à venir. Pour illustrer ce processus étape par étape, nous pouvons utiliser l'exemple d'une conception de test de type heavy-up sur 28 jours utilisant une régression temporelle (TBR) et un échantillonnage stratifié.

  • DesignConfig : permet de définir les bases des tests :
    • experiment_duration : durée du test, hors périodes de stabilisation. En règle générale, la durée couvre au moins un cycle d'achat du produit.
    • cell_count : nombre de cellules de traitement dans le test. La valeur par défaut est 1, ce qui signifie qu'un groupe de traitement est associé à un groupe de contrôle dans le test. Si la valeur est supérieure à 1, concevez une étude multicellulaire contenant plusieurs cellules de traitement.
    • experiment_types : définit la nature du test, par exemple "holdback", "go-dark" ou "heavy-up". Pour en savoir plus, consultez Types de tests. Dans les tests multicellulaires, vous pouvez définir un type de test différent pour chaque cellule. Par exemple, {'cell_1': ExperimentType.GO_DARK, 'cell_2': ExperimentType.HEAVY_UP} indique que vous exécutez un test go-dark dans une cellule de traitement et un test heavy-up dans une autre. Cette configuration est très courante dans les tests multicellulaires sans incidence sur le budget.
    • methodology : méthode d'analyse choisie pour la sélection de la conception, telle que la régression temporelle, le contrôle synthétique ou la méthode des doubles différences synthétiques.
    • geo_assignment_rule : l'échantillonnage aléatoire et l'échantillonnage stratifié sont tous deux acceptés.
    • design_output_count : nombre total de conceptions recommandées classées à inclure dans le résultat.

Pour en savoir plus sur les options de méthodologie et de règles d'attribution, consultez Comparer les méthodologies.

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 : permet de spécifier des budgets maximaux et d'autres contraintes liées à la conception. Cas d'utilisation plus avancés, tels que l'inclusion ou l'exclusion de zones géographiques spécifiques, ou la définition de seuils de conversion. Voici une configuration de contraintes de base qui inclut uniquement des budgets maximaux. Les contraintes plus avancées sont abordées dans la section suivante.
# Limit the max experiment budget to be 100000.
constraints = geox.Constraints(
    budget_constraint=geox.Budget(budget=100000)
)
  • geox.run_design() : fonction principale qui utilise l'ensemble de données de prétest, les configurations et les contraintes pour générer un ensemble de conceptions de test potentielles, classées par 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 propose également des paramètres permettant d'affiner la conception. Il n'est toutefois pas nécessaire de les renseigner, car ils disposent de valeurs par défaut :

  • alpha (facultatif) : niveau de signification du test. La valeur par défaut est 0,10 ou 10 %. Cela signifie également que la probabilité de couverture attendue de l'intervalle de confiance est de 1 - alpha = 90 %.
  • power (facultatif) : probabilité de détecter un effet réel. La valeur par défaut est de 80 %.
  • cost_per_incremental_conversion (CpIC, facultatif) : utilisé uniquement dans les tests de type holdback. Dans les tests de ce type, le CpIC permet d'estimer le budget minimal, c'est-à-dire le montant à dépenser pour les campagnes nouvellement activées. La valeur par défaut est 1, mais il est plus pratique d'estimer votre CpIC à l'aide de la formule 1/iCPD (ou 1/ROAS incrémental), où l'estimation de l'iCPD (ou du ROAS incrémental) provient d'un modèle MMM Meridian existant ou d'une étude d'incrémentalité antérieure, comme GeoX ou le conversion lift de Google. Comme le CpIC n'est utile que dans les tests de type holdback, il n'est pas pris en compte dans les tests (ou cellules) go-dark et heavy-up. Ceux-ci évaluent les campagnes déjà actives, et le budget du test est estimé à l'aide de données historiques sur les dépenses.
  • min_r2 (facultatif) : seuil minimal du score de coefficient de détermination hors échantillon (qualité de l'adéquation) requis pour les conceptions candidates pendant la phase de conception. La valeur par défaut est définie sur 0,8 (80 %), ce qui exclut les conceptions candidates dont l'ajustement du modèle de prétest est inférieur à ce seuil.

2. Configurations de conception supplémentaires via des contraintes

Dans cette section, vous allez apprendre à configurer la conception de manière flexible en transmettant davantage de contraintes de conception, en plus de spécifier seulement un budget maximal, comme indiqué dans la section précédente. Toutes ces contraintes sont facultatives. Voici un exemple d'ajout de quelques contraintes à la conception.

  • excluded_geos : zones géographiques à exclure de la conception du test. En général, il s'agit de grandes agglomérations que vous ne souhaitez pas inclure dans une étude Meridian GeoX, car cela pourrait perturber considérablement la diffusion publicitaire.
  • excluded_dates : dates à exclure de la conception du test.
  • budget_percent : variation maximale, en pourcentage, du budget pour la conception du test. Cette option ne peut être utilisée que si les données sur les dépenses sont fournies par cellule.
  • budget_constraint : contrainte budgétaire pour la conception du test (par cellule). Il peut s'agir d'un montant total du budget ou d'une variation en pourcentage.
  • max_conversions_percent : volume maximal de conversions pour le groupe de traitement. La valeur par défaut est définie sur 30 %, car une étude GeoX standard ne devrait pas affecter plus de 30 % de vos médias.
# 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. Évaluation, visualisation et exportation

Après l'exécution de geox.run_design(), le résultat contient une liste de conceptions candidates. Vous pouvez évaluer ces conceptions en examinant les métriques clés du tableau récapitulatif, comme le coefficient de détermination (\( R^2 \)), l'effet minimal détectable (MDE) et la valeur p du test A/A. Toutes les conceptions candidates du tableau récapitulatif sont classées par ordre croissant de MDE.

design_id cell design_methodology r2 mde mde_abs p_value (AA) budget 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

Évaluer la viabilité de la conception

Pour sélectionner une conception appropriée à utiliser dans votre parcours Meridian GeoX, évaluez les propositions selon les critères suivants :

  1. Seuil du coefficient de détermination (\( R^2 \)) : il est recommandé de sélectionner une conception avec\( R^2 \ge 0.8 \) . Un \( R^2 < 0.5 \) indique que les zones géographiques de contrôle ne permettent pas de prédire correctement les zones géographiques de traitement, ce qui, dans certains cas, peut compromettre la fiabilité de l'analyse post-test.

  2. Validation du test A/A : assurez-vous que la conception sélectionnée réussit le test A/A. La valeur p de votre test A/A doit être supérieure au seuil de signification choisi (\( \alpha \)) pour garantir l'absence de biais préexistant significatif. De plus, si un pourcentage élevé de conceptions candidates échoue au test A/A, cela indique généralement une mauvaise qualité des données de prétest (par exemple, des données aberrantes extrêmes, des changements soudains dans les zones géographiques ou une forte volatilité) ou un mauvais ajustement du modèle. Exécuter un test avec de telles données rend l'analyse post-test peu fiable en raison d'un risque élevé de fausses découvertes (détection d'un lift inexistant).

Ajustement du coefficient de détermination

La valeur minimale requise \( R^2 \) est contrôlée par le paramètre min_r2 dans geox.DesignConfig. Par défaut, la valeur \( R^2 \) minimale requise est de 0,8. Si la recherche de conceptions ne renvoie aucun candidat viable avec une valeur de 0,8, vous pouvez assouplir ce seuil, en l'abaissant par exemple à 0,75 ou 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
)

Résoudre les problèmes liés aux tests A/A

  1. Recherchez d'éventuelles anomalies de données : examinez vos données de prétest pour repérer les erreurs de saisie, les jours manquants ou les pics ponctuels extrêmes dans des zones géographiques spécifiques. Excluez ces dates et zones géographiques anormales à l'aide de Constraints(excluded_dates=...excluded_geos=...).

  2. Augmentez l'historique de prétest : fournissez un historique de prétest plus long (par exemple, en passant de \( 3N \) à \( 6N \) ou plus) afin de donner au modèle davantage de données pour apprendre des relations stables.

  3. Faisabilité du MDE : comparez le MDE de la conception à vos attentes commerciales. Le MDE correspond au lift minimal que le test peut détecter. Si vous prévoyez que votre campagne ne générera qu'un lift de 5 %, mais que la conception choisie présente un MDE de 12 %, la puissance statistique de l'étude est insuffisante. Avant de poursuivre, vous devriez augmenter la taille du groupe de traitement ou la durée.

Visualiser la conception

Utilisez geox.plot_design() pour générer des représentations visuelles du traitement et du scénario contrefactuel.

Exemple de comparaison entre le total des données des conversions observées et celui des conversions du scénario contrefactuel

Exporter la conception

Pour terminer, vous pouvez exporter la conception choisie au format JSON à l'aide de .export_to_json() et la recharger ultérieurement avec .load_from_json() afin d'assurer la cohérence entre les phases de conception et d'analyse.

4. Conception multicellulaire

Notez que Meridian GeoX est compatible de manière native avec différents tests multicellulaires. Par exemple, une option courante, appelée "test sans incidence sur le budget", vous permet de tester simultanément les effets d'une réduction du budget (go-dark) et d'une augmentation du budget (heavy-up) sur un même marché, sans modifier le budget total alloué à l'ensemble des zones géographiques. Pour concevoir un test sans incidence sur le budget, vous pouvez définir cell_count sur 2, puis attribuer les types de tests GO_DARK et HEAVY_UP aux deux cellules de traitement.

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,
)

Une fois les contraintes configurées pour le test multicellulaire, la fonction geox.run_design() devrait renvoyer les conceptions multicellulaires demandées. Comme dans le scénario à cellule unique, les conceptions candidates peuvent être récupérées en conséquence.

# 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])