๐ฐ๏ธ ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์: Prophet ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ ๐

์๋ ํ์ธ์, ๋ฐ์ดํฐ ๋ถ์ ๋ง๋ฒ์ฌ๋ค! ๐งโโ๏ธโจ ์ค๋์ ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์์ ์ธ๊ณ๋ก ์ฌ๋ฌ๋ถ์ ์ด๋ํฉ๋๋ค. ํนํ Facebook์์ ๊ฐ๋ฐํ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ Prophet ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํด ๋ฏธ๋๋ฅผ ์์ธกํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฑฐ์์. ๋ง์น ํฌ๋ฆฌ์คํ ๋ณผ์ ๋ค์ฌ๋ค๋ณด๋ ๊ฒ์ฒ๋ผ ๋ฐ์ดํฐ์ ๋ฏธ๋๋ฅผ ๋ค์ฌ๋ค๋ณด๋ ๊ฑฐ์ฃ ! ๐ฎ
์ฌ๋ฌ๋ถ, ํน์ ํ๋ก์นด๋๋ก ๋ฏธ๋๋ฅผ ์ ์น๋ ๊ฒ์ ๋ณธ ์ ์๋์? ์ฐ๋ฆฌ๊ฐ ํ ์๊ณ์ด ๋ถ์๋ ๋น์ทํด์. ๋ค๋ง, ์นด๋ ๋์ ๋ฐ์ดํฐ๋ฅผ, ์ง๊ด ๋์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ ์ ์ด ๋ค๋ฅด์ฃ . ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค ํจ์ฌ ๋ ์ ํํ๋ต๋๋ค! ๐
์๊ณ์ด ๋ฐ์ดํฐ๋ ์๊ฐ์ ๋ฐ๋ผ ๋ณํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํด์. ์๋ฅผ ๋ค๋ฉด, ๋งค์ผ์ ์ฃผ์ ๊ฐ๊ฒฉ, ์๋ณ ํ๋งค๋, ์ฐ๋๋ณ ์ธ๊ตฌ ์ฆ๊ฐ์จ ๋ฑ์ด ์์ฃ . ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ฉด ๋ฏธ๋์ ํธ๋ ๋๋ฅผ ์์ธกํ ์ ์์ด์.
๊ทธ๋ฐ๋ฐ ๋ง์ด์ฃ , ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์์ด ์ ์ค์ํ ๊น์? ๐ค ์... ์ฌ๋ฅ๋ท(https://www.jaenung.net)์ ์๋ก ๋ค์ด๋ณผ๊น์? ์ฌ๋ฅ๋ท์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ํ๋ซํผ์ธ๋ฐ, ๋ง์ฝ ์ฌ๋ฅ๋ท์์ ํน์ ์ฌ๋ฅ์ ์์๊ฐ ์ด๋ป๊ฒ ๋ณํ ์ง ์์ธกํ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ์์๊ฐ ์ฆ๊ฐํ ๊ฒ ๊ฐ์ ์ฌ๋ฅ์ ๋ํด ๋ฏธ๋ฆฌ ์ค๋นํ๊ณ , ๊ฐ์ํ ๊ฒ ๊ฐ์ ์ฌ๋ฅ์ ๋ํด์๋ ๋์ฑ ์ ์ธ์ธ ์ ์๊ฒ ์ฃ . ์ด์ฒ๋ผ ์๊ณ์ด ๋ถ์์ ๋น์ฆ๋์ค ์ ๋ต์ ์ธ์ฐ๋ ๋ฐ ํฐ ๋์์ด ๋ฉ๋๋ค.
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Prophet์ ๋ํด ์์๋ณผ๊น์? Prophet์ Facebook์์ ๊ฐ๋ฐํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ณต์กํ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ถ์ํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ๋ณต์กํ ๋ ์ํผ๋ฅผ ๊ฐ๋จํ steps๋ก ์ ๋ฆฌํด์ฃผ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์์! ๐ณ
๐ก Prophet์ ์ฃผ์ ํน์ง:
- ๊ฐ๋ ฅํ ์์ธก ๋ฅ๋ ฅ
- ๊ณ์ ์ฑ, ํด์ผ ํจ๊ณผ ๋ฑ์ ์๋์ผ๋ก ๊ณ ๋ ค
- ์ด์์น์ ๊ฐํจ
- ๋๋ฝ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ธํฐํ์ด์ค
์ด์ ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ ๋ถ์ ์ฌํ์ ์์ํด๋ณผ๊น์? ์์ ๋ฒจํธ๋ฅผ ๋งค์ธ์. ์ฐ๋ฆฌ๋ Python์ ์ธ๊ณ๋ก ๋น ์ ธ๋ค ์ค๋น๊ฐ ๋์์ต๋๋ค! ๐โจ
๐ ๏ธ Prophet ์ค์น ๋ฐ ํ๊ฒฝ ์ค์
์, ์ด์ ์ฐ๋ฆฌ์ ๋ง๋ฒ ์งํก์ด... ์๋, Prophet์ ์ค์นํ ์๊ฐ์ ๋๋ค! ๐งโโ๏ธ ๋จผ์ , ์ฐ๋ฆฌ๋ Python ํ๊ฒฝ์ด ์ค๋น๋์ด ์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์. ์์ง Python์ ์ค์นํ์ง ์์ผ์ จ๋ค๋ฉด, Python ๊ณต์ ์น์ฌ์ดํธ์์ ๋ค์ด๋ก๋ํ์ค ์ ์์ด์.
Prophet์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํด์. ๊ทธ์ pip๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค!
pip install prophet
๋ง์ฝ ์ค์น ์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ผ ์ ์์ด์:
- Python ๋ฒ์ ์ด ๋๋ฌด ๋ฎ๊ฑฐ๋ ๋์ ๊ฒฝ์ฐ
- ํ์ํ ์์กด์ฑ ํจํค์ง๊ฐ ์ค์น๋์ง ์์ ๊ฒฝ์ฐ
- ์ด์ ์ฒด์ ์์ ํธํ์ฑ ๋ฌธ์
์ด๋ฐ ๋ฌธ์ ๋ค์ ๋๋ถ๋ถ Python ํ๊ฒฝ์ ์ ๋ฐ์ดํธํ๊ฑฐ๋, ํ์ํ ํจํค์ง๋ฅผ ์๋์ผ๋ก ์ค์นํ์ฌ ํด๊ฒฐํ ์ ์์ด์. ๋ง์น ์๋ฆฌ๋ฅผ ํ ๋ ์ฌ๋ฃ๊ฐ ๋ถ์กฑํ๋ฉด ์ถ๊ฐ๋ก ๊ตฌ๋งคํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
Prophet์ด ์ฑ๊ณต์ ์ผ๋ก ์ค์น๋์๋ค๋ฉด, ์ด์ ์ฐ๋ฆฌ์ ๋ง๋ฒ ๋๊ตฌ๊ฐ ์ค๋น๋ ๊ฑฐ์์! ๐
๐ Pro Tip: ๊ฐ์ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์. ๊ฐ์ ํ๊ฒฝ์ ๋ง์น ์๋ฆฌ์ฌ๊ฐ ๊ฐ ์๋ฆฌ๋ณ๋ก ๋ค๋ฅธ ์ฃผ๋ฐฉ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์์. ํ๋ก์ ํธ๋ง๋ค ๋ ๋ฆฝ๋ ํ๊ฒฝ์ ๋ง๋ค์ด ํจํค์ง ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์ฃ !
๊ฐ์ ํ๊ฒฝ์ ๋ง๋ค๊ณ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์:
# ๊ฐ์ ํ๊ฒฝ ์์ฑ
python -m venv prophet_env
# ๊ฐ์ ํ๊ฒฝ ํ์ฑํ (Windows)
prophet_env\Scripts\activate
# ๊ฐ์ ํ๊ฒฝ ํ์ฑํ (macOS/Linux)
source prophet_env/bin/activate
๊ฐ์ ํ๊ฒฝ์ด ํ์ฑํ๋๋ฉด, ์ด์ ๊ทธ ํ๊ฒฝ ์์์ Prophet์ ์ค์นํ๋ฉด ๋ฉ๋๋ค.
์, ์ด์ ์ฐ๋ฆฌ์ ์ฃผ๋ฐฉ... ์๋, ๊ฐ๋ฐ ํ๊ฒฝ์ด ์๋ฒฝํ๊ฒ ์ค๋น๋์์ด์! ๐ณ๐จโ๐ณ ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋์๋ณผ๊น์?
์ด ๊ทธ๋ฆผ์ฒ๋ผ, Prophet ์ค์น๋ ๋ง๋ฒ์ ์์์ ์ด์์. ์ด์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ์ ๋ฏธ๋๋ฅผ ๋ค์ฌ๋ค๋ณผ ์ค๋น๊ฐ ๋์๋ต๋๋ค! ๐ฎ
๋ค์ ์น์ ์์๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ Prophet์ ์ฌ์ฉํด๋ณผ ๊ฑฐ์์. ์ฌ๋ฅ๋ท์์ ํน์ ์ฌ๋ฅ์ ์์ ๋ณํ๋ฅผ ์์ธกํ๋ ์์ ๋ฅผ ๋ค์ด๋ณผ๊น์? ํฅ๋ฏธ์ง์งํ ์ฌ์ ์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด์! ๐
๐ ๋ฐ์ดํฐ ์ค๋น์ ๋ถ๋ฌ์ค๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ์ ๋ง๋ฒ ๋๊ตฌ์ธ Prophet์ด ์ค๋น๋์์ผ๋, ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๋์๋ณผ ์๊ฐ์ด์์! ๐ญ ์ฐ๋ฆฌ๋ ์ฌ๋ฅ๋ท์ ๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ๋ณผ ๊ฑฐ์์. ์ด ๋ฐ์ดํฐ๋ "Python ํํฐ๋ง" ์๋น์ค์ ์ผ์ผ ์์ฒญ ์๋ฅผ ๋ํ๋ด๋ ์๊ณ์ด ๋ฐ์ดํฐ๋๋๋ค.
์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฐ์ดํฐ์ ํ์์ด์์. Prophet์ ํน์ ํ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌํ๋๋ฐ, ๋ฐ๋ก 'ds'์ 'y' ๋ ๊ฐ์ ์ด์ด ํ์ํด์.
- 'ds': ๋ ์ง/์๊ฐ์ ๋ํ๋ด๋ ์ด
- 'y': ์์ธกํ๊ณ ์ ํ๋ ์ธก์ ๊ฐ์ ๋ํ๋ด๋ ์ด
์, ์ด์ ์ฐ๋ฆฌ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณผ๊น์? Python์ pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฑฐ์์.
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# ์์ ๋ ์ง ์ค์
start_date = datetime(2022, 1, 1)
# 365์ผ ๋์์ ๋ ์ง ์์ฑ
dates = [start_date + timedelta(days=i) for i in range(365)]
# ๊ฐ์์ 'Python ํํฐ๋ง' ์์ฒญ ์ ์์ฑ (ํธ๋ ๋, ๊ณ์ ์ฑ, ๋
ธ์ด์ฆ ํฌํจ)
y = []
for i in range(365):
trend = i * 0.1 # ์ฆ๊ฐ ํธ๋ ๋
seasonality = 15 * np.sin(2 * np.pi * i / 7) # ์ฃผ๊ฐ ๊ณ์ ์ฑ
noise = np.random.normal(0, 5) # ๋๋ค ๋
ธ์ด์ฆ
value = max(0, trend + seasonality + noise) # ์์ ๊ฐ ๋ฐฉ์ง
y.append(int(value))
# DataFrame ์์ฑ
df = pd.DataFrame({'ds': dates, 'y': y})
# ๋ฐ์ดํฐ ํ์ธ
print(df.head())
์ฐ์! ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ๋ง๋ ์ด ๋ฐ์ดํฐ๋ ์ ๋ง ํน๋ณํด์. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ง ์ฌ๋ฃ๋ฅผ ์กฐํฉํด ๋ง์๋ ์๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ์์๋ฅผ ์กฐํฉํด ํ์ค์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์์ด์. ๐ฒ
๐ง ๋ฐ์ดํฐ ๊ตฌ์ฑ ์์ ์ค๋ช :
- ํธ๋ ๋(Trend): ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ ์ ์ฆ๊ฐํ๋ ์ถ์ธ๋ฅผ ๋ํ๋ด์. ์ด๋ Python ํํฐ๋ง์ ์ธ๊ธฐ๊ฐ ์ ์ ๋์์ง๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํด์.
- ๊ณ์ ์ฑ(Seasonality): ์ผ์ฃผ์ผ์ ์ฃผ๊ธฐ๋ก ๋ฐ๋ณต๋๋ ํจํด์ ๋ํ๋ด์. ์ฃผ๋ง์๋ ์์ฒญ์ด ์ค๊ณ , ํ์ผ์๋ ๋์ด๋๋ ์์ด์ฃ .
- ๋ ธ์ด์ฆ(Noise): ์์ธกํ ์ ์๋ ๋๋คํ ๋ณ๋์ ์ถ๊ฐํ์ด์. ํ์ค ์ธ๊ณ์ ๋ฐ์ดํฐ๋ ํญ์ ์ด๋ฐ ๋ถ๊ท์น์ฑ์ ํฌํจํ๊ฑฐ๋ ์.
์ด๋ ๊ฒ ๋ง๋ ๋ฐ์ดํฐ๋ ๋ง์น ์ค์ ์ฌ๋ฅ๋ท์์ ๋ณผ ์ ์๋ ๋ฐ์ดํฐ์ ๋น์ทํด์. Python ํํฐ๋ง ์๋น์ค์ ์์๊ฐ ์ ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์ง๋ง, ์ฃผ๊ฐ ๋จ์๋ก ๋ณ๋์ด ์๊ณ , ์์ธกํ ์ ์๋ ๋ณํ๋ ์๋ค๋ ๊ฑธ ๋ณด์ฌ์ฃผ๊ณ ์์ด์.
์ด์ ์ฐ๋ฆฌ๋ Prophet์ด ์ดํดํ ์ ์๋ ํํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ฒ ๋์์ด์. 'ds' ์ด์๋ ๋ ์ง๊ฐ, 'y' ์ด์๋ Python ํํฐ๋ง ์์ฒญ ์๊ฐ ๋ค์ด์์ฃ .
์ด ๊ทธ๋ํ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฐ์ดํฐ์ ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ์์ด์. ๋นจ๊ฐ ์ ์ ์ฆ๊ฐํ๋ ํธ๋ ๋๋ฅผ, ํ๋ ๊ณก์ ์ ๊ณ์ ์ฑ์, ์ด๋ก ์ ๋ค์ ๋ ธ์ด์ฆ๋ฅผ ๋ํ๋ด์. ์ค์ ๋ฐ์ดํฐ๋ ์ด ๋ชจ๋ ์์๊ฐ ๋ณตํฉ์ ์ผ๋ก ์์ฉํ ๊ฒฐ๊ณผ๋๋๋ค.
์, ์ด์ ์ฐ๋ฆฌ์ ์ฌ๋ฃ... ์๋, ๋ฐ์ดํฐ๊ฐ ์ค๋น๋์์ด์! ๐ฅ ๋ค์ ๋จ๊ณ์์๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ Prophet ๋ชจ๋ธ์ ํ์ต์ํค๊ณ , ๋ฏธ๋์ Python ํํฐ๋ง ์์๋ฅผ ์์ธกํด๋ณผ ๊ฑฐ์์. ํฅ๋ฏธ์ง์งํ์ง ์๋์? ๐
์ฌ๋ฅ๋ท์์ ์ด๋ฐ ๋ถ์์ ํ๋ค๋ฉด, ์ด๋ค ์ฌ๋ฅ์ด ์์ผ๋ก ๋ ์ธ๊ธฐ๋ฅผ ์ป์์ง, ์ด๋ค ์๊ธฐ์ ํน์ ์ฌ๋ฅ์ ์์๊ฐ ๋์ด๋ ์ง ์์ธกํ ์ ์๊ฒ ์ฃ . ์ด๋ ํ๋ซํผ ์ด์๊ณผ ๋ง์ผํ ์ ๋ต ์๋ฆฝ์ ํฐ ๋์์ด ๋ ๊ฑฐ์์.
๋ค์ ์น์ ์์๋ Prophet ๋ชจ๋ธ์ ํ์ต์ํค๊ณ ์์ธก์ ์ํํ๋ ๊ณผ์ ์ ์์ธํ ์ดํด๋ณผ ๊ฑฐ์์. ๋ฐ์ดํฐ ๊ณผํ์์ ๋ง๋ฒ์ด ์์๋ฉ๋๋ค! ๐งโโ๏ธโจ
๐ฎ Prophet ๋ชจ๋ธ ํ์ต ๋ฐ ์์ธก
์, ์ด์ ์ฐ๋ฆฌ์ ๋ง๋ฒ ์งํก์ด์ธ Prophet์ ์ค์ ๋ก ์ฌ์ฉํด๋ณผ ์๊ฐ์ด์์! ๐งโโ๏ธ ์ฐ๋ฆฌ๋ ์์ ์ค๋นํ "Python ํํฐ๋ง" ์๋น์ค์ ์ผ์ผ ์์ฒญ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๊ฑฐ์์. ์ด ๋ฐ์ดํฐ๋ก Prophet ๋ชจ๋ธ์ ํ์ต์ํค๊ณ , ๋ฏธ๋์ ์์๋ฅผ ์์ธกํด๋ณผ ๊ฑฐ๋๋๋ค.
Prophet ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ณผ์ ์ ๋๋๋๋ก ๊ฐ๋จํด์. ๋ง์น ์๋ฆฌ ๋ ์ํผ๋ฅผ ๋ฐ๋ผํ๋ ๊ฒ์ฒ๋ผ ์ฝ๋ต๋๋ค! ๐ณ
๋จผ์ , ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ import ํด๋ณผ๊น์?
from prophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('seaborn')
์ด์ Prophet ๋ชจ๋ธ์ ์์ฑํ๊ณ ํ์ต์์ผ ๋ณผ๊ฒ์:
# Prophet ๋ชจ๋ธ ์์ฑ
model = Prophet()
# ๋ชจ๋ธ ํ์ต
model.fit(df)
์์ฐ! ๐ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ชจ๋ธ์ด ํ์ต๋์์ด์. Prophet์ด ์๋์ผ๋ก ์ฐ๋ฆฌ ๋ฐ์ดํฐ์ ํธ๋ ๋, ๊ณ์ ์ฑ, ํด์ผ ํจ๊ณผ ๋ฑ์ ํ์ ํ๋ต๋๋ค. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ์ฌ๋ฃ์ ๋ง์ ํ์ ํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์์!
์ด์ ๋ฏธ๋๋ฅผ ์์ธกํด๋ณผ๊น์? ์ฐ๋ฆฌ๋ ํฅํ 30์ผ ๋์์ Python ํํฐ๋ง ์์๋ฅผ ์์ธกํด๋ณผ ๊ฑฐ์์.
# ๋ฏธ๋ ๋ ์ง ๋ฐ์ดํฐํ๋ ์ ์์ฑ
future_dates = model.make_future_dataframe(periods=30)
# ์์ธก ์ํ
forecast = model.predict(future_dates)
# ์์ธก ๊ฒฐ๊ณผ ํ์ธ
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
์ฌ๊ธฐ์ 'yhat'์ ์์ธก๊ฐ์, 'yhat_lower'์ 'yhat_upper'๋ ์์ธก์ ๋ถํ์ค์ฑ์ ๋ํ๋ด๋ ํํ๊ฐ๊ณผ ์ํ๊ฐ์ ์๋ฏธํด์.
๐ก Prophet์ ์ฅ์ :
- ์๋์ผ๋ก ๊ฒฐ์ธก์น๋ฅผ ์ฒ๋ฆฌํด์ค์.
- ์ด์์น(outlier)์ ๊ฐํด์.
- ๋ณต์กํ ๊ณ์ ์ฑ์ ์๋์ผ๋ก ์ก์๋ด์.
- ํด์ผ ํจ๊ณผ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ธ๋งํ ์ ์์ด์.
์ด์ ์ฐ๋ฆฌ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํด๋ณผ๊น์? Prophet์ ์ด๋ฅผ ์ํ ํธ๋ฆฌํ ํจ์๋ฅผ ์ ๊ณตํด์.
# ์์ธก ๊ฒฐ๊ณผ ์๊ฐํ
fig1 = model.plot(forecast)
plt.title('Python ํํฐ๋ง ์์ ์์ธก')
plt.xlabel('๋ ์ง')
plt.ylabel('์ผ์ผ ์์ฒญ ์')
plt.show()
# ๊ตฌ์ฑ ์์ ๋ถํด ์๊ฐํ
fig2 = model.plot_components(forecast)
plt.show()
์! ์ ๋ง ๋ฉ์ง ๊ทธ๋ํ๊ฐ ๋์์ด์! ๐ ์ฒซ ๋ฒ์งธ ๊ทธ๋ํ๋ ์ ์ฒด์ ์ธ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ๋ ๋ฒ์งธ ๊ทธ๋ํ๋ ํธ๋ ๋, ์ฃผ๊ฐ ๊ณ์ ์ฑ, ์ฐ๊ฐ ๊ณ์ ์ฑ ๋ฑ ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ๋ถํดํด์ ๋ณด์ฌ์ค์.
์ด ๊ทธ๋ํ๋ Prophet์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ ๊ฒ์ด์์. ํ๋ ์ ์ ์์ธก๊ฐ์, ๋นจ๊ฐ ์ ์ ์ ์ ๋ขฐ ๊ตฌ๊ฐ์ ๋ํ๋ด์. ์ด๋ก ์ ์ ์ ํ์ฌ ์์ ์ ํ์ํ๊ณ ์์ด์. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ Python ํํฐ๋ง ์์๊ฐ ์ด๋ป๊ฒ ๋ณํ ์ง ํ๋์ ํ์ ํ ์ ์๋ต๋๋ค!
์ด๋ฐ ์์ธก ๊ฒฐ๊ณผ๋ ์ฌ๋ฅ๋ท๊ณผ ๊ฐ์ ํ๋ซํผ์์ ์ ๋ง ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ด์. ์๋ฅผ ๋ค์ด, Python ํํฐ๋ง ์์๊ฐ ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์ธก๋๋ค๋ฉด, ๊ด๋ จ ํํฐ๋ค์๊ฒ ๋ฏธ๋ฆฌ ์๋ ค ์ค๋นํ ์ ์๊ฒ ํ๊ฑฐ๋, ์ฌ์ฉ์๋ค์๊ฒ ๋ง์ถคํ ์ถ์ฒ์ ์ ๊ณตํ ์ ์๊ฒ ์ฃ .
ํ์ง๋ง ๊ธฐ์ตํ์ธ์, ์์ธก์ ํญ์ ๋ถํ์ค์ฑ์ ํฌํจํ๊ณ ์์ด์. ๋ง์น ๋ ์จ ์๋ณด์ฒ๋ผ ๋ง์ด์ฃ ! ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํญ์ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์ ๊น๊ฒ ํด์ํ๊ณ , ํ์ํ๋ค๋ฉด ๋ค๋ฅธ ์ ๋ณด๋ค๊ณผ ํจ๊ป ์ข ํฉ์ ์ผ๋ก ํ๋จํด์ผ ํด์.
๋ค์ ์น์ ์์๋ ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ ๋์ฑ ์ ๊ตํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. Prophet์ ๋ค์ํ ํ๋ผ๋ฏธํฐ๋ค์ ์กฐ์ ํ๊ณ , ํด์ผ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ๋ ๋ฑ ๋ ๊น์ด ์๋ ๋ถ์์ ํด๋ณผ ๊ฑฐ๋๋๋ค. ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ ๊ณผํ ์ฌํ์ ๊ณ์๋ฉ๋๋ค! ๐โจ
๐ ๏ธ Prophet ๋ชจ๋ธ ํ๋ ๋ฐ ๊ณ ๊ธ ๊ธฐ๋ฅ
์, ์ด์ ์ฐ๋ฆฌ์ Prophet ๋ชจ๋ธ์ ๋์ฑ ์ ๊ตํ๊ฒ ๋ค๋ฌ์ด๋ณผ ์๊ฐ์ด์์! ๐ง ๋ง์น ์๋ฆฌ์ฌ๊ฐ ์๋ฆฌ์ ๋ง์ ๋์ฑ ํ๋ถํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์๋ ์ ์กฐ์ ํ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ๊ณ ์ถ๊ฐ ๊ธฐ๋ฅ์ ํ์ฉํด๋ณผ ๊ฑฐ์์.
Prophet์ ๋ค์ํ ํ๋ผ๋ฏธํฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๋ชจ๋ธ์ ์ํฉ์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ด์. ์ด๋ฅผ ํตํด ๋ ์ ํํ๊ณ ์ ์ฉํ ์์ธก์ ํ ์ ์๋ต๋๋ค!
1. ์ฑ์ฅ๋ฅ ์กฐ์
Prophet์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก์ง์คํฑ ์ฑ์ฅ ๋ชจ๋ธ์ ์ฌ์ฉํด์. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ Python ํํฐ๋ง ์๋น์ค์ ์ต๋ ์์ฉ ๊ฐ๋ฅํ ์์ฒญ ์๋ฅผ ์๊ณ ์๋ค๋ฉด, ์ด๋ฅผ ๋ชจ๋ธ์ ๋ฐ์ํ ์ ์์ด์.
# ์ต๋ ์์ฉ ๊ฐ๋ฅํ ์์ฒญ ์๋ฅผ 500์ผ๋ก ๊ฐ์
df['cap'] = 500
model = Prophet(growth='logistic')
model.fit(df)
# ๋ฏธ๋ ๋ฐ์ดํฐ์๋ cap ๊ฐ ์ค์
future_dates = model.make_future_dataframe(periods=30)
future_dates['cap'] = 500
forecast = model.predict(future_dates)
์ด๋ ๊ฒ ํ๋ฉด ์์ธก์ด ํ์ค์ ์ธ ํ๊ณ๋ฅผ ๋์ด์์ง ์๋๋ก ํ ์ ์์ด์. ๋ง์น ๋๋น์ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ฌ ์๋ฆฌ์ ์์ ์กฐ์ ํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐ฒ
2. ํด์ผ ํจ๊ณผ ์ถ๊ฐ
Python ํํฐ๋ง ์์๋ ํด์ผ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ณํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๋ฐฉํ ๊ธฐ๊ฐ์๋ ์์๊ฐ ์ฆ๊ฐํ ์ ์๊ฒ ์ฃ . Prophet์ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ํด์ผ ํจ๊ณผ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ธ์ ์ถ๊ฐํ ์ ์์ด์.
from prophet.holidays import USFederalHolidays
# ํด์ผ ํจ๊ณผ๋ฅผ ํฌํจํ ๋ชจ๋ธ ์์ฑ
model = Prophet(holidays=USFederalHolidays())
model.fit(df)
# ์์ธก ์ํ
forecast = model.predict(future_dates)
# ํด์ผ ํจ๊ณผ ์๊ฐํ
fig = model.plot_components(forecast)
plt.show()
์ด๋ ๊ฒ ํ๋ฉด ๋ฏธ๊ตญ์ ์ฐ๋ฐฉ ๊ณตํด์ผ์ด Python ํํฐ๋ง ์์์ ๋ฏธ์น๋ ์ํฅ์ ๋ชจ๋ธ์ด ์๋์ผ๋ก ํ์ตํด์. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ํน๋ณํ ๋ ์๋ ํน๋ณํ ์ฌ๋ฃ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐
3. ์ถ๊ฐ ๊ณ์ ์ฑ ๊ณ ๋ ค
๊ธฐ๋ณธ์ ์ผ๋ก Prophet์ ์ฐ๊ฐ, ์ฃผ๊ฐ ๊ณ์ ์ฑ์ ๊ณ ๋ คํ์ง๋ง, ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฃผ๊ธฐ์ ๊ณ์ ์ฑ์ ์ถ๊ฐํ ์ ์์ด์.
# ์๊ฐ ๊ณ์ ์ฑ ์ถ๊ฐ
model = Prophet(weekly_seasonality=True, yearly_seasonality=True)
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
model.fit(df)
forecast = model.predict(future_dates)
์ด๋ ๊ฒ ํ๋ฉด ์๋ณ๋ก ๋ฐ๋ณต๋๋ ํจํด๋ ๋ชจ๋ธ์ด ์ก์๋ผ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๋งค์ ์ด์ Python ํํฐ๋ง ์์๊ฐ ์ฆ๊ฐํ๋ค๋ฉด ์ด๋ฐ ํจํด์ ๋ชจ๋ธ์ด ํ์ตํ ์ ์๋ต๋๋ค.
4. ๋ณํ์ (Changepoints) ์กฐ์
Prophet์ ์๋์ผ๋ก ํธ๋ ๋์ ๋ณํ์ ์ ์ฐพ์๋ด์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ง์ ์ด๋ฅผ ์กฐ์ ํ ์๋ ์์ด์.
# ๋ณํ์ ์ ์ ์ฐ์ฑ ์กฐ์
model = Prophet(changepoint_prior_scale=0.05)
model.fit(df)
# ํน์ ๋ ์ง๋ฅผ ๋ณํ์ ์ผ๋ก ์ถ๊ฐ
model = Prophet(changepoints=['2022-03-01', '2022-06-01', '2022-09-01'])
model.fit(df)
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ธ์ด ํธ๋ ๋์ ๋ณํ๋ฅผ ๋ ์ ํํ๊ฒ ํฌ์ฐฉํ ์ ์์ด์. ๋ง์น ์๋ฆฌ์ฌ๊ฐ ๋ถ์ ์ธ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐ฅ
๐ Pro Tip: ๋ชจ๋ธ ํ๋์ ์คํ๊ณผ ๋ฐ๋ณต์ด ํ์ํ ๊ณผ์ ์ด์์. ๋ค์ํ ์ค์ ์ ์๋ํด๋ณด๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด๊ฐ๋ฉฐ ์ต์ ์ ๋ชจ๋ธ์ ์ฐพ์๊ฐ๋ ๊ฒ์ด ์ค์ํด์!
5. ๊ต์ฐจ ๊ฒ์ฆ
๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๊ฐ๊ด์ ์ผ๋ก ํ๊ฐํ๊ธฐ ์ํด ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ ์ ์์ด์.
from prophet.diagnostics import cross_validation, performance_metrics
# ๊ต์ฐจ ๊ฒ์ฆ ์ํ
df_cv = cross_validation(model, initial='300 days', period='30 days', horizon='30 days')
# ์ฑ๋ฅ ์งํ ๊ณ์ฐ
df_p = performance_metrics(df_cv)
print(df_p)
์ด๋ฅผ ํตํด ์ฐ๋ฆฌ ๋ชจ๋ธ์ ์์ธก ์ ํ๋๋ฅผ ์ธก์ ํ ์ ์์ด์. ๋ง์น ์๋ฆฌ ๋ํ์์ ์ฌ์ฌ์์๋ค์ด ์๋ฆฌ๋ฅผ ํ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐จโ๐ณ๐ฉโ๐ณ
์ด ๊ทธ๋ฆผ์ Prophet ๋ชจ๋ธ ํ๋์ ์ฃผ์ ๋จ๊ณ๋ฅผ ๋ณด์ฌ์ค์. ๊ฐ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด์ ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ ์ ์ ๋ ์ ๊ตํด์ง๊ณ ์ ํํด์ง๋ต๋๋ค!
์, ์ด์ ์ฐ๋ฆฌ๋ Prophet์ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ดค์ด์. ์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ํ์ฉํ๋ฉด, ์ฌ๋ฅ๋ท์ Python ํํฐ๋ง ์์ ์์ธก์ ๋์ฑ ์ ํํ๊ฒ ํ ์ ์์ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด, ๋ฐฉํ ๊ธฐ๊ฐ์ ์์ ์ฆ๊ฐ, ์๋ณ ํธ๋ ๋ ๋ณํ, ํน์ ์ด๋ฒคํธ๋ก ์ธํ ๊ธ๊ฒฉํ ๋ณํ ๋ฑ์ ๋ชจ๋ธ์ ๋ฐ์ํ ์ ์๋ต๋๋ค.
์ด๋ฌํ ์ ๊ตํ ์์ธก์ ์ฌ๋ฅ๋ท์ ์ด์์ ํฐ ๋์์ด ๋ ๊ฑฐ์์. ํํฐ ์๊ธ ๊ณํ์ ์ธ์ฐ๊ฑฐ๋, ๋ง์ผํ ์ ๋ต์ ์๋ฆฝํ ๋ ์ด ์์ธก ๊ฒฐ๊ณผ๋ฅผ ํ์ฉํ ์ ์๊ฒ ์ฃ . ๋ํ, ์ฌ์ฉ์๋ค์๊ฒ ๋ ๋์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐ์๋ ๋์์ด ๋ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด, ์์๊ฐ ๋ง์ด ์ฆ๊ฐํ ๊ฒ์ผ๋ก ์์๋๋ ์๊ธฐ์ ๋ฏธ๋ฆฌ ์ถ๊ฐ ํํฐ๋ฅผ ๋ชจ์งํ๊ฑฐ๋, ํ ์ธ ์ด๋ฒคํธ๋ฅผ ๊ธฐํํ ์ ์๊ฒ ์ฃ .
Prophet์ ๋ง์คํฐํ๋ ๊ฒ์ ๋ง์น ์๋ฆฌ์ ๋๊ฐ๊ฐ ๋๋ ๊ฒ๊ณผ ๊ฐ์์. ๊ธฐ๋ณธ ๋ ์ํผ๋ฅผ ์ตํ๊ณ , ๋ค์ํ ์ฌ๋ฃ์ ๊ธฐ์ ์ ์ตํ๋ฉด์ ์ ์ ๋ ๋ง์๋ ์๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋๋ ๊ฒ์ฒ๋ผ, Prophet์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ตํ๊ณ ํ์ฉํ๋ฉด์ ์ ์ ๋ ์ ํํ๊ณ ์ ์ฉํ ์์ธก์ ํ ์ ์๊ฒ ๋ ๊ฑฐ์์. ๐ฝ๏ธ๐จโ๐ณ
์, ์ด์ ์ฐ๋ฆฌ๋ Prophet์ ์ง์ ํ ๋ง๋ฒ์ฌ๊ฐ ๋์์ด์! ๐งโโ๏ธโจ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ํ์ฉํด ์ฌ๋ฅ๋ท์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ๋ฏธ๋๋ฅผ ์์ธกํด๋ณด์ธ์. ๋ฐ์ดํฐ์ ๋ฐ๋ค์์ ์จ๊ฒจ์ง ๋ณด๋ฌผ์ ์ฐพ๋ ์ฌ์ ์ ์ฆ๊ธฐ์๊ธฐ ๋ฐ๋๋๋ค! ๐๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ