날씨 데이터로 Prophet 모델을 구축하여 시계열 예측

Author

김희영

Published

September 30, 2022

서울관측소(108)에서 2016년 9월 1일부터 2022년 9월 29일까지의 평균기온 데이터입니다. 2016년 9월 1일부터 2022년 8월 31일까지의 데이터를 이용하여 모델을 생성합니다. 그 이후, 생성된 모델로 2022년 9월 1일부터 2022년 9월 29일까지 예측값을 만들어 실제값과 비교해보는 프로세스를 진행해 보겠습니다.

import pandas as pd
path = 'https://raw.githubusercontent.com/kimheeyounghee/sigolyori/main/2_1.csv'
df = pd.read_csv(path, encoding = 'cp949')
df.head()
print(min(df.일시))
print(max(df.일시))

온도 데이터의 시작은 2016년 9월 1일, 끝은 2022년 9월 29일입니다.

df.drop(['지점', '지점명'], axis = 1, inplace = True)
df.columns = ['ds', 'y']
df.head()

Prophet은 일정한 데이터프레임 형식이 있습니다. 날짜 열은 ‘ds’라는 이름으로, 값은 ‘y’로 지정해 주어야 합니다. 따라서 필요한 열만 남기고 남은 열의 이름을 바꾸어 줍니다.

train = df[df.ds < '2022-09-01']
test = df[df.ds >= '2022-09-01']

모델에 적용하는 온도 데이터는 2016년 9월 1일부터 2022년 8월 31일까지이며, 2022년 9월 1일부터 2022년 9월 29일까지는 예측값과의 비교를 위해 test 데이터로 남겨둡니다.

from prophet import Prophet
m = Prophet()
m.fit(train)
future = m.make_future_dataframe(periods=30)
future.tail()

make_future_dataframe 함수는 훈련에 포함되었던 날짜와 그 이후 periods 인수의 기간만큼을 추가한 데이터프레임을 생성합니다.

forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

predict 함수는 모델의 예측값을 산출합니다.

fig1 = m.plot(forecast)
fig1.set_size_inches(12, 7)

import matplotlib.pyplot as plt
fig2 = plt.scatter(test.ds, test.y, color = 'y', s = 12)

plt.show()

파란 선은 예측값(yhat)이며 범위는 허용 가능한 오차 범위(yhat_lower ~ yhat_upper)입니다. 노란 점은 실제 9월 1일부터 9월 29일까지의 온도 분포입니다. 그래프를 보면 미래 온도 흐름을 예측할 수 있는 모델이 생성된 것을 알 수 있습니다.