3. 缺失值处理策略
数据缺失,是ESG评分里最让人头疼的问题之一。我做了这么多年数据治理,可以说十个项目里有九个都栽在缺失值上。你想想看,一家公司明明披露了碳排放数据,但社会维度里的员工流失率却是空的——这种“偏科”现象太常见了。
处理缺失值,第一步不是动手填数,而是先搞清楚:数据为什么缺失?
3.1 缺失值类型:MCAR / MAR / MNAR
这三种类型,说白了就是缺失的“动机”不同。我习惯用一个比喻来理解:
- MCAR(完全随机缺失):就像考试时有人忘带笔,跟成绩好坏没关系。数据缺失完全是偶然的,跟其他变量无关。
- MAR(随机缺失):有点像“学霸不爱写简单题”——缺失跟其他变量有关,但跟自身无关。比如,高营收的公司可能更不愿意披露某些负面指标。
- MNAR(非随机缺失):这是最麻烦的。缺失本身就是因为数据“不好看”。比如,碳排放超标的企业故意不披露数据。
核心判断逻辑:
MCAR 可以用删除法;MAR 可以用填充法;MNAR 必须建模处理,否则偏差会很大。
我在项目中遇到过一家能源公司,它的环境评分里“废弃物回收率”字段缺失率高达40%。一开始我以为是MCAR,后来一查——那些缺失的样本,恰恰是回收率最低的几家工厂。这就是典型的MNAR。如果直接填充均值,评分会虚高,误导投资者。
3.2 删除法:简单但代价高
删除法是最直接的办法。但我建议你谨慎使用。
- 整行删除:如果缺失率低于5%,且是MCAR,可以删。但ESG数据往往样本量不大,删一行可能就损失一个行业的关键样本。
- 整列删除:如果某个指标缺失率超过70%,我一般直接放弃这个字段。比如“董事会性别多元化”这个指标,很多中小企业根本不披露,留着也没意义。
避坑指南:我曾经在某个项目中删掉了缺失率60%的“供应链审计次数”字段,结果模型跑出来发现,这个字段恰恰是区分头部企业和尾部企业的关键特征。后来我学乖了——删除前一定要做特征重要性分析。
3.3 填充法:均值/中位数/众数
填充法是最常用的。但怎么选,有讲究。
| 填充方式 | 适用场景 | 我的经验 |
|---|---|---|
| 均值填充 | 数据近似正态分布,且缺失率低 | ESG评分中很少用,因为数据往往偏态 |
| 中位数填充 | 数据有异常值或偏态分布 | 我常用,比如“员工人均培训时长”这种指标 |
| 众数填充 | 分类变量,比如“是否通过ISO认证” | 注意:如果众数占比过高,会引入偏差 |
举个例子。处理“女性高管比例”这个字段时,我发现数据右偏——大部分公司在10%-20%之间,但有几家头部企业高达40%。如果填均值,会拉高整体水平;填中位数,更接近真实分布。我个人习惯先画个直方图,看一眼分布再决定。
# 我常用的填充逻辑(Python伪代码)
import pandas as pd
import numpy as np
def smart_fill(df, column):
# 先判断分布
skewness = df[column].skew()
if abs(skewness) < 0.5:
# 近似正态,用均值
return df[column].fillna(df[column].mean())
else:
# 偏态分布,用中位数
return df[column].fillna(df[column].median())
3.4 插值法:时间序列的利器
ESG数据很多是时间序列——比如一家公司连续5年的碳排放数据。这时候,插值法比简单填充靠谱得多。
- 线性插值:假设数据在两点之间是线性变化。适合平稳指标,比如“员工数量”。
- 多项式插值:适合有波动趋势的数据,比如“年度营收”。但注意,阶数太高容易过拟合。
- 时间加权插值:我比较推荐。比如2020年缺失,用2019和2021年的数据加权平均,权重按时间距离分配。
我的小技巧:插值前,先检查数据是否有“断崖式”变化。比如某公司2020年碳排放突然降了50%,那可能是业务调整,不是正常趋势。这时候插值会失真,我一般会手动标记为“业务变更”,单独处理。
# 线性插值示例
df['碳排放'] = df['碳排放'].interpolate(method='linear')
# 时间加权插值(自定义)
def time_weighted_fill(series):
# 前后各取2个点,按时间距离加权
# 代码略,核心逻辑是:距离越近,权重越大
pass
3.5 知识体系总览
下面这张图,是我梳理的缺失值处理决策流程。你照着走一遍,基本不会出错。
嗯,这张图的核心逻辑就是:先判断类型,再选方法。别一上来就填均值,那是偷懒的做法。
最后说一句:缺失值处理没有银弹。我见过太多人用“均值填充”一招鲜,结果模型跑出来一塌糊涂。你想想看,ESG数据本身就有很强的行业属性和时间属性——制造业的碳排放和金融业的碳排放,能填同一个均值吗?
所以我的建议是:先理解业务,再动手处理。数据是死的,但业务是活的。
公众号:蓝海资料掘金营,微信deep3321