4、探索性数据分析:统计特征分析、可视化方法、相关性分析
拿到储能系统的运行数据后,第一件事是什么?
别急着建模。我个人习惯先做探索性数据分析,简称EDA。说白了,就是跟数据「聊聊天」,看看它长什么样、有没有异常、变量之间有没有关系。这一步做扎实了,后面的建模才能少踩坑。
4.1 统计特征分析:先摸清数据的「脾气」
我记得刚入行时,接过一个储能电站的SOC数据。上来就建模,结果模型死活不收敛。后来一查,发现数据里有大量缺失值和离群点。嗯,从那以后,我每次都会先做统计特征分析。
统计特征分析主要看这几个维度:
- 集中趋势:均值、中位数、众数。比如电池温度的均值是25°C,但中位数是23°C,说明数据右偏,可能有高温异常点。
- 离散程度:标准差、方差、极差、四分位距。标准差大,说明数据波动剧烈,可能是充放电工况切换频繁。
- 分布形态:偏度、峰度。偏度>0表示右偏,峰度>3表示尖峰分布——这在储能数据里很常见,因为充放电过程往往集中在某些区间。
实战经验:我在一个大型储能项目中,发现某组电池的电压标准差是其他组的3倍。后来排查发现,是BMS采样模块出了问题。如果没做这一步,带着「脏数据」建模,后果不堪设想。
代码示例(Python):
import pandas as pd
import numpy as np
# 加载储能数据
df = pd.read_csv('bess_data.csv')
# 统计特征概览
desc = df.describe()
print(desc)
# 自定义统计
stats = pd.DataFrame({
'均值': df.mean(),
'标准差': df.std(),
'偏度': df.skew(),
'峰度': df.kurtosis(),
'缺失率': df.isnull().mean()
})
print(stats)
4.2 可视化方法:一图胜千言
数字看多了容易麻木。我建议你多用图表,很多问题一眼就能看出来。
常用的可视化方法:
- 直方图 + 核密度图:看数据分布形态。比如SOC的分布如果是双峰,说明电站经常在低电量和高电量之间切换。
- 箱线图:快速识别离群点。我习惯把箱线图和3σ原则结合使用。
- 时间序列图:看趋势和周期性。储能数据的时间特征非常明显,白天充、晚上放。
- 散点图矩阵:初步看变量间的关系。比如电压和SOC通常呈正相关。
小技巧:画图时别忘了设置合适的采样频率。我曾经用1秒采样数据画了一整年的图,结果文件太大,电脑直接卡死。后来改成每小时采样,清晰多了。
代码示例:
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 1. 直方图
plt.figure(figsize=(10, 6))
sns.histplot(df['SOC'], kde=True, bins=50)
plt.title('SOC分布直方图')
plt.show()
# 2. 箱线图
plt.figure(figsize=(12, 6))
sns.boxplot(data=df[['电压', '电流', '温度']])
plt.title('关键参数箱线图')
plt.show()
# 3. 时间序列图
plt.figure(figsize=(14, 5))
plt.plot(df['时间'], df['SOC'], alpha=0.7)
plt.title('SOC时间序列')
plt.xlabel('时间')
plt.ylabel('SOC(%)')
plt.show()
4.3 相关性分析:找到变量间的「悄悄话」
你想想看,储能系统里几十个参数,哪些是真正相关的?相关性分析就是帮我们找到这些「悄悄话」。
常用的方法:
- 皮尔逊相关系数:衡量线性关系。取值范围[-1, 1]。绝对值>0.7算强相关。
- 斯皮尔曼秩相关系数:不要求线性关系,适合非线性场景。储能数据里很多关系是非线性的,比如内阻和温度。
- 互信息:捕捉任意类型的依赖关系。计算量稍大,但信息量更丰富。
注意:相关性不等于因果性。我曾经见过一个项目,把SOC和室外温度的相关性当成因果关系,结果优化策略完全跑偏。记住,相关只是提示,因果需要实验验证。
代码示例:
# 皮尔逊相关系数矩阵
corr_matrix = df.corr(method='pearson')
print(corr_matrix)
# 热力图可视化
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap='RdBu_r',
fmt='.2f', linewidths=0.5)
plt.title('皮尔逊相关系数热力图')
plt.show()
# 斯皮尔曼相关系数
spearman_corr = df.corr(method='spearman')
print(spearman_corr)
4.4 知识体系总览
下面这张图,是我梳理的EDA核心逻辑。你可以把它当作检查清单,每次做数据分析前过一遍。
4.5 实战中的避坑指南
做EDA这么多年,我总结了几条经验:
- 先看数据量纲:电压是V还是mV?电流是A还是kA?我曾经因为单位搞错,相关性分析全乱套。
- 注意时间对齐:储能数据来自不同传感器,时间戳可能不同步。记得先做重采样对齐。
- 别只看相关系数:相关系数为0不代表没关系,可能是非线性关系。画个散点图看看更保险。
- 离群点要谨慎处理:有些离群点其实是真实工况(比如极端天气下的过充保护),别一刀切删掉。
我的习惯:每次做完EDA,我都会生成一份「数据健康报告」,包含缺失率、异常值比例、关键变量分布图。这份报告不仅是建模的输入,也是跟团队沟通的「共同语言」。
好了,EDA这部分就聊到这儿。记住,数据不会骗人,但前提是你得学会「听」它说话。下一节我们聊聊特征工程,看看怎么从原始数据里挖出更有价值的信息。
公众号:蓝海资料掘金营,微信deep3321