先给结论:访客被分到不同版本时,样本污染通常不是“数据脏了”,而是分流边界和统计口径不一致。识别它的关键是找到同一批访客在两个版本之间来回切换的证据,而不是比较两个版本的平均值。若分流由前端脚本控制,先查脚本执行时机;若分流由服务端或CDN控制,先查缓存键和回源规则。两条路径的判断依据不同,选错方向会让后续所有对比失效。
样本污染的第一层区分是:版本分配发生在客户端还是服务端。这个判断决定了你要检查的对象和可用的证据类型。
如果版本由前端脚本按随机数或用户标识分配,那么同一访客在不同设备、不同会话甚至同一会话的多次页面加载中,都可能落到不同版本。此时样本污染的证据往往出现在客户端存储里:cookie、localStorage或会话存储中的分组标识前后不一致。你可以抽取一批访客标识,检查其分组值是否稳定。若同一标识在短时间内出现两个版本值,说明分流层本身没有做到粘性。
如果版本由服务端或边缘节点分配,那么问题更可能出在缓存键设计上。当缓存键不包含分组维度时,先到达的版本会被缓存,后续访客无论应分到哪个版本,都会拿到同一份缓存内容。这时客户端看到的版本是稳定的,但服务端日志里的分配记录与客户端实际渲染的版本对不上。检查方法是:取同一时间窗口内的服务端分配日志和前端埋点中的版本标识,按访客标识做关联,看两者一致率。一致率明显低于分流配置的预期,就说明缓存层覆盖了分配结果。
很多人识别样本污染时习惯对比两个版本的转化率或点击率均值。但均值差异既可能来自版本效果,也可能来自样本构成不同,无法区分原因。更可靠的做法是纵向追踪同一批访客标识。
具体动作是:从站内统计中导出带访客标识、时间戳、版本标识的原始事件表,按访客标识分组,统计每个访客出现过的版本数量。如果一个访客在统计窗口内只出现一个版本,说明该访客的样本是干净的;如果出现两个及以上版本,就标记为污染样本。然后计算污染样本占总样本的比例,以及污染样本在两个版本中的分布是否对称。
这个动作的结果会直接影响下一步:如果污染比例很低且分布对称,版本对比的结论仍可参考,但需要在报告中注明;如果污染比例较高或分布明显偏向某一版本,那么当前对比数据不足以支撑决策,应先修复分流再重新收集。这里不需要设定一个固定的污染比例阈值,因为阈值取决于你对结论精度的要求,而不是某个通用标准。
即使分流本身是稳定的,统计口径也可能制造出“样本污染”的假象。常见情况是:站内统计按会话去重,而会话边界在版本切换时被重新划分。例如访客先看到A版本,几分钟后通过站内链接进入B版本页面,统计工具把这次跳转记为新的会话,于是同一访客在两个版本中各贡献了一个会话。
识别这种口径问题的方法是:对比按访客去重和按会话去重两种口径下的版本分布。如果按访客去重时污染比例很低,按会话去重时污染比例明显升高,那么问题出在会话划分规则,而不是分流逻辑。此时需要调整统计口径,或者在分析时统一按访客维度聚合。
另一种口径问题是第三方估算流量与站内统计的差异。第三方工具通常无法看到你的分组标识,它给出的流量变化只能作为背景参考,不能用来判断样本污染。站内事件表才是可核查的证据链。
假设某页面用服务端分流,缓存键只包含URL和设备类型,不包含分组标识。第一个访客被分到A版本,页面被缓存;第二个访客应分到B版本,但边缘节点直接返回了缓存的A版本。此时前端埋点记录的版本是A,服务端分配日志记录的版本是B。
诊断动作是:按访客标识关联服务端分配日志和前端埋点,计算版本一致率。如果一致率显著低于分流配置的预期,且不一致的记录集中在缓存命中率高的时段,就可以把缓存键缺失列为候选原因。修复动作是在缓存键中加入分组标识,然后重新验证一致率。这个例子的数字仅用于说明比较方法,不代表任何真实项目的表现。
并非所有版本切换都需要立即处理。如果污染样本在两组之间近似对称,且污染比例相对于版本差异很小,那么版本对比的方向性结论仍然成立。判断依据是:污染样本的版本分布是否与整体样本的版本分布接近。如果接近,说明污染没有系统性地偏向某一版本。
但有一种情况必须停止分析:当污染样本的版本分布明显偏向某一版本时,任何均值对比都可能被样本构成差异解释,而不是版本效果。此时继续分析只会得到不可靠的结论。正确的下一步是先修复分流或统计口径,再重新收集数据。
最后提醒一点:请求量、抓取量或某项统计归零,不能单独证明分流处理正确。它可能来自流量下降、埋点故障、缓存策略变化或统计口径调整。只有把分流日志、前端埋点和统计口径三者对齐,才能确认样本是否真的干净。