Definir distribuições a priori personalizadas de ROI usando experimentos anteriores

O Meridian oferece calibragem automatizada dessas distribuições usando experimentos anteriores com CalibrationBuilder para automatizar a tradução dos resultados de experimentos de incrementalidade em distribuições a priori de ROI para mídia paga e canais de alcance e frequência. A ferramenta aceita resultados de qualquer fonte de experimento, com integração direta com o Meridian GeoX para simplificar o fluxo de trabalho.

A calibragem exige a definição de uma distribuição a priori do Meridian, e os resultados de experimentos de incrementalidade são uma ótima maneira de justificar suas suposições. No entanto, as MMMs e os experimentos diferem em aspectos importantes, especificamente no escopo, no prazo e na duração. Para ajudar você a alinhar os dados, o CalibrationBuilder foi projetado para considerar automaticamente essas diferenças, transformando os resultados do experimento em distribuições a priori robustas.

O CalibrationBuilder resolve essas diferenças aplicando automaticamente ajustes aos resultados do experimento antes de mesclá-los em uma única distribuição a priori calibrada por canal.

Este é o fluxo de trabalho:

  1. Registro de experimentos: o usuário adiciona os resultados de experimentos genéricos ou do Meridian GeoX a um canal.
  2. Aplicação de ajustes: o CalibrationBuilder calcula e aplica ajustes de gasto, tempo para retorno e duração.
  3. Mesclagem de distribuições: o CalibrationBuilder combina as distribuições ajustadas de todos os experimentos registrados usando a atualização bayesiana.
  4. Ajuste de distribuições paramétricas: o CalibrationBuilder ajusta uma família de distribuições paramétricas (log-normal, gama ou normal) à distribuição a posteriori para produzir as distribuições a priori finais de roi_m e roi_rf.

Etapa 1: registrar experimentos

É possível registrar experimentos usando a API Python CalibrationBuilder. O builder é compatível com dois tipos de fontes:

  • Experimentos do Meridian GeoX: registrados usando with_meridian_geox_experiment_result. Aceita diretamente o objeto AnalysisResult da ferramenta GeoX do Google. O CalibrationBuilder extrai automaticamente a estimativa pontual, o erro padrão, os gastos e as datas do experimento de AnalysisResult para calcular os ajustes.
  • Experimentos genéricos: registrados usando with_incrementality_experiment_result. Útil para experimentos que não são GeoX, em que você especifica manualmente a estimativa pontual, o erro padrão, o gasto e as datas.

Para tutoriais interativos completos de código, confira a demonstração de calibragem de distribuições a priori.

Etapa 2: aplicar ajustes de calibragem

Um experimento e uma MMM têm metas e condições de medição diferentes. Para alinhar esses dados, o Meridian ajusta a estimativa pontual do experimento (dimensionando-a por um fator \(\gamma\)) e aumenta o erro padrão (ajustando a variância por um fator \(\tau\)) para refletir a incerteza adicional de converter o experimento para a MMM.

A média ajustada (\(\mu_{adj}\)) e o desvio padrão (\(\sigma_{adj}\)) de um único experimento são calculados da seguinte forma:

$$ \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} } $$

Em que:

  • \(\mu_{exp}\) é a estimativa pontual do experimento.
  • \(\sigma_{exp}\) é o erro padrão do experimento.
  • \(\gamma_{duration}\) é o fator de escalonamento da duração (calculado automaticamente; o valor de referência é \(1.0\) quando o experimento captura 100% do efeito de Adstock).
  • \(\gamma_{user}\) é um ajuste opcional de estimativa pontual especificado pelo usuário (o padrão é \(0\)).
  • \(\tau_{spend}\), \(\tau_{recency}\)e \(\tau_{duration}\) são os ajustes de variância para gasto, tempo para retorno e duração, respectivamente (calculados de forma automática; o valor de referência é \(0.0\) quando nenhum ajuste é necessário).
  • \(\tau_{user}\) é um ajuste de erro padrão opcional especificado pelo usuário (o padrão é \(0\)).

Automação e padrões

Enquanto \(\gamma_{user}\) e \(\tau_{user}\) permitem o ajuste manual e usam \(0\)como padrão, os outros (\(\tau_{spend}\), \(\tau_{recency}\),\(\tau_{duration}\)e \(\gamma_{duration}\)) são calculados automaticamente peloCalibrationBuilder:

  • Experimentos do Meridian GeoX: o cálculo do ajuste é totalmente automatizado. O CalibrationBuilder extrai diretamente \(\mu_{exp}\) e\(\sigma_{exp}\) das métricas icpd do GeoX (metrics.icpd.point_estimate e metrics.icpd.standard_deviation), o gasto do experimento de estimated_bau_spend (metrics.descriptive_metrics.estimated_bau_spend) e as datas de início e término de analysis_config (analysis_config.analysis_start_date e analysis_config.analysis_end_date). Os experimentos de KPI que não são de receita são convertidos automaticamente para a escala de receita usando o revenue_per_kpi do modelo. Não é necessário informar manualmente os parâmetros de gasto, duração ou data.
  • Experimentos genéricos: o CalibrationBuilder calcula os ajustes usando as mesmas fórmulas dos argumentos de gasto, data de início e data de término que você fornece em with_incrementality_experiment_result.
  • Padrões do modelo: os cálculos de duração usam os parâmetros de decaimento do CalibrationBuilder, que têm como padrão adstock_decay_spec='geometric', alpha=0.5 e max_lag=8 (correspondendo aos padrões de ModelSpec). Os cálculos de tempo para retorno usam uma meia-vida fixa de 52 semanas (1 ano).

Ajuste de gastos

O ajuste de gastos (\(\tau_{spend}\)) considera as diferenças na escala e na intensidade do gasto. Um experimento geralmente abrange apenas uma fração do gasto total observado na janela da MMM. Para comparar a escala de gastos de maneira independente da duração do experimento, o Meridian compara o gasto diário médio do experimento com o gasto diário médio do canal no período modelado.

Para experimentos do Meridian GeoX, o gasto é extraído automaticamente de estimated_bau_spend no AnalysisResult do GeoX (em metrics.descriptive_metrics.estimated_bau_spend).

O ajuste de gasto é calculado da seguinte forma:

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

Em que \(r\) é a proporção que compara as taxas de gasto diário médio:

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

Em que:

  • \[\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}}\]

  • Se a taxa de gasto diário do experimento corresponder à do canal (\(r = 1.0\)), então \(\tau_{spend} = 0.0\) (sem incerteza adicional).

  • À medida que a taxa de gastos do experimento se torna uma fração menor (ou maior) da taxa de gastos do canal (\(r \rightarrow 0\)), o \(\tau_{spend}\) aumenta, o que amplia a distribuição a priori.

  • A proporção de gastos \(r\) também considera as diferenças na granularidade da mídia. Por exemplo, se você fizer um experimento no nível da campanha, mas modelar no nível do canal na MMM, a taxa de gasto do experimento será comparada com a taxa de gasto total do canal. Se a campanha representar uma grande parte da atividade do canal, ela será mais representativa, e haverá menos incerteza ao traduzir os resultados. Por outro lado, se for uma campanha pequena, o ajuste será maior para refletir a incerteza de dimensionar o Lift dessa campanha para todo o canal.

Ajuste de tempo para retorno

O ajuste de tempo para retorno dá mais peso aos experimentos mais recentes, já que eles podem ser mais precisos para modelar resultados incrementais atualizados. Quanto mais antigo for o experimento em relação ao fim do período de modelagem da MMM, menor será a probabilidade de os resultados refletirem a realidade atual do negócio.

Para experimentos do Meridian GeoX, a data de término é extraída automaticamente de analysis_config.analysis_end_date no AnalysisResult.

O ajuste de tempo para retorno é calculado usando um decaimento exponencial com uma meia-vida de 52 semanas (1 ano):

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

Em que \(w\) é o número de semanas entre a data de término do experimento e a última data modelada na MMM.

  • Se o experimento terminou na última data modelada (\(w = 0\)), então \(\lambda = 1.0\) e \(\tau_{recency} = 0.0\).
  • Para experimentos mais antigos, \(\lambda\) diminui, fazendo com que \(\tau_{recency}\) aumente e adicione mais incerteza.
  • Se a última data modelada for anterior ao experimento, nenhum ajuste será aplicado (\(\tau_{recency} = 0.0\)).

Ajuste de duração

O ajuste de duração (\(\gamma_{duration}\) e \(\tau_{duration}\)) considera a diferença entre a duração do experimento (\(D\), em semanas) e a janela de defasagem máxima do modelo (\(L\), em semanas).

Para experimentos do Meridian GeoX, a duração (\(D\)) é calculada automaticamente com base em analysis_config.analysis_start_date e analysis_config.analysis_end_date no AnalysisResult do GeoX.

Como os efeitos do marketing se estendem ao longo do tempo (modelados pelo decaimento de Adstock), um experimento curto talvez não capture o efeito total e de longo prazo do gasto de mídia. Por outro lado, se for muito longo, um experimento talvez capture efeitos além da janela de defasagem truncada do modelo.

O Meridian calcula a proporção de captura (\(p\)), que é a proporção do total de pesos de decaimento do Adstock capturados durante as semanas ativas do experimento.

Considere \(w_s\) como os pesos de decaimento calculados usando a função de decaimento de Adstock (geométrica ou binomial) com taxa de decaimento \(\alpha\) na janela do modelo \(L + 1\) (configurada em CalibrationBuilder, com padrão adstock_decay_spec='geometric', alpha=0.5 e max_lag=8):

  • Se a duração do experimento for menor ou igual à janela do modelo (\(D \le L + 1\)):
    • Decaimento binomial e geométrico: a proporção de captura \(p\) é a soma dos pesos de decaimento normalizados até \(D\):
$$ p = \frac{\sum_{s=0}^{D-1} w_s}{\sum_{s=0}^{L} w_s} $$
  • Se a duração do experimento for maior que a janela do modelo (\(D > L + 1\)):
    • Decaimento binomial: como os pesos binomiais decaem para zero na janela de lookback, o experimento captura todos os efeitos possíveis: \(p = 1.0\)
    • Decaimento geométrico: como os pesos geométricos decaem infinitamente, o numerador inclui a cauda da série geométrica até \(D - 1\):
$$ p = \frac{\sum_{s=0}^{L} w_s + \sum_{s=L+1}^{D-1} \alpha^s}{\sum_{s=0}^{L} w_s} $$

A proporção de captura \(p\) é limitada a um valor mínimo de \(10^{-6}\) e um valor máximo de \(1.0\) (para decaimento binomial).

Usando \(p\), os ajustes de duração são:

  • Fator de escalonamento da estimativa pontual:
$$ \gamma_{duration} = \frac{1.0}{p} $$

Se o experimento for mais curto que a janela do modelo (\(p < 1.0\)), a estimativa pontual será escalonada verticalmente (\(\gamma_{duration} > 1.0\)) para estimar o efeito total de longo prazo. Se for mais longo (\(p > 1.0\) para decaimento geométrico), a estimativa pontual será reduzida (\(\gamma_{duration} < 1.0\)).

  • Ajuste de erro padrão:
$$ \tau_{duration} = \max\left(\frac{1.0 - p}{p}, 0.0\right) $$

Se o experimento for mais curto (\(p < 1.0\)), adicione incerteza (\(\tau_{duration} > 0.0\)) porque a cauda não observada do efeito está extrapolando. Já se for mais longo ou igual (\(p \ge 1.0\)), nenhuma incerteza adicional será adicionada (\(\tau_{duration} = 0.0\)).


Etapa 3: mesclar experimentos

Se você registrar vários experimentos para um único canal, o Meridian vai combiná-los (com um baseline_prior opcional) usando a atualização bayesiana.

Pelo teorema de Bayes, a densidade a posteriori do ROI do canal é proporcional ao produto da distribuição a priori de referência e das probabilidades de todos os experimentos independentes:

$$ 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}) $$

Onde a função de probabilidade para cada experimento \(i\) é:

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

Podemos considerar essa definição de produto como um modelo bayesiano próprio. Matematicamente, tratamos cada experimento ajustado como uma observação ruidosa do verdadeiro ROI do canal. O modelo é formulado da seguinte maneira:

$$ \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*} $$

Em que:

  • \(\mu_{adj,i}\) é a estimativa pontual ajustada para o experimento \(i\).
  • \(\sigma_{adj,i}\) é o erro padrão ajustado para o experimento \(i\).
  • \(\text{ROI}\) é o parâmetro de ROI verdadeiro e desconhecido a ser estimado para o canal.
  • \(\pi(\cdot)\) é a distribuição baseline_prior. Se nenhuma distribuição a priori de valor de referência for especificada, será usada uma distribuição a priori uniforme inadequada sobre números reais positivos (\(\pi(\text{ROI}) \propto 1\) para \(\text{ROI} > 0\)).
  • \(N\) é o número de experimentos registrados.

O builder avalia essa densidade a posteriori numericamente em uma grade de parâmetros adaptativa para encontrar a distribuição combinada. Consulte o Anexo técnico para mais detalhes.

Etapa 4: ajustar e criar a distribuição a priori calibrada

Por fim, o Meridian ajusta uma família de distribuição paramétrica padrão (LogNormal, Gamma ou Normal) à distribuição a posteriori numérica calculada na Etapa 3. As famílias de distribuição candidatas são escolhidas com base no baseline_prior: "log-normal" e "gama" são sempre consideradas, enquanto "normal" é avaliada quando a distribuição a priori de referência permite suporte negativo. A forma de distribuição mais adequada é escolhida minimizando-se a perda de entropia cruzada (equivalente a minimizar a divergência de KL) em relação à distribuição numérica a posteriori.

Depois que a distribuição a priori ideal é encontrada para cada canal calibrado, o CalibrationBuilder as agrupa. Para os canais que não passaram pela calibragem, o CalibrationBuilder atribui a distribuição a priori personalizada fornecida em custom_prior. A distribuição a priori de ROI padrão de \(\text{LogNormal}(0.2, 0.9)\) só será usada se sua versão personalizada não for fornecida para esse canal.

O resultado final de build() é uma classe de dados CalibratedPriors que contém:

  • priors.roi_m: um CalibratedDistribution (subclasse de IndependentMultivariateDistribution) que representa a distribuição a priori calibrada para canais de mídia paga.
  • priors.roi_rf: um CalibratedDistribution (subclasse de IndependentMultivariateDistribution) que representa a distribuição a priori calibrada para canais de alcance e frequência.

Essas distribuições calibradas são transmitidas para PriorDistribution e, em seguida, para ModelSpec para inicializar o modelo do Meridian.


Apêndice técnico

Nesta seção, apresentamos as fórmulas matemáticas e os detalhes algorítmicos que fundamentam o cálculo numérico a posteriori e o ajuste de distribuição do CalibrationBuilder.

Fórmula da distribuição a posteriori

Para um determinado canal, \(\theta\) representa o ROI real. Observe os resultados do experimento ajustado independente de\(N\) . Para cada experimento \(i \in \{1, \ldots, N\}\), há uma estimativa pontual ajustada \(\mu_{adj,i}\) e um erro padrão ajustado \(\sigma_{adj,i}\).

Suponhamos que cada estimativa pontual ajustada seja uma observação distribuída normalmente em torno do ROI verdadeiro:

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

A função de probabilidade para o \(i\)º experimento é:

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

Se um baseline_prior for fornecido, denote a função de densidade de probabilidade como\(\pi(\theta)\). Se nenhuma distribuição a priori de valor de referência for fornecida, use uma distribuição a priori uniforme plana imprópria sobre valores positivos, \(\pi(\theta) \propto I_{\{\theta > 0\}}\), em que\(I\) é a função indicadora.

Segundo o teorema de Bayes, a densidade a posteriori do ROI do canal, \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\), é proporcional ao produto da distribuição a priori e às probabilidades de todos os experimentos independentes:

$$ 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}) $$

Integração numérica em grade

Como a distribuição a posteriori \(p(\theta \mid \{\mu_{adj,i}, \sigma_{adj,i}\})\) pode não ter uma forma analítica padrão (como ao usar distribuições a priori de referência não normais, como log-normal ou gama), o Meridian a avalia numericamente em uma grade.

  1. Passagem de sondagem: primeiro, o Meridian realiza uma passagem de "sondagem" para localizar a região de alta massa de probabilidade. O Meridian define uma grade ampla centralizada na média empírica das distribuições e encontra o intervalo que contém\(99.8\%\) da probabilidade cumulativa (do \(0.1\)º percentil ao \(99.9\)º).
  2. Avaliação de grade fina: em seguida, ele cria uma grade fina de 10.000 pontos igualmente espaçados nesse intervalo resolvido \([\theta_{\text{min}}, \theta_{\text{max}}]\) e avalia a densidade a posteriori não normalizada em cada ponto.
  3. Normalização: a densidade é normalizada usando a integração da soma de Riemann:

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

    Em que \(u(\theta)\) é a densidade a posteriori não normalizada, \(\theta_j\) é o \(j\)º ponto de grade e \(\Delta\theta\) é a taxa de aprendizado.

Ajuste de distribuição

Depois que a FDP numérica a posteriori é calculada na grade, o Meridian ajusta uma distribuição paramétrica \(q(\theta; \phi)\) (em que \(\phi\) representa os parâmetros de distribuição) para aproximar a distribuição a posteriori.

O Meridian determina as famílias de distribuição candidatas com base no suporte da distribuição a priori de referência:

  • Suporte não negativo (padrão): se nenhuma distribuição a priori de referência for fornecida (que, por padrão, tem suporte não negativo) ou se ela restringir o suporte a valores não negativos (como LogNormal ou Gamma), o Meridian vai considerar as famílias de distribuição log-normal (\((0, \infty)\)) e gama (\((0, \infty)\)) e não vai considerar a normal.
  • Suporte negativo: se a distribuição a priori de referência atribuir densidade de probabilidade finita a valores negativos (como Normal), o Meridian vai considerar Normal (definida em \((-\infty, \infty)\)) e também log-normal e gama.

Para cada família candidata, o Meridian encontra os parâmetros \(\phi\) que minimizam a perda de entropia cruzada entre a distribuição a posteriori numérica \(p(\theta)\) e a distribuição candidata \(q(\theta; \phi)\):

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

Minimizar essa perda é matematicamente equivalente a reduzir a divergência de Kullback-Leibler \(D_{KL}(p \parallel q)\) da aproximação\(q\) para a distribuição numérica a posteriori verdadeira \(p\).

O Meridian usa o algoritmo de otimização L-BFGS-B para encontrar os parâmetros ideais. A família de distribuição que alcança a menor perda é selecionada como a distribuição a priori calibrada final para o canal.