先给结论:发现源数据有缺项时,不要先补一个“看起来合理”的值,而要把缺项变成显式状态,并切断它向下游计算、聚合与展示的传播路径。你要做的是三步:标记缺失、隔离依赖、用可核对证据判断影响范围。缺项本身很少直接毁掉一篇博客,真正的问题是它被当成正常值参与运算或判断,最后让读者看到一个错误结论。
同样是空值,处理方式完全不同。先把缺项归到下面三类,后续动作才不会乱。
判断依据只有一个:这个字段在业务上是否必然存在。如果必然存在却为空,就是采集或同步问题;如果不必然存在,就按结构性缺失处理。把这三类混在一起,是错误扩散最常见的起点。
很多错误不是缺项造成的,而是缺项被默认成 0、空字符串或上一行的值。你可以用下面的顺序改造手中的资料或页面:
status,取值限定为 ok、missing、not_applicable。不要用空值同时表示“没采到”和“本来就没有”。missing 时直接跳过该行,而不是用 0 参与求和或求平均。0 会拉低均值,造成“整体下降”的假象。missing 显示为“暂无数据”,对 not_applicable 显示为“不适用”。两者对读者的含义不同,不能合并。一个假设例子:你统计 10 篇文章的阅读完成率,其中 2 篇的阅读时长字段缺失。如果把这 2 篇按 0 分钟计入,平均完成率会被明显拉低;如果跳过这 2 篇,你得到的是 8 篇的结果,但必须在结论里注明样本是 8 篇。两种做法都可以成立,前提是分母和缺失状态一致,并且读者能看到这个前提。
出现与直觉相反的结果时,先别急着改结论。缺项、采集差异和真实需求变化都会产生类似现象,需要分开验证。
请求量或抓取量归零,不能单独证明你的处理是对的。它也可能是采集端故障、访问限制或统计延迟造成的。要确认处理有效,至少需要两个独立来源同时显示缺失率下降,并且下游计算不再把缺失行计入分母。
当你确认源数据有缺项,按下面顺序操作,能最快阻止错误继续扩散:
missing,同时记录缺失发生的时间点和来源批次,便于回源补采。这个顺序的关键是:先切断传播,再补数据,最后才改结论。反过来做,很容易用补出来的假值掩盖真正的缺项。
补值不是绝对禁止,但条件很窄。只有在同时满足下面两点时,才考虑用可解释的规则补值:一是缺失原因已经查明且不会再发生,二是补值规则可以被读者复核。例如用同一篇文章前后两次采集的稳定值回填,并注明回填依据。
如果缺失原因不明、缺失比例在上升,或者补值会改变结论方向,就必须留空并标注。留空不会让博客失去价值,把缺项伪装成正常值才会。一次改动前后比较时,还要考虑季节、搜索需求变化和数据采集差异,不能把全部差异都归给这次改动。
把缺项当成一种需要显式表达的状态,而不是需要消灭的异常,你的下游计算、页面展示和结论都会更稳。下一步动作很简单:打开你手头那份资料,给每个可能缺失的字段加一个状态列,然后只重算一次,看差异落在哪些行上。