6. 한국전력거래소 17년간 발전실적 분석 및 향후 1년 예측[시계열데이터]

2001년부터 2017년까지의 한국전력거래소의 발전실적을 시계열데이터로 나타내어 요일, 월, 년도별로 경향을 분석해보고 fbprophet을 이용하여 1년간 데이터를 예측해본다.

[main code]

한국전력거래소 17년간 발전실적 분석및 예측

  • 한국전력거래소의 2001년부터 2017년까지의 발전실적을 가져와 시간의 흐름에 따른 변화를 살펴보고 앞으로의 발전 실적에 대해 예측을 해본다.
  • 시계열데이터를 fbprophet이라는 모듈을 사용하여 분석하여 예측해 본다.
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from fbprophet import Prophet
from datetime import datetime
path = "c:/Windows/Fonts/malgun.ttf"
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    rc('font', family=font_name)
else:
    print('Unknown system... sorry~~~~')    

plt.rcParams['axes.unicode_minus'] = False
electric_sending = pd.read_csv('../data/2001년_이후_일별_송전단실적_총합_정보.csv', engine= 'python') 
electric_sending = electric_sending[electric_sending[' 송전단실적 합계(MWh)'].notnull()] # null 값 없애기
electric_sending.head()
송전단실적 합계(MWh)
0200141606955.2747
1200142719433.3379
2200143738837.1730
3200144727158.4834
4200145681998.4485
electric_sending['date'] = electric_sending['년'].apply(lambda x : str(x)) +'-' \
                            + electric_sending['월'].apply(lambda x : str(x)) +'-' \
                            + electric_sending['일'].apply(lambda x : str(x))
del electric_sending["년"]
del electric_sending["월"]
del electric_sending["일"]
electric_sending.head()
송전단실적 합계(MWh)date
0606955.27472001-4-1
1719433.33792001-4-2
2738837.17302001-4-3
3727158.48342001-4-4
4681998.44852001-4-5
electric_sending_1 = electric_sending.set_index("date")
electric_sending_1.head()
송전단실적 합계(MWh)
date
2001-4-1606955.2747
2001-4-2719433.3379
2001-4-3738837.1730
2001-4-4727158.4834
2001-4-5681998.4485

17년간 송전단실적 변화 추이를 그래프로 나타내어 본다

electric_sending_1[' 송전단실적 합계(MWh)'].plot(figsize=(12,9), grid=True,title = "17년간 송전단실적 변화 추이[2001년-2017년](단위:MWh)");

png

17년간의 데이터를 이용하여 선형 회귀 분석을 해본다

time = np.arange(0,len(electric_sending_1))
MWh = electric_sending_1[' 송전단실적 합계(MWh)'].values

fx = np.linspace(0, time[-1], 1000)
fp1 = np.polyfit(time, MWh, 1)
f1 = np.poly1d(fp1)
fp1
array([1.23816187e+02, 7.45179273e+05])
plt.figure(figsize=(15,10))
plt.scatter(time, MWh, s=10)

plt.plot(fx, f1(fx), lw=4, label='f1',c = 'red')
plt.xlabel("time") 
plt.ylabel("송전실적(MWh)") 

plt.grid(True, linestyle='-', color='0.75')

plt.show()

png

17년간의 데이터를 이용하여 2018년도의 송전량을 예측해본다.

df = pd.DataFrame({'ds':electric_sending["date"], 'y':electric_sending[' 송전단실적 합계(MWh)']})
df.reset_index(inplace=True)
df['ds'] =  pd.to_datetime(df['ds'])


m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df)
<fbprophet.forecaster.Prophet at 0x2039e7f8940>
future = m.make_future_dataframe(periods=365)
future.tail()
ds
64792018-12-27
64802018-12-28
64812018-12-29
64822018-12-30
64832018-12-31
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
dsyhatyhat_loweryhat_upper
64792018-12-271.592441e+061.511890e+061.670860e+06
64802018-12-281.588012e+061.512791e+061.660921e+06
64812018-12-291.506943e+061.428594e+061.577516e+06
64822018-12-301.424124e+061.352407e+061.499014e+06
64832018-12-311.559662e+061.479290e+061.635239e+06
m.plot(forecast,xlabel = "year",ylabel="송전실적(MWh)");

png

예측한 그래프를 보면 2018년에도 그전과 비슷하게 상승하고 있는 것을 알 수 있다.

m.plot_components(forecast);

png

결론

trend를 보면 2009년에 갑작스럽게 양이 늘어난 구간을 제외하고는 송전량이 꾸준한 양으로 증가하고있다.

주말에는 주중에비해 송전량이 적은 것으로 보아 직원들이 많이 출근하지 않는 주말에는 송전량이 적은 것으로 추측할 수 있다.

1년간의 추세를 보면 겨울과 여름에 송전량이 많은 것으로 보아 에어컨이나 난방기구를 많이 작동하기 때문이라고 추측할 수 있다.

제일 아래에 daily 그래프는 관련된 data가 없으므로 필요 없는 그래프이다.


© 2020. All rights reserved.