데이터 취업 스쿨 스터디 노트 -(22) forecast(시계열 분석)

테리·2024년 7월 10일

시계열 데이터란?

시간의 흐름에 대해 특정 패턴과 같은 정보를 가지고 있는 경우를 시계열 데이터라고 함.
일반적으로 머신러닝에서는 '시간'을 특성으로 잡지 않아서 머신러닝에서는 시계열 데이터를 다루지는 않음.

prophet 이란?

  • 페이스북에서 만든 시계열 분석 라이브러리
  • fbprophet -> prophet으로 명칭 바뀜!
  • fbprophet 설치해봤자 안된다. prophet으로 설치!!

설치

함수(def)의 기초

return으로 데이터를 저장하지 않으면 함수의 해당 값을 재사용 할 수 없다.

수학 수식 기호 작성

두개의 $$ 사이에서 수학 수식을 작성하면 바뀐다.
1. $$ y=asin(2\pi ft + t_0) + b $$
2. esc -> m -> shift + enter

Docstring 내용 작성하는 방법

함수 안에서 쌍따옴표를 사용하고 쌍따옴표 사이에 입력하면 된다.

def plotSineWave(amp, freq, endTime, sampleTime, startTime, bias):
    """
    plot sine wave
    y = a sin(2 pi f t + t_0) + b
    """
    pass

**kwargs

아래와 같은 함수를 만들었다고 해보자.

이 경우 함수를 사용할 때 매번 plotSineWave(2,1,10,0.01,0.5,0) 와 같이 매개변수 값을 다 입력해야 실행된다. (심지어 각 자리가 뭐를 뜻하는지 잘 모르겠다.)

이 경우 **kwargs 를 사용한다.
**kwargs를 사용해 기본 값을 미리 세팅해둔다.
단, 여기에서 중요한 것은 kwargs라는 알파벳이 아니다. 이것은 뭐로 사용하든 상관 없다. 별두개가 중요한 것이다.

이렇게 하면 함수를 사용할 때 plotSineWave() 처럼 괄호를 비워놔도 기본값으로 실행된다.

데이터 값을 변경하려면 각 값을 지정해주면 된다.

그래프 한글설정 파일 만들기(나중에 import로 사용)

%%writefile ./set_matplotlib_hangul.py

import platform
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc

path = "c:/Windows/Fonts/malgun.ttf"

if platform.system() == "Darwin":
    print("hangul OK in your MAC!!!")
    rc('font', family='Arial Unicode MS')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname=path).get_name()
    print("hangul OK in your Windows!!!")
    rc('font', family=font_name)
else:
    print('Unknown system.. sorry~~~')
plt.rcParams['axes.unicode_minus'] = False

시계열 분석

데이터 만들기

예시1

prophet

  • yearly_seasonality=True : 데이터가 매년 반복되는 패턴이 있는 경우 사용.
  • daily_seasonality=True : 데이터가 매일 반복되는 패턴이 있는경우 사용

연간 및 일간 주기성을 모두 반영하여 예측을 수행하도록 한다.

점은 실제 데이터, 파란색 선이 예측 데이터

예시2

미래 예측

예시3

미래 예측

시계열 데이터 실전 이용해보기

초기 데이터 불러오기

pandas_datareader는 금융 데이터와 경제 지표를 손쉽게 가져와서 분석할 수 있게 해주는 유용한 도구이다.

import pandas as pd
import pandas_datareader.data as web
import datetime
#
# 시작일과 종료일 설정
start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2020, 12, 31)
#
# 야후 금융에서 애플 주식 데이터 가져오기
apple = web.DataReader('AAPL', 'yahoo', start, end)
#
print(apple.head())

이런식으로 사용할 수 있지만 여기서 사용하지는 않았다.(왜 import 했는지 모르겠다)

trend 분석을 시각화하기 위한 x축 값을 만들기

time = np.arange(0, len(pinkwink_web))
traffic = pinkwink_web['hit'].values
fx = np.linspace(0, time[-1], 1000) # time[-1] 은 time의 가장 마지막 데이터

에러를 계산할 함수

  • polyfit, poly1d를 사용해 다항식 만들기
  • .values를 사용하면 pandas의 Series나 DataFrame 객체를 numpy 배열로 변환할 수 있다. 꼭 numpy 배열의 데이터를 요구하는 함수나 계산이 아닌 이상 사용하지 않아도 차이는 없지만 이렇게 하면 데이터에 접근하는 속도가 빨라지고 메모리 사용량도 줄일 수 있다.

그래프 그리기

원하는 데이터 프레임으로 만들기

to_datetime 함수를 사용해 날짜 형식 변경

시계열 예측

pd.to_datetime(df['ds'], format='%y. %m. %d.')를 통해 df['ds']를 표준 datetime 형식으로 변환하면, Prophet 모델이 이를 자동으로 인식하여 시계열 예측에 사용할 수 있다고 한다.

Prophet 모델은 기본적으로 ds라는 이름의 날짜 컬럼을 기대하며, 이 컬럼을 통해 시계열 데이터의 시간 간격을 예측하고 통계적인 분석을 수행한다고 한다.

예측 결과를 얻음

그래프로 확인

m.plot_components(forecast);

  • 연간, 주간, 일간과 같은 Prophet에서 기본적으로 제공하는 시즌성 요소들을 따로 시각적으로 보여줌.

0개의 댓글