본문 바로가기
컴퓨터 COMPUTER/Urban Data Analytics 데이터분석

TimeSeries Forecasting (2) 시계열 분석 데이터 Stationarity check - 파이썬으로 데이터의 계절성/주기성 파악하기 ACF, PACF 플롯 그리고 해석하기

by 매실이 maesiri 2022. 1. 22.

TimeSeries Forecasting (1) 시계열 분석 데이터 Stationarity check - 파이썬으로 데이터의 계절성/주기성 파악하기 ACF, PACF 플롯 그리고 해석하기

 

맨땅에 헤딩하듯 시계열예측 모델을 공부하다 보니 알게된 매우 중요한 팁.

예측 모델은 가지고 있는 시계열 데이터의 통계적 특성을 확인하는 것에서 시작해야 한다는 점이다.

현재의 값이 과거의 값들과 어느정도 correlate할까? 데이터의 계절마다의 특성은 뭘까? 데이터는 주기성이 없을까? 

이러한 물음에 스스로 답하기 위해서 Stationarity Check을 할 필요가 있다. 

데이터의 특성에 따라 정확도가 높고 효율이 좋은 모델이 달라지기 때문이다. 

 

이 포스팅에서는 Autocorrelation Function (ACF) plot, Partial Autocorrelation Function (PACF) plot을 이용해서 Stationarity Check을 할 것이다. 다음에 기회가 되면 Seasonal Decomposition plot 도 그려보도록 하겠음!

 

ACF, PACF 플롯을 이용하면 ARIMA 혹은 AR, MA, ARMA 모델을 활용할 때 가장 효율적인 모델과 해당하는 p,d,q 파라미터를 구하는 데에도 도움이 된다.

 

1. 먼저 패키지 임포트

import os #provides functions for interacting with the operating system
import numpy as np 
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
from math import sqrt

from numpy import concatenate
from matplotlib import pyplot
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
from pandas import to_datetime

%matplotlib inline

# To change scientific numbers to float
np.set_printoptions(formatter={'float_kind':'{:f}'.format})

# Increases the size of sns plots
sns.set(rc={'figure.figsize':(8,6)})

import itertools
import warnings

import datetime
from datetime import datetime
warnings.filterwarnings('ignore')

 

내가 가진 데이터를 불러온 후, ACF, PACF plot을 그려볼고야

 

2. 데이터 불러오기

 

이 포스팅에서 테스트할 인풋 데이터는 date, death 라는 두개의 column을 가진 dataframe이다. Chicago-Naperville-Elgin 세 도시를 묶은 지역 단위에서 2020년 2월 16일부터 코로나로 인해 사망한 사람이 몇 명인지 일주일 단위로 기록한 것이다. 

 

아래와 같은 형식이 되도록 csv 파일을 가져와 dataframe으로 변형시켰다. 

Like this..

 

3. ACF, PACF 플롯 그리기

 

ACF, PACF 플롯은 앞서 말한대로 Autocorrelation Function (ACF) plot, Partial Autocorrelation Function (PACF) plot 을 줄인 말이다.

이 플롯들은 현재 값이 과거 값과 어떤 relationship을 가지고 있는지 보여준다. 

 

현재 시간을 t라고 하자.

현재 값을 S(t) 라고 했을 때, p개 전의 값은 S(t-p) 이다. 

과거부터 현재까지의 값을 나열하자면, ... - S(t-p) - S(t-p+1) - ... - S(t-1) - S(t)  일 것이다.

 

이때, ACF 은 corr(St, S(t-p)). 즉 현재 값과 p개 전의 값의 correlation인데, S(t-p) 는 S(t-p+1)에도 영향을 미치고, S(t-p+2) 에도 영향을 미치고, 이런식으로 S(t)에 도달하기 전까지의 값들이 모두 영향을 줬을텐데, 이런 indirect 간접적인 영향까지 모두 고려한 것이 ACF 이다. 

만약 ACF plot 을 그렸는데 변화가 거의 없다면, 데이터가 딱히 주기성을 가지지 않은 것이다. 

반면, PACF은 'partial' ACF로서, S(t-p)가 S(t) 에 주는 direct 영향 만을 의미한다. 

 

내가 처음에 두 플롯을 읽는 방법을 공부할 때 가장 도움이 되었던 동영상들을 공유하려고 한다. 이 포스팅을 작성할 때도 참고하였다. 
https://www.youtube.com/watch?v=DeORzP0go5I   
https://www.youtube.com/watch?v=Icl9_46_RZY  

 

이제 직접 ACF, PACF 플롯을 그리기 위해 패키지를 임포트 하자.

from scalecast.Forecaster import Forecaster
import matplotlib.pyplot as plt
import pandas_datareader as pdr

Forecaster 라이브러리를 이용해 우선 데이터가 어떻게 생겼는지 그려본다.

 

f = Forecaster(y=chicago_death['death'], current_dates=chicago_death['date'])
f.plot()

다음으로, ACF와 PACF 플롯을 그려본다. 정말 간단하게 plot_acf(), plot_pacf()  함수를 이용하면 된다. 

f.plot_acf()
f.plot_pacf()
plt.show()

내가 가진 데이터 상으로는 아래와 같이 그래프가 그려졌다. 

반응형

4. 그래프 해석

 

그래프를 성공적으로 그렸다면, 이제 그래프를 해석해보자. y축의 값들은 ACF, PACF 을 수치화 한 것이고, x축이 lag되는 수, 즉 몇개 전의 값에 대한 것인지 말해준다. 왼쪽으로부터 첫번째 바 는 x 가 0.0 인데, 이는 현재 값이라고 생각하면 된다. 그래서 ACF, PACF 값이 무조건 1로 나온다. x 값이 2 이면 2개 전의 값을 말한다. 

우선, 실핀처럼 생긴 bar 들이 있는데, 이게 파란색 상자 안에 들어가게 되면, 그 때부터는 값이 통계적으로 significant하지 않다고 본다. 

아래 표를 활용해서 적합한 모델과 p,q 값을 구할 수 있다. 이를 테면,  ACF 그래프의 모양이 점점 작아지고, PACF 그래프에서 p 개 바 뒤에 그래프가 끊긴다면 (insignificant 해지거나 - 값으로 갑자기 떨어질 경우) AR 모델이 적합한 것이고, p 값을 AR 모델의 파라미터로 쓰면 된다. 

  AR(p) 모델 적합 MA(q) 모델 적합 ARMA(p,q) 모델 적합
ACF 그래프 점점 작아진다. 첫 값으로부터 q개 뒤에 끊긴다. 점점 작아진다. 
PACF 그래프 첫 값으로부터 p개 뒤에 끊긴다. 점점 작아진다.  점점 작아진다. 

내가 그린 ACF, PACF 플롯을 보면,  ACF 그래프가 점점 작아지고, PACF 그래프는 첫 값으로부터 1개 뒤 이후부터 파란상자 안에 값이 들어가며 그래프가 끊기는 것을 볼 수 있다. 이로부터, 이 데이터셋을 사용할 때는 AR(1) 모델을 활용하는 것이 가장 정확도가 높을 것이라고 유추할 수 있다.

 

만약 이해가 잘 되지 않았거나 조금 더 깊이 이해하고 싶다면, 위에 공유한 영상들을 꼭 시청해보길 바란당!

그럼 이만 바-이

 

무료이미지

반응형

댓글