缺失值处理(上):缺失值识别、统计与可视化
各位同学,今天我们来聊聊数据清洗里最基础、也最绕不开的一步——缺失值处理。
说实话,我做了这么多年供应链数据分析,接手过的数据没有一套是干干净净的。库存表里缺数量、订单表里缺日期、供应商表里缺联系方式……这些太常见了。你想想看,如果连数据里缺了什么都不知道,后面的特征工程、建模预测,那不就是空中楼阁吗?
所以这一章,我们先打好地基。我会带你走完三个步骤:识别缺失值、统计缺失情况、可视化展示。嗯,咱们一步步来。
1. 缺失值识别——先看看数据到底长什么样
拿到一份数据,我个人的习惯是,先不急着写代码。我会先问自己三个问题:
- 这份数据有多少行、多少列?
- 哪些字段是必须有的?
- 缺失值大概会出现在哪里?
比如在供应链场景里,订单日期、发货日期、产品数量、单价这些字段,一旦缺失,后面的分析基本就废了。而像“备注”、“客户留言”这种字段,缺了就缺了,影响不大。
好,那怎么用代码识别缺失值?最直接的方法就是 isnull() 配合 sum()。
import pandas as pd
# 读取数据
df = pd.read_csv('supply_chain_data.csv')
# 查看缺失值情况
print(df.isnull().sum())
这段代码会输出每一列的缺失值数量。我在项目中遇到过,有些同事只看这个结果就下结论了,其实不够。为什么呢?因为 isnull() 只能告诉你“缺了多少”,但没法告诉你“缺在哪里”。
所以,我建议你再跑一行:
# 查看前5行缺失值分布
print(df.head().isnull())
这样你就能直观看到,哪些行、哪些列是空的。嗯,这一步虽然简单,但很管用。
2. 缺失值统计——量化分析,心里有数
识别出缺失值之后,下一步就是统计。统计什么?我个人认为,至少要看三个指标:
| 指标 | 含义 | 计算公式 |
|---|---|---|
| 缺失数量 | 该列有多少个空值 | df[col].isnull().sum() |
| 缺失比例 | 缺失值占总行数的百分比 | df[col].isnull().mean() * 100 |
| 缺失模式 | 缺失值是否集中在某些行或某些列 | 可视化分析(见下一节) |
这里我特别想强调一下缺失比例。为什么?因为比例决定了你的处理策略。
- 如果缺失比例 < 5%,直接删除这些行,问题不大。
- 如果缺失比例在 5% ~ 20% 之间,可以考虑填充。
- 如果缺失比例 > 50%,这个字段基本可以放弃了。
当然,这只是经验值。我在一个库存预测项目里,遇到过“供应商评级”字段缺失了 60%。按理说该删掉,但业务方说这个字段很重要。后来我们用了聚类填充,效果还不错。所以,规则是死的,业务是活的。
统计代码也很简单:
# 计算缺失比例
missing_ratio = df.isnull().mean() * 100
missing_ratio = missing_ratio[missing_ratio > 0].sort_values(ascending=False)
print("缺失比例超过0%的字段:")
print(missing_ratio)
重要提醒:统计缺失值时,别忘了检查数据类型。有时候字段看起来是数字,但实际上是字符串,比如 "N/A"、"Unknown"、"null" 这些。Pandas 默认不会把它们识别为缺失值,需要手动转换。
# 手动将常见缺失标识转换为 NaN
df.replace(['N/A', 'Unknown', 'null', ''], pd.NA, inplace=True)
3. 缺失值可视化——用 missingno 一眼看穿
统计数字虽然精确,但不够直观。你想想看,如果数据有 100 列、10 万行,光看数字你能看出缺失值的分布规律吗?很难。
所以,我强烈推荐一个库——missingno。这个库专门用来可视化缺失值,几行代码就能生成非常清晰的图表。
先安装:
pip install missingno
然后导入并使用:
import missingno as msno
import matplotlib.pyplot as plt
# 1. 缺失值矩阵图(最常用)
msno.matrix(df)
plt.show()
# 2. 缺失值条形图
msno.bar(df)
plt.show()
# 3. 缺失值热力图(看相关性)
msno.heatmap(df)
plt.show()
这三种图各有用途:
- 矩阵图:每一行是一条数据,白色表示缺失。一眼就能看出缺失值集中在哪些行、哪些列。
- 条形图:展示每一列的缺失比例,适合快速对比。
- 热力图:展示列与列之间缺失值的相关性。比如,如果“发货日期”缺失时,“物流单号”也大概率缺失,那说明这两个字段的缺失是关联的。
我的小技巧:在查看矩阵图时,我会把数据按缺失率排序。这样缺失值多的列会集中在一起,更容易发现规律。missingno 的 matrix() 函数默认就会按缺失率排序,省了我不少事。
我曾经在一个供应链项目中,用热力图发现了一个有趣的现象:“实际到货日期”和“质检通过日期”的缺失高度相关。后来一查,原来是系统里这两个字段是联动的——一个没填,另一个也填不了。这个发现帮我们优化了数据录入流程。
知识体系总览
为了让你更清晰地理解本章的内容结构,我画了一张图:
避坑指南:我曾经犯过一个低级错误——在统计缺失值时,忘了考虑重复数据。结果缺失比例算出来偏低,导致我低估了问题的严重性。所以,建议你在做缺失值分析之前,先做一步去重:df.drop_duplicates(inplace=True)。
好了,这一章的内容就到这里。缺失值识别、统计、可视化,这三步是数据清洗的起点。你可能会觉得简单,但越是基础的东西,越容易出错。我的建议是:每拿到一份新数据,都走一遍这个流程,形成肌肉记忆。
下一章,我们会接着讲缺失值的处理方法——删除、填充、插值,以及每种方法的适用场景。到时候见。
公众号:蓝海资料掘金营,微信deep3321