配置首选设计

本文档将指导您完成使用 Meridian GeoX 库配置实验设计的过程。了解如何准备数据、设置关键实验参数、利用高级配置、评估设计可行性,以及如何直观呈现和导出所选设计。

回顾和数据准备

首先,导入 Meridian GeoX 库,并准备测试前数据集。如收集并准备数据中所述,此数据集是设计 GeoX 研究的前提条件。

数据集必须是 Pandas DataFrame,并且必须包含以下列:

  • date:例如,每天
  • location:例如,不同的市场区域
  • conversions:响应数据通常是原始转化次数或收入数据,一般来自广告客户 CRM
  • spend:研究中包含的广告系列的支出数据。此列为可选列。对于多实验组实验配置,请使用不同的列标签,例如 spend_cell_1spend_cell_2

1. 实验设计

这是核心步骤,您将在此定义即将进行的实验的参数。为了逐步说明这一点,下面以一项为期 28 天的增投实验设计为例,该设计采用基于时间的回归 (TBR) 和分层抽样。

  • DesignConfig:用于设置实验的基础:
    • experiment_duration:实验时长,不包括任何冷却期。时长通常至少涵盖一个产品购买周期。
    • cell_count:实验中的实验组数量。默认值为 1,表示实验中有一个实验组与一个对照组配对。如果该值大于 1,请设计包含多个实验组的多实验组研究。
    • experiment_types:定义测试的性质,例如预留对照、停投、增投。如需了解详情,请参阅实验类型。在多实验组实验中,您可以为不同的实验组设置不同的实验类型。例如,{'cell_1': ExperimentType.GO_DARK, 'cell_2': ExperimentType.HEAVY_UP} 表示在一个实验组中停投,在另一个实验组中增投,这是预算中性多实验组实验中非常常见的设置。
    • methodology:用于设计选择的分析方法,例如基于时间的回归、合成控制法、合成双重差分。
    • geo_assignment_rule:支持随机抽样或分层抽样。
    • design_output_count:要包含在输出中的已排名推荐设计的总数。

如需详细了解方法和分配规则选项,请参阅比较方法

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:可让您指定预算上限和其他与设计相关的限制条件。更高级的应用场景,例如包含或排除特定地理区域,或设置转化阈值。仅包含预算上限的基本限制条件设置如下。下一部分将介绍更高级的限制条件。
# Limit the max experiment budget to be 100000.
constraints = geox.Constraints(
    budget_constraint=geox.Budget(budget=100000)
)
  • geox.run_design():核心函数,接受测试前数据集、配置和限制条件,生成一组潜在的实验设计,并按 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 还包含您可以针对设计进行微调的参数,但将其留空也没问题,因为它们有默认值:

  • alpha(可选):测试的显著性水平。默认值为 0.10 或 10%。这也意味着置信区间的预期覆盖概率为 1 - alpha = 90%。
  • power(可选):检测到真实效应的概率。默认值为 80%。
  • cost_per_incremental_conversion(CpIC,可选):仅用于预留对照实验。在预留对照实验中,CpIC 用于估算最低预算,即在新启用的广告系列上应支出的金额。默认值为 1,但更实用的方法是将 CpIC 估算为 1/iCPD(或 1/增量广告支出回报率 [iROAS]),其中 iCPD(或 iROAS)估算值来自现有的 Meridian MMM 模型或过去的增量研究,例如 GeoX 或 Google 的转化量提升情况研究。由于 CpIC 仅在预留对照实验中有用,因此在停投实验和增投实验(或实验组)中会被忽略,这些实验衡量的是现有的在投广告系列,实验预算则根据历史支出数据推算。
  • min_r2(可选):在设计阶段,候选设计必须达到的样本外 R 平方(拟合优度)分数最低阈值。默认值设为 0.8 (80%),会过滤掉测试前模型拟合度低于此阈值的候选设计。

2. 通过限制条件进行其他设计配置

在本部分中,您将学习如何通过传递更多设计限制条件来灵活配置设计,而不像上一部分那样仅指定预算上限。所有这些限制条件都是可选的。以下示例展示了如何在设计中添加一些限制条件。

  • excluded_geos:要从实验设计中排除的地理区域。这些地理区域通常是大型都市圈,您不希望将其纳入 Meridian GeoX 研究,因为这可能会导致严重的媒体中断。
  • excluded_dates:要从实验设计中排除的日期。
  • budget_percent:实验设计的预算百分比变化上限。仅当按实验组提供支出数据时,才能使用此项。
  • budget_constraint:实验设计的预算限制(每个实验组)。这可以是预算总额,也可以是预算百分比变化。
  • max_conversions_percent:实验组的最大转化量。默认值设为 30%,因为普通 GeoX 不应影响超过 30% 的媒体。
# 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. 评估、直观呈现和导出

运行 geox.run_design() 后,输出会包含候选设计列表。您可以通过检查摘要表中的关键指标(例如 R 平方 [\( R^2 \)]、MDE 和 A/A 测试 p 值)来评估这些设计。摘要表中的所有候选设计均按 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

评估设计可行性

为了选出合适的设计以继续推进 Meridian GeoX 流程,请根据以下标准评估候选设计:

  1. R 平方 (\( R^2 \)) 阈值:建议选择\( R^2 \ge 0.8 \) 的设计。 \( R^2 < 0.5 \) 表示对照组地理区域对实验组地理区域的预测效果不佳,在某些情况下,这可能会导致测试后分析不可靠。

  2. A/A 测试验证:确保所选设计通过 A/A 测试。A/A 测试 p 值应大于您选择的显著性水平 (\( \alpha \)),以确保原本不存在显著偏差。此外,如果候选设计中有很大一部分未通过 A/A 测试,通常表明测试前数据质量较差(例如存在极端离群值、突发地理区域偏移或高波动性),或者模型拟合度较差。使用此类数据进行实验会导致测试后分析不可靠,因为存在较高的误报风险(检测到不存在的提升效果)。

R 平方调整

所需的最低 \( R^2 \) 由 geox.DesignConfig 中的 min_r2 参数控制。默认情况下,所需的最低 \( R^2 \) 值为 0.8。 如果设计搜索在 0.8 阈值下未返回任何可行的候选设计,您可以灵活地放宽阈值,例如将其调整为 0.75 或 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
)

排查 A/A 测试问题

  1. 检查数据异常值:检查测试前数据是否存在数据输入错误、缺失天数或特定地理区域出现极端的一次性峰值。使用 Constraints(excluded_dates=...excluded_geos=...) 排除这些异常日期和地理区域。

  2. 增加测试前历史记录:提供更长的测试前历史记录(例如,从 \( 3N \) 增加到 \( 6N \) 或更长),以便为模型提供更多数据来学习稳定的关系。

  3. MDE 的可行性:将设计的 MDE 与您的业务预期进行比较。MDE 是测试可以检测到的最小提升效果。如果您预计广告系列只能产生 5% 的提升效果,但所选设计的 MDE 为 12%,则该研究的统计功效不足,必须先扩大实验组规模或延长实验时长,然后才能继续推进。

直观呈现设计

使用 geox.plot_design() 生成实验组与反事实情景的直观呈现图。

观测到的总转化数据与反事实总转化数据对比示例

导出设计

最后,您可以使用 .export_to_json() 将所选设计导出为 JSON,并在以后使用 .load_from_json() 重新加载,以确保设计阶段和分析阶段之间的一致性。

4. 多实验组设计

请注意,Meridian GeoX 原生支持各种多实验组实验。 例如,有一种常用选项称为“预算中性测试”,可让您在同一市场中同时测试停投(减少预算)和增投(增加预算)的效果,而所有地理区域的总预算仍保持中性。如需设计预算中性测试,您可以将 cell_count 设置为 2,然后将两个实验组的实验类型分别设为 GO_DARKHEAVY_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,
)

为多实验组测试设置限制条件后,geox.run_design() 函数应返回所请求的多实验组设计。与单实验组场景类似,您可以按同样的方式获取候选设计。

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