Prophet
Prophet
Prophet은 Meta(Facebook)의 Core Data Science 팀이 공개한 오픈소스 시계열 예측 라이브러리예요. 비선형 트렌드에 연간(Yearly), 주간(Weekly), 일간(Daily) 계절성과 휴일 효과를 더하는 가법 모델(additive model)을 기반으로 동작해요. 계절성이 뚜렷하고 여러 해에 걸친 과거 데이터가 있는 시계열에서 특히 잘 작동하며, 결측값이나 트렌드의 변화에도 강하고 이상치(outlier)도 대체로 잘 처리해 줘요. R과 Python 두 가지로 구현되어 있어요.
출처: 문서
본문
설치
Prophet은 PyPI에 등록되어 있어서 pip으로 설치할 수 있어요.
python -m pip install prophet
v1.0부터 PyPI 패키지 이름은 prophet이고, 그 이전 버전은 fbprophet이었어요. v1.1부터 지원하는 최소 Python 버전은 3.7이며 그 이전부터 Python 2는 지원하지 않아요. Anaconda를 쓴다면 conda-forge로도 설치할 수 있어요.
conda install -c conda-forge prophet
R에서는 CRAN 패키지로 제공되니 install.packages로 설치하면 돼요.
install.packages('prophet')
기본 사용 (피팅/예측)
Prophet은 sklearn 모델 API를 따르고 있어요. Prophet 클래스 인스턴스를 만들고 fit과 predict 메서드를 호출하면 되죠.
Prophet에 들어가는 입력은 항상 ds와 y 두 개의 컬럼을 가진 데이터프레임이에요. ds(날짜 스탬프) 컬럼은 Pandas가 기대하는 형식이어야 하고, 날짜는 YYYY-MM-DD, 타임스탬프는 YYYY-MM-DD HH:MM:SS 형식이 좋아요. y 컬럼은 숫자형이어야 하며 예측하려는 측정값을 나타내요.
import pandas as pd
from prophet import Prophet
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv')
df.head()
모델은 Prophet 객체를 만들고 fit 메서드에 과거 데이터프레임을 넘겨서 피팅해요. 보통 피팅에 1~5초 정도 걸려요.
m = Prophet()
m.fit(df)
예측은 예측할 날짜가 담긴 ds 컬럼을 가진 데이터프레임에 대해 이루어져요. 미래를 지정한 일수만큼 확장한 데이터프레임은 make_future_dataframe 헬퍼 메서드로 만들 수 있어요. 기본적으로 과거 날짜(히스토리)도 함께 포함되기 때문에 모델의 인샘플(in-sample) 적합도 함께 볼 수 있어요.
future = m.make_future_dataframe(periods=365)
future.tail()
predict 메서드는 각 행에 예측값인 yhat을 만들어 줘요. 과거 날짜를 넘기면 인샘플 적합값도 제공해 주죠. 예측 결과 객체에는 yhat과 함께 구성요소(components) 및 불확실성 구간을 담은 컬럼들이 포함돼요.
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
시각화
예측 결과는 plot 메서드로 그릴 수 있어요.
fig1 = m.plot(forecast)
예측을 트렌드, 연간 계절성, 주간 계절성 등으로 분해해서 보고 싶다면 plot_components 메서드를 써요. 휴일을 포함했다면 그 구성요소도 함께 보여줘요.
fig2 = m.plot_components(forecast)
plotly를 설치했다면 plotly 기반의 인터랙티브 플롯도 만들 수 있어요. plotly 4.0 이상은 기본으로 설치되지 않으니 따로 설치해야 해요.
from prophet.plot import plot_plotly, plot_components_plotly
plot_plotly(m, forecast)
plot_components_plotly(m, forecast)
R에서는 Python의 m.plot(forecast) 대신 plot(m, forecast) 함수를 사용해요.
library(prophet)
m <- prophet(df)
future <- make_future_dataframe(m, periods = 365)
forecast <- predict(m, future)
plot(m, forecast)
prophet_plot_components(m, forecast)
계절성과 트렌드
Prophet의 핵심은 비선형 트렌드에 연간·주간·일간 계절성과 휴일 효과를 더하는 가법 모델이에요. 기본 모델은 자동으로 연간 계절성과 주간 계절성을 감지해요.
- 트렌드(Trend): 데이터에 트렌드가 여러 개의 변화 지점(changepoint)을 가질 수 있어요. Prophet은 자동으로 변화 지점을 감지하고,
changepoint_prior_scale매개변수로 트렌드의 유연성을 조절할 수 있어요. - 계절성(Seasonality): 기본적으로 연간 계절성과 주간 계절성이 푸리에 급수(Fourier series)로 모델링돼요. 사용자 정의 계절성도 추가할 수 있고,
yearly_seasonality나weekly_seasonality매개변수로 끄거나 푸리에 차수(order)를 조정할 수 있어요. - 휴일 효과(Holiday Effects): 휴일을 지정하면 해당 날짜의 효과를 모델에 반영해요. Python에서는 내장된 국가별 휴일 데이터셋도 제공돼요.
주요 매개변수
예측 절차의 설정값은 Prophet() 생성자에 넣으면 돼요. 주요 매개변수로는 다음과 같은 것들이 있어요.
growth: 트렌드의 형태 (linear,logistic,flat)seasonality_mode: 계절성의 방식 (additive또는multiplicative)yearly_seasonality/weekly_seasonality/daily_seasonality: 각 계절성의 자동 감지 여부 또는 푸리에 차수 지정changepoint_prior_scale: 트렌드 변화 지점의 유연성 조절seasonality_prior_scale: 계절성과 휴일에 대한 사전 분포(prior)의 스케일holidays_prior_scale: 휴일 효과에 대한 사전 분포의 스케일holidays: 휴일 데이터프레임
각 메서드의 세부 옵션은 도큐스트링에서 확인할 수 있어요. Python에서는 help(Prophet)이나 help(Prophet.fit)으로, R에서는 ?prophet 또는 ?fit.prophet으로 확인하면 돼요.
특징 요약
- 자동 예측: 데이터 분석가나 데이터 과학자가 손으로 튜닝할 수 있는 완전 자동화된 예측을 제공해요.
- 빠른 속도: 피팅이 1~5초로 빠르고, 교차 검증과 하이퍼파라미터 튜닝도 지원해요.
- 결측값·이상치에 강함: 결측 데이터와 트렌드의 변화에 강하고 이상치를 대체로 잘 처리해요.
- 불확실성 구간 제공:
yhat_lower와yhat_upper같은 예측 불확실성 구간을 함께 제공해요.