[중급] 가볍게 이것저것

[스마트 빌딩] 건물의 전력 소비량 알아보기_1

PassionPython 2019. 8. 21. 16:21

COMmercial Building Energy Data set

(COMBED)

데이터분석, 시각화

이 데이터 셋은 한 대학교 건물로부터 얻은 1달 간의 전력 소비량 데이터 입니다.

컬럼 설명

(데이터는 다음의 링크에서 다운받으실 수 있습니다)
  • time

    • 타임스탬프, 1/30 Hz 주기이고 밀리초(ms) 단위로 획득됩니다.
  • Power

    • 건물의 해당 시간 전기 에너지 소비량
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
path = 'data/COMBED/total_main.csv'
building = pd.read_csv(path, sep=',')
building.head()

1401695783000.0 40767.359375
0 1.401696e+12 41936.476562
1 1.401696e+12 40863.601562
2 1.401696e+12 40860.156250
3 1.401696e+12 44302.625000
4 1.401696e+12 41400.218750
# 데이터 셋에 컬럼명이 들어있지 않기 때문에, 직접 넣어줍니다.
building.columns = ['time', 'Power']
# 컬럼명이 제대로 들어간 것을 확인합니다.
building.head()

time Power
0 1.401696e+12 41936.476562
1 1.401696e+12 40863.601562
2 1.401696e+12 40860.156250
3 1.401696e+12 44302.625000
4 1.401696e+12 41400.218750
# .astype() 을 이용하여 데이터의 형태를 바꿀 수 있습니다.
# ms 영역대의 데이터이므로, datetime64[ms] 로 바꾸어줍니다.
# 이렇게 바꾼 데이터를 datetime 컬럼에 넣어줍니다.
building['datetime'] = building['time'].astype("datetime64[ms]")

# s 영역대의 데이터라면, datetime64[s] 를 넣어주어야 합니다.
# 시간 datetime이 제대로 들어간 것을 확인합니다.

building.head()
# 14년도 6월 2일 07시 56분 경 부터 획득하였습니다.
# 30 초 주기로 들어간 것을 확인하였습니다.

time Power datetime
0 1.401696e+12 41936.476562 2014-06-02 07:56:53
1 1.401696e+12 40863.601562 2014-06-02 07:57:23
2 1.401696e+12 40860.156250 2014-06-02 07:57:53
3 1.401696e+12 44302.625000 2014-06-02 07:58:23
4 1.401696e+12 41400.218750 2014-06-02 07:58:53
# .tail로 14년도 7월 1일 04시 까지 획득하였음을 확인합니다.

building.tail()

time Power datetime
82882 1.404187e+12 31189.355469 2014-07-01 03:57:53
82883 1.404187e+12 31259.027344 2014-07-01 03:58:23
82884 1.404187e+12 34298.542969 2014-07-01 03:58:53
82885 1.404187e+12 33069.281250 2014-07-01 03:59:23
82886 1.404187e+12 34743.265625 2014-07-01 03:59:53
# building 데이터에 연, 월, 일, 시, 분, 초를 나타내는 새로운 컬럼을 생성합니다.
# 각각의 이름을 datetime-month/day/hour/minute/second라고 지정합니다.
# 이 컬럼에 날짜(datetime) 컬럼의 dt(datetime의 약자입니다) 옵션을 활용하여 월일시분을 따로 넣어줍니다.
building["datetime-month"] = building["datetime"].dt.month
building["datetime-day"] = building["datetime"].dt.day
building["datetime-hour"] = building["datetime"].dt.hour
building["datetime-minute"] = building["datetime"].dt.minute

# dayofweek는 날짜에서 요일(월~일)을 가져오는 기능입니다.
# 값은 0(월), 1(화), 2(수), 3(목), 4(금), 5(토), 6(일) 을 나타냅니다.
building["datetime-dayofweek"] = building["datetime"].dt.dayofweek
# building 변수에 할당된 데이터의 행렬 사이즈를 출력합니다.
# 출력은 (row, column) 으로 표시됩니다.
print(building.shape)

# .head()로 building 데이터의 상위 5개를 띄우되,
# datetime과 이와 연관된 나머지 다섯 개의 컬럼만을 출력합니다.
building[["datetime", "datetime-month", "datetime-day", 
       "datetime-hour", "datetime-minute", "datetime-dayofweek"]].head()
(82887, 8)

datetime datetime-month datetime-day datetime-hour datetime-minute datetime-dayofweek
0 2014-06-02 07:56:53 6 2 7 56 0
1 2014-06-02 07:57:23 6 2 7 57 0
2 2014-06-02 07:57:53 6 2 7 57 0
3 2014-06-02 07:58:23 6 2 7 58 0
4 2014-06-02 07:58:53 6 2 7 58 0
# matplotlib의 subplots를 사용합니다. 이 함수는 여러 개의 시각화를 한 화면에 띄울 수 있도록 합니다.
# 이번에는 2x2으로 총 4개의 시각화를 한 화면에 띄웁니다.
figure, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)

# 시각화의 전체 사이즈는 18x8로 설정합니다.
figure.set_size_inches(18, 8)

# seaborn의 barplot으로 subplots의 각 구역에
# 월, 일, 시, 분 별 전력 소비량을 출력합니다.
sns.barplot(data=building, x="datetime-month", y="Power", ax=ax1)
sns.lineplot(data=building, x="datetime-day", y="Power", ax=ax2)
sns.lineplot(data=building, x="datetime-hour", y="Power", ax=ax3)
sns.barplot(data=building, x="datetime-minute", y="Power", ax=ax4)
<matplotlib.axes._subplots.AxesSubplot at 0x298f93887f0>

# 행을 시간으로, 열을 요일로 하는 피벗 테이블인 pivoted을 만들고
pivoted = building.pivot_table(index = 'datetime-dayofweek', columns = 'datetime-hour', values = 'Power')

# 이 피벗 테이블을 히트맵 방식으로 시각화 합니다. cmap 옵션은 색 분포를 의미합니다.
sns.heatmap(pivoted, cmap='hot')
plt.gcf().set_size_inches(20, 5)