3. 缺失值处理(上):识别缺失值、原因分析与删除策略
各位同学好,我是老李。在电力数据分析这行摸爬滚打十几年,要说最让人头疼的,不是数据量太大,也不是模型调参,而是——缺失值。
我记得刚入行那会儿,接手一个省级电网的日前电价预测项目。数据拿过来一看,好家伙,某些时段直接是空白。当时我差点以为数据传输出问题了,后来才发现,这是电力市场的常态。说白了,缺失值就像电路里的虚焊——表面看问题不大,但关键时刻就会掉链子。
今天这一讲,咱们就专门聊聊缺失值处理的第一个阶段:识别、分析原因、以及最粗暴但有时最有效的删除策略。
3.1 识别缺失值:先找到“敌人”在哪
做数据清洗,第一步永远是“摸清家底”。你都不知道哪些地方有缺失,怎么处理?
我个人习惯,拿到数据后第一件事就是跑 isnull() 和 sum()。这两个函数是黄金搭档。
import pandas as pd
# 假设 df 是你的电价数据
# 看看每个字段有多少缺失值
print(df.isnull().sum())
输出结果大概长这样:
| 字段名 | 缺失数量 |
|---|---|
| 时间戳 | 0 |
| 系统负荷 | 12 |
| 风电出力 | 45 |
| 日前电价 | 3 |
| 气温 | 0 |
看到这个结果,你心里就有数了。风电出力缺失45个,这很常见——风机检修、风速仪故障,都可能导致数据没传回来。
df.isnull().sum() / len(df) * 100。这样一眼就能看出哪些字段是“重灾区”。缺失率超过50%的字段,我通常会直接考虑删除。
3.2 缺失值产生原因分析:别急着删,先问为什么
识别出缺失值后,很多新手直接上手 dropna()。我劝你慢一点。
为什么?因为缺失的原因决定了处理方式。在电力数据里,缺失值通常有这几种“出身”:
- 随机缺失(MCAR):比如传感器偶尔抽风,数据没传上来。这种缺失跟其他变量没关系,可以放心删除或填充。
- 非随机缺失(MNAR):比如电价太高时,某些市场主体故意不报数据。这种缺失本身就有信息量,直接删掉会引入偏差。
- 系统缺失:比如凌晨2点到5点,某些风电场停机检修,数据就是0。这不是缺失,是业务逻辑。
我在项目中遇到过最坑的一次:某省电网的负荷数据,每天凌晨3点准时缺失。一开始我以为是随机缺失,直接填充了均值。后来跟业务人员一聊才知道,那是系统在做数据归档,数据本身是正常的。嗯,从那以后,我养成了先问业务再动手的习惯。
3.3 删除缺失值:简单粗暴,但有条件
好,现在你知道了缺失的原因。如果确认是随机缺失,且缺失量不大(我个人标准是 < 5%),那 dropna() 就是最干净利落的办法。
# 删除所有包含缺失值的行
df_clean = df.dropna()
# 只删除指定列有缺失的行
df_clean = df.dropna(subset=['日前电价', '系统负荷'])
# 删除整行缺失超过3个的
df_clean = df.dropna(thresh=3)
这里有几个参数你得记住:
| 参数 | 作用 | 我常用的场景 |
|---|---|---|
axis=0 |
删除行(默认) | 数据量够大时,删几行不心疼 |
axis=1 |
删除列 | 某个字段缺失率超过80%,直接删列 |
how='any' |
有任一缺失就删 | 严格模式,适合关键字段 |
how='all' |
全部缺失才删 | 宽松模式,保留部分有效数据 |
thresh |
保留至少有N个非空值的行 | 平衡数据量与质量 |
你想想看,如果数据有100万条,缺失了1000条,删掉完全没问题。但如果只有1万条,缺失了2000条,你还敢删吗?
1. 缺失是随机的,不引入偏差
2. 缺失量小,不影响样本代表性
3. 你确认这些数据无法通过其他方式补全
3.4 知识体系总览
为了让你更直观地理解这一章的内容,我画了张图。你看完应该能明白,缺失值处理不是一锤子买卖,而是一个决策链条。
这张图你看懂了吗?说白了,删除只是手段,不是目的。真正的高手,是在动手之前已经把数据的前因后果摸透了。
好了,这一讲我们聊了缺失值的识别、原因分析和删除策略。下一讲我们会深入探讨更高级的填充方法——均值填充、插值法、以及模型预测填充。到时候我会分享一个我压箱底的案例,保证让你大开眼界。
公众号:蓝海资料掘金营,微信deep3321