3. 数据探索:使用Pandas进行描述性统计,了解用电量的分布与趋势
拿到电费账单数据后,别急着建模。我个人的习惯是——先跟数据“聊聊天”。
什么叫聊天?就是看看它长什么样,有没有异常值,分布是否均匀。说白了,就是做描述性统计。这一步做扎实了,后面的分析才能站得住脚。
3.1 加载数据,先看一眼全貌
假设我们已经把数据整理成了CSV格式。用Pandas加载进来,这是基本功。
import pandas as pd
import numpy as np
# 加载数据
df = pd.read_csv('family_energy.csv', parse_dates=['date'])
df.head()
嗯,这里要注意:parse_dates参数一定要加。我见过太多人把日期读成字符串,后面处理时各种报错。
输出结果大概长这样:
| date | kwh_used | peak_hours | offpeak_hours | cost |
|---|---|---|---|---|
| 2024-01-01 | 12.5 | 4.2 | 8.3 | 8.75 |
| 2024-01-02 | 15.1 | 5.0 | 10.1 | 10.57 |
| 2024-01-03 | 10.8 | 3.1 | 7.7 | 7.56 |
看到数据了。接下来,用info()和describe()快速摸清底细。
df.info()
df.describe()
核心输出解读:
count:看看有没有缺失值。如果某列count少于总行数,说明有坑。mean:日均用电量。我一般会跟当地平均水平对比一下。std:标准差。数值越大,说明用电波动越剧烈。min / max:一眼看出有没有离谱的极端值。
3.2 用电量的集中趋势:均值和中位数
均值和中位数,这两个指标要一起看。为什么?
举个例子。我去年帮一个小区做能耗分析,发现某户的日均用电量均值是18度,但中位数只有12度。一查才知道,他家夏天开了一个月的泳池水泵,直接把均值拉高了。你想想看,如果只看均值,你会误以为这户人家天天用电很猛。
mean_kwh = df['kwh_used'].mean()
median_kwh = df['kwh_used'].median()
print(f"日均用电量均值: {mean_kwh:.2f} kWh")
print(f"日均用电量中位数: {median_kwh:.2f} kWh")
如果均值远大于中位数,说明数据右偏——存在一些“用电大户”在拉高整体水平。
3.3 离散程度:标准差与四分位数
光看平均值不够。你得知道数据“散不散”。
q1 = df['kwh_used'].quantile(0.25)
q3 = df['kwh_used'].quantile(0.75)
iqr = q3 - q1
print(f"第一四分位数: {q1:.2f}")
print(f"第三四分位数: {q3:.2f}")
print(f"四分位距: {iqr:.2f}")
我的经验:四分位距(IQR)比标准差更稳健。标准差容易受极端值影响,但IQR只看中间50%的数据。做家庭能源分析时,我优先用IQR来判断用电稳定性。
我曾经遇到一个案例:某户的IQR只有2.3度,说明用电习惯非常规律。而另一户的IQR高达8.7度,后来发现是因为家里有电动车,充电时间不固定。你看,光一个IQR就能帮你推测用户行为。
3.4 分布形态:偏度与峰度
偏度告诉你数据是左偏还是右偏。峰度告诉你数据是“尖”还是“平”。
skewness = df['kwh_used'].skew()
kurtosis = df['kwh_used'].kurtosis()
print(f"偏度: {skewness:.3f}")
print(f"峰度: {kurtosis:.3f}")
- 偏度 > 0:右偏,多数日子用电较少,偶尔有高峰。
- 偏度 < 0:左偏,多数日子用电较多,偶尔有低谷。
- 峰度 > 3:数据集中在均值附近,尾部较厚(极端值多)。
- 峰度 < 3:数据分布较平坦,波动均匀。
说白了,偏度和峰度就是帮你判断:你家用电是“平稳型”还是“爆发型”。
3.5 时间趋势:按周/月聚合
描述性统计不能只看整体,还要看趋势。我习惯按周聚合,看看用电量有没有周期性。
df['week'] = df['date'].dt.isocalendar().week
weekly = df.groupby('week')['kwh_used'].mean()
print(weekly.head())
输出结果:
| week | mean_kwh |
|---|---|
| 1 | 13.2 |
| 2 | 12.8 |
| 3 | 14.5 |
| 4 | 11.9 |
嗯,这里要注意:第3周用电量明显偏高。我猜可能是春节前后,家里人多。这种模式,光看日均值是看不出来的。
3.6 知识体系结构图
下面这张图,帮你把本章的知识脉络理清楚:
3.7 避坑指南
我曾经踩过的坑:
- 直接用
mean()算整体均值,忽略了节假日和季节因素。后来发现夏季均值比冬季高出40%。建议按季节分组计算。 - 看到缺失值就直接
dropna()。有一次删掉了20%的数据,结果分析结果完全失真。先看看缺失值是不是集中在某个时间段,再决定怎么处理。 - 偏度和峰度只看数值,不看实际分布。我建议配合直方图一起看,更直观。
3.8 小结
描述性统计,说白了就是给数据“体检”。
通过均值、中位数、标准差、IQR、偏度、峰度这些指标,你能快速掌握用电量的整体面貌。再结合时间趋势分析,就能发现隐藏在数据背后的规律。
我个人觉得,这一步花的时间越多,后面建模就越省心。别急着跑模型,先把数据摸透。
实用建议:把describe()的结果保存下来,作为后续分析的基准线。每次更新数据后,对比一下指标变化,能帮你快速发现异常。