Review/논문 리뷰

[논문 실습] 페이스북 시계열예측 모델 | prophet with 제주도 관광객 예측

어쩌다통계 2022. 10. 19. 01:03
728x90

이 글이 도움되셨다면 광고 클릭 부탁드립니다 : )

아래의 포스팅에서 공부해본 prophet을 제주도 관광객 데이터를 가지고 Python 실습해보려고 합니다.
이론적 설명이 필요하시면 아래의 [논문 리뷰]로 이동하시면 됩니다~
https://slowsteadystat.tistory.com/7?category=922379

 

[논문 리뷰] 페이스북 시계열예측 모델 | prophet

2017년 페이스북에서 공개한 시계열 예측 방법인 prophet 논문을 리뷰해보려고 합니다. prophet은 R/Python 라이브러리도 공개되어 있어서 적용하기도 쉽고 날짜 정보와 예측할 y만 있으면 되기 때문

slowsteadystat.tistory.com


여기서 분석해볼 데이터는 제주도의 월별 관광객 데이터입니다.
데이터 수집을 제주시 홈페이지에서 수기로 가져오느라 기간은 2018/05/01~2020/05/01 월별 데이터로 29개만 가져와서 분석해보도록 하겠습니다.
https://www.jeju.go.kr/open/open/iopenboard.htm?category=1035&page=2

 

제주특별자치도 코로나바이러스감염증-19 상황실

제주특별자치도 코로나19 상황실

www.jeju.go.kr

코로나 19로 인해 제주도 관광객이 작년 대비하여 많이 줄어들었는데, 과연 prophet 모델이 이점을 잘 반영하여 예측하는지 살펴보도록 하겠습니다.

먼저 분석을 위해 라이브러리를 설치해줍니다.
여기서 prophet을 돌리기 위한 가장 중요한 라이브러리는 "fbprophet"입니다

import os
import random
import pandas as pd                        
import numpy as np                        
import fbprophet as Prophet


데이터를 불러와서 정보를 확인해봅니다.

os.getcwd()
os.chdir('~directory~')
df = pd.read_csv('data/jeju_entry.csv') 
df.info()
df.tail()

데이터가 어떻게 생겼는지 확인했으니 저는 바로 prophet 모델이 적용해보려고 합니다.
prophet에 꼭 필요한 함수들로는 모델을 만드는 Prophet(), 데이터에 모델을 피팅하는 fit(), 예측을 위한 predict()로 크게 3 덩어리로 이루어져 있습니다.

우선 아무 parameter도 수정하지 않고 default값으로 돌려보겠습니다.

model =  Prophet.Prophet() 
model.fit(df);


6월/ 7월 제주도 관광객 수를 예측하기 위해 future_Data를 만들어 주어 predict 함수에 넣어줍니다.

past = model.make_future_dataframe(periods=0, freq='M')
future_data = pd.DataFrame(['2020-06-01','2020-07-01'], columns=['ds']).astype( 'datetime64[ns]')
future_data = pd.concat([past,future_data],axis=0)
forecast_data = model.predict(future_data)


plot을 그려서 예측 결과를 보면, 코로나 이후에 감소한 효과가 6월/7월에는 보이지 않습니다.

from fbprophet.plot import add_changepoints_to_plot
fig = model.plot(forecast_data)
a = add_changepoints_to_plot(fig.gca(), model, forecast_data)



그래서 이번엔 model을 적당히 튜닝해볼 텐데요.
논문에서 소개해주었던 여러 parameter를 수정해보려고 합니다.
코로나 19의 전후로 바뀌는 트렌드를 반영하기 위해 changepoints를 따로 넣고, 한국의 holidays를 반영해봅니다.
그리고 월별 데이터이기 때문에 weekly와 daily seasonality는 False로 설정합니다.

model =  Prophet.Prophet(changepoint_prior_scale=10, changepoints = ['2020-01-25','2020-02-29'],yearly_seasonality=10,weekly_seasonality=False,daily_seasonality=False, growth='linear') 
model.add_country_holidays(country_name='KR')
model.fit(df);
past = model.make_future_dataframe(periods=0, freq='M')
future_data = pd.DataFrame(['2020-06-01','2020-07-01'], columns=['ds']).astype( 'datetime64[ns]')
future_data = pd.concat([past,future_data],axis=0)
forecast_data = model.predict(future_data)


똑같이 그림을 그리게 되면, 우리가 지정해준 2020-01-25와 2020-02-29를 기준으로 트렌드의 기울기가 바뀌는 것을 확인할 수 있습니다.
이렇게 parameter를 어떻게 조정하느냐에 따라 모델의 성능이 많이 달라집니다.
논문에서 주장하는 강점이 여러 parameter를 빠르게 조절할 수 있어 다양한 시도를 해볼 수 있다고 했는데,
확실히 전통적인 시계열 데이터 분석보다는 접근도 쉽고 활용이 쉬운 것 같네요.


prophet 모델의 각 component를 분절화해서 확인할 수도 있습니다.

model.plot_components(forecast_data)

반응형