[코드구현] Time Series Forecasting - Facebook Prophet

1 minute read

Time Series Forecasting 프로젝트

 

한 시간 간격으로 측정 되어 있는 한 달치 특정 구간의 평균 속도 데이터를 이용하여 마지막 일주일 간의 평균 속도를 예측하는 task를 수행해 보았다.

Code

 

데이터는 도로교통공사의 오픈 데이터를 직접 가공하였으며 아래에서 다운로드할 수 있다.

csvfile

 

페이스북에서 제공하는 시계열 예측 모듈인 Facebook prophet을 사용하여 예측을 진행해 보았다.

 

Load Data

FaceBook Prophet을 사용하기 위해서는 시간을 나타내는 datetime 형식의 “ds”라는 이름을 가진 column과 데이터를 나타내는 숫자 형식의 “y”라는 이름을 가진 column이 있어야 한다.

import pandas as pd
from prophet import Prophet
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("서인천IC-부평IC 평균속도.csv", encoding='CP949')
df = df.drop(df.columns[0], axis=1)

df.columns = ["ds","y"]
df["ds"] = df["ds"].astype(str)
df["ds"] = pd.to_datetime(df["ds"].str.slice(start=0, stop=4) + "/" + df["ds"].str.slice(start=4, stop=6) + "/" +df["ds"].str.slice(start=6, stop=8) + "/" + df["ds"].str.slice(start=8, stop=10) + ":0")
df
  ds y
0 2021-05-01 00:00:00 98.63
1 2021-05-01 01:00:00 100.53
2 2021-05-01 02:00:00 99.86
3 2021-05-01 03:00:00 99.34
4 2021-05-01 04:00:00 93.64

Facebook Prophet을 사용할 수 있도록 dataframe의 형태를 바꿔준다.

 

Train

m = Prophet()
m.fit(df[:-24*7])

마지막 일주일을 예측하는 것이 목표 이므로 마지막 일주일의 데이터를 제외한 데이터를 이용하여 훈련을 진행한다.

 

Evaluate

future = m.make_future_dataframe(freq='H',periods=24*7)
future.tail()
  ds
739 2021-05-31 19:00:00
740 2021-05-31 20:00:00
741 2021-05-31 21:00:00
742 2021-05-31 22:00:00
743 2021-05-31 23:00:00

먼저 예측을 진행할 기간을 포함하고 있는 데이터 프레임을 생성한다.

 

forecast = m.predict(future)
forecast[['ds', 'yhat']].tail()
  ds yhat
739 2021-05-31 19:00:00 69.159387
740 2021-05-31 20:00:00 75.501921
741 2021-05-31 21:00:00 83.056167
742 2021-05-31 22:00:00 89.974651
743 2021-05-31 23:00:00 94.653136

학습된 모델을 이용하여 결과를 예측한다.

 

plt.figure(figsize=(20,5))

plt.plot(df["y"][400:])
plt.plot(range(744-24*7,744),forecast['yhat'][-24*7:])

image-20210730142627807

뭔가 어느정도는 비슷하게 예측을 한 것 같다.

 

def MAPEval(y_pred, y_true):
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
MAPEval(forecast['yhat'][744-24*7:],df["y"][744-24*7:])
9.854380158591118

결과의 MAPE 를 계산해본 결과 약 9.85로 나쁘지 않은 정확도를 가지고 있는 것을 확인했다.

 

Conclusion

Facebokk Prophet을 이용하여 시계열 예측을 진행해본 결과 MAPE 9.85의 나쁘지 않은 성능을 확인할 수 있었다.

결과 그래프를 보면 뭔가 동글동글하게 예측이 되는 것을 알 수 있었고 별다른 입력 없이 오직 데이터만 입력으로 넣은 결과치고는 요일별 특성이나 일별 특성을 잘 포착한 것 같다.

학습과 예측 과정이 매우 간편하고 빠름에도 불구하고 나쁘지 않은 성능을 확인할 수 있었다.

어떤 데이터라도 시계열 예측이 필요할 때 간편하게 사용해 볼 수 있는 방법인것 같다.