先给结论:当关键字分析工具里同一批访客被分到不同版本,而各角色对“哪份数据可信”争执不下时,最有效的做法不是比较总量,而是先建立一条可核对的访客归属链。只有确认每个访客只进入一个版本、且版本标识在整条链路上保持一致,样本污染才可能被排除;否则任何差异都可能来自分流失效,而不是版本本身。
常见场景是:运营看到A版本转化率更高,产品看到B版本停留更久,双方都从同一个关键字分析工具导出数据。分歧往往不在指标定义,而在“谁被算进了哪个版本”。
假设某次实验把访问者按随机数分到A、B两组,但页面加载时又根据设备类型做了一次重定向。此时同一个访客可能在第一次请求时被记为A,落地后实际看到B。工具按首次曝光归因,就把他算进A;按最终页面归因,又算进B。两个人各自导出,分母自然不同。
这类现象有两个合理解释:一是分流机制本身有缺陷,导致同一访客跨版本;二是版本标识在采集、传输或回传环节丢失,导致归属被重新计算。两者都会让样本污染,但修复动作完全不同。
分流层问题通常发生在客户端跳转、缓存命中或AB测试脚本与业务代码冲突时。判断它是否存在,可以查三件事:
如果同一访客ID确实对应两个版本,而且时间顺序是先A后B,那么污染来自分流层。此时应先暂停实验,修好归属逻辑,再重新开始,而不是继续对比两组均值。
另一种情况是分流本身正确,但版本标识没有随事件完整上报。例如页面先加载,版本参数在后续异步请求里才写入;或者部分事件走的是旧版SDK,不携带版本字段。工具在聚合时只能按默认值或最近一次已知值填充,于是同一访客被重新归类。
区分这两种解释的证据不同。分流层问题看的是“访客是否真的看到两个版本”,采集层问题看的是“版本字段在事件里是否完整”。可以做一个最小核对:
如果事件序列里版本字段时有时无,而服务端日志显示该访客始终属于同一组,那么问题在采集层,不在分流层。
多个角色对同一事实有不同理解时,不要继续争论指标高低,先把分歧拆成可核对的项目。以下检查表可以直接用于下一次实验前的预检:
这张表的价值在于,它把“谁的数对”变成“哪一环的归属证据不成立”。只要有一环无法核对,就不能断言样本干净。
假设某次实验计划覆盖一万名访客,但上线后发现A、B两组的次日留存差异很大。此时不要直接下结论,而是先取其中一百名访客做归属核对:
从服务端日志取出这一百人的分配版本,再从关键字分析工具导出同一百人的事件序列,逐条比对版本字段。如果发现其中十人的工具归属与服务端分配不一致,且这十人集中在某个异步加载模块,那么可以判断污染来自该模块的采集缺失。下一步动作是修复该模块的事件上报,再重新核对同一批访客;如果修复后不一致比例降到零,才具备继续分析实验差异的前提。
这个例子的数字仅用于说明核对方法,不代表任何真实项目的比例或收益。
样本污染被识别后,最忌讳的是把污染访客直接剔除再算一遍。因为被剔除的往往不是随机样本,而是某类设备、某个入口或某个时段的访客,剔除本身会引入新的偏差。更稳妥的动作是:先确认污染范围是否可解释,再决定是修复后重跑,还是把实验结论降级为“仅作方向参考”。
如果服务端日志与工具归属在修复后仍无法对齐,说明版本标识的传递链路还有断点,此时应暂停基于该实验的决策,而不是用第三方估算流量去反推哪组更好。第三方估算、搜索引擎报告与站内统计口径本就不同,它们不能互相替代,更不能用来还原分流是否正确。只有当归属链完整、每个访客只对应一个版本时,版本之间的差异才值得进一步分析。