4. 探索性数据分析(EDA):数据可视化
数据拿到手,别急着往模型里塞。我个人的习惯是,先花半天时间跟数据“聊聊天”。
EDA 说白了,就是让你用眼睛去发现数据里的秘密。哪些特征跟功率强相关?哪些传感器坏了?有没有异常的风况?这些都能在图上看得一清二楚。
这一章,咱们就聚焦在三种最实用的图:散点图、箱线图、相关性热力图。嗯,这三板斧用好了,数据规律和异常基本就无处遁形了。
4.1 散点图:看关系,找异常
散点图是最直观的工具。你想想看,风速和功率的关系,理论上是一条“S”型曲线(功率曲线)。但实际数据呢?
我在内蒙古一个风场就遇到过,散点图上一堆点飘在功率曲线下方。一开始以为是模型不准,后来发现是那台机组的桨距角执行器有卡涩。你看,一张图就揪出了一个机械故障。
代码示例:
import matplotlib.pyplot as plt
import seaborn as sns
# 假设 df 是你的数据框,包含 'wind_speed' 和 'active_power'
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='wind_speed', y='active_power', alpha=0.5)
plt.title('风速 vs 有功功率 散点图')
plt.xlabel('风速 (m/s)')
plt.ylabel('有功功率 (kW)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
看这张图,你要关注三点:
- 趋势对不对? 是不是大致符合功率曲线?
- 有没有“离群点”? 比如风速 12m/s 时功率只有 500kW,这肯定有问题。
- 有没有“分层”? 有时候不同机组、不同季节的数据会形成不同的簇。
4.2 箱线图:揪出“坏”数据
箱线图是看数据分布的利器。它能告诉你中位数、四分位数,还有——异常值。
为什么会特别关注异常值?因为风功率数据里,异常值往往意味着:
- 传感器故障(比如风速计冻住了)
- 通讯中断(数据包丢失,补了个默认值)
- 机组限功率运行(电网调度指令)
代码示例:
plt.figure(figsize=(12, 6))
sns.boxplot(data=df[['wind_speed', 'active_power', 'temperature']])
plt.title('关键特征箱线图')
plt.ylabel('数值')
plt.show()
看箱线图时,我一般会:
- 先看中位数位置,判断数据是否偏斜。
- 再看箱体宽度,了解数据波动范围。
- 最后看“胡须”外面的点,那些就是潜在的异常值。
对于这些异常值,我的处理原则是:不轻易删除,先溯源。如果是传感器偶发故障,直接剔除;如果是限功率运行,要打标签保留,因为那是真实工况。
4.3 相关性热力图:找“亲戚”
做预测模型,你得知道哪些特征对功率影响大。相关性热力图就是干这个的。
它用颜色表示两个变量之间的线性相关程度。深红色表示强正相关,深蓝色表示强负相关,白色表示没关系。
代码示例:
# 计算相关系数矩阵
corr_matrix = df.corr()
# 绘制热力图
plt.figure(figsize=(14, 10))
sns.heatmap(corr_matrix, annot=True, fmt='.2f', cmap='RdBu_r',
square=True, cbar_kws={"shrink": 0.8})
plt.title('特征相关性热力图')
plt.show()
看热力图时,我重点关注:
- 目标变量(功率)与其他特征的相关性。 风速、桨距角、转速,这些通常相关性高。
- 特征之间的相关性。 如果两个特征相关系数超过 0.9,比如“机舱温度”和“齿轮箱温度”,那它们携带的信息高度重叠。建模时可以考虑只保留一个,避免多重共线性。
- 意外的强相关。 比如“环境温度”和“功率”如果强相关,可能说明机组在高温下存在降容运行。
4.4 知识体系:EDA 核心逻辑
下面这张图,是我自己总结的 EDA 流程。每次做项目前,我都会在脑子里过一遍。
你看,EDA 不是一蹴而就的。它是一个循环迭代的过程。发现异常 → 处理数据 → 重新可视化 → 再发现。直到你对数据有了“感觉”,才进入建模阶段。
4.5 实战避坑指南
最后,分享几个我这些年总结的教训:
嗯,EDA 这部分就聊到这儿。记住一句话:好的模型,始于好的数据理解。 别急着调参,先把图看明白。
公众号:蓝海资料掘金营,微信deep3321