Time Series Analysis
Prophet
Prophet์ ์ด์ฉํ ์๊ณ์ด ๋ถ์ ๋ฐ ์์ธก
์๊ณ์ด ๋ถ์์ ์์ฐ๊ด๋ฆฌ๋ ์์์์ธก ๋ฑ ์ค๋ฌด์์ ๋ง์ด ํ์๋ก ํ์ง๋ง ํ์ง์ด ๊ทธ๋ค์ง ์ข์ง ์๋ ํธ์ด๋ค. ์ ํ ๋ฐ ์๋น์ค์ ๋ํ ์์๋ฅผ ๋ ์ ์์ธกํ๊ธฐ ์ํด ์๊ณ์ด ๋ถ์์ ์๋์ ์ ํ์ฑ์ ๊ฐ์ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค. ์๋ฅผ ๋ค์ด ์ ํ์ด ๋งค์ฅ์ ์ ๊ฒ ๋ฐฐ์น๋๋ฉด ๊ณ ๊ฐ์ ํ์ํ ๋ ์ ํ์ ๊ตฌ๋งคํ ์ ์์ด์ ์๋งค์ ์ฒด์ ์์ต ์์ค์ ์ด๋ํ๊ณ ์๋น์๋ค์ ๋ถ๋ง์ผ๋ก ๊ณ ๊ฐ์ด ๊ฒฝ์์ ์ฒด๋ก ์ด๋ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ ํํ๊ณ ์๊ธฐ์ ์ ํ ์์ธก์ด ์ค์ํ๋ค.
Prophet
Prophet์ ํ์ด์ค๋ถ์์ ๊ณต๊ฐํ ์๊ณ์ด ๋ถ์ ๋ฐ ์์ธก ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, ์ต๋ํ ๋ง์ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ ์๊ณ์ด ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค. ์ ํ๋๊ฐ ๋๊ณ ์ง๊ด์ ์ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํด ๋ชจ๋ธ์ ํ๋ํ ์ ์๋ค. ๊ณ์ ์ฑ์ด ์๊ณ ์ฌ๋ฌ ์์ฆ์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๊ฐ ์๋ ์๊ณ์ด์์ ์ ๋์ํ๋ฉฐ, KPI ์์ธก์ ํ์ฉํ ์ ์๋ค.
Prophet์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ์ ํนํ ์ ์ฉํ๋ค.
์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๊ด์ธก๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ก ์ฐ ๋จ์ ์ด์์ด๋ฉด ์ข๋ค. ๊ณ์ ์ ํน์ฑ์ด ์กด์ฌํ๋ค. ๋ถ๊ท์น์ ์ผ๋ก ์ผ์ด๋์ง๋ง ์ฌ์ ์ ์์ ์ ์๊ณ ์๋ ์ด๋ฒคํธ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์๋ค. ์๋ฅผ๋ค์ด, ๋ธ๋ ํ๋ผ์ด๋ฐ์ด๋ ํน์ ํ ์ด๋ฒคํธ๋ก ์ธํด ์ฅ๊ธฐ์ ์ธ ์ถ์ด๊ฐ ๋ณํ ์ ์๋ค. ์ ์ ํ ์ถ์, ๋์์ธ ๋ณ๊ฒฝ์ ๋น์ ํ ์ฑ์ฅ ์ถ์ธ์ด๋ค. ์ฆ๊ฐํ ์ ์๋ ์งํ์ ์ต๋์น๊ฐ ์กด์ฌํ๊ณ ์ด๋ฅผ ์๊ณ ์๋ ๊ฒฝ์ฐ์ด๋ค. ๊ฒฐ์ธก์น๊ฐ ์กด์ฌํ๊ฑฐ๋ ์ด์์น๊ฐ ๋ง๋ค.
Prophet์ ์ฃผ์ ๊ตฌ์ฑ์์๋ Growth, Seasonality, Holidays(Events), Error Term ์ด๋ฉฐ, ๊ณต์์ ๋ค์๊ณผ ๊ฐ๋ค.

Growth: g(t)
Growth๋ ์๊ฐ์ ๋ฐ๋ผ ์ถ์ธ(Trend)๋ฅผ ๋ํ๋ด๋ฉฐ, Linear Growth (Change Point)์ Non-Linear Growth (Logistic Growth), Flat Growth ๊ฐ ์๋ค.
Logistic Growth Model
Logistic Growth model์ ์์ฐ์ ์ธ ์ํ์ ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
C (Capacity) ์ํ์ , k ๋ growth rate๋ก ๊ณก์ ์ ๊ธฐ์ธ๊ธฐ, m์ด offset parameter ์ด๋ค.

์ง์ ๋ชจ๋ธ์ ๋จ๊ธฐ์ ์ผ๋ก ์ ์ฉํ ์ ์์ง๋ง ์ฑ์ฅ์ด ์์ํ ์ง์๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ์ง์๋๋ฉด ๋ฌด๋์ง๋ ๊ฒฝํฅ์ด ์๋ค. Capacity์ k(์ฑ์ฅ๋ฅ )๊ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ณํ ์๋ ์๋ค.
Linear Growth Model (Piecewise)
์ผ์ ํ ์ฑ์ฅ๋ฅ ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ Linear Growth Model์ ์ฌ์ฉํ๋ค. Change point๋ ์๋์ผ๋ก ํ์ง๋๋ฉฐ, ์์ธกํ ๋ ํน์ ์ง์ ์ด Change point์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋ฅ ์ ์ผ๋ก ๊ฒฐ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ Change point ๋ ์ ์ ํ ์ถ์, ๋์์ธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ํน์ ํ ์ด๋ฒคํธ๋ก ์ธํด ์ถ์ธ๊ฐ ๋ณํ ์ ์๋ ์์ ์ด๋ฉฐ, ์ฌ์ฉ์๊ฐ change point๋ฅผ ์ถ๊ฐํ ์๋ ์๋ค.
Seasonality: s(t)
์๊ฐ์ ๋ฐ๋ผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ํ๋๋ ํจํด์ด๋ค. ํจํด์ Trend์ ๋ฐ๋ผ ์งํญ์ด ์ผ์ , ์ฆ๊ฐ ํน์ ๊ฐ์ํ ์ ์๋ค. ํธ๋ฆฌ์ ๊ธ์๋ฅผ ์ด์ฉํด์ ํจํด์ ๊ทผ์ฌ์น๋ฅผ ์ฐพ๋๋ฐ, ํธ๋ฆฌ์ ๊ธ์๋ ์์์ ์ฃผ๊ธฐํจ์๋ฅผ ์ผ๊ฐํจ์์ ํฉ์ผ๋ก ํํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.

P๋ ์ฃผ๊ธฐ T๋ฅผ ์๋ฏธํ๋ฉฐ ์ฐ๋จ์๋ฉด 365.25, ์ฃผ ๋จ์๋ฉด 7์ผ์ด๋ค. N ์ ์ผ๊ฐํจ์๋ฅผ ์ผ๋ง๋ ์๋๋๋ฅผ ์๋ฏธํ๋ฉฐ, ์ฐ๋๊ธฐ์ค์ด๋ฉด N=10, ์ฃผ๋จ์๋ฉด N=3 ์ด ์ ๋ค์ด๋ง๋๋ค๊ณ ํ๋ค. N์ด ํฌ๋ฉด ํจํ ฌ์ด ๋น ๋ฅด๊ฒ ๋ฐ๋๊ฒ ๋๊ณ , N์ด ์์ผ๋ฉด ๋๋ฆฌ๊ฒ ๋ณํ๋ค.
Holidays: h(t)
์ฃผ๊ธฐ์ฑ์ ๊ฐ์ง์ง๋ ์์ง๋ง(๋ถ๊ท์นํ์ง๋ง) ์ ์ฒด ์ถ์ด์ ํฐ ์ํฅ์ ์ฃผ๋ ์ด๋ฒคํธ์ด๋ค. ์ด๋ฒคํธ ์๋ค๋ก window ๋ฒ์๋ฅผ ์ง์ ํ์ฌ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฏธ์น๋ ์ํฅ์ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์๋ค. ๋ธ๋ํ๋ผ์ด๋ฐ์ด๋ ์๋ ฅ ์ด๋ฒคํธ๋ ๊ธฐ์ ์ ์์ฐ๊ด๋ฆฌ๋ ์ด์ค์ฐฝ์ถ์ ์ํฅ์ ์ฃผ์ง๋ง ๋ ์ง๊ฐ ๋ค๋ฅผ ์ ์๋ค.
Error Term (ฯต) ๋ฐ์ดํฐ์ ์ก์์ด ๋ค์ด๊ฐ๊ฑฐ๋ ์ ์ค๋๋ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์๋ฒฝํ ํ๊ท์์ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ํ๊ท์์ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ์์ฐจ๋ฅผ ๋๋ค.
๋ชจ๋ธ ํ๋ จ
๋ฐฑ์๋๋ก ํต๊ณ ๋ชจ๋ธ๋ง ๋๊ตฌ Stan์ ์ฌ์ฉํด ๋ชจ๋ธ์ ํ์ต์ํจ๋ค. Prophet์ ์ ํ๋๊ฐ ๋๊ณ ์ง๊ด์ ์ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํด ๋ชจ๋ธ์ ํ๋ํ ์ ์๋ค.
๋ชจ๋ธ์ ์ ํฉํ๋ ๊ณผ์ ์ ์ดํด๋ณด๊ธฐ ์, fit() ํจ์๋ฅผ ํธ์ถํ๋ฉด
y: history
seasonality_prior_scale: prior_scale
holidays_prior_scale: prior_scale
seasonality_mode: mode
period: period
๋ฑ์ ๋ณ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ make_all_seasonality_features() ํจ์๋ฅผ ํธ์ถํ๋ฉด make_seasonality_features()์์ fourier_series() ํจ์๋ฅผ ์ฌ์ฉํด ๊ณ์ ํจํด์ธ seasonal_feature๋ฅผ ๊ตฌํ๊ณ seasonality_prior_scale ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด prior_scales ๊ตฌํ๊ณ make_holiday_features() ํจ์๋ฅผ ์ฌ์ฉํด holiday_feature์ holidays_prior_scale ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด prior_scales๋ฅผ ๊ตฌํด seasonal_features ์ ์ถ๊ฐํ๋ค.
seasonal_features: X,
prior_scales: sigmas,
changepoint_prior_scale: tau,
changepoints_t: t_change,
ds -> t: t
additive_terms: s_a
multiplicative_terms: s_m
๋ฑ์ผ๋ก ํ๋ผ๋ฏธํฐ ๋ฐ ๋ณ์๋ฅผ ์ ์ํ๊ณ stan์ ์ ๋ฌํ์ฌ ๋ชจ๋ธ์ ํ์ตํ๋ค. ๋ชจ๋ธ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ดํด๋ฐฉ๋ฒ์ธ Newton ํน์ LBFGS๋ฅผ ์ฌ์ฉํ๋ค.
transformed parameters {
vector[T] trend;
if (trend_indicator == 0) {
trend = linear_trend(k, m, delta, t, A, t_change);
} else if (trend_indicator == 1) {
trend = logistic_trend(k, m, delta, t, cap, A, t_change, S);
} else if (trend_indicator == 2) {
trend = flat_trend(m, T);
}
}
model {
//priors
k ~ normal(0, 5);
m ~ normal(0, 5);
delta ~ double_exponential(0, tau);
sigma_obs ~ normal(0, 0.5);
beta ~ normal(0, sigmas);
// Likelihood
y ~ normal(
trend
.* (1 + X * (beta .* s_m))
+ X * (beta .* s_a),
sigma_obs
);
}
Capacities ์๊ณ์ด ๋ฐ์ดํฐ ์ ์ฒด์ ์ต๋๊ฐ์ด๋ค. ์) ์์ฅ ์ด ์์
Change points ์ถ์ธ๊ฐ ๋ณํํ๋ ์์ ์ด๋ค. ์) ์ํ์ด ๋ฐ๋๊ฑฐ๋ ์ ์ ํ์ด ์ถ์๋ ๋
Holidays & Seasonality ์ถ์ธ์ ์ํฅ์ ๋ฏธ์น๋ ์๊ธฐ์ ์์ธ๋ค์ด๋ค. ์) ํ๋งค๋์ ์ํฅ์ ๋ง์ด ๋ฏธ์น๋ ํด์ผ ๋ฑ์ด๋ค.
Smoothing Parameter ๊ฐ๊ฐ์ ์์๋ค์ด ์ ์ฒด ์ถ์ด์ ๋ฏธ์น๋ ์ํฅ์ ์ ๋์ด๋ค. ์) ์ฃผ๊ธฐ๋ง๋ค ๋ณ๋์ ์ผ๋ง๋ ๋ํ๋ด์ผ ํ๋์ง์ด๋ค.
๋ชจ๋ธ ํ๊ฐ
T ๊น์ง ์๋ฃ๊ฐ ์๊ณ ์ดํ h๋ฅผ ๋ ์์ธกํ๋๋ฐ ๊ทธ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ณ ์ค์ฐจ์ MAPE(Mean Absolute Percentage Error)๋ฅผ ํ๊ฐ์งํ๋ก ์ฌ์ฉํ๋ค.
๋ชจ๋ธ ํ๊ฐ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๊ฐ ์๊ณ์ด์ด๊ณ ์์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋์ถฉ ์ ์ฒด ๊ธฐ๊ฐ์ ์ ๋ฐ ์ ๋๋ฅผ ๋์์ผ๋ก ์๋์ฐ๋ฅผ ์ก๊ณ ํ๊ฐํ๋ค. ์๋์ฐ๊ฐ ํฌ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ค ๋น์ทํ๊ณ ์์ผ๋ฉด ์๋ฌ๊ฐ ์ปค์ง ์ ์๋ค.
์๋ฌ์จ ์ ์ผ ๋ฎ์์ผ ์ข์ ๋ชจ๋ธ์ด๋ค.
๋ชจ๋ธ ํ๋ ๋ฐฉ๋ฒ์ Baseline ๋ชจ๋ธ๊ณผ ๋น๊ตํด ์ฑ๋ฅ์ด ๋จ์ด์ง๋ฉด trend, seansonality ๋ฑ์ ์์ ํ๊ณ , ํน์ ์ผ์์ ์์ธก๋ฅ ์ด ๋จ์ด์ง๋ฉด, ์ด์์น๋ฅผ ์ ๊ฑฐํ๊ณ , ํน์ cutoff (์ฐ๋ง ๋ฑ)์ ์์ธก๋ฅ ์ด ๋จ์ด์ง๋ฉด changepoint๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ์์ ์ ํ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ
https://github.com/facebook/prophet/blob/master/python/prophet/forecaster.py https://databricks.com/blog/2020/01/27/time-series-forecasting-prophet-spark.html https://databricks.com/blog/2021/04/06/fine-grained-time-series-forecasting-at-scale-with- https://www.slideshare.net/lumiamitie/facebook-prophet https://brunch.co.kr/@gimmesilver/17 https://m-insideout.tistory.com/m/13 https://peerj.com/preprints/3190.pdf https://github.com/facebook/prophet/blob/master/python/prophet/forecaster.py#L1136 ์คํํฌ๋ฅผ ์ด์ฉํ ์๊ณ์ด ์์ธก, https://towardsdatascience.com/pyspark-forecasting-with-pandas-udf-and-fb-prophet-e9d70f86d802
Last updated
Was this helpful?