当前位置:首页>python>Python入门必练项目!数据分析实战案例— —家庭用电数据分析(源码+数据集+技术文档)

Python入门必练项目!数据分析实战案例— —家庭用电数据分析(源码+数据集+技术文档)

  • 2026-09-10 06:20:27
Python入门必练项目!数据分析实战案例— —家庭用电数据分析(源码+数据集+技术文档)

1、数据说明

本项目所用数据集包含了一个家庭6个月的用电数据,收集于2007年1月至2007年6月。这些数据包括有功功率、无功功率、电压、电流强度、分项计量1(厨房)、分项计量2(洗衣房)和分项计量3(电热水器和空调)等信息。该数据集共有260,640个测量值,可以为了解家庭用电情况提供重要的见解。

字段含义对照表:

列名说明
Date
日期
Time
时间
Globalactivepower
除分项计量外所消耗的总有功功率(千瓦)
Globalreactivepower
该家庭消耗的总无功功率(千瓦)
Voltage
向家庭输送电力的电压(伏特)
Global_intensity
输送到家庭的平均电流强度(安培)
Submetering1
厨房消耗的有功功率(千瓦)
Submetering2
洗衣房所消耗的有功功率(千瓦)
Submetering3
电热水器和空调所消耗的有功功率(千瓦)

2、数据来源

【相关视频教程及课件源码在文末】

【相关视频教程及课件源码在文末】

3、其他说明

有功功率是保持用电设备正常运行所需的电功率,也就是将电能转换为其他形式能量(机械能、光能、热能)的电功率。比如:5.5千瓦的电动机就是把5.5千瓦的电能转换为机械能,带动水泵抽水或脱粒机脱粒;各种照明设备将电能转换为光能,供人们生活和工作照明。无功功率比较抽象,它是用于电路内电场与磁场的交换,并用来在电气设备中建立和维持磁场的电功率。它不对外作功,而是转变为其他形式的能量。凡是有电磁线圈的电气设备,要建立磁场,就要消耗无功功率。比如40瓦的日光灯,除需40多瓦有功功率(镇流器也需消耗一部分有功功率)来发光外,还需80乏左右的无功功率供镇流器的线圈建立交变磁场用。由于它不对外做功,才被称之为“无功”。

4、前期工作

4.1 导包

import numpy as npimport pandas as pdfrom pyecharts.charts import *import pyecharts.options as optsfrom statsmodels.tsa.seasonal import seasonal_decomposeimport matplotlib.pyplot as plt# plt.rcParams['axes.unicode_minus']=False# plt.rcParams['font.sans-serif'] = ['SimHei']

4.2 读取数据

# 数据路径data_path = r'/home/mw/input/Household_Electricity4767/household_power_consumption.csv'# 读取数据df = pd.read_csv(data_path,index_col='index')# 预览数据df.head()
DateTimeGlobal_active_powerGlobal_reactive_powerVoltageGlobal_intensitySub_metering_1Sub_metering_2Sub_metering_3
index
0
1/1/07
0:00:00
2.58
0.136
241.97
10.6
0
0
0.0
1
1/1/07
0:01:00
2.552
0.1
241.75
10.4
0
0
0.0
2
1/1/07
0:0200
2.55
0.1
241.64
10.4
0
0
0.0
3
1/1/07
0:03:00
2.55
0.1
241.71
10.4
0
0
0.0
4
1/1/07
0:04:00
2.554
0.1
241.98
10.4
0
0
0.0

5、数据处理

5.1 数据预览

In[3]:

# 将列名替换为中文df.rename(columns={    'Date': '日期',    'Time': '时间',    'Global_active_power': '有功功率',    'Global_reactive_power': '无功功率',    'Voltage': '电压',    'Global_intensity': '电流',    'Sub_metering_1': '厨房的有功功率',    'Sub_metering_2': '洗衣房的有功功率',    'Sub_metering_3': '电热水器和空调的有功功率',    },inplace=1)# 再次预览前5行数据df.head()  # 列名改成中文顺眼多了

Out[3]:

日期
时间
有功功率
无功功率
电压
电流
厨房的有功功率
洗衣房的有功功率
电热水器和空调的有功功率
index
0
1/1/07
0:00:00
2.58
0.136
241.97
10.6
0
0
0.0
1
1/1/07
0:01:00
2.552
0.1
241.75
10.4
0
0
0.0
2
1/1/07
0:0200
2.55
0.1
241.64
10.4
0
0
0.0
3
1/1/07
0:03:00
2.55
0.1
241.71
10.4
0
0
0.0
4
1/1/07
0:04:00
2.554
0.1
241.98
10.4
0
0
0.0

In[4]:

# 查看数据基本信息df.info()  # 共计260640条数据,可以看到各列非空数据的数量

Out[4]:

<class 'pandas.core.frame.DataFrame'>Int64Index: 260640 entries, 0 to 260639Data columns (total 9 columns): #   Column        Non-Null Count   Dtype  ---  ------        --------------   -----   0   日期            260640 non-null  object  1   时间            260640 non-null  object  2   有功功率          260640 non-null  object  3   无功功率          260640 non-null  object  4   电压            260640 non-null  object  5   电流            260640 non-null  object  6   厨房的有功功率       260640 non-null  object  7   洗衣房的有功功率      260640 non-null  object  8   电热水器和空调的有功功率  256869 non-null  float64dtypes: float64(1), object(8)memory usage: 19.9+ MB

In[5]:

# 查看各列数据类型df.dtypes  # object类型数据应转换为数值型数据

Out[5]:

日期               object时间               object有功功率             object无功功率             object电压               object电流               object厨房的有功功率          object洗衣房的有功功率         object电热水器和空调的有功功率    f
loat64dtype: object

In[6]:

# 查看数据是否有重复值df.duplicated().sum()  # 没有

Out[6]:

0

5.2 数据清洗

在尝试将object类型数据转换为数值型数据时发现有的数据为'?',故将包含'?'的数据进行异常值处理:

In[7]:

# 将异常值替换为空值df = df.replace('?',np.NAN)# 将有功功率、无功功率、电压、电流、厨房的有功功率、洗衣房的有功功率object类型数据都转换为数值型数据for i in list(df.columns)[2:-1]:    df[i] = df[i].astype(float)# 进行缺失值填充df = df.interpolate()

将日期、时间列结合后作为数据集的索引:

In[8]:

# 统一日期列数据形式df['日期'] = df['日期'].str.replace('/07','/2007')# 将日期、时间转换为str类型df['日期'] = df['日期'].astype(str)df['时间'] = df['时间'].astype(str)# 重构index数据为包含年月日时分秒的完整时间df.index = pd.to_datetime(df['日期']+ ' ' + df['时间'],format='%d/%m/%Y %H:%M:%S')df=df.drop(['日期','时间'],axis=1)df.head()

有功功率

无功功率
电压
电流
厨房的有功功率
洗衣房的有功功率
电热水器和空调的有功功率
2007-01-01
00:00:00
2.580
0.136
241.97
10.6
0.0
0.0
2007-01-01
00:01:00
2.552
0.100
241.75
10.4
0.0
0.0
2007-01-01
00:02:00
2.550
0.100
241.64
10.4
0.0
0.0
2007-01-01
00:03:00
2.550
0.100
241.71
10.4
0.0
0.0
2007-01-01
00:04:00
2.554
0.100
241.98
10.4
0.0
0.0

新建一列总有功功率数据:

In[9]:

df['总有功功率'] = df['有功功率']+df['厨房的有功功率']+df['洗衣房的有功功率']+df['电热水器和空调的有功功率']df.head()

Out[9]:

有功功率
无功功率
电压
电流
厨房的有功功率
洗衣房的有功功率
电热水器和空调的有功功率
总有功功率
2007-01-01
00:00:00
2.580
0.136
241.97
10.6
0.0
0.0
2.580
2007-01-01
00:01:00
2.552
0.100
241.75
10.4
0.0
0.0
2.552
2007-01-01
00:02:00
2.550
0.100
241.64
10.4
0.0
0.0
2.550
2007-01-01
00:03:00
2.550
0.100
241.71
10.4
0.0
0.0
2.550
2007-01-01
00:04:00
2.554
0.100
241.98
10.4
0.0
0.0
2.554

In[10]:

# 按小时进行数据重采样df_h = df.resample('H').sum()df_h.head()

Out[10]:

有功功率
无功功率
电压
电流
厨房的有功功率
洗衣房的有功功率
电热水器和空调的有功功率
总有功功率
2007-01-01
00:00:00
153.038
6.768
14481.68
631.8
0.0
35.0
188.038
2007-01-01
01:00:00
151.404
4.298
14465.79
626.6
0.0
0.0
151.404
2007-01-01
02:00:00
154.940
6.400
14592.01
632.4
0.0
20.0
174.940
2007-01-01
03:00:00
152.500
5.406
14595.94
624.0
16.0
0.0
168.500
2007-01-01
04:00:00
148.544
5.290
14547.37
606.6
0.0
0.0
148.544

In[11]:

# 按天进行数据重采样df_d = df.resample('D').sum()df_d.head()

Out[12]:

有功功率
无功功率
电压
电流
厨房的有功功率
洗衣房的有功功率
电热水器和空调的有功功率
总有功功率
2007-01-01
2749.004
148.166
345785.73
11400.4
0.0
352.0
5880.0
8981.004
2007-01-02
1269.236
190.342
348399.04
5348.2
0.0
348.0
6562.0
8179.236
2007-01-03
1014.054
196.728
350722.21
4340.2
0.0
344.0
4765.0
6123.054
2007-01-04
3259.412
202.302
345240.43
13648.6
1051.0
7597.0
10896.0
22803.412
2007-01-05
2713.364
173.154
346313.90
11354.6
1483.0
379.0
7602.0
12177.364

6、 数据分析

以分析家庭用电量的角度来说,数据集中的无功功率、电压和电流的分析意义不大,故选取其他特征进行数据的分析和挖掘。

6.1 不同类型的家庭用电量与总用电量的关系

首先看一下不同类型的家庭用电量在总用电量中的占比:

Out[12]:

由图可见,电热水器和空调的用电量占比最高,近60%的功率都是由电热水器和空调消耗的,洗衣房、厨房和其他电器的用电量相差不大,近乎是三等份。

6.2 家庭用电量的趋势分析

通过对时间序列可视化的方式对家庭用电趋势进行分析:

Out[13]:

<matplotlib.legend.Legend at 0x7fb3d9656fd0>

从可视化结果上来看,该家庭在二月末三月初时用电量较低,在这之后洗衣房的用电量激增,在4月末某一天总用电量达到了一个最谷底,除此之外整体的时序信息还是比较杂乱的。尝试通过序列分解的方式挖掘数据中的信息,考虑到工作日和周末对用电量的影响,对时间序列按照7天一个周期的方式进行分解,并对分解后的趋势序列进行可视化:

In [14]:

# seasonal_decompose函数可以将时序数据中的趋势特征、周期特征和残差项分解出来total_decomposition_d = seasonal_decompose(df_d['总有功功率'],period=7)kitchen_decomposition_d = seasonal_decompose(df_d['厨房的有功功率'],period=7)laundry_decomposition_d = seasonal_decompose(df_d['洗衣房的有功功率'],period=7)conditioner_decomposition_d = seasonal_decompose(df_d['电热水器和空调的有功功率'],period=7)

Out[15]:

<matplotlib.legend.Legend at 0x7fb3d93fb5b0>

看起来电热水器和空调的用电量与总用电量的时序图像最为相似,与3.1的结论相似,看起来电热水器和空调的用电量对总用电量的影响最大。除以之外,从以上图像中可以更清晰地看到各类家庭用电量的峰值时间段和谷值时间段:在三月末四月初时,该家庭的总用电量达到了最高峰值,在二月末该家庭的总用电量达到了最低谷,并在四月中上旬和四月末有两个用电量低谷期。

6.3 家庭用电量的时段分析

家庭用电量应该会有周期性的规律,从以上时序图像来看并不明显,尝试将分解序列所提取的周期特征进行可视化分析:

Out[16]:

<matplotlib.legend.Legend at 0x7fb3d9268c70>

由图可见,周日是一周中总用电量最大的一天(2007-01-01是周一),其次是周六和周三,周二和周五是一周中总用电量最少的两天。

In [17]:

# 以24小时为周期对每小时用电量序列进行分解total_decomposition_h = seasonal_decompose(df_h['总有功功率'],period=24)kitchen_decomposition_h = seasonal_decompose(df_h['厨房的有功功率'],period=24)laundry_decomposition_h = seasonal_decompose(df_h['洗衣房的有功功率'],period=24)conditioner_decomposition_h = seasonal_decompose(df_h['电热水器和空调的有功功率'],period=24)

Out[18]:

<matplotlib.legend.Legend at 0x7fb3d9054520>

由图可见,一天之中,晚上8点到10点是该家庭的用电高峰,其次是上午9点到10点,后半夜4点至6点用电量最低;厨房电器和洗衣房电器在晚上8点到10点是使用高峰期,电热水器和空调在上午8点到10点是使用高峰期,其次是晚上8点到10点。

7、分析结论

通过上述分析可以得到以下结论:

  • 该家庭近60%的功率都是由电热水器和空调所消耗的;
  • 在三月末四月初时,该家庭的总用电量达到了最高峰值,在二月末该家庭的总用电量达到了最低谷,并在四月中上旬和四月末有两个用电量低谷期;
  • 周日是该家庭一周中总用电量最大的一天,其次是周六和周三,周二和周五是一周中总用电量最少的两天;
  • 一天之中,晚上8点到10点是该家庭的用电高峰,其次是上午9点到10点,后半夜4点至6点用电量最低;
  • 厨房电器和洗衣房电器晚上8点到10点是使用高峰期,电热水器和空调在上午8点到10点是使用高峰期,其次是晚上8点到10点。

资料获取方式:

1. 关注本公众号

2. 发送口令“Python”即可领取(人工回复可能存在轻微时差,大家无需着急,所有发送口令的同学都会收到资料)

最新文章

随机文章