"用合成对照法算增量"这句话在大多数文章里只有一行。真正决定实验结果能不能信的,是控制组权重怎么求解、置信区间怎么构造,以及你测的这几周到底够不够看出效果。
大多数讲地理增量实验(Geo Lift Test)的文章,到"用合成对照法或者 DiD 计算增量"这一句就停了,把最关键的两步当成黑箱:合成对照组是怎么"配"出来的?测出来的效果有多大把握是真的,不是噪音?以及在动手之前更根本的问题——这次实验要测多久、该选哪几个地理区,才有足够的统计功效检测出你关心的效应量级?
这两个问题不是学术洁癖。如果控制组权重求解得不对,"合成对照组"跟测试组在实验前的走势本来就没对齐好,任何后续的增量估计都是在比较两条本来就不一样的曲线。如果没做功效分析就直接开始测,最常见的结局是:测了 6 周,效果不显著,然后有两种可能——渠道真的没有增量效应,或者你的实验设计从一开始就不可能在 6 周内测出这个量级的效应,两者在结果上看起来一样,但结论完全相反。SparkX 平台的地理增量模块把这两步都做成了具体的数值方法,本文把背后的实现拆开讲清楚。
合成对照法(Synthetic Control Method)的核心思路:既然找不到一个"完美对照组"跟测试地理区完全一样,那就用多个候选对照地理区的加权组合去人工构造一个虚拟对照组,只要这个加权组合在实验开始前(pre-period)能紧密跟随测试组的走势,就有理由认为它在实验期间(post-period)如果没有受到广告变化的影响,会继续跟随同样的走势——两者之间的差值,就是增量。
"Augmented"(增强版)指的是在经典合成对照法基础上,加入岭回归(Ridge)风格的正则化和残差修正,让方法在候选对照地理区数量较少、或者候选组合无法完美拟合测试组时依然稳健——这正是大多数品牌实际遇到的情况:可用的地理区数量通常是几十个,不是几百个。
设测试地理区在实验前的序列为 Y_test(t),候选对照地理区的序列组成矩阵 Y_control(每一列是一个对照地理区),要找的是一组权重 w,满足两个约束——非负(不允许对照地理区反向抵消测试组)、加总为 1(保持量级可比)——使得加权组合尽可能贴近测试组在实验前的走势:
这是一个带约束的二次优化问题,工程实现上用 SLSQP(Sequential Least Squares Programming)求解——初始猜测是所有候选地理区权重相等,优化器在"非负 + 加总为 1"这个约束空间内搜索使 pre-period 残差平方和最小的权重组合。求解完成后,第一件要检查的事是拟合质量,用 pre-period 的 R²:
如果 R²_pre 明显偏低(比如低于 0.8),说明候选对照地理区里没有哪个组合能在实验前很好地跟随测试组,这时候不管后面算出多大的"增量",都不该直接采信——问题不在于统计方法本身,而在于地理区选择的输入质量不够。实践中最常见的补救方式是扩大候选对照地理区的范围,或者换一批地理粒度更接近的测试地理区。
权重求出来之后,实验期的增量估计(Average Treatment Effect on the Treated,ATT)是实际观测值减去合成对照组的预测值:
但一个点估计不够——需要知道这个数字的不确定性有多大。经典做法是用区块自助法(Block Bootstrap)而不是普通的逐点重采样,原因是时间序列数据点之间存在自相关(今天的销售额跟昨天相关),逐点打乱重采样会破坏这种时序结构,低估真实的不确定性。区块自助法的做法是:
如果重采样过程中因为某些块组合导致权重求解失败的次数太多(少于 50 次成功),会退化为正态近似(用估计的标准误乘以 1.96)作为兜底,避免极端情况下拿不到任何置信区间。判断增量是否显著的标准很直接:置信区间是否跨过零——下界大于 0 或者上界小于 0,才能说这个渠道的增量效应在统计上是可信的,不是噪音。
ATT 本身是增量销售额的绝对值,业务上更常问的是增量投资回报率(incremental ROAS,iROAS):这次多投的钱,换来的增量销售额,值不值。计算方式是把 ATT 除以测试期相对于基线的增量花费:
这里 ΔSpend 的计算需要注意一个细节:不能直接拿测试期花费减去 pre-period 花费的绝对值,因为两段时期长度可能不同。正确做法是把 pre-period 的花费按测试期长度做比例折算后再相减,避免"测试期比 pre-period 长,所以花费自然更多"这种伪增量混进计算。iROAS 的置信区间直接由 ATT 的置信区间除以花费差值得到,不需要重新做一次自助法。
iROAS 算出来之后,最有价值的用法不是拿它跟平台自己报的 ROAS 比大小(这个坑在上一篇讲 DTC 和 Amazon 数据打通里详细拆过),而是把它转成一个先验分布,喂回 MMM 模型——iROAS 的点估计对应先验均值的对数,置信区间的宽度对应先验的不确定性,这样 MMM 在长期持续建模时,会在这个渠道上"知道"真实世界已经验证过的效应量级,不用完全靠花费和销售的相关性从零猜起。
功效分析(Power Analysis)回答的问题是:在给定的地理区数量、数据质量和实验时长下,多大的效应量级才有把握被真的检测出来?这个问题必须在实验开始前回答,而不是实验结束后拿"不显著"当结论。原因很直观——统计功效(Power)是"效应真实存在时,检验能正确检测出来的概率",如果实验设计本身的功效不足(比如只有 80% 检出概率对应的效应量级远高于渠道实际的效应),那么"没测出显著效应"这个结果完全无法区分"渠道真的没用"和"这次实验天生测不出来"。
SparkX 的功效分析用的是模拟法(Simulation-based Power Analysis),不是查表或者用解析公式估算——因为合成对照法本身依赖具体的地理区数据结构,解析公式在这种场景下不够准确,模拟法更贴近真实情况。
核心逻辑是:既然不知道真实效应有多大,那就人为地在历史数据里注入一个已知大小的效应,看合成对照法能不能把它检测出来,反复这个过程就能画出"效应量级 vs 检出概率"的曲线。具体流程:
(1 + effect) 并加入少量噪声,模拟"如果这个渠道真的有这么大的增量效应,数据会长这样"SparkX 除了给出 MDE 这个单点结论,还会输出一条完整的"效应量级 vs 检出概率"曲线(对 7 个效应量级分别算出功效)。如果你的渠道历史 ROI 表现暗示这次增量效应大概在 8%-10% 左右,直接看这条曲线上对应位置的功效数值,比只看一个 MDE 阈值更能帮你判断这次实验值不值得做。
MDE 不只取决于效应量级,还取决于选哪些地理区做测试组——同样的渠道,选花费体量大、数据噪声小的地理区做测试,比选花费很小、波动很大的地理区,能测出更小的效应。SparkX 的设计搜索会在候选地理区里尝试从 1 个到最多 3 个地理区的组合(避免测试组过大导致对照组样本不足),对每种组合都跑一次上面的 MDE 模拟流程,选出MDE 最小的组合作为推荐设计。
为了控制计算量,搜索会做两层限制:如果候选地理区超过 10 个,先按历史花费量排序,只取花费最高的 10 个进入组合搜索(花费越大的地理区,实验期的花费变化幅度通常也更明显,更容易被合成对照法捕捉到);组合搜索本身也限制在候选池的前 8 个地理区内做排列组合,避免组合数量随地理区数量指数级增长拖垮响应时间。这是一个工程上"足够好但不追求全局最优"的取舍——对大多数品牌(地理区数量在 10-50 个之间)来说,这个搜索范围能覆盖到效果接近最优的设计。
找到推荐的地理区组合之后,SparkX 还会额外计算一张"实验时长 vs MDE"的对照表——分别在 4、6、8、10、12 周的实验时长假设下重新跑一次 MDE 模拟(每个时长用减半的模拟次数加速计算),得到不同时长对应的最小可检测效应。这张表通常呈现的规律是:时长每增加,MDE 会下降,但下降速度递减——从 4 周到 8 周的 MDE 改善幅度,通常远大于从 8 周到 12 周的改善幅度。
这条曲线的实际用途是帮你做一个明确的权衡决策:如果 6 周的 MDE 已经低于你想验证的效应量级(比如渠道历史表现暗示效应大概在 10%,而 6 周设计的 MDE 是 7%),没有必要为了"更保险"把实验拖到 12 周——多测的几周只是在消耗机会成本,边际收益很小。反过来,如果 6 周的 MDE 高于你关心的效应量级,说明这次实验设计本身就测不出你想要的结论,该做的不是硬测下去,而是回头看能不能扩大测试地理区的花费体量,或者接受更长的实验周期。
合成对照法和功效分析这两块,是"做一次增量实验"和"做一次能被信任的增量实验"之间的差距。前者只要有软件工具就能跑出一个数字,后者需要在跑之前想清楚这个数字的置信边界,以及这次实验设计本身有没有能力回答你想问的问题。这也是为什么把这两步的具体机制讲透,比停留在"用合成对照法算增量"这句话更有价值——数字背后的方法论决定了这个数字能不能被拿去做真正的预算决策。