“满意度”这一列有 40 个空。把空行筛掉,剩下 60 个人平均打 4.0 分,报告上写“满意度 4.0,达标”。

这个动作在代码里往往只是加一句 WHERE 评分 IS NOT NULL。它做了两件事:拿走 40 条记录;把“被调研的 100 位客户”换成“愿意打分的 60 位客户”。第二件事才决定结论对不对。

同一个 4.0,可能对应两种真相

故事一: 问卷系统故障,40 份回复被随机丢掉。剩下的 60 个人大致是全体客户的缩影,4.0 可以作为全体的估计,代价只是样本少了、误差范围宽了。

故事二: 问卷放在页面最底下,只有耐心滑到底、体验还不错的人才会打分。假设那 40 个人其实平均只打 2.0 分,全体真值就是:

60×4.0+40×2.0100=3.2\frac{60\times 4.0 + 40\times 2.0}{100} = 3.2

你当然不知道那 40 个人打了几分。但你能算出范围:评分最低 1 分、最高 5 分,真值就落在

240+40×1100=2.8到240+40×5100=4.4\frac{240+40\times 1}{100}=2.8 \quad\text{到}\quad \frac{240+40\times 5}{100}=4.4

之间。如果判断线是“4.0 达标”,这个区间跨过了判断线:按最乐观的填法刚好达标,按最悲观的填法明显不达标。删掉空值后报出的 4.0,等于把区间的乐观端点当成了唯一答案。

两次缺失比例一模一样,结论却一个稳、一个悬。区别不在缺了多少,而在 谁缺了。

删掉行,等于偷偷换掉了你在描述的那群人

你报出的每一个数,背后都藏着一个分母。筛选动作改的就是这个分母。

改分母本身不必然错。只有当被删掉的那批人,在 你要测的那件事上 跟留下的人不一样时,才会错。故事一里他们没差别,故事二里差别巨大。

这和上一篇讲的偏差是同一回事。波动方向随机,多抽几批会互相抵消,加样本能压住;偏差方向固定,加样本只是让你更自信。缺失一旦与被测的值有关,就属于后者——那 40 个人不是随机消失的,是 因为不想给高分而不出现的。

判断能不能删,先分清三种“为什么空”

完全随机缺失(MCAR): 谁缺、谁不缺跟任何变量都无关。系统随机故障丢了一批问卷属于这种。

随机缺失(MAR): 缺失跟 已经记录在案的变量 有关,但跟那个没记下来的值本身无关。比如男性更不愿意填抑郁量表——性别这一列你有,所以这种缺失讲得通、补得回。

非随机缺失(MNAR): 缺失跟 那个缺失值本身 有关。收入高的人更不想报收入;对服务不满的人直接关掉问卷。故事二就是这种。

一句话概括判断标准:被删掉的人,在你要测的那个数上,跟留下的人是否不同?

  • 看不出不同 → 删掉只是浪费信息,样本量一减,波动范围变宽。
  • 不同,但这种不同完全体现在你已有的列里 → 删掉有偏,但有救:按那些列分层各自比较,或者用能利用这些列的方法去补。
  • 不同,而且跟那个值本身有关 → 删掉必然有偏,而且从这份数据内部修不好。

要提醒一句:缺失机制没法只靠数据判定。 有一类检验能拒绝“完全随机”这个假设,但检验不显著不等于缺失就是随机的;至于“缺失是否与被测的值有关”,你手里根本没有那些缺失的值,原则上无法检验。这一步靠的是你对数据怎么产生的理解,而不是跑一个程序。

不删,改成填呢:均值插补保住了中心,改掉了别的

最省事的填法是把空值都填成这一列的均值。听起来很温和:均值不动,那结论不就稳了吗?

均值确实没动,别的东西全动了。还是上面的例子,60 个已观测评分均值 4.0、标准差约 0.8。把 40 个空全填成 4.0 之后,这些数相对均值的偏离都是 0,平方和一点没增加,分母却从 60 变成了 100:标准差降到约 0.62,均值的标准误从 0.80/60≈0.1030.80/\sqrt{60}\approx 0.103 降到 0.62/100≈0.0620.62/\sqrt{100}\approx 0.062,误差范围窄了近四成。

问题就在这四成里。软件把填进去的数当成真实观测,你的样本量凭空涨了 40,误差范围跟着缩水——可缺失恰恰是“这个数有多确定”出问题的地方,你却在这里把不确定性抹掉了。填均值做的事,是把“不知道”改写成“知道了,而且正好在中间”,再把这份伪造的确定性写进结论。它还会把分布压平:原本右偏或双峰的形状,被填成中间一柱。

想正经补,方法是 多重插补:填出几份略有差异的完整数据,分别分析再合并,让缺失带来的不确定性重新进入误差范围。它只在 MAR 假设下可靠;到了非随机缺失那一类,没有方法能担保结果无偏。

动手之前,先看四样东西

  1. 缺失率和缺失分布。 哪几列缺、缺多少、是不是集中在同一批行。整批集中缺失通常指向流程事件(某天系统故障、某段时间没采这个字段),零散缺失更可能来自个人选择。
  2. 有缺失的行和没缺失的行,在你已经观测到的列上比一比。 这是不用任何统计工具就能做的动作:如果缺评分的人里投诉率是其他人的 3 倍,你就已经知道他们不一样了。
  3. 这个“空”是哪一种空。 是真的为零(没成交订单的金额确实是 0),还是“没有值”,还是“没记录”?三者性质完全不同,填 0 有时完全正确,有时错得离谱。还要认出伪装成数字的空:-1、9999。
  4. 缺失的原因有没有被记下来。 问卷系统里的“跳过/拒答/超时”、埋点里的空事件,往往直接告诉你属于哪一类。

一条可以照着走的顺序

绘制中

最后那条路对应的具体做法是 敏感度分析:把缺失值分别按最有利和最不利的情况填一遍,看结论会不会翻转。上面的例子里,就是把 40 个空先全填 1 分、再全填 5 分,得到 2.8 和 4.4。如果结论在这两端之间来回翻,那它就不算一个结论,只算一个猜法。

边界

“删除一定错”是过头话。 在完全随机缺失下,删除是无偏的,只是浪费了信息;缺失比例很小时这点影响可以忽略——有人给出的经验法则是超过 5% 就别默认删除,但这只是经验,不是定律。更细一层:即使在随机缺失下,如果缺失只跟解释变量有关、跟你要预测的结果无关,删除往往也没偏。

“插补一定对”同样是过头话。 每一种插补都在替缺失值假设一个分布,而这个假设用数据检验不了。

最省事的办法始终是别让它缺:关键字段设成必填,问卷放在流程里而不是流程末尾,在数据生成的那一刻就记下“他为什么没答”。等数据躺在表格里再想,你能做的只剩判断和坦白。

空值本身不改结论。改结论的是:你在删掉它的同一刻,也删掉了一部分人。