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()
我的小技巧: 把 alpha 参数设成 0.3-0.5。数据点多了会重叠,调低透明度能看清密度分布。

看这张图,你要关注三点:

  • 趋势对不对? 是不是大致符合功率曲线?
  • 有没有“离群点”? 比如风速 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()
我曾经踩过的坑: 有一次做模型,发现误差总是很大。查了三天,最后用箱线图一看,风速数据里有几百个 99.9 m/s 的值。那是 SCADA 系统的默认填充值。如果没做 EDA,模型就被这些“假数据”带偏了。

看箱线图时,我一般会:

  1. 先看中位数位置,判断数据是否偏斜。
  2. 再看箱体宽度,了解数据波动范围。
  3. 最后看“胡须”外面的点,那些就是潜在的异常值。

对于这些异常值,我的处理原则是:不轻易删除,先溯源。如果是传感器偶发故障,直接剔除;如果是限功率运行,要打标签保留,因为那是真实工况。

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.85-0.95 之间。如果低于 0.7,你要警惕了——要么数据质量差,要么有其他强影响因素(比如桨距角、湍流强度)。

看热力图时,我重点关注:

  • 目标变量(功率)与其他特征的相关性。 风速、桨距角、转速,这些通常相关性高。
  • 特征之间的相关性。 如果两个特征相关系数超过 0.9,比如“机舱温度”和“齿轮箱温度”,那它们携带的信息高度重叠。建模时可以考虑只保留一个,避免多重共线性。
  • 意外的强相关。 比如“环境温度”和“功率”如果强相关,可能说明机组在高温下存在降容运行。

4.4 知识体系:EDA 核心逻辑

下面这张图,是我自己总结的 EDA 流程。每次做项目前,我都会在脑子里过一遍。

EDA 核心逻辑:从数据到洞察 1. 数据概览 形状、类型、缺失值 2. 单变量分析 箱线图、直方图 3. 双变量分析 散点图、相关性 4. 发现规律与异常 趋势判断、异常定位、特征筛选 5. 数据清洗与特征工程 异常处理、特征选择、新特征构建

你看,EDA 不是一蹴而就的。它是一个循环迭代的过程。发现异常 → 处理数据 → 重新可视化 → 再发现。直到你对数据有了“感觉”,才进入建模阶段。

4.5 实战避坑指南

最后,分享几个我这些年总结的教训:

关于时间序列: 风功率数据是时间序列。做散点图时,别忘了按时间着色。我见过太多人把不同季节的数据混在一起看,结果趋势完全被掩盖了。
关于相关性: 相关性不等于因果。风速和功率高度相关,但你不能说“提高风速就能提高功率”——风速是自然变量,你控制不了。建模时,要区分哪些是可操作变量,哪些是环境变量。

嗯,EDA 这部分就聊到这儿。记住一句话:好的模型,始于好的数据理解。 别急着调参,先把图看明白。


公众号:蓝海资料掘金营,微信deep3321