Prophet

JoQuri(조규리)·2023년 12월 21일
0

EDA

목록 보기
6/7

install(Window 기준)

  1. Visual C++ Build Tool Microsoft C++ Build Tools 먼저 설치
  2. conda install pandas-datareader
  3. conda install -c conda-forge prophet

< def > 함수 정의

  • return(결과값이 있어야 저장후 활용가능)
  • global(global 변수를 def 내에서 사용하고 싶다면 global로 선언)
  • """ : ((shift+tab) Docstring)정의한 def함수를 설명 호출할 때 표현
  • 키워드argument '**' :기본값이 디폴트되어 있고 사용자 지정도 가능
# 마크다운으로 '$$' 수학수식 적기
$$ y = asin(2\pi ft + t_0)+b $$
def plotSinWave(**kwargs):
    """
    plot sin wave
    y  = a sin(2 pi ft + t_0) + b
    """
    amp = kwargs.get('amp', 1)
    freq = kwargs.get('freq', 1)
    endTime = kwargs.get('endTime',1)
    sampleTime = kwargs.get('sampleTime', 0.01)
    startTime = kwargs.get('startTime', 0)
    bias = kwargs.get('bias', 0)

    figsize = kwargs.get('figsize',(12,6))
    
    time = np.arange(startTime, endTime, sampleTime)
    result = amp * np.sin(2* np.pi * freq * time + startTime) + bias

    plt.figure(figsize=(12,6))
    plt.plot(time, result)

    plt.show()
plotSinWave(amp=2, freq=0.5, endTime=10)
  • 사용자가 만든 def함수 import모듈 ->.py파일로 만들기
    • jupyter notebook에 바로 (.py)파일 만들기: %%writefile ./drawSinWave.py
    • 직접 터미널에서 실행가능
      - %matplotlib inline은 실행안됨
    • if name == "main":

from prophet import Prophet(with matplotlib)

Time Series Data(시계열 데이터)?

: 시간의 흐름에 대해 특정 패턴, 주기성과 같은 정보를 가지고 있는 경우
(cf.'머신러닝'같은 경우 시간을 특성으로 잡히지 않음)
대부분 Forecast ( 먼저 Trend를 찾고, Trend를 뺀 주기적 특성을 찾음. )
그중 Prophet은 단지 예측과 분석하는 데 맛보기로 쓸만한 모듈(주기성이 좋을수록 예측정확도가 높아짐)

기본 형태

import matplotlib.pyplot as plt
%matplotlib inline

from prophet import Prophet

알고리즘 성능 테스트

: 2년간의 sin특성을 가진 데이터

time= np.linspace(0,1,365*2)        
result= np.sin(2*np.pi*12*time)     #sin함수

ds= pd.date_range('2018-01-01', periods=365*2, freq='D') #2년간의 날짜데이터
df= pd.DataFrame({'ds':ds, 'y':result})

: 연(year) 주기성, 일(daily) 주기성이 있는 데이터 (cf.자연상태는 여러 주기가 나타남)

m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df)
# df을 Prophet에서 학습 후 변수m에 저장

: 이후 30일간을 예측 & 그래프 그리기

future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
# 예측값을 forecast변수에 저장

m.plot(forecast);
# plot이 리턴해준 객체도 마찬가지로 그려주는 역할을 하기 때문에 세미콜론을 사용하면 후자를 막음

  • 편향성 time
result= np.sin(2*np.pi*12*time) + time

  • 노이즈 random(노이즈도 답습하여 예측가능. 다만 추측정확도가 다소 떨어지기도))
result= np.sin(2*np.pi*12*time) + time + np.random.randn(365*2)/4

실제 데이터로 시계열 분석

pinkwink 블로그의 방문자 수 시계열 분석

import pandas as pd
import pandas_datareader as web
import numpy as np
import matplotlib.pyplot as plt

from datetime import datetime
from prophet import Prophet

%matplotlib inline

1. 데이터 읽어온 뒤 전체 데이터 그래프

  • pd.read(index['date'], columns['hit'] 정리) : pinkwink_web

2. Numpy로 trend파악

# trend 분석을 시각화하기 위한 x축 값 만들기
time = np.arange(0, len(pinkwink_web))        #배열형태로 데이터(0~365)
traffic = pinkwink_web['hit'].values
fx = np.linspace(0, time[-1], 1000)           #1차열배열을 만듬(0~364,1000개)

# 에러를 계산할 함수
def error(f, x, y):
    return np.sqrt(np.mean((f(x) - y) ** 2))   # 표준편차? (fx - 원래값) sqrt루트
    
fp1 = np.polyfit(time, traffic, 1)			   # 1차식
f1 = np.poly1d(fp1)
# 2차식(2차원)~ 다양하게 만들 수 있고 몇 차식을 트랜드로 볼지는 디자이너 몫

- error함수 확인 결과 1~3차식까지 큰 차이가 없으나 15차식에서 실제값과의 함수와의 차이가 적은 것을 확인할 수 있다
(->트랜드를 자세히 분석이 필요하면 높은 차식 이용)

  • 1차식~3차식까지 큰 차이가 없으니 그냥 1차식으로 trend선 설정

3. Prophet로 tread분석과 예측

  • DataFrame다시 생성(index(X),날짜 컬럼'ds'=pd.to_datetime(df['ds'], format= '%y. %m. %d.'))
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df);						# ;이 없어도 됨

# 60일간에 해당하는 데이터 예측
future = m.make_future_dataframe(periods=60)

# 예측 결과는 상한/하한의 범위를 포함해서 얻어짐
forecast = m.predict(future)


4. plot_components (트랜드 뺀) 요일별, 월별, 시간별 등 주기적 특성 보고

0개의 댓글