当前位置: 首页 > news >正文

4.1 缺失值处理

本章学习目标

  • 理解什么是缺失值、为什么会出现
  • 学会发现和量化缺失值
  • 掌握4种核心处理方法:删除、均值/中位数填充、众数填充、前向/后向填充
  • 建立决策原则:什么时候用什么方法
  • 不需要记住代码,只需要知道“有什么方法、什么时候用、怎么告诉AI”

一、什么是缺失值?

1.1 缺失值的定义

缺失值,简单说就是“该有数据的地方,没有数据”。

在表格中,缺失值通常表现为:

表现形式你看到的样子说明
标准空值NaNnullNone程序能识别的标准缺失标记
占位符-?N/Aunknown/人为用某个符号表示缺失
空字符串''(什么都没有)看起来是空,但类型是文本
特殊数字0999-999用特殊数字代表“缺失”或“未知”

重要认知:缺失值不一定是“空的”。有时候,0-1999等特殊值也可能是缺失值的伪装。

1.2 一个直观的例子

看下面这张“用户信息表”:

user_idnameagecityphone
1张三28北京138****0000
2李四NaN上海139****1111
3王五35-
4赵六NaNNaN137****2222
5NULL42广州NULL

表格中有多处缺失:

位置缺失表现解读
第2行ageNaN标准缺失 —— 没记录年龄
第3行city-占位符 —— 可能是“不详”的替代符号
第3行phone空字符串文本类型的空值
第4行agecityNaN多条缺失
第5行namephoneNULL数据库导出的标准缺失

二、为什么会出现缺失值?

理解缺失值产生的原因,能帮助你判断“该怎么处理它”。

2.1 三类主要原因

原因类型具体场景举例处理思路
数据采集问题系统故障、传感器失灵、人工录入遗漏温度传感器某天坏了,没记录到数据需要填充或推断
数据本身不存在某些字段对部分对象不适用未婚人士的“配偶姓名”为空可以保留缺失,或填充“无”
数据清洗/合并问题多表合并时没匹配上、格式转换出错用户表和订单表按user_id合并,某些用户没订单 → 订单信息为空检查合并逻辑

2.2 从业务角度理解缺失

以二手车数据集为例,分析每个字段缺失的可能原因:

字段缺失比例可能的原因性质判断
model极少极少数车型没记录随机缺失
bodyType3.3%部分车辆车身类型未知信息缺失
fuelType6%部分车辆燃油类型不详信息缺失
gearbox4%部分车辆变速箱类型未记录信息缺失
notRepairedDamage20%可能“是否提供检测报告”本身取决于某种条件非随机缺失 ⚠️

关键洞察notRepairedDamage缺失比例高达20%,而且“是否填写这项”可能与车况本身有关(车况好的车主更愿意填写)—— 这种缺失不是随机的,处理时需要特别小心。

2.3 缺失的三种模式(进阶概念)

模式英文含义举例
完全随机缺失MCAR缺失与任何数据无关传感器随机故障
随机缺失MAR缺失与其他列有关,与本列无关男性用户更不愿意填“化妆品偏好”
非随机缺失MNAR缺失与本列的值本身有关高收入人群更不愿意填“收入”

对你的意义:大多数情况下,不需要严格区分这三种模式。但要知道:缺失比例越高、越可能与关键业务相关,处理时要越谨慎。如果“是否缺少年收入”与“年收入本身的水平”有关(富人更不愿意填),那么简单地用均值填充会严重偏低估测值。


三、怎么发现缺失值?

数据体检环节已经学过相关工具,这里快速回顾:

3.1 体检工具汇总

工具作用怎么告诉AI
info()看每列的非空数量,反推缺失数量“用info查看哪些列有缺失、缺了多少”
isnull().sum()精确统计每列缺失数量“统计每列的缺失值数量”
isnull().mean()计算每列缺失比例“计算每列缺失值的占比”
isnull().sum().sort_values(ascending=False)按缺失数量排序“哪些列缺失最多?按缺失数量排序”

3.2 常用体检需求

你想知道什么怎么告诉AI
整体缺失情况“检查整个数据集的缺失值情况”
缺失最多的列“找出缺失比例最高的3列”
某列的缺失情况“查看年龄列有多少缺失值”
行级别的缺失“找出所有存在缺失值的行”

四、缺失值处理方法总览

有两大类、六种常见方法:

缺失值处理 ├── 方法一:删除 → 直接去掉缺失的行或列 │ ├── 删除整行(na.omit / dropna) │ └── 删除整列(如果缺失太多) │ └── 方法二:填充 → 用一个值替代缺失 ├── 均值填充(适合正态分布数值) ├── 中位数填充(适合偏态数值或有异常值) ├── 众数填充(适合分类变量) ├── 前向/后向填充(适合时间序列) └── 模型预测填充(适合重要列,复杂度高)

本小节重点讲解删除三种基础填充(均值、中位数、众数、前向填充)。模型预测填充属于进阶内容,可以参考附录。


五、方法一:删除(Deletion)

5.1 什么时候用删除?

场景是否适合理由
缺失比例极少(< 3%)✅ 推荐删除几行不影响整体分布
缺失比例中等(3%-10%)⚠️ 谨慎删除可能丢失信息,需评估
缺失比例很高(> 30%)⚠️ 考虑删列填充可能引入偏差,删列是备选
该列对分析不重要✅ 可以直接删留着没意义,不如删掉
该列缺失不随机🔴 避免删除删除会引入选择偏差

5.2 删除的两种方式

方式做法适用场景
删除行去掉包含缺失值的那些行缺失比例小,数据量大
删除列去掉某整列缺失比例太高(> 50%),或者该列不重要

5.3 实际决策案例(二手车数据集)

列名缺失比例删除决策理由
model0.0007%✅ 删除行只有1条缺失,直接删掉这1行
notRepairedDamage20%❌ 不删列该列对价格预测可能有价值,20%缺失但可用填充
offerType全部相同值✅ 删除列不是缺失问题,是无信息量问题
bodyType3.3%❌ 删行 or 填充可选——删掉缺失的行(5000条),或填充

5.4 删除的风险

警告:删除缺失行,意味着你放弃了那些数据。如果缺失不是随机发生的,删除会导致分析结果有偏

例子:在用户满意度调查中,不满意的人更不愿意填写收入。如果你删除了收入缺失的行,剩下的大多是满意的人——然后你得出结论“用户普遍满意” —— 这是偏差


六、方法二:填充(Imputation)

6.1 均值填充(Mean Imputation)

它是什么?

用该列的平均值填充缺失值。

什么时候用?
条件说明
数据近似正态分布均值能代表“典型值”
没有极端异常值极端值会拉偏均值
数值型变量年龄、价格、分数
例子

某班级数学成绩,有几个缺考学生,用全班平均分85分填充:

学生原成绩填充后
张三9090
李四NaN85(填充)
王五8080
平均分8585
优缺点
优点缺点
实现简单,计算快缩小方差(填充值都在均值附近)
保持整体均值不变削弱相关性(填充值与其他列的相关性变弱)
——数据不是正态分布时效果差

6.2 中位数填充(Median Imputation)

它是什么?

用该列的中位数填充缺失值。

什么时候用?
条件说明
数据右偏或左偏(有极端值)中位数比均值更稳健
有异常值存在均值会被极端值拉偏
数值型变量收入、房价、里程
例子

小区房价:300万、320万、350万、360万、5000万(豪宅)。中位数350万更能代表“典型房价”。

房产原价均值填充中位数填充
普通住宅A300300300
普通住宅B320320320
普通住宅C350350350
普通住宅D360360360
豪宅500050005000
缺失房产NaN1266(均值)350(中位数)

均值1266万的填充值,实际上是“被豪宅拉高的”,并不能代表普通房价。中位数350万更合理。

优缺点
优点缺点
抗异常值,比均值稳健同样会缩小方差
适合偏态分布同样会削弱相关性
比均值更接近“典型值”——

6.3 众数填充(Mode Imputation)

它是什么?

用该列出现次数最多的值填充缺失值。

什么时候用?
条件说明
分类变量性别、城市、车型、燃油类型
有序分类变量(可酌情)教育程度(小学/初中/高中/大学)
某类别占绝对优势90%的用户都是“自动挡”
例子

二手车变速箱类型:

变速箱类型出现次数占比
自动挡80,00080%
手动挡20,00020%

缺失的变速箱类型,用众数“自动挡”填充(因为自动挡占绝大多数)。

优缺点
优点缺点
实现简单放大众数比例
适合高众数占比的分类变量若众数占比不高(如55% vs 45%),填充会引入明显偏差
业务上常合理(填最常见的)——

6.4 前向/后向填充(Forward/Backward Fill)

它是什么?

前一行(前向)或后一行(后向)的值填充缺失——利用数据的时间顺序。

什么时候用?
条件说明
时间序列数据股价、气温、销售数据
数据有自然顺序相邻时间点的值通常接近
缺失是连续的几个点连续缺失也可以逐次填充
例子

某股票每日收盘价:

日期原股价前向填充说明
周一100100正常
周二NaN100用周一的值填充
周三NaN100沿用周二的填充值(100)
周四105105恢复正常
周五102102正常
优缺点
优点缺点
保持时间趋势必须有顺序(时间排序)
比均值/中位数合理(时间序列场景)缺失太长时会“把过去的值拖太久”
简单直接不适合没有顺序关系的数据

七、决策原则:到底该用哪一种?

7.1 决策流程图

拿到缺失值 │ ▼ 缺失比例多少? │ ├── < 3% ──────────────────→ 删除行 │ ├── 3% - 30% │ │ │ ▼ │ 列是什么类型? │ │ │ ├── 数值型,正态分布 ─→ 均值填充 │ ├── 数值型,偏态或有异常值 ─→ 中位数填充 │ ├── 分类变量 ─→ 众数填充 │ └── 时间序列 ─→ 前向/后向填充 │ └── > 50% ────────────────→ 考虑是否删除整列

7.2 快速决策表

数据类型分布特征缺失比例推荐方法
数值型正态分布< 30%均值填充
数值型偏态或有异常值< 30%中位数填充
分类变量有主导类别(>60%)< 30%众数填充
分类变量类别均衡(50% vs 50%)< 30%新增“未知”类别
时间序列有顺序关系连续少量缺失前向/后向填充
任意类型< 3%任意删除行
任意类型> 50%——考虑删除列

7.3 二手车数据集填充决策示例

列名类型缺失比例推荐方法理由
model分类0.0007%删除行太少,直接删
bodyType分类3.3%众数填充车身类型有限,找最常见的
fuelType分类6%众数填充燃油类型有限,找最常见的
gearbox分类4%众数填充自动挡最常见
notRepairedDamage分类20%众数或新增“未知”0(无损伤)最常见;也可单独设为“未知”类
power数值(偏态)0%异常值处理缺失问题,是异常值问题
kilometer数值(可能偏态)0%异常值处理缺失问题

八、实战场景速查

场景问题推荐方法怎么告诉AI
用户表,年龄缺了2%缺失很少删除行“年龄列缺失很少,删除缺失的行”
员工表,薪资缺了15%薪资分布右偏(高薪少)中位数填充“用薪资的中位数填充缺失值”
产品表,分类缺了10%分类有主导类别众数填充“用商品类别的众数填充缺失值”
用户表,收入缺了25%收入分布偏态,有离群高管中位数填充“收入列用中位数填充”
股票数据,连续3天缺失时间序列前向填充“用前一天的股价填充缺失值”
二手车表,变速器类型缺5%自动挡占80%众数填充“变速器类型用众数填充”
某列缺失60%缺太多删除整列“这一列缺失超过50%,删除整列”

九、本章总结

核心知识点回顾

  1. 什么是缺失值:该有数据的地方是空的,表现形式有NaN、-、空字符串等
  2. 为什么缺失:采集问题、数据本身不存在、合并问题
  3. 怎么发现info()isnull().sum()
  4. 处理方法
    • 删除:缺失极少时用
    • 均值填充:数值型、正态分布
    • 中位数填充:数值型、偏态或有异常值
    • 众数填充:分类变量
    • 前向填充:时间序列
  5. 决策原则:看缺失比例 + 数据类型 + 分布形态

决策速查卡

场景方法
缺失极少(❤️%)删除行
数值-正态均值填充
数值-偏态/有异常值中位数填充
分类变量众数填充
时间序列前向填充
缺失>50%删除整列

核心心法

“没有最好的填充方法,只有最合适的方法。选择取决于:缺失比例 + 数据类型 + 数据分布 + 业务含义。”


十、思考题

  1. 某电商平台的“用户收入”列缺失比例为25%。你认为高收入用户和不填写收入的相关性可能是什么?如果简单用均值填充,可能产生什么偏差?

  2. 你在处理一个“房屋价格预测”数据集。bedrooms(卧室数量)列缺失了5%。你会用均值、中位数还是众数填充?为什么?

  3. 一个酒店预订数据中,“儿童数量”列缺失40%,但大多数预订都没有儿童。你决定用0填充。理由是什么?有没有更好的方案?

  4. 股票价格数据中,某只股票连续5个交易日数据缺失。用前向填充合理吗?如果这5天里发生了重大利空/利好消息,填充还是合理的吗?

  5. 二手车数据集的notRepairedDamage(是否有未修复损伤)缺失20%。你怀疑“车辆状况好的车主更不愿意花时间填这项”。如果直接删除缺失的行,会有什么后果?


下一节预告:4.2 重复值与异常值处理 —— 除了缺失,数据还有“重复的 记录”和“离谱的数值”。如何发现它们?删除?修正?还是保留?

http://www.jsqmd.com/news/801065/

相关文章:

  • 5个理由告诉你为什么小熊猫Dev-C++是C/C++编程的最佳选择
  • 如何通过55个功能重塑你的炉石传说体验:HsMod深度解析
  • Delphi: TSocketConnection 中文乱码
  • qmc-decoder实战:解锁QQ音乐加密音频的专业解决方案
  • 智慧树刷课插件:3分钟解决90%安装使用问题,提升学习效率300%
  • 嵌入式系统噪声抑制:从硬件设计到固件优化
  • 构建AI模型智能路由池:告别手动切换,实现高可用编程助手
  • Anaconda 安装与配置 的所有核心步骤
  • 18.地下室的服务器
  • XXMI启动器:游戏模组管理的一站式解决方案
  • 突破性能瓶颈:深入理解 JavaScript TypedArray
  • 3步解决智慧树刷课插件90%问题:从安装失败到完美运行
  • AzurLaneAutoScript:碧蓝航线终极自动化解决方案
  • 如何快速提取B站CC字幕:面向新手的完整工具指南
  • 时间序列交叉验证中的间隙机制:原理、实践与防信息泄露
  • 虞城装修公司选哪家专业?业主正确对比装修公司的方法,看完不踩坑
  • ESXi 6.5主机上VM网络时断时续?别急着换硬件,先试试这个网卡切换命令
  • ARM GICv5中断控制器与IRS寄存器详解
  • GD32C103RBT6 ADC库驱动代码详解
  • 告别混乱搜索:一文搞懂Quartus前仿真的两种玩法(Modelsim调用 vs VWF内嵌)
  • 构建职业智能中心:用Git与AI打造结构化职业发展系统
  • AI代码管理工具claude-code-manager:解决Claude生成代码的整合难题
  • 半导体制造可持续转型:数据驱动、绿色技术与循环设计实践
  • 放心API和4SAPI怎么选?从开发者选型角度看差异
  • ARMv8-A A64指令集:符号扩展与位操作指令详解
  • OpenSpeedy 终极指南:免费开源游戏加速工具完整使用教程
  • YOLO11部署优化:端侧设备落地 | YOLO11 NCNN C++部署全流程解析,将YOLO塞进Android/树莓派等边缘算力设备
  • 智能视频PPT提取方法:实现自动化内容归档的完整策略
  • 前端开发者福音:用Vue.js开发的Beekeeper Studio,如何让SQL开发体验更‘现代’?
  • WarcraftHelper:魔兽争霸III终极兼容性修复工具,5大核心功能全面优化游戏体验