Définir des a priori de ROI personnalisés à l'aide d'anciens tests

Meridian propose une calibration automatique des a priori en s'appuyant sur les tests précédents avec CalibrationBuilder pour automatiser la conversion des résultats des tests d'incrémentalité en a priori de ROI pour les canaux média payants et de couverture et fréquence. Le compilateur accepte les résultats de n'importe quelle source de test, avec une intégration directe pour Meridian GeoX afin de simplifier le workflow.

La calibration nécessite de définir un a priori Meridian, et les résultats des tests d'incrémentalité constituent un excellent moyen d'étayer cette intuition. Cependant, les MMM et les tests diffèrent sur des points importants, en particulier leur portée, leur calendrier et leur durée. Pour vous aider à combler cet écart, CalibrationBuilder est conçu pour prendre automatiquement en compte ces différences et traduire les résultats de votre test en a priori robustes.

CalibrationBuilder résout ces différences en appliquant automatiquement des ajustements aux résultats du test avant de les fusionner en une distribution a priori unique, calibrée par canal.

Le workflow se compose des étapes suivantes :

  1. Enregistrement des tests : l'utilisateur ajoute des résultats de tests génériques ou Meridian GeoX à un canal.
  2. Application des ajustements : CalibrationBuilder calcule et applique les ajustements de dépenses, de récence et de durée.
  3. Fusion des distributions : CalibrationBuilder utilise la mise à jour bayésienne pour combiner les distributions ajustées de tous les tests enregistrés.
  4. Ajustement des distributions paramétriques : CalibrationBuilder ajuste une famille de distributions paramétriques (LogNormal, Gamma ou Normal) à la distribution a posteriori pour produire les distributions a priori roi_m et roi_rf finales.

Étape 1 : Enregistrez les tests

Vous pouvez enregistrer des tests à l'aide de l'API Python CalibrationBuilder. Le compilateur accepte deux types de sources de test :

  • Tests Meridian GeoX : enregistrés à l'aide de with_meridian_geox_experiment_result. Accepte directement l'objet AnalysisResult de l'outil GeoX de Google. CalibrationBuilder extrait automatiquement l'estimation ponctuelle, l'erreur standard, les dépenses et les dates du test à partir de AnalysisResult pour calculer les ajustements.
  • Tests génériques : enregistrés à l'aide de with_incrementality_experiment_result. Utile pour les tests non GeoX où vous spécifiez manuellement l'estimation ponctuelle, l'erreur standard, les dépenses et les dates.

Pour obtenir des tutoriels de code interactifs complets, consultez la démonstration de la calibration des a priori.

Étape 2 : Appliquez les ajustements de calibration

Un test et un MMM ont des objectifs et des conditions de mesure différents. Pour combler cet écart, Meridian ajuste l'estimation ponctuelle du test (en la mettant à l'échelle par un facteur \(\gamma\)) et augmente l'erreur standard (en ajustant la variance par un facteur \(\tau\)) pour refléter l'incertitude supplémentaire liée à la conversion du test en MMM.

La moyenne ajustée (\(\mu_{adj}\)) et l'écart-type ajusté (\(\sigma_{adj}\)) pour un seul test sont calculés comme suit :

$$ \mu_{adj} = (\gamma_{duration} + \gamma_{user}) \cdot \mu_{exp} $$
$$ \sigma_{adj} = \sigma_{exp} \cdot \sqrt{1.0 + \tau_{spend} + \tau_{recency} + \tau_{duration} + \tau_{user} } $$

Où :

  • \(\mu_{exp}\) est l'estimation ponctuelle du test.
  • \(\sigma_{exp}\) est l'erreur standard du test.
  • \(\gamma_{duration}\) est le facteur de scaling de la durée (calculé automatiquement ; la référence est \(1.0\) lorsque le test capture 100 % de l'effet adstock).
  • \(\gamma_{user}\) est un ajustement facultatif de l'estimation ponctuelle spécifié par l'utilisateur (la valeur par défaut est \(0\)).
  • \(\tau_{spend}\), \(\tau_{recency}\)et \(\tau_{duration}\) sont les ajustements de variance pour les dépenses, la récence et la durée, respectivement (calculés automatiquement ; la référence est \(0.0\) lorsqu'aucun ajustement n'est nécessaire).
  • \(\tau_{user}\) est un ajustement d'erreur standard facultatif spécifié par l'utilisateur (la valeur par défaut est \(0\)).

Automatisation et valeurs par défaut

Alors que \(\gamma_{user}\) et \(\tau_{user}\) permettent un réglage manuel et sont définis par défaut sur \(0\), les autres ajustements (\(\tau_{spend}\), \(\tau_{recency}\),\(\tau_{duration}\)et \(\gamma_{duration}\)) sont calculés automatiquement par CalibrationBuilder :

  • Tests Meridian GeoX : le calcul de l'ajustement est entièrement automatisé. CalibrationBuilder extrait directement \(\mu_{exp}\) et\(\sigma_{exp}\) des métriques GeoX icpd (metrics.icpd.point_estimate et metrics.icpd.standard_deviation), les dépenses du test de estimated_bau_spend (metrics.descriptive_metrics.estimated_bau_spend), ainsi que les dates de début et de fin de analysis_config (analysis_config.analysis_start_date et analysis_config.analysis_end_date). Les tests de KPI non liés aux revenus sont automatiquement convertis à l'échelle des revenus à l'aide du revenue_per_kpi du modèle. Vous n'avez pas besoin de fournir manuellement les paramètres de dépenses, de durée ou de date.
  • Tests génériques : CalibrationBuilder calcule les ajustements à l'aide des mêmes formules, à partir des arguments de dépenses, et des arguments de date de début et de date de fin que vous fournissez dans with_incrementality_experiment_result.
  • Valeurs par défaut du modèle : les calculs de durée utilisent les paramètres de décroissance CalibrationBuilder, qui sont définis par défaut sur adstock_decay_spec='geometric', alpha=0.5 et max_lag=8 (correspondant aux valeurs par défaut de ModelSpec). Les calculs de récence utilisent une demi-vie fixe de 52 semaines (un an).

Ajustement des dépenses

L'ajustement des dépenses (\(\tau_{spend}\)) tient compte des différences d'échelle et d'intensité des dépenses. Un test ne couvre généralement qu'une fraction des dépenses totales observées dans la fenêtre MMM. Pour comparer l'échelle des dépenses indépendamment de la durée du test, Meridian compare les dépenses quotidiennes moyennes du test avec celles du canal sur la période modélisée.

Pour les tests Meridian GeoX, les dépenses liées aux tests sont extraites automatiquement de estimated_bau_spend dans l'objet AnalysisResult de GeoX (sous metrics.descriptive_metrics.estimated_bau_spend).

L'ajustement des dépenses est calculé comme suit :

$$ \tau_{spend} = \frac{1.0 - r}{r} $$

Où \(r\) correspond au ratio de dépenses comparant les taux de dépenses quotidiens moyens :

$$ r = \frac{ \min(\text{experiment_avg_daily_spend}, \text{channel_avg_daily_spend}) }{ \max(\text{experiment_avg_daily_spend}, \text{channel_avg_daily_spend}) } $$

Où :

  • \[\text{experiment_avg_daily_spend} = \frac{\text{experiment_total_spend}}{\text{experiment_duration_days}}\]
  • \[\text{channel_avg_daily_spend} = \frac{\text{total_channel_spend}}{\text{model_duration_days}}\]

  • Si le taux de dépenses quotidiennes du test correspond au taux de dépenses quotidiennes du canal (\(r = 1.0\)), alors \(\tau_{spend} = 0.0\) (aucune incertitude supplémentaire).

  • À mesure que le taux de dépenses du test devient une fraction plus petite (ou plus grande) du taux de dépenses du canal (\(r \rightarrow 0\)), \(\tau_{spend}\) augmente, ce qui élargit la distribution a priori.

  • Le ratio de dépenses \(r\) tient également compte des différences de précision des médias. Par exemple, si vous effectuez un test au niveau de la campagne, mais que vous modélisez au niveau du canal dans le MMM, le taux de dépenses du test sera comparé au taux de dépenses total du canal. Si la campagne représente une grande partie de l'activité du canal, elle sera plus représentative de celui-ci, et l'incertitude sera moindre lors de l'interprétation des résultats. À l'inverse, s'il s'agit d'une petite campagne, l'ajustement sera plus important pour refléter l'incertitude liée à l'extension du lift de cette campagne à l'ensemble du canal.

Ajustement de la récence

L'ajustement de la récence privilégie les tests les plus récents, car ils peuvent être plus précis pour modéliser des résultats incrémentaux actualisés. Plus la date du test est ancienne par rapport à la fin de la période de modélisation du MMM, moins ses résultats sont susceptibles de refléter la réalité commerciale actuelle.

Pour les tests Meridian GeoX, la date de fin du test est extraite automatiquement de analysis_config.analysis_end_date dans l'objet AnalysisResult de GeoX.

L'ajustement de la récence est calculé à l'aide d'une décroissance exponentielle avec une demi-vie de 52 semaines (un an) :

$$ \lambda = 0.5^{w / 52.0} $$
$$ \tau_{recency} = \frac{1.0 - \lambda}{\lambda} $$

Où \(w\) est le nombre de semaines écoulées entre la date de fin du test et la dernière date modélisée dans le MMM.

  • Si le test s'est terminé à la dernière date modélisée (\(w = 0\)), alors \(\lambda = 1.0\) et \(\tau_{recency} = 0.0\).
  • Pour les tests plus anciens, \(\lambda\) diminue, ce qui entraîne une augmentation de \(\tau_{recency}\) et ajoute de l'incertitude.
  • Si la dernière date modélisée est antérieure au test, aucun ajustement n'est appliqué (\(\tau_{recency} = 0.0\)).

Ajustement de la durée

L'ajustement de la durée (\(\gamma_{duration}\) et \(\tau_{duration}\)) tient compte de la différence entre la durée du test (\(D\), en semaines) et la fenêtre de décalage maximale du modèle (\(L\), en semaines).

Pour les tests Meridian GeoX, la durée du test (\(D\)) est calculée automatiquement à partir de analysis_config.analysis_start_date et analysis_config.analysis_end_date dans l'objet AnalysisResult de GeoX.

Étant donné que les effets marketing se prolongent dans le temps (modélisés par la décroissance de l'adstock), un test de courte durée peut ne pas refléter l'effet complet à long terme des dépenses média. À l'inverse, si le test est très long, il peut capturer des effets au-delà de la fenêtre de décalage tronquée du modèle.

Meridian calcule la proportion de capture (\(p\)), qui correspond à la proportion de l'ensemble des pondérations de décroissance de l'adstock capturées pendant les semaines actives du test.

Soit \(w_s\) les pondérations de décroissance calculées à l'aide de la fonction de décroissance de l'adstock (géométrique ou binomiale) avec un taux de décroissance \(\alpha\) sur la fenêtre du modèle \(L + 1\) (configurée sur CalibrationBuilder, avec par défaut adstock_decay_spec='geometric', alpha=0.5 et max_lag=8) :

  • Si la durée du test est inférieure ou égale à la fenêtre du modèle (\(D \le L + 1\)) :
    • Décroissance binomiale et géométrique : la proportion de capture \(p\) est la somme des pondérations de décroissance normalisées jusqu'à \(D\) :
$$ p = \frac{\sum_{s=0}^{D-1} w_s}{\sum_{s=0}^{L} w_s} $$
  • Si la durée du test est supérieure à la fenêtre du modèle (\(D > L + 1\)) :
    • Décroissance binomiale : les pondérations binomiales diminuent jusqu'à zéro dans la période d'analyse, de sorte que le test capture tous les effets possibles : \(p = 1.0\)
    • Décroissance géométrique : les pondérations géométriques diminuent à l'infini. Le numérateur inclut donc la fin de la série géométrique jusqu'à \(D - 1\) :
$$ p = \frac{\sum_{s=0}^{L} w_s + \sum_{s=L+1}^{D-1} \alpha^s}{\sum_{s=0}^{L} w_s} $$

La proportion de capture \(p\) est limitée à une valeur minimale de \(10^{-6}\) et à une valeur maximale de \(1.0\) (pour la décroissance binomiale).

En utilisant \(p\), les ajustements de durée sont les suivants :

  • Facteur de scaling de l'estimation ponctuelle :
$$ \gamma_{duration} = \frac{1.0}{p} $$

Si le test est plus court que la fenêtre du modèle (\(p < 1.0\)), l'estimation ponctuelle est augmentée (\(\gamma_{duration} > 1.0\)) pour estimer l'effet complet à long terme. Si le test est plus long (\(p > 1.0\) pour la décroissance géométrique), l'estimation ponctuelle est réduite (\(\gamma_{duration} < 1.0\)).

  • Ajustement de l'erreur standard :
$$ \tau_{duration} = \max\left(\frac{1.0 - p}{p}, 0.0\right) $$

Si le test est plus court (\(p < 1.0\)), de l'incertitude est ajoutée (\(\tau_{duration} > 0.0\)), car la fin non observée de l'effet est extrapolée. Si le test est plus long ou égal (\(p \ge 1.0\)), aucune incertitude supplémentaire n'est ajoutée (\(\tau_{duration} = 0.0\)).


Étape 3 : Fusionnez les tests

Si vous enregistrez plusieurs tests pour un même canal, Meridian les combine (avec un baseline_prior facultatif) par le biais d'une mise à jour bayésienne.

Selon le théorème de Bayes, la densité a posteriori du ROI du canal est proportionnelle au produit de l'a priori de référence et des probabilités de tous les tests indépendants :

$$ p(\text{ROI} \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) \propto \pi(\text{ROI}) \prod_{i=1}^N L_i(\text{ROI}; \mu_{adj,i}, \sigma_{adj,i}) $$

Où la fonction de vraisemblance pour chaque test \(i\) est :

$$ L_i(\text{ROI}; \mu_{adj,i}, \sigma_{adj,i}) = \frac{1}{\sqrt{2\pi}\sigma_{adj,i}} \exp\left(-\frac{(\mu_{adj,i} - \text{ROI})^2}{2\sigma_{adj,i}^2} \right) $$

Notez que cette définition du produit peut être considérée comme un modèle bayésien à part entière. Sur le plan mathématique, chaque test ajusté est traité comme une observation bruitée du ROI réel du canal. Le modèle est formulé comme suit :

$$ \begin{align*} \mu_{adj,i} &\sim \text{Normal}(\text{ROI}, \sigma_{adj,i}^2) \quad \text{for each experiment } i \\ \text{ROI} &\sim \pi(\cdot) \end{align*} $$

Où :

  • \(\mu_{adj,i}\) est l'estimation ponctuelle ajustée pour le test \(i\).
  • \(\sigma_{adj,i}\) est l'erreur standard ajustée pour le test \(i\).
  • \(\text{ROI}\) est le paramètre de ROI réel et inconnu à estimer pour le canal.
  • \(\pi(\cdot)\) est la distribution baseline_prior. Si aucun a priori de référence n'est spécifié, un a priori uniforme plat impropre sur les nombres réels positifs est utilisé (\(\pi(\text{ROI}) \propto 1\) pour \(\text{ROI} > 0\)).
  • \(N\) est le nombre de tests enregistrés.

Le compilateur évalue numériquement cette densité a posteriori sur une grille de paramètres adaptative pour trouver la distribution combinée. Pour en savoir plus, consultez l'annexe technique.

Étape 4 : Ajustez et créez l'a priori calibré

Pour finir, Meridian ajuste une famille de distributions paramétriques standards (LogNormal, Gamma ou Normal) à la distribution a posteriori numérique calculée à l'étape 3. Les familles de distributions candidates sont choisies en fonction de baseline_prior : LogNormal et Gamma sont toujours pris en compte, tandis que Normal est évalué lorsque l'a priori de référence autorise un support négatif. La forme de distribution la plus adaptée est choisie en minimisant la perte d'entropie croisée (équivalente à la minimisation de la divergence KL) par rapport à la distribution a posteriori numérique.

Une fois la distribution a priori optimale trouvée pour chaque canal calibré, CalibrationBuilder les encapsule. Pour les canaux qui n'ont pas été calibrés, CalibrationBuilder attribue l'a priori personnalisé fourni dans custom_prior. L'a priori de ROI par défaut de \(\text{LogNormal}(0.2, 0.9)\) n'est utilisé que si aucun a priori personnalisé n'est fourni pour ce canal.

Le résultat final de build() est une classe de données CalibratedPriors contenant les éléments suivants :

  • priors.roi_m : CalibratedDistribution (sous-classe de IndependentMultivariateDistribution) représentant l'a priori calibré pour les canaux média payants.
  • priors.roi_rf : CalibratedDistribution (sous-classe de IndependentMultivariateDistribution) représentant l'a priori calibré pour les canaux de couverture et de fréquence.

Ces distributions calibrées sont transmises à PriorDistribution, puis à ModelSpec pour initialiser le modèle Meridian.


Annexe technique

Cette section présente les formulations mathématiques et les détails algorithmiques qui sous-tendent le calcul de l'a posteriori numérique et l'ajustement de la distribution de CalibrationBuilder.

Formulation de la distribution a posteriori

Pour un canal donné, soit \(\theta\) le ROI réel du canal. Observez\(N\)  résultats de test ajustés indépendants. Pour chaque test \(i \in \{1, \ldots, N\}\), il existe une estimation ponctuelle ajustée \(\mu_{adj,i}\) et une erreur standard ajustée \(\sigma_{adj,i}\).

Supposons que chaque estimation ponctuelle ajustée soit une observation distribuée normalement autour du ROI réel :

$$ \mu_{adj,i} \mid \theta \sim \text{Normal}(\theta, \sigma_{adj,i}^2) $$

La fonction de vraisemblance pour le \(i\)e test est la suivante :

$$ L_i(\theta; \mu_{adj,i}, \sigma_{adj,i}) = \frac{1}{\sqrt{2\pi}\sigma_{adj,i}} \exp\left(-\frac{(\mu_{adj,i} - \theta)^2}{2\sigma_{adj,i}^2} \right) $$

Si une distribution baseline_prior est fournie, indiquez sa fonction de densité de probabilité sous la forme\(\pi(\theta)\). Si aucun a priori de référence n'est fourni, utilisez un a priori uniforme plat impropre sur les valeurs positives, \(\pi(\theta) \propto I_{\{\theta > 0\}}\), où\(I\) est la fonction d'indicateur.

Selon le théorème de Bayes, la densité a posteriori du ROI du canal, \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\), est proportionnelle au produit de l'a priori et des probabilités de tous les tests indépendants :

$$ p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) \propto \pi(\theta) \prod_{i=1}^N L_i(\theta; \mu_{adj,i}, \sigma_{adj,i}) $$

Intégration numérique basée sur une grille

Étant donné que la distribution a posteriori \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\) peut ne pas avoir de forme analytique standard (par exemple, lors de l'utilisation d'a priori de référence non normaux comme LogNormal ou Gamma), Meridian l'évalue numériquement sur une grille.

  1. Passe de repérage : Meridian effectue d'abord une passe de "repérage" pour identifier la région à forte densité de probabilité. Il définit une grille large centrée autour de la moyenne empirique des distributions et trouve la plage contenant\(99.8\%\) de la probabilité cumulée (du \(0.1\)e centile au \(99.9\)e centile).
  2. Évaluation sur grille fine : Meridian construit ensuite une grille fine de 10 000 points équidistants sur cette plage résolue \([\theta_{\text{min}}, \theta_{\text{max}}]\) et évalue la densité a posteriori non normalisée à chaque point.
  3. Normalisation : la densité est normalisée à l'aide de l'intégration de la somme de Riemann :

    $$ p(\theta_j \mid \{\mu_{adj,i}, \sigma_{adj,i}\}) = \frac{u(\theta_j)}{\sum_k u(\theta_k)\Delta\theta} $$

    Où \(u(\theta)\) est la densité a posteriori non normalisée, \(\theta_j\) est le \(j\)e point de la grille et \(\Delta\theta\) est la taille de pas.

Ajustement de la distribution

Une fois la fonction de densité (PDF) a posteriori numérique calculée sur la grille, Meridian ajuste une distribution paramétrique \(q(\theta; \phi)\) (où \(\phi\) représente les paramètres de distribution) pour estimer la distribution a posteriori.

Meridian détermine les familles de distributions candidates en fonction de la compatibilité de l'a priori de référence :

  • Support non négatif (par défaut) : si aucun a priori de référence n'est fourni (traité par défaut comme un support non négatif) ou si l'a priori de référence limite le support aux valeurs non négatives (comme LogNormal ou Gamma), Meridian prend en compte les familles de distribution LogNormal (\((0, \infty)\)) et Gamma (\((0, \infty)\)), mais pas la distribution Normal.
  • Support négatif : si l'a priori de référence attribue une densité de probabilité finie aux valeurs négatives (comme Normal), Meridian prend en compte la distribution Normal (définie sur \((-\infty, \infty)\)) et également les distributions LogNormal et Gamma.

Pour chaque famille candidate, Meridian détermine les paramètres \(\phi\) qui minimisent la perte d'entropie croisée entre la distribution a posteriori numérique \(p(\theta)\) et la distribution candidate \(q(\theta; \phi)\) :

$$ \text{Loss}(\phi) = -\sum_j p(\theta_j) \log q(\theta_j; \phi) \cdot \Delta\theta $$

Minimiser cette perte équivaut mathématiquement à minimiser la divergence de Kullback-Leibler \(D_{KL}(p \parallel q)\) de l'approximation\(q\) par rapport à la vraie distribution a posteriori numérique \(p\).

Meridian utilise l'algorithme d'optimisation L-BFGS-B pour déterminer les paramètres optimaux. La famille de distributions qui obtient la perte la plus faible est sélectionnée comme a priori calibré final pour le canal.