处理缺失值的第一步不是“怎么填”,而是“为什么缺”。 在统计学中,缺失机制通常分为三类:

- 完全随机缺失:数据缺失是随机的,与任何已观测或未观测的变量都无关,这是最理想的情况。
- 随机缺失:数据缺失与其他已观测变量有关,但与自身的真实值无关。
- 在收入调查中,女性可能更不愿意报告收入,但“是否缺失”与“收入高低”无关,只与“性别”有关。
- 非随机缺失:数据缺失与其自身的真实值有关。
- 高收入人群更可能隐瞒收入,这是最棘手的情况,因为缺失本身包含了信息。
行动指南:先分析缺失模式(缺失比例、与哪些变量相关),尝试理解其背后的原因,这能帮你判断填充是否合适,以及选择哪种方法。
第二部分:识别与评估缺失值
在动手之前,需要先摸清情况:
- 计算缺失率:对每个变量(列)计算
(缺失数量 / 总样本数),高缺失率(如 > 30%-50%)的变量可能需要直接删除。 - 可视化:使用热力图 (
seaborn.heatmap或missingno.matrix) 可以直观看到数据集中缺失值的分布模式。 - 模式判断:是集中在某几列(变量缺失)还是某几行(样本缺失)?
第三部分:基础处理方法(从简单到进阶)
直接删除
最简单粗暴,适用于特定情况。
- 删除整行:当某样本(行) 的缺失值非常多,或者缺失目标变量时。
- 缺点:可能损失大量有价值数据。
- 删除整列:当某变量(列) 的缺失率极高,且信息价值不大时。
- 使用条件:数据量大,缺失比例小,且缺失机制为“完全随机缺失”。
单变量填充(适用于数值型数据)
用一个固定的统计量来填充某一列的所有缺失值。
- 均值/中位数/众数填充:
- 均值填充:
df['col'].fillna(df['col'].mean(), inplace=True) - 中位数填充:对异常值更稳健。
- 众数填充:用于分类变量。
- 优点:简单快速,不会改变数据的均值和分布(仅限均值填充)。
- 缺点:低估了方差,忽略了与其他变量的关系,可能产生有偏估计。
临近值填充
利用数据在顺序上的相关性。
- 前向填充/后向填充:
df.fillna(method='ffill')用上一个有效值填充。- 适用场景:时间序列数据,或数据按某种顺序排列且连续性强。
- 缺点:可能传播异常值。
基于模型的填充(多变量填充)
利用数据集中其他已知变量来预测缺失值,这是更高级、更推荐的方法。
- K-最近邻填充:
- 原理:对于一个有缺失值的样本,在数据集中找到k个与其其他变量最相似的完整样本,用这k个样本在该变量上的(加权)均值/众数来填充。
- 优点:考虑了变量间的相关性。
- 缺点:计算量随数据量增大而增加。
- 回归/分类模型预测填充:
- 原理:将有缺失值的变量作为目标变量Y,其他完整变量作为特征X。
- 用数据中该变量不缺失的部分训练一个模型(回归或分类)。
- 用训练好的模型去预测缺失部分的值。
- 迭代填充:可以对所有有缺失的变量循环此过程,并用最新填充好的数据去预测其他变量的缺失值,迭代多次直到稳定。
- 优点:最科学,能最好地利用数据中的信息,保持变量间的关系。
- 缺点:更复杂,可能引入模型本身的误差,存在过拟合风险。
创建“缺失指示符”
有时,“缺失”本身就是一个重要信息。
- 操作:在填充前或填充的同时,为每个有缺失的变量创建一个新的布尔型列(
col_missing),标记原数据是否缺失。 - 优点:可以为模型提供“数据缺失”这一潜在的重要模式信息,尤其适用于“随机缺失”或“非随机缺失”的场景。
第四部分:方法选择指南与注意事项
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除 | 缺失率极低或极高;完全随机缺失;数据量巨大 | 简单,无偏(在MCAR下) | 信息损失,样本减少 |
| 均值/中位数/众数 | 初步分析;缺失率较低;作为基线方法 | 极其简单快速 | 扭曲分布,忽略相关性,低估不确定性 |
| 临近填充 | 时间序列或有序数据 | 简单,保持顺序 | 可能传播误差,不适用于无序列数据 |
| KNN填充 | 数据存在局部相似性;中小型数据集 | 考虑了数据结构 | 对k值敏感,计算量较大,不适用于高维稀疏数据 |
| 模型预测 | 变量间相关性较强;对准确性要求高 | 最科学,信息利用充分 | 复杂,可能过拟合,计算成本高 |
| 缺失指示符 | 缺失可能包含信息(非MCAR) | 保留“缺失”模式信息 | 增加特征维度 |
黄金法则:
- 分而治之:数值型和分类型变量往往需要不同的处理策略。
- 训练/测试集分离:务必在划分训练集和测试集之后再进行填充!所有填充参数(如均值、模型)必须仅从训练集中计算,然后应用到测试集上,否则会造成数据泄漏。
- 评估影响:尝试不同的填充方法,评估它们对最终分析或模型结果的影响,可以使用交叉验证来比较。
- 记录与透明:在报告中清晰记录你处理缺失值的方法和理由。
总结流程建议
- 探索:计算缺失率,可视化缺失模式。
- 分析:思考缺失的可能原因(MCAR?MAR?MNAR?)。
- 策略:
- 高缺失列/行:考虑删除。
- 低缺失,且为完全随机:可用简单填充(均值/中位数)或删除。
- 变量间有明确关系:使用KNN或模型预测填充。
- 时间序列:使用前向/后向填充。
- 怀疑缺失有含义:添加“缺失指示符”。
- 实施与验证:在训练集上拟合填充器,转换训练集和测试集,评估最终模型性能。
从简单的统计量填充开始建立基线,再尝试更复杂的基于模型的方法,这是实践中稳妥有效的路径。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。