数据缺失比数据错误更隐蔽
错误和缺失的区别在于有没有触发人的注意。错误的数字往往偏离常识,一眼就能看出来。空值没有任何异常特征,它在表格里和背景融为一体,除非你专门去找,否则不会注意到它的存在。
缺失的第二种隐蔽性来自工具的处理方式。多数表格软件在计算时会自动跳过空值,所以平均值、求和这些结果看上去都很正常。工具没有骗人,它只是按自己的规则处理了,但这个处理结果未必是你想要的。
第三种隐蔽性来自缺失与正常的混淆。有些字段为空本身是合理的,比如没有退款的订单退款原因为空。当合理的空和不合理的空混在一起,你就很难分辨哪些该处理,哪些不用管。
还有一个隐蔽的地方是缺失会随时间积累。今天漏一个字段,明天漏另一个,单次看不出问题。一两个月之后,某几个字段的空值比例可能已经到了不可用的程度,而这个过程是逐步发生的,没有任何一个时间点会报警。
判断自己有没有被缺失影响,可以做一个测试:随便挑一个你常用的指标,把来源数据里空值的那部分单独拿出来,看看如果它们有值,结果会不会变化。如果变化明显,说明这个指标一直建立在不完整的样本上。
排查缺失的第一个动作是把它显性化。在表格里统计每一列的空值数量,看看哪些列有空、各有多少。这个动作几秒钟就能做完,但它能把一批看不见的问题变成一张看得见的清单。
第二步是区分合理空值和异常空值。看这个字段的定义,在它该有值的情况下是不是空的。比如已经完成的订单,签收时间就该有值;如果没有,那就是缺失。用这个标准过一遍,异常的部分就浮出来了。
第三步是看缺失的分布。是随机散落还是集中在某个时间段、某个品类、某几个人填的。随机分布通常指向偶发遗漏,集中分布指向流程或者系统层面的问题,两者的处理方向完全不同。
第四步是量化影响。把这个字段的空值样本单独拿出来,看它们和完整样本在其他字段上有没有明显差异。如果有差异,说明缺失不是随机的,那么基于完整样本得出的结论就不能代表整体情况。
第五步才是动手处理。经过前面四步,你已经知道缺的是什么、属于哪一类、影响有多大,处理起来就有了明确的方向。跳过前四步直接填数,是处理缺失时最常见的错误,往往越填越乱。
举一个具体案例。一家店铺统计各商品的运费占比,某个商品算出来的比例异常低,看起来是个运费很划算的品。实际原因是有几笔订单的运费字段是空的,被自动跳过了,分母里没有它们。这个结论完全建立在不完整的样本上。
这个案例里最值得注意的一点是,如果不去统计空值数量,这个问题永远不会被发现。运费占比这个数值本身没有异常,它在合理范围里,只是构成它的样本比应该有的少了一部分。
另一个案例关于退款原因。店铺想分析主要退款原因来改善商品,结果显示某个原因占比最高。但退款原因为空的订单没有被计入任何一类,而这些空值恰好集中在一类商品上。分类统计的结论因此偏向了另一批商品。
还有一个更微妙的情况是缺失掩盖了另一些问题。某段时间成本字段大面积为空,导致测算出的利润率偏高。团队据此判断这段时间经营状况良好,直到后来补上成本才发现实际情况要差一些。掩盖问题比制造问题更难发现。
边界条件在于,缺失的影响大小和字段的用途强相关。同样缺百分之五,用在核心指标上可能就是严重问题,用在辅助参考上就无关紧要。判断严重程度时先看它用在哪里,而不是只看缺口比例。

缺失处理的第一步是承认它是空的,而不是给它一个数
空字段通常出现在哪里
第一类出现在手工录入的环节。成本、运费、包装重量这类字段平台不会自动带上,需要人为填写。人一忙就会漏,尤其是新上架的商品,第一步先把商品挂上去,细节打算之后再补,然后就忘了。
第二类出现在多来源拼接的环节。从不同入口导出的数据拼成一张表时,两个来源的字段名不完全一样,拼接之后就有一批行对应不上。这类缺失的特征是集中在一段时间或者一批商品上,呈块状分布。
第三类出现在状态尚未推进的环节。物流签收时间、退款完成时间、结算到账时间,这些字段在流程走完之前本来就是空的。这种属于时间未到,不是真正的缺失,但如果不加区分,会误判为数据问题。
第四类出现在分类字段上。商品属性、退款原因、买家来源这些由人来选的选项,遇到拿不准的时候容易被留空。这类缺失的分布往往不均匀,某些品类或者某些场景下特别集中,背后可能有规则上的模糊。
第五类出现在关系表连接处。当两张表通过某个编号关联时,编号缺失或者格式不一致的行会连不上,关联之后那部分字段就是空的。这类缺失通常表现为某些行的多个字段同时为空,而不是单独一个字段。
找到位置的方法之一是看时间分布。把空值按日期统计出来,看看它们集中在哪几天。集中在某几天说明那几天有特殊情况,比如换了人、上了新流程、系统做了调整,顺着时间点往回查通常能直接找到原因。
方法之二是看商品分布。把空值按商品类别或者具体商品统计,看是不是集中在某一类。集中在某一类说明这类商品的处理方式不一样,可能是属性字段没定义,可能是这类商品走的是另一套流程。
方法之三是看字段之间的关联。观察空值是不是总是几个字段一起出现。如果是,说明它们共享同一个上游环节,问题出在那个环节而不是各个字段本身。找到共同的入口,比分别处理几个字段有效得多。
方法之四是看不同来源的拼接表。如果数据是从多个入口拼起来的,把各来源分别统计一遍空值,看看差异出现在哪一段。这类问题通常出在拼接那一步,顺着拼接规则查就能定位。
定位清楚之后建议把结果记下来。写清哪类字段容易空、空的原因是什么、下次检查从哪里入手。这份记录积累几次之后,检查数据完整性就变成了一件有章可循的事,而不是每次靠碰运气。
有一个具体场景是关于上新节奏的。一家店铺大促前集中上新了八十多个商品,操作时优先想着把上架速度提上去,成本字段打算之后再补。大促结束后统计利润,发现这批商品的成本栏全是空的,占当期销量的将近一半。
这个场景暴露的是一个节奏问题:上新和补信息被分成了两个阶段,而第二个阶段没有固定的时间表。只要没有时间表,补信息这件事就会被挤到后面,直到某次分析逼着你回头补。
处理这类问题的办法是把补信息挂在流程上。上新之后设置一个固定的检查点,比如上新当天结束前必须把成本字段填完。挂在流程上比依靠自觉可靠得多,因为自觉在忙的时候最先消失。
另一个常出问题的地方是多人协作。一个人负责上架、一个人负责定价,字段填写的责任边界不清楚,两边都以为对方会填。结果是都等着对方,最后谁也没填。责任到字段这个做法能解决大部分这类问题。
边界情况是有些字段本身不该由人来填。如果某个信息在平台上有来源,就不要靠人工录入,直接取过来。人工录入的环节越多,缺失的机会也越多。能用自动的方式就不用手工,这条原则对减少缺失作用很大。

越依赖手工录入的字段,越容易空着
缺失原因分成哪几类
第一类是录入遗漏。人对某个字段的重要性认识不足,或者流程里没有强制填写,导致偶尔漏掉。这类缺失的特征是零散分布,没有明显的规律,抽查几行就能看到填写习惯的不一致。
第二类是来源本身没有。平台在某个环节不提供这个数据,或者只在某些条件下提供。这类缺失是系统性的,会在所有数据上一致地出现,不管你怎么取数都补不回来,处理方式只能是估算或者放弃这个字段。
第三类是口径未覆盖。取数时的筛选条件把一部分数据排除掉了,比如只选了某个状态、某个时间段,导致另一部分没有进来。这类缺失是人为可修复的,重新调整条件取一次就能补上。
第四类是时间未到。流程还在进行中,结果字段自然为空。这类缺失会随时间自行消解,需要做的只是耐心等待,或者在统计时明确把尚未完成的部分排除在外,避免把它当成缺失处理。
第五类是环境变化。字段改名、接口调整、报表结构调整,都会让某一段时间的对应关系断掉。这类缺失的特征是集中出现在某个时间点之后或者之前,时间段非常明确,做一次映射通常就能接上。
分类的时候有一个实用顺序:先判断能不能补,再判断值不值得补。能补且值得补的立刻补,能补但不值得补的先标注,不能补的评估影响后再决定是否估算。这个顺序能避免在无解的问题上浪费时间。
判断能不能补,看的是来源。原始单据、另一个报表、平台的另一个入口,只要有一处存在这个信息,就属于能补。如果所有来源都没有,那就属于来源本身没有,再怎么找也找不到。
判断值不值得补,看的是用途。这个字段参与核心指标计算的,值得花时间去补;只是偶尔看一眼的,标注缺失即可。不是所有缺失都需要处理,分清哪些值得动手,能省下大量时间。
对于不能补的字段,先看它影响的指标有多重要。如果影响的是核心判断,那就考虑按规则估算并明确标注。如果影响很有限,直接承认这个字段不可得,在分析里回避它,也是一种合理的处理。
分类完成之后把结论写进一份简短的说明。写清每个关键字段属于哪一类、能不能补、怎么处理。这份说明让后来的人不必重新分类一遍,也让处理方式在整个团队里保持一致。
举一个关于字段改名的例子。平台的报表里原本有一个商品属性字段,某次调整后换了名字,用旧字段名取数就全是空的。收到报表的人以为那段时间商品属性没有记录过,实际上数据一直在,只是换了标签。
这类问题的特征是断档非常整齐:某个时间点之前全都有值,之后全都是空。看到这种整齐的分布时,第一反应应该是环境发生了变化,而不是数据莫名消失了。顺藤摸瓜去找变更记录,通常很快就能定位。
处理方式就是做一张映射表,把新旧字段名对应起来。做好之后历史数据和新数据能接上,断档消失。映射表要保留下来,因为下一次字段改名还会用到,而且往往改的是同一批字段。
还有一个类别是交接断层。负责人更换的时候,如果只交接了日常工作,没有交接那些需要定期维护的字段,会留下连续几周甚至几个月的空白。这类缺失在事后看来很突兀,但在发生时没有任何人察觉。
边界条件是这一类缺失往往能补回来一部分。如果那段时间的单据还在,就能按单据补。补的时候要注明这是事后补录的,与当时实时录入的数据在可信度上略有差别,尤其是时间敏感的字段。
| 缺失类型 | 典型场景 | 能否补回 | 处理方式 | ||||
|---|---|---|---|---|---|---|---|
| 录 | 入 | 遗 | 漏 | ||||
| 手 | 工 | 填 | 写 | 漏 | 了 | 一 | 栏 |
| 能 | |||||||
| 回 | 原 | 始 | 来 | 源 | 补 | 齐 |
补数据的可行路径
第一条路径是回原始来源。如果缺的是手工录入的成本,就去看采购单据;缺的是商品属性,就去看商品详情。这条路径得到的是真实数据,可信度最高,代价是需要人工去找,适合缺得不多的情况。
第二条路径是调整取数条件重新拉一次。如果缺的是口径未覆盖的那部分,改一下筛选条件就能拿到。这条路径成本很低,但前提是先确认真的是口径问题,而不是来源没有,否则重拉几次结果都一样。
第三条路径是跨表关联。如果另一个报表里有这个字段,可以通过订单编号或者商品编号关联过来。这条路径要求两边有共同的键值,并且键值的格式一致。关联前检查一遍格式,能避免大量关联不上。
第四条路径是等。对于状态尚未推进的字段,等待是最合适的处理方式。强行现在就补,只能靠猜。等一个完整周期再取数,数据自然就完整了,这比任何估算都可靠。
第五条路径是向对接人要。如果是平台口径或者结算规则上的疑问,问对接人比自己推测更直接。问的时候带上具体的问题和例子,说明你缺的是哪个字段、影响的是什么判断,得到的回答会具体得多。
选择路径时先看缺失的量。缺得很少,逐笔去原始来源找是最靠谱的。缺得很多,逐笔找的成本会非常高,这时候就要考虑批量关联或者按规则估算,先解决大头,剩下的零散部分再单独处理。
第二条经验是先补近期再补历史。近期的数据会影响现在的判断,历史数据主要影响回顾。如果精力有限,先把最近一个月的数据补完整,历史部分可以标注后放着,不必一次性全补上。
第三条经验是补之前先备份。在原表上直接覆盖,一旦补的过程中出错或者补错了,原始状态就找不回来了。留一份备份再动手,成本是几秒钟,收益是任何时候都能回退。
第四条经验是补的过程中留下痕迹。哪些行补了、补的值是多少、从哪里来的,都记下来。批量补数据最怕的是补完自己也说不清哪几行动过,出问题的时候无从查起。
还有一个提醒:补数据不要追求一次补到完美。先把关键字段补上,让当期的分析能跑起来,剩下的边跑边补。追求一步到位往往会让整个分析被推迟很久,实际价值反而下降。
有一个补数据的实际案例。一家店铺发现三个月的历史订单缺少成本数据,涉及上千笔。逐笔去找显然不现实,他们的做法是先从采购记录里找到这段时间的采购单价,按商品编号做一次映射批量填上。
这个做法有效的原因是商品的成本在三个月内没有大幅变动。用这个前提做批量补,效率很高。但需要注意,前提一旦不成立,这个做法就会产生系统性偏差。用之前先验证前提,比事后纠正容易得多。
补完之后他们做了一件事:抽查二十笔,和实际采购单据比对,看误差有多大。抽查的结果显示误差在很小的范围内,这批补数据就被接受了。抽查这一步不能省,它是补数据可不可以用的判断依据。
另一个案例是关于物流时间的。一批订单的签收时间为空,原因是这些订单还在运输途中。处理方式是等到物流走完再取一次数,而不是现在就估算。时间未到这类缺失,等是成本最低也最准确的做法。
边界情况是补数据的时效性。今天能补回来的信息,过一个月可能就补不回来了,因为原始单据可能被归档或者清理。发现缺失之后尽早处理,比拖到季度末再补要容易得多,成本也低得多。
补不了的时候怎么估算
估算的第一种方式是分类均值。把数据按一个稳定的维度分组,用同组内其他样本的均值来填充。比如缺失的运费可以按重量区间或者目的地区间的均值来估。分组越细,估算越接近真实,但每组还要留下足够的样本。
第二种方式是用比例推算。当缺失的是金额类字段,可以用已知的比例关系来推。比如运费占商品价的比例在同类商品里相对稳定,用这个比例和已知的商品价去推缺失的运费。用之前要验证一下这个比例的稳定性。
第三种方式是上一期沿用。对于变化缓慢的字段,比如包装重量、商品成本,用上一期的值填补是可接受的。前提是这个字段确实不常变,对于价格波动大的字段就不能这么处理。
估算的通用原则是宁可粗一点也要写明方法。选择一种能说清楚的做法,并把它记下来。如果你自己都说不清这个数是怎么来的,那么任何一个据此作出的判断都缺少根基。
还有一个原则是估算只用于分析,不用于核算。做趋势判断、看大体结构的时候,估算可以接受。涉及结算、成本核算、绩效计算这类场景,估算数不应该被当作真实数据使用,这类场景宁可留空。
估算之前先做一次小样本验证。拿一批已知的数据,假设它们是缺失的,用你打算采用的估算方法算一遍,再和真实值比一比。误差在可接受范围内的,方法可以用;误差很大的,换一种方法再试。
验证的样本不必很大,二三十条就够。关键是样本要覆盖不同的情况,比如不同品类、不同价格区间,这样验证出来的误差才有代表性,而不是只在一类数据上准确。
估算方法选定之后写下来,包括规则、参数、适用范围。写下来的好处一是团队里其他人可以复用,二是当结论被质疑的时候,你能说明这个数是怎么来的,而不是只能说大概是估的。
估算结果要分批标注。整体估算的和局部估算的、用均值填的和用比例推的,分别用不同标记。不同方法的可靠性不一样,混在一起标注会让人无法判断哪些数更值得相信。
还有一个原则是定期回看。等真实数据后来补齐了,和当初的估算比一比,看看误差有多大。误差持续偏大的方法应该弃用,误差稳定的方法可以继续用。这个回看的动作能让估算质量慢慢提高。
举一个估算的具体场景。某段时间的运费字段缺失较多,处理方式是按重量区间分组,用每个区间内已知运费的均值来填。分组之后每组的样本还有几十条,估算的结果比较稳定。
判断这个估算能不能用,可以看它和已知数据的分布是否吻合。填完之后看整列的分布,如果出现了明显的异常尖峰或者断层,说明估算引入了不自然的特征。分布自然,估算才站得住。
另一个场景是用比例推算。有些店铺的包装成本和商品售价之间存在大致的比例关系,缺失的包装成本可以按这个比例和售价推出来。用这个方式之前,要验证比例在不同品类之间是否稳定。
还有一种情况是估算也无从下手。字段之间没有任何稳定的关联,同类样本的数量也不够。这时候正确的处理是明确标注为不可估算,在分析里主动排除这批样本,而不是随便给一个数让它看起来完整。
估算的质量可以用一个简单的方式跟踪:等真实数据后来补齐了,回顾一下当初的估算误差。连续观察几次之后,你会知道哪种估算方法在你的数据上更靠谱,也会知道哪类字段根本不该估算。

缺失最麻烦的地方是它不报错,只让结论悄悄偏掉
标记缺失值的记录习惯
标记的第一个要求是区分空的原因。同样是空,可能是尚未发生、可能是遗漏、可能是来源没有。用不同的标记区分开,后续处理时就不用重新判断一遍。标记符号不必复杂,一个字母或者一个简短词就够。
标记的第二个要求是保留原始值。估算之后不要直接覆盖原来的空值,而是把估算值放在另一列,或者用标记注明这是估算。原始的空值本身也是信息,它告诉你这个位置从来没有真实数据。
标记的第三个要求是能追溯方法。看到标记之后能查到估算是怎么做出来的,用了什么规则、依据什么假设。可以把这个说明集中写在表格的一个说明区,或者单独放在一份简短的说明文档里。
标记的第四个要求是统计比例。每隔一段时间算一次各类缺失占全部样本的比例,看着这个比例的变化。比例上升说明某个环节出了问题,比等到具体某个分析出错再回头查要主动得多。
标记的习惯建立起来之后,一个附带的好处是数据会变得可分。你可以随时选择只分析完整样本,或者把估算样本单独拿出来看。有选择的前提是有标记,没有标记就只能整体接受或者整体放弃。
标记从最小的一步开始就好。先约定一个符号表示该有值但没有,另一个符号表示本来就没有值。两个符号就能覆盖大部分情况,不用一开始就设计复杂的标记体系,那样反而没人愿意用。
标记之后要能统计。如果标记是写在单元格里的文字,统计会比较麻烦。用统一的短符号,或者单独开一列做标记,统计起来就容易得多。标记的目的是能用,不是好看。
统计出来的结果建议做成一条简单的记录。每次检查时写清日期、哪个字段、有多少个缺失。连续记录几次之后,你会看到完整率是在改善还是恶化,这个趋势比单次的数字更有意义。
对于已经估算过的位置,标记里可以带上估算方法的代号。比如用字母区分均值填充和比例推算。这些代号在说明里解释一次,之后团队里所有人看标记都能明白含义。
标记的最后一层是让它进入工作流程。每次做分析之前先看一眼标记情况,而不是分析完发现问题再回头查。把标记检查变成分析前的固定动作,缺失就不会在结论里悄悄起作用了。
有一个关于标记作用的例子。一家店铺的表格里,成本列有估算值也有真实值,最初没有区分。后来做成本分析时,没人能说清哪些是估算的,只能整列放弃使用,前期补数据的功夫白费了一半。
加了标记之后就不同了。分析时可以只选真实值那部分做严格测算,也可以把估算值一起纳入看大体趋势。同一份数据有了两种用法,这是标记带来的直接价值,成本只是多打一个符号。
还有一个细节是标记要写在同一个地方。有人标在备注里、有人标在颜色上、有人标在旁边的列里,三种方式混在一起,统计的时候就得人工一个个看。统一一种方式,后面的统计才能自动化。
边界情况是标记也可能被误用。如果标记符号被用在了不该用的地方,比如把正常的零值也标成缺失,那就会干扰判断。约定符号的时候要把定义写清楚,哪种情况用哪个符号,避免各自理解不同。
最后一个建议是把标记和说明放在一起。表格里用符号,说明文档里解释符号的含义和每种估算方法的规则。两边配合,任何一个人打开表格都能看懂,不必去问当初填表的人,这在常规场合不算什么,但在人员流动之后就显出价值了。

把缺失显式记录下来,比把它藏起来更有用
减少缺失的前置动作
第一个动作是给关键字段加校验。在录入表格里对必填项设置提示,或者用条件格式把空的单元格标出来。校验的作用不是防止所有遗漏,而是让遗漏在发生的时候就被看到,而不是等到分析时才暴露。
第二个动作是把补录安排在固定节奏里。比如每周固定抽半小时检查一次上周的数据完整性,把缺的补上。节奏化的好处是不依赖记忆,缺的东西不会一直拖到月底才被发现。
第三个动作是稳定数据来源。尽量让同一个字段始终从同一个入口取,减少拼接环节。来源一多,字段名和格式的差异就会带来大量关联不上的情况,而这类缺失最消耗排查时间。
第四个动作是给字段改名做映射表。平台调整字段名或者报表结构调整时,立刻记下新旧对应关系,写进一张映射表里。这样历史数据和新数据能接上,不会因为改名而出现一段空白。
第五个动作是把责任落到人。每个关键字段指定一个人负责,缺了由他补。没有责任人的字段,大家都会觉得是别人的事,最后就是谁都不管。这件事的成本很低,但对减少缺失的效果非常直接。
落地的时候从影响最大的那个字段开始。找出目前在用的核心指标里,哪个受缺失影响最严重,先解决它。解决一个关键字段带来的改善,通常大过同时铺开处理五六个次要字段。
第二个动作是把检查放进既有的周常里。不要新建一套独立的流程,而是挂在已经固定要做的事情上,比如每周做数据汇总的时候顺手看一眼空值数量。挂在既有节奏上的动作更容易长期坚持。
第三个动作是给缺失记录下来但不追究。检查的目的是发现问题、改善流程,不是找人负责。如果检查变成了追责,填报的人会想办法把空值填上凑数,反而制造出更麻烦的假数据。
第四个动作是定期回看改善效果。解决了一个原因之后,隔一个月看看这个字段的空值比例有没有下降。没有下降说明原因判断错了或者动作没落地,需要重新看一遍。有下降就说明做法有效,可以继续。
最后一个动作是接受一部分缺失长期存在。有些字段的来源本身就不稳定,能做到的最好状态就是缺得少一点,而不是完全补齐。承认这个现实,把精力放到能改善的地方,比反复纠缠更实际。
有一个具体的改善案例。一家店铺发现商品属性字段的缺失比例一直偏高,查下来是因为填写表单里这个字段不是必填项,很多人图省事就跳过了。把它改成必填之后,缺失比例明显下降。
这个案例说明前置动作有时候只是一个设置上的改动,不需要复杂的方案。关键在于先查清原因,知道缺的原因是流程允许跳过,那么改流程就是最直接的解法,成本很低。
另一个案例是关于数据来源的。一家店铺的订单数据从两个入口分别导出再拼接,字段名有细微差别,拼接时总有一部分对不上。后来统一只从一个入口取数,拼接环节取消,这类缺失就不再出现了。
还有一个不容易注意的前置动作是文档。把关键字段的定义、来源、负责人写在一份简短说明里。当有人问起某个字段怎么填、从哪取的时候,翻一下文档就有答案,不必每次去问同一个人,也就减少了因为不清楚而跳过的情况。
最后一个边界提醒是前置动作的效果需要时间才能显现。刚改完流程的头两周,缺失比例可能没有明显变化,因为习惯的调整需要过程。建议观察一个月以上的趋势再判断做法有没有效,不要因为短期没变化就放弃。