본문 바로가기
딥러닝 with Python

[머신러닝 with Python] Prophet 모델 구현하기(시계열 예측) / Peyton Manning 웹 트래픽 데이터 활용 / [Google 코랩]

by CodeCrafter 2025. 3. 2.
반응형

 

이번에는 지난 포스팅에 이어서 Prophet 모델에 대해서 알아보겠습니다.

 

지난번 포스팅에서는 주로 Prophet 모델과 라이브러리에 대해서 개념적으로 알아보았는데요

[머신러닝 with Python] Prophet 모델 알아보기(시계열 예측)

 

[머신러닝 with Python] Prophet 모델 알아보기(시계열 예측)

이번에는 시계열 예측(Time Series Forecasting) 모델 중 라이브러리 형태로 쉽게 구현 가능하면서도 효과적인 Prophet  모델에 대해서 알아보겠습니다. Prophet은 (구) Facebook ( 현: Meta) 에서 만든 시계열

jaylala.tistory.com

 

 

이번에는 실제 데이터를 활용해서 모델을 구현해보도록 하겠습니다.

 

1. Peyton Manning 웹 트래픽 데이터을 활용한 Prophet 모델 구현

1.1 Peyton Manning 데이터

 

- 해당 데이터는 미국 NFL의 전설적인 쿼터백인 Peyton Manning의 Wikipedia 페이지 방문 횟수를 기록한 시계열 데이터 입니다.

 * 기존 Prophet 라이브러리에서 예제 데이터로 소개했던 데이터입니다. 지금은 라이브러리 상으로 다운은 제한되지만 간단한 코드 한 줄로 쉽게 다운로드가 가능합니다.

 

 

1.2 Peyton Manning 데이터 시각화

 

- 우선 해당 데이터를 다운로드 받고 기본적인 데이터의 특성을 알아보도록 하겠습니다.

* 구현은 구글 코랩으로 하였으니, 아래 코드를 참조해서 쉽게 따라하시기가 가능하실 것입니다.

 

 

* 먼저, 코랩 환경내에서 한글 폰트가 설치가 안되어있기에 설치해줍니다(시각화에서 한글을 활용하기 위해서입니다)

 

!apt-get install -y fonts-nanum
!fc-cache -fv
!rm -rf ~/.cache/matplotlib

 

import matplotlib.pyplot as plt
from matplotlib import font_manager

# 나눔 폰트 경로 확인
font_path = "/usr/share/fonts/truetype/nanum/NanumGothic.ttf"

# 폰트 설정
font_manager.fontManager.addfont(font_path)
plt.rc('font', family='NanumGothic')  # 나눔고딕 설정
plt.rcParams['axes.unicode_minus'] = False  # 마이너스 기호 깨짐 방지

 

 

* 이제 Peyton manning 데이터를 다운로드 받아주고, 데이터를 불러와봅니다.

# 데이터 다운로드 (Colab 환경에서 사용 가능)
!wget https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_peyton_manning.csv -O peyton_manning.csv

 

import pandas as pd

# 데이터 로드
df = pd.read_csv("peyton_manning.csv")

df

 

* 해당 데이터를 x축은 날짜(시간), y축은 트래픽(로그 스케일로 변환)으로 시각화 해보겠습니다.

 

import matplotlib.pyplot as plt

# 날짜 형식 변환
df["ds"] = pd.to_datetime(df["ds"])

# 데이터 시각화
plt.figure(figsize=(12, 5))
plt.plot(df["ds"], df["y"], label="Wikipedia 조회수", color="royalblue")
plt.xlabel("날짜")
plt.ylabel("로그 변환된 트래픽")
plt.title("Peyton Manning 위키피디아 페이지 트래픽")
plt.legend()
plt.show()

 

 

* 연간 트래픽으로 요약해서 시각화해보겠습니다.

# 연간 트래픽 평균 계산
df["year"] = df["ds"].dt.year
yearly_avg = df.groupby("year")["y"].mean()

# 연도별 트래픽 시각화
plt.figure(figsize=(10, 5))
plt.bar(yearly_avg.index, yearly_avg.values, color="coral")
plt.xlabel("연도")
plt.ylabel("연간 평균 트래픽 (로그 변환)")
plt.title("연도별 Peyton Manning 위키 트래픽 변화")
plt.show()

 

* 또한, 전체적인 그림 슈퍼볼 경기일자를 추가해서 시각화해보겠습니다.

# 슈퍼볼 날짜 리스트 추가
superbowl_dates = [
    "2008-02-03", "2009-02-01", "2010-02-07", "2013-02-03", "2014-02-02", "2015-02-01", "2016-02-07"
]

# 슈퍼볼이 있었던 날짜에 대한 필터링
df_superbowl = df[df["ds"].isin(pd.to_datetime(superbowl_dates))]

# 트래픽 비교 시각화
plt.figure(figsize=(12, 5))
plt.plot(df["ds"], df["y"], label="일반 트래픽", alpha=0.5, color="gray")
plt.scatter(df_superbowl["ds"], df_superbowl["y"], color="red", label="슈퍼볼 트래픽", s=100)
plt.xlabel("날짜")
plt.ylabel("로그 변환된 트래픽")
plt.title("슈퍼볼 경기일과 웹 트래픽 증가 비교")
plt.legend()
plt.show()

 

 

 

2. Prophet 모델을 활용한 데이터 분석

이제 Prophet Model을 활용해서 데이터를 분석해보겠습니다.

 

- 먼저 Prophet을 설치해줍니다.

# Colab에서 Prophet 설치
!pip install prophet

 

-  이제 사전에 불러온 데이터(df)를 가지고 기본적인 모델 Inference를 해보겠습니다.

 
from prophet import Prophet

# Prophet 모델 생성 (기본 설정)
model = Prophet()

# 모델 학습
model.fit(df)

 

- 그리고 해당 데이터 마지막일 기준 향후 1년 예측을 위한 데이터 프레임을 만들어줍니다.

# 향후 1년(365일) 예측을 위한 데이터프레임 생성
future = model.make_future_dataframe(periods=365)

# 예측 수행
forecast = model.predict(future)

# 예측 결과 확인
print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail())

 

* 예측 결과 중 마지막 5개의 데이터를 출력해보면 아래와 같습니다. yhat이 예측 값이며, yhat_lower는 95% 신뢰구간 범위내에서 하한 / yhat_upper는 95% 신뢰구간 범위내에서 상한입니다.

 

- 이제 기존 데이터와 예측한 향후 1년 데이터를 포함해서 Prophet 데이터가 예측한 내용을 시각화해보겠습니다.

# Prophet 내장된 시각화 함수 사용
fig = model.plot(forecast)
plt.title("Peyton Manning 위키 트래픽 예측")
plt.show()

 

* 이때 파란색 선은 예측값, 밝은 파란색 영역은 모델의 신뢰 구간(Confidence Interval)입니다. 특정 시점에 트래픽의 급등과 계절성이 반영된 것을 확인할 수 있습니다.

 

- 이번에는 트렌드 및 계절성을 분석해보겠습니다.

# 트렌드 및 계절성 분석
fig2 = model.plot_components(forecast)
plt.show()

 

*  첫번째 그림이 Trend, 두번째가 Weekly Seasonality, 세번째 그래프가 Yearly Seasonality 입니다.

 

 

 

- 이제 Holiday Effects를 추가해서 분석을 해보겠습니다. 추가할 특정 이벤트는 "슈퍼볼이 있는 날짜" 입니다.

# 공휴일 데이터 추가
holidays = pd.DataFrame({
    "ds": ["2008-02-03", "2009-02-01", "2010-02-07", "2011-02-06", "2012-02-05",
           "2013-02-03", "2014-02-02", "2015-02-01", "2016-02-07"],
    "holiday": ["SuperBowl"] * 9
})

# Prophet 모델에 공휴일 반영
model_holiday = Prophet(holidays=holidays)
model_holiday.fit(df)

# 예측 수행
forecast_holiday = model_holiday.predict(future)

# 공휴일 효과 반영된 예측 결과 시각화
fig = model_holiday.plot(forecast_holiday)
plt.title("SuperBowl 효과 반영된 웹 트래픽 예측")
plt.show()

 

*Holiday Effect를 추가하긴 했지만 해당 숫자가 많지 않으며, 이미 데이터에 잘 반영되어있어서 그런지 큰 변화를 체감하기는 어렵습니다.

 

 

이렇게 실제 데이터를 활용해 Prophet 모델을 분석해보았습니다.

 

쉽고 다양하게 분석이 가능하며, Meta에서 개발해서 계속 보수관리하고 있기에 신뢰성있게 사용가능한 모델이라고 생각됩니다.

반응형

댓글