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 知识体系总览

下面这张图,是我梳理的缺失值处理决策流程。你照着走一遍,基本不会出错。

缺失值处理决策流程 发现缺失值 判断缺失类型 MCAR MAR MNAR 删除法 缺失率<5%可用 填充法 均值/中位数/众数 建模处理 插值/回归/EM算法 输出:完整数据集

嗯,这张图的核心逻辑就是:先判断类型,再选方法。别一上来就填均值,那是偷懒的做法。

最后说一句:缺失值处理没有银弹。我见过太多人用“均值填充”一招鲜,结果模型跑出来一塌糊涂。你想想看,ESG数据本身就有很强的行业属性和时间属性——制造业的碳排放和金融业的碳排放,能填同一个均值吗?

所以我的建议是:先理解业务,再动手处理。数据是死的,但业务是活的。


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