1、数据说明
本项目所用数据集包含了一个家庭6个月的用电数据,收集于2007年1月至2007年6月。这些数据包括有功功率、无功功率、电压、电流强度、分项计量1(厨房)、分项计量2(洗衣房)和分项计量3(电热水器和空调)等信息。该数据集共有260,640个测量值,可以为了解家庭用电情况提供重要的见解。
我们要感谢databeats团队提供这个数据集。如果你在你的研究中使用这个数据集,请注明原作者:Georges Hébrail 和 Alice Bérard。
字段含义对照表:
2、数据来源
https://www.kaggle.com/完整路径请点击文末阅读原文。
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()
| Date | Time | Global_active_power | Global_reactive_power | Voltage | Global_intensity | Sub_metering_1 | Sub_metering_2 | Sub_metering_3 |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
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]:
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
In[6]:
# 查看数据是否有重复值df.duplicated().sum() # 没有
Out[6]:
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()
新建一列总有功功率数据:
In[9]:
df['总有功功率'] = df['有功功率']+df['厨房的有功功率']+df['洗衣房的有功功率']+df['电热水器和空调的有功功率']df.head()
Out[9]:
In[10]:
# 按小时进行数据重采样df_h = df.resample('H').sum()df_h.head()
Out[10]:
In[11]:
# 按天进行数据重采样df_d = df.resample('D').sum()df_d.head()
Out[12]:
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点。