🤖 AI/ML

Prophet

Meta Prophet

Meta의 시계열 예측 라이브러리. 계절성, 휴일 효과 자동 처리.

📖 상세 설명

Prophet은 Meta(구 Facebook)에서 2017년 오픈소스로 공개한 시계열 예측 라이브러리입니다. 비즈니스 시계열 데이터(매출, 트래픽, 재고 등)의 예측에 특화되어 있으며, 통계학 배경 없이도 쉽게 사용할 수 있도록 설계되었습니다.

Prophet은 분해 가능한 시계열 모델(decomposable time series model)을 사용합니다. y(t) = g(t) + s(t) + h(t) + e(t) 형태로, 추세(trend), 계절성(seasonality), 휴일 효과(holiday), 오차(error)로 시계열을 분해합니다. 각 컴포넌트를 독립적으로 모델링하여 해석 가능성이 높습니다.

핵심 강점은 결측치, 이상치, 추세 변화에 강건하다는 점입니다. 실제 비즈니스 데이터는 누락이나 급격한 변화가 흔한데, Prophet은 이를 자동으로 처리합니다. 또한 휴일, 이벤트의 효과를 명시적으로 모델링할 수 있어 프로모션, 공휴일 영향을 반영할 수 있습니다.

실무에서 Prophet은 수요 예측, 용량 계획, 마케팅 효과 분석에 널리 사용됩니다. Python과 R 인터페이스를 제공하며, 몇 줄의 코드로 예측과 시각화가 가능합니다. 다만 최근에는 NeuralProphet, TimeGPT 같은 딥러닝 기반 대안도 주목받고 있습니다.

💻 코드 예제

from prophet import Prophet
import pandas as pd
import matplotlib.pyplot as plt

# 데이터 준비 (ds: 날짜, y: 값)
df = pd.DataFrame({
    'ds': pd.date_range(start='2023-01-01', periods=365, freq='D'),
    'y': [100 + i*0.5 + 20*np.sin(i*2*np.pi/7) + np.random.randn()*5
          for i in range(365)]
})

# 기본 모델 학습
model = Prophet()
model.fit(df)

# 미래 예측 (30일)
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)

# 예측 결과 시각화
fig1 = model.plot(forecast)
plt.title('Prophet 예측 결과')
plt.show()

# 컴포넌트 분해 시각화 (추세, 주간 계절성)
fig2 = model.plot_components(forecast)
plt.show()

# === 고급 설정 ===

# 휴일 효과 추가 (한국 공휴일)
korean_holidays = pd.DataFrame({
    'holiday': 'korean_holiday',
    'ds': pd.to_datetime(['2024-01-01', '2024-02-09', '2024-02-10',
                          '2024-02-11', '2024-03-01', '2024-05-05',
                          '2024-05-15', '2024-06-06', '2024-08-15',
                          '2024-09-16', '2024-09-17', '2024-09-18',
                          '2024-10-03', '2024-10-09', '2024-12-25']),
    'lower_window': 0,  # 휴일 전 영향 범위
    'upper_window': 1   # 휴일 후 영향 범위
})

model_with_holidays = Prophet(holidays=korean_holidays)
model_with_holidays.fit(df)

# 계절성 커스터마이징
model_custom = Prophet(
    yearly_seasonality=True,
    weekly_seasonality=True,
    daily_seasonality=False,
    seasonality_mode='multiplicative'  # 곱셈적 계절성
)

# 추가 계절성 (월간)
model_custom.add_seasonality(
    name='monthly',
    period=30.5,
    fourier_order=5
)

# 외부 변수(regressor) 추가
df['promotion'] = [1 if i % 7 == 5 else 0 for i in range(365)]  # 토요일 프로모션

model_with_regressor = Prophet()
model_with_regressor.add_regressor('promotion')
model_with_regressor.fit(df)

# 미래 데이터에도 regressor 필요
future_with_promo = model_with_regressor.make_future_dataframe(periods=30)
future_with_promo['promotion'] = [1 if d.weekday() == 5 else 0
                                   for d in future_with_promo['ds']]
forecast = model_with_regressor.predict(future_with_promo)

# 크로스 밸리데이션
from prophet.diagnostics import cross_validation, performance_metrics

cv_results = cross_validation(
    model,
    initial='180 days',  # 초기 학습 기간
    period='30 days',    # 예측 간격
    horizon='30 days'    # 예측 기간
)
metrics = performance_metrics(cv_results)
print(f"MAPE: {metrics['mape'].mean():.2%}")

📊 성능 & 비용

Prophet은 오픈소스 라이브러리로 무료입니다. 학습 및 추론 시간은 데이터 크기와 설정에 따라 달라집니다.

항목 일반적인 값 비고
라이선스 MIT (무료) 상용 사용 가능
학습 시간 (1년 일간 데이터) 1-5초 Stan 백엔드 기준
학습 시간 (5년 일간 데이터) 5-30초 계절성 복잡도에 따라 증가
예측 시간 (1년 미래) ~1초 불확실성 구간 포함
권장 최소 데이터 1-2년 연간 계절성 학습 위해

대안 비교: NeuralProphet은 딥러닝 기반으로 복잡한 패턴에 강하지만 학습이 느립니다. TimeGPT(Nixtla)는 API 기반 서비스로 $0.99/1000 rows부터 시작합니다. ARIMA는 파라미터 튜닝이 복잡하지만 계산이 빠릅니다.

🗣️ 실무에서 이렇게 말하세요

💬 회의에서

"다음 분기 서버 용량 계획을 세워야 하는데, Prophet으로 트래픽 예측 모델 만들어 둔 게 있어요. 공휴일 효과까지 반영되어 있어서 설날, 추석 기간 피크도 예측 가능합니다. 불확실성 구간도 같이 보면서 버퍼를 잡으면 될 것 같아요."

💬 면접에서

"Prophet과 ARIMA의 차이점은 뭔가요?" - "ARIMA는 통계적 가정이 엄격하고 파라미터 튜닝이 복잡해요. Prophet은 비전문가도 쓸 수 있게 설계됐고, 결측치나 이상치에 강건합니다. 다만 고빈도 데이터(분단위)나 복잡한 다변량 관계에서는 딥러닝 모델이 더 나을 수 있어요."

💬 기술 토론에서

"Prophet의 seasonality_mode를 multiplicative로 바꾸니까 예측이 훨씬 좋아졌어요. 우리 매출 데이터는 전체 규모에 비례해서 계절 변동이 커지거든요. 1월 100만원일 때 10% 변동이면 12월 500만원일 때는 50만원 변동이니까요."

⚠️ 흔한 실수 & 주의사항

데이터 부족 상태에서 사용

Prophet은 최소 1-2년 이상의 데이터가 있어야 연간 계절성을 학습할 수 있습니다. 데이터가 부족하면 yearly_seasonality=False로 설정하거나, 더 간단한 모델을 사용하세요.

외부 요인 무시

코로나 같은 특수 상황, 경쟁사 이벤트, 정책 변화는 Prophet이 자동으로 학습하지 못합니다. 이런 외부 변수는 add_regressor로 명시적으로 추가하거나, 해당 기간을 제외하고 학습해야 합니다.

cross_validation으로 검증

Prophet 내장 cross_validation 함수로 반드시 모델을 검증하세요. MAPE, MAE 등 지표를 확인하고, 특정 기간에 오차가 큰지 분석해야 합니다. 과적합된 모델은 미래 예측에서 크게 빗나갑니다.

🔗 관련 용어

📚 더 배우기