缺失值处理(上):识别缺失模式、删除策略的适用场景

各位同学,咱们今天聊一个绕不开的话题——缺失值。

做ESG数据清洗,我敢说,你遇到的第一个拦路虎就是缺失值。ESG数据不像股票行情数据那么规整,很多公司披露的数据东缺一块西少一块。我个人习惯,拿到数据第一件事不是跑模型,而是先看看缺失值长什么样。

一、缺失值长什么样?先摸清“敌情”

缺失值不是简单的“空”就完了。它背后有模式,有规律。我见过太多人上来就删,结果把有用的信息也删掉了。

常见的缺失模式有三种:

  • 完全随机缺失(MCAR):缺失跟数据本身没关系。比如数据录入时随机漏掉了几行。这种情况很少见,但处理起来最简单。
  • 随机缺失(MAR):缺失跟其他变量有关,但跟自身无关。举个例子,小市值公司可能更不愿意披露ESG数据,但缺失本身跟ESG得分高低没关系。
  • 非随机缺失(MNAR):缺失跟自身有关。比如ESG得分低的公司故意不披露坏数据。这是最头疼的,删除策略基本无效。

怎么识别?我一般先画个缺失矩阵图。用Python的missingno库,一行代码就能看到缺失的分布。

import missingno as msno
import matplotlib.pyplot as plt

# 假设df是你的ESG评分数据
msno.matrix(df)
plt.show()

这张图能告诉你:哪些列缺失多?哪些行缺失多?缺失是不是集中在某些区域?

我曾经处理过一家评级机构的数据,发现环境(E)维度的缺失值集中在2019年之前。为什么?因为那一年很多公司还没开始披露碳排放数据。这就是典型的MAR模式——缺失跟时间有关。

核心观点:别急着处理缺失值。先花10分钟看看缺失模式,能省你后面2小时的无用功。

二、行删除:什么时候该“一刀切”?

行删除,说白了就是把有缺失值的样本整行删掉。简单粗暴,但适用场景很有限。

适用场景一:缺失比例极低

如果缺失值占比不到1%,而且你确信是MCAR模式,行删除没问题。比如1000家公司里只有3家缺了董事会多样性数据,删了就删了,影响不大。

适用场景二:你只需要完整样本做回归分析

很多统计模型要求输入数据完整。如果你做的是线性回归、逻辑回归,行删除是最省事的办法。但要注意,样本量不能太少。

什么时候千万别用行删除?

  • 缺失比例超过5%——你会丢掉太多信息
  • 缺失是非随机的——你会引入偏差
  • 你的样本量本来就小——比如只有50家公司,删掉10家,模型还怎么跑?

避坑指南:我曾经在做一个ESG因子回测时,用了行删除,结果发现回测结果异常好。后来一查,原来删掉的全是表现差的公司。说白了,你删掉的不只是缺失值,还有背后的信息。这叫“幸存者偏差”。

三、列删除:什么时候该“砍掉一列”?

列删除,就是直接扔掉某个变量。听起来更狠,但有时候这是最明智的选择。

适用场景一:缺失率超过70%

如果一个ESG指标,比如“供应链环境审计得分”,70%的公司都没披露。你想想看,这个变量还能用吗?强行插补出来的数据,你敢信吗?

我个人习惯,缺失率超过60%的列,直接砍掉。除非这个指标特别重要,比如碳排放数据,那我会考虑用其他方法。

适用场景二:变量之间高度相关

ESG数据里有很多冗余指标。比如“员工培训时长”和“员工培训覆盖率”,相关性可能高达0.9。如果其中一个缺失严重,直接删掉那个缺失多的,保留另一个就行。

适用场景三:变量对模型贡献极小

你可以先跑一个简单的模型,看看特征重要性。如果某个变量重要性垫底,缺失又多,留着干嘛?删了还能降低维度灾难。

小技巧:列删除前,先算一下“缺失率 + 变量重要性”的权衡。我一般画个散点图,横轴是缺失率,纵轴是特征重要性。落在右下角的变量,优先考虑删除。

四、行删除 vs 列删除:怎么选?

我整理了一个对比表,方便你快速决策:

维度 行删除 列删除
适用缺失率 <5% >60%
样本量影响 减少样本数 减少变量数
偏差风险 高(非随机缺失时) 低(变量本身不重要时)
典型场景 回归分析、小样本缺失 高缺失率变量、冗余变量
代码实现 df.dropna() df.drop(columns=['col'])

嗯,这里要注意:行删除和列删除不是互斥的。你可以先做列删除,砍掉那些没救的变量,再做行删除,去掉那些零星缺失的样本。

五、实战中的决策流程

我一般按这个流程走:

  1. 第一步:计算每列的缺失率。缺失率 > 60% 的,直接标记为“待删除”。
  2. 第二步:对剩下的列,计算缺失模式。看看是MCAR、MAR还是MNAR。
  3. 第三步:如果是MCAR且缺失率 < 5%,行删除。
  4. 第四步:如果是MAR或MNAR,或者缺失率在5%-60%之间,别急着删。下一章我们会讲插补方法。

说白了,删除策略只是第一步。真正考验功夫的,是后面的插补和合成。

一句话总结:行删除是“刮骨疗毒”,列删除是“断臂求生”。两者都是不得已而为之,但用对了地方,能帮你快速清理数据。

好了,这一章就到这里。记住,缺失值处理没有银弹。多看图,多思考,别上来就删。


公众号:蓝海资料掘金营,微信deep3321