DEEP LEARNING/Deep Learning Library

DL(딥러닝) : Facebook의 Prophet 활용한 시계열 데이터 학습 & 예측

신강희 2024. 5. 1. 14:27
728x90

< Facebook의 Prophet >

# 프롬펫(Prophet)은 Facebook에서 개발한 시계열 예측 라이브러리

# Prophet은 시계열 데이터(타임 시리즈 데이터)를 예측하기 위한 강력하고 사용하기 쉬운 도구를 제공한다. 특히 Prophet은 비즈니스 및 금융 데이터와 같은 일반적으로 사용되는 시계열 데이터에 대한 예측을 중점적으로 다룬다.

 

< AVOCADO 가격 예측 (Facebook Prophet ) >

STEP #0: 데이터셋

  • 데이터는 미국의 아보카도 리테일 데이터 입니다. (2018년도 weekly 데이터)
  • 아보카도 거래량과 가격이 나와 있습니다.

컬럼 설명 :

  • Date - The date of the observation
  • AveragePrice - the average price of a single avocado
  • type - conventional or organic
  • year - the year
  • Region - the city or region of the observation
  • Total Volume - Total number of avocados sold
  • 4046 - Total number of avocados with PLU 4046 sold - PLU는 농산물 코드입니다
  • 4225 - Total number of avocados with PLU 4225 sold
  • 4770 - Total number of avocados with PLU 4770 sold
 

STEP #1: 데이터 준비

Prophet 라이브러리

  • install : pip install prophet
  • 위 에러 발생시 : conda install -c conda-forge prophet
# import libraries
 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
import seaborn as sns
from prophet import Prophet

 

# 데이터 불러오기 (구글 드라이브 연동)

from google.colab import drive
 
drive.mount('/content/drive')

 

Mounted at /content/drive

 

# avocado.csv 데이터 읽기
# 데이터 사전에 확인결과 첫컬럼은 필요없는 컬럼으로 확인되어, index_col=0로 불러오는 과정에서 삭제
 
df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/ML2/data/avocado.csv', index_col=0)

 

STEP #2: EDA(Exploratory Data Analysis) : 탐색적 데이터 분석

df

 

# 데이터의 날짜가 뒤죽박죽 입니다. 날짜로 정렬하시오.

df = df.sort_values(['Date'], ascending=True)

 

df['Date'].nunique()
169

 

# 날짜별로 가격이 어떻게 변하는지 간단하게 확인하시오. (plot 이용)

# 동일한 날짜의 인덱스가 같으므로 인덱스를 우선 초기화

 

# prompt: 인덱스 초기화 해줘

df.reset_index(inplace=True)
df

 

# prompt: 첫번째 컬럼은 삭제해줘

df = df.iloc[:, 1:]

 

# 'region' 별로 데이터 몇개인지 시각화 하시오.

df.groupby('region').size()
region
Albany                 338
Atlanta                338
BaltimoreWashington    338
Boise                  338
Boston                 338
BuffaloRochester       338
California             338
Charlotte              338
Chicago                338
CincinnatiDayton       338
Columbus               338
DallasFtWorth          338
Denver                 338
Detroit                338
GrandRapids            338
GreatLakes             338
HarrisburgScranton     338
HartfordSpringfield    338
Houston                338
Indianapolis           338
Jacksonville           338
LasVegas               338
LosAngeles             338
Louisville             338
MiamiFtLauderdale      338
Midsouth               338
Nashville              338
NewOrleansMobile       338
NewYork                338
Northeast              338
NorthernNewEngland     338
Orlando                338
Philadelphia           338
PhoenixTucson          338
Pittsburgh             338
Plains                 338
Portland               338
RaleighGreensboro      338
RichmondNorfolk        338
Roanoke                338
Sacramento             338
SanDiego               338
SanFrancisco           338
Seattle                338
SouthCarolina          338
SouthCentral           338
Southeast              338
Spokane                338
StLouis                338
Syracuse               338
Tampa                  338
TotalUS                338
West                   338
WestTexNewMexico       335
dtype: int64

 

# prompt: 'region'별로 데이터가 몇개인지 시각화 해줘

df.groupby('region').size().plot(kind='bar')
plt.title('Number of Avocado Records by Region')
plt.xlabel('Region')
plt.ylabel('Number of Records')
plt.show()

 

# 년도('year')별로 데이터가 몇건인지 확인하시오.

# prompt: 년도('year')별로 데이터가 몇건인지 확인해줘 시각화는 빼고

df['year'].value_counts()
year
2017    5722
2016    5616
2015    5615
2018    1296
Name: count, dtype: int64

 

< 프로펫 분석을 위해, 두개의 컬럼만 가져오시오. ('Date', 'AveragePrice') >

# 전체 컬럼 확인

df.head(1)

 

df.loc[: , 'Date' : 'AveragePrice' ]

 

avocado_prophet_df = df.loc[: , 'Date' : 'AveragePrice' ]
avocado_prophet_df

 

STEP 3: Prophet 을 이용한 예측 수행

# ds 와 y 로 컬럼명을 셋팅하시오.

avocado_prophet_df.columns = ['ds' , 'y']
avocado_prophet_df

 

< 프로펫 예측 하시오 >

# 1. 라이브러리를 변수로 만들고
 
prophet = Prophet()

 

# 2. 데이터를 학습시킨다.
 
prophet.fit(avocado_prophet_df)
INFO:prophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/_h7x0fzg.json
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/_j4ezup4.json
DEBUG:cmdstanpy:idx 0
DEBUG:cmdstanpy:running CmdStan, num_threads: None
DEBUG:cmdstanpy:CmdStan args: ['/usr/local/lib/python3.10/dist-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=97129', 'data', 'file=/tmp/tmpf0uawuc9/_h7x0fzg.json', 'init=/tmp/tmpf0uawuc9/_j4ezup4.json', 'output', 'file=/tmp/tmpf0uawuc9/prophet_modelgpdvzvo9/prophet_model-20240419031445.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']
03:14:45 - cmdstanpy - INFO - Chain [1] start processing
INFO:cmdstanpy:Chain [1] start processing
03:14:48 - cmdstanpy - INFO - Chain [1] done processing
INFO:cmdstanpy:Chain [1] done processing
 
# 365일치를 예측하시오.
# 3. 예측하고자 하는 기간을 정해서, 비어있는 데이터프레임을 만든다.
 
future = prophet.make_future_dataframe(periods=365, freq='D')

 

future.head()

 

future.tail()

 

# 4. 예측을 한다.
 
forecast = prophet.predict(future)
forecast

ㄴ 쭈욱 이어서 결과값이 나오는데 실측적인 예측값은 yhat 이다.

 

# 차트로 확인하시오.
# 코랩에서 plt.show()로 차트를 불러내면 두개가 중첩되서 불러오는 에러가 있어서 이미지를 저장하여 불러냄.
prophet.plot(forecast)
plt.savefig('chart1.jpg')

 

prophet.plot_components(forecast)
plt.savefig('chart2.jpg')

 

< PART 2 : region 이 west 인 아보카도의 가격을 예측하시오 >

# prompt: 'region'이 'west'인 데이터만 뽑아와서 avocado_df_sample = 저장해줘

avocado_df_sample = df.loc[df['region'] == 'West']

 

# prompt: 같은 변수명으로 해서 'Date' 와 'AveragePrice' 데이터만 저장해줘

avocado_df_sample = df[df['region'] == 'West'][['Date', 'AveragePrice']]
avocado_df_sample

 

avocado_df_sample.columns = ['ds' , 'y']
avocado_df_sample

 

# 깡통 라이브러리를 한번더 만들고
 
prophet = Prophet()

 

# 재학습
 
prophet.fit(avocado_df_sample)
INFO:prophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:prophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/xqexdcwt.json
DEBUG:cmdstanpy:input tempfile: /tmp/tmpf0uawuc9/bya5bfk_.json
DEBUG:cmdstanpy:idx 0
DEBUG:cmdstanpy:running CmdStan, num_threads: None
DEBUG:cmdstanpy:CmdStan args: ['/usr/local/lib/python3.10/dist-packages/prophet/stan_model/prophet_model.bin', 'random', 'seed=10296', 'data', 'file=/tmp/tmpf0uawuc9/xqexdcwt.json', 'init=/tmp/tmpf0uawuc9/bya5bfk_.json', 'output', 'file=/tmp/tmpf0uawuc9/prophet_modelvbws7_b3/prophet_model-20240419034719.csv', 'method=optimize', 'algorithm=lbfgs', 'iter=10000']
03:47:19 - cmdstanpy - INFO - Chain [1] start processing
INFO:cmdstanpy:Chain [1] start processing
03:47:19 - cmdstanpy - INFO - Chain [1] done processing
INFO:cmdstanpy:Chain [1] done processing
 
future2 = prophet.make_future_dataframe(periods=365, freq='D')
forecast2 = prophet.predict(future2)
prophet.plot(forecast2)
plt.savefig('chart2.jpg')

 

prophet.plot_components(forecast2)
plt.savefig('chart4.jpg')

 

다음 게시글로 한번더 prophet 실습 진행

반응형