本文档将指导您完成使用 Meridian GeoX 库配置实验设计的过程。了解如何准备数据、设置关键实验参数、利用高级配置、评估设计可行性,以及如何直观呈现和导出所选设计。
回顾和数据准备
首先,导入 Meridian GeoX 库,并准备测试前数据集。如收集并准备数据中所述,此数据集是设计 GeoX 研究的前提条件。
数据集必须是 Pandas DataFrame,并且必须包含以下列:
- date:例如,每天
- location:例如,不同的市场区域
- conversions:响应数据通常是原始转化次数或收入数据,一般来自广告客户 CRM
- spend:研究中包含的广告系列的支出数据。此列为可选列。对于多实验组实验配置,请使用不同的列标签,例如
spend_cell_1或spend_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 流程,请根据以下标准评估候选设计:
R 平方 (\( R^2 \)) 阈值:建议选择\( R^2 \ge 0.8 \) 的设计。 \( R^2 < 0.5 \) 表示对照组地理区域对实验组地理区域的预测效果不佳,在某些情况下,这可能会导致测试后分析不可靠。
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 测试问题
检查数据异常值:检查测试前数据是否存在数据输入错误、缺失天数或特定地理区域出现极端的一次性峰值。使用
Constraints(excluded_dates=...excluded_geos=...)排除这些异常日期和地理区域。增加测试前历史记录:提供更长的测试前历史记录(例如,从 \( 3N \) 增加到 \( 6N \) 或更长),以便为模型提供更多数据来学习稳定的关系。
MDE 的可行性:将设计的 MDE 与您的业务预期进行比较。MDE 是测试可以检测到的最小提升效果。如果您预计广告系列只能产生 5% 的提升效果,但所选设计的 MDE 为 12%,则该研究的统计功效不足,必须先扩大实验组规模或延长实验时长,然后才能继续推进。
直观呈现设计
使用 geox.plot_design() 生成实验组与反事实情景的直观呈现图。

导出设计
最后,您可以使用 .export_to_json() 将所选设计导出为 JSON,并在以后使用 .load_from_json() 重新加载,以确保设计阶段和分析阶段之间的一致性。
4. 多实验组设计
请注意,Meridian GeoX 原生支持各种多实验组实验。
例如,有一种常用选项称为“预算中性测试”,可让您在同一市场中同时测试停投(减少预算)和增投(增加预算)的效果,而所有地理区域的总预算仍保持中性。如需设计预算中性测试,您可以将 cell_count 设置为 2,然后将两个实验组的实验类型分别设为 GO_DARK 和 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,
)
为多实验组测试设置限制条件后,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])