Configurar o design que quiser

Este documento mostra o processo de configuração do experimento usando a biblioteca Meridian GeoX. Veja como preparar seus dados, definir os principais parâmetros do experimento, usar configurações avançadas, avaliar a viabilidade do design e como visualizar e exportar o design escolhido.

Recapitulação e preparação de dados

Importe a biblioteca do Meridian GeoX e prepare o conjunto de dados de pré-teste. Conforme descrito na seção Colete e prepare seus dados, esse conjunto de dados é o pré-requisito para criar um estudo do GeoX.

O conjunto de dados precisa ser um DataFrame do Pandas, e as colunas obrigatórias são:

  • date: por exemplo, diariamente.
  • location: por exemplo, diferentes áreas de mercado.
  • conversions: os dados de resposta geralmente são contagens de conversões brutas ou dados de receita, normalmente de um CRM do anunciante.
  • spend: dados de gastos das campanhas incluídas no estudo. Essa coluna é opcional. Para configurar experimentos com várias células, use rótulos de coluna distintos, como spend_cell_1 ou spend_cell_2.

1. Design do experimento

Essa é a interação principal em que você define os parâmetros do próximo experimento. Para ilustrar esse processo, vejamos um experimento de investimento em regiões específicas de 28 dias com regressão baseada em tempo (TBR, na sigla em inglês) e amostragem estratificada.

  • DesignConfig: usado para definir as bases dos experimentos:
    • experiment_duration: a duração do experimento, excluindo os períodos de espera. A duração abrange pelo menos um ciclo de compra do produto.
    • cell_count: o número de células de tratamento no experimento. O padrão é 1, o que significa que um grupo experimental é pareado com um grupo de controle no experimento. Se o valor for maior que 1, crie um estudo com várias células de tratamento.
    • experiment_types: define a natureza do teste, como retenção parcial, retirada de anúncios, investimento em regiões específicas. Consulte Tipos de experimentos para ver mais detalhes. Em experimentos com várias células, é possível definir tipos diferentes para cada célula. Por exemplo, {'cell_1': ExperimentType.GO_DARK, 'cell_2': ExperimentType.HEAVY_UP} indica a execução de uma estratégia de retirada de anúncios em uma célula de tratamento e de investimento em regiões específicas em outra, o que é uma configuração muito comum em experimentos multicélulas com orçamento neutro.
    • methodology: é o método de análise escolhido para a seleção do design, como regressão baseada em tempo, controle sintético, diferença sintética.
    • geo_assignment_rule: aceita amostragem aleatória e estratificada.
    • design_output_count: o número total de designs recomendados classificados que serão incluídos na saída.

Confira mais detalhes sobre a metodologia e as opções de regras de atribuição em Comparar metodologias.

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: permite especificar orçamentos máximos e outras restrições relacionadas ao design. Casos de uso mais avançados, como incluir ou excluir regiões específicas ou definir limites de conversão. Uma configuração básica de restrições que inclui apenas orçamentos máximos é a seguinte: As restrições mais avançadas são abordadas na próxima seção.
# Limit the max experiment budget to be 100000.
constraints = geox.Constraints(
    budget_constraint=geox.Budget(budget=100000)
)
  • geox.run_design(): a função principal que usa o conjunto de dados de pré-teste, as configurações e as restrições para gerar um conjunto de possíveis designs de experimento, classificados por 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]

O DesignConfig também inclui parâmetros que podem ser ajustados para o design, mas deixá-los em branco não é um problema, já que há valores padrão para eles:

  • alpha (opcional): o nível de significância do teste. O valor padrão é 0,10 ou 10%. Isso também significa que a probabilidade de cobertura esperada do intervalo de confiança é 1 - alfa = 90%.
  • power (opcional): a probabilidade de detectar um efeito verdadeiro. O valor padrão é 80%.
  • cost_per_incremental_conversion (CpIC, opcional): usado apenas em experimentos de retenção. Em experimentos de retenção, o CpIC é usado para estimar o orçamento mínimo, ou seja, o quanto deve ser gasto em campanhas recém-ativadas. O valor padrão é 1, mas é mais prático estimar o CpIC como 1/iCPD (ou 1/iROAS), em que a estimativa de iCPD (ou iROAS) vem de um modelo de MMM do Meridian ou de um estudo de incrementalidade anterior, como o GeoX ou o Conversion Lift do Google. Como ele só é útil em experimentos de retenção, o CpIC é ignorado em experimentos (ou células) de retirada de anúncios e de investimento em regiões específicas, que medem as campanhas ativas, e o orçamento do experimento é projetado usando dados de gastos históricos.
  • min_r2 (opcional): limite mínimo de pontuação de R ao quadrado fora da amostra (qualidade do ajuste) necessário para as opções de design durante a fase de design. O valor padrão é definido como 0,8 (80%), filtrando as opções de design em que o ajuste do modelo pré-teste é menor que esse limite.

2. Configurações adicionais de design usando restrições

Nesta seção, veja como configurar o design de forma flexível, transmitindo mais restrições de design, além de especificar apenas um orçamento máximo, conforme a seção anterior. Todas essas restrições são opcionais. Veja um exemplo de como adicionar algumas restrições ao design.

  • excluded_geos: as regiões geográficas que serão excluídas do design do experimento. Normalmente, essas regiões são grandes áreas metropolitanas que você não quer incluir em um estudo do Meridian GeoX, o que pode causar uma interrupção significativa na mídia.
  • excluded_dates: datas a serem excluídas do design do experimento.
  • budget_percent: a mudança percentual máxima do orçamento para o design do experimento. Isso só poderá ser usado se os dados de gasto forem fornecidos por célula.
  • budget_constraint: a restrição de orçamento para o design do experimento (por célula). Pode ser um valor total ou uma mudança percentual no orçamento.
  • max_conversions_percent: o volume máximo de conversões do grupo experimental. O valor padrão é definido como 30%, já que um GeoX comum não deve afetar mais de 30% da sua mídia.
# 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. Avaliação, visualização e exportação

Depois de executar geox.run_design(), a saída contém uma lista de opções de design. Para avaliar esses designs, inspecione as principais métricas na tabela de resumo, como R ao quadrado (\( R^2 \)), MDE e o valor-p do teste A/A. Todas as opções de design na tabela de resumo são classificados por MDE em ordem crescente.

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

Avaliar a viabilidade do design

Para selecionar um design adequado e continuar aprendendo sobre o Meridian GeoX, avalie as opções de acordo com estes critérios:

  1. Limite de R ao quadrado (\( R^2 \)): recomendamos selecionar um design com\( R^2 \ge 0.8 \) . Um \( R^2 < 0.5 \) indica que as regiões de controle são inadequadas para estimar as regiões de tratamento, o que, em determinados cenários, pode tornar a análise pós-teste não confiável.

  2. Validação do teste A/A: verifique se o design selecionado passa no teste A/A. O valor p do teste A/A precisa ser maior que o nível de significância escolhido (\( \alpha \)) para garantir que não haja um viés preexistente significativo. Além disso, se uma alta porcentagem de opções de design falhar no teste A/A, isso geralmente indica uma baixa qualidade de dados pré-teste, como outliers extremos, mudanças geográficas repentinas ou alta volatilidade, ou um ajuste inadequado do modelo. Realizar um experimento com esses dados torna a análise pós-teste não confiável devido ao alto risco de descobertas falsas (detecção de Lift inexistente).

Ajuste de R ao quadrado

O \( R^2 \) mínimo necessário é controlado pelo parâmetro min_r2 em geox.DesignConfig. Por padrão, o valor mínimo de \( R^2 \) é 0,8. Se a pesquisa de design não retornar opções viáveis em 0,8, você poderá flexibilizar o limite, por exemplo, ajustando-o para 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
)

Resolver problemas de testes A/A

  1. Verifique se há anomalias nos dados: inspecione os dados de pré-teste para identificar erros de entrada, dias ausentes ou picos extremos em regiões geográficas específicas. Exclua essas datas e regiões anômalas usando Constraints(excluded_dates=...excluded_geos=...).

  2. Aumente o histórico de pré-teste: forneça um histórico de pré-teste mais longo (por exemplo, de \( 3N \) para \( 6N \) ou mais) para que o modelo tenha mais dados para aprender relações estáveis.

  3. Viabilidade do MDE: compare o MDE do design com as expectativas da sua empresa. O MDE é o Lift mínimo que o teste pode detectar. Se você espera que sua campanha gere um Lift de apenas 5%, mas o design escolhido tem um MDE de 12%, o estudo não tem poder suficiente e você não deve continuar sem aumentar o tamanho do grupo experimental ou a duração.

Visualizar o design

Use geox.plot_design() para gerar representações visuais do tratamento e do contrafactual.

Exemplo de comparação de dados de conversões totais observadas em relação a contrafactuais

Exportar o design

No final, o design escolhido pode ser exportado para JSON usando .export_to_json() e recarregado mais tarde com .load_from_json() para garantir a consistência entre as fases de design e análise.

4. Design de várias células

O Meridian GeoX é compatível com vários experimentos de várias células. Por exemplo, uma opção conhecida como teste de orçamento neutro permite testar os efeitos de redução (retirada de anúncios) e aumento (investimento em regiões específicas) do orçamento no mesmo mercado ao mesmo tempo, enquanto o orçamento total em todas as regiões geográficas permanece neutro. Para criar um teste neutro em termos de orçamento, defina cell_count como 2 e selecione os tipos de experimento das duas células de tratamento como GO_DARK e 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,
)

Depois de configurar as restrições para o teste de várias células, a função geox.run_design() vai retornar os designs solicitados. Assim como no cenário de célula única, os designs podem ser recuperados da mesma forma.

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