Data Analysis & ML/시계열분석

[시계열분석] 시계열 알고리즘 - 일반 선형확률 과정(3) - ARMA(자기회귀이동평균)

YSY^ 2021. 8. 21. 23:02

MA와 AR의 관계

가역성 조건 : MR과 AR는 서로 반대의 특징을 가지고 있음

1) MA(q) -> AR(∞): 변환 후 AR 모형이 Stationary Condition이면 "Invertibility"
2) AR(p) -> MA(∞): 여러개 모형변환 가능하지만 "Invertibility" 조건을 만족하는 MA 모형은 단 1개만 존재

 

ARMA(Auto-Regressive Moving Average) (자기회귀이동평균 )

ARMA(p,q): 알고리즘의 차수(p & q)가 유한한 AR(p)와 MA(q)의 선형조합

  • p: 자기회귀 다항식의 차수
  • q: 이동평균 다항식의 차수
  • AR과 MA의 정상성 조건과 가역성 조건이 동일하게 ARMA 알고리즘들에 적용
  • 종속변수 Y_t는 종속변수 Y_t와 백색잡음 차분들(Lagged Variables)의 합으로 예측가능

ARMA의 수식

  • ϕ: 자기회귀 모형의 모수
  • θ: 이동평균 모형의 모수
  • c: 상수
  • ϵϵ 오차항 (백색잡음, white noise)

ARMA(1,0) = AR(1)

  • ACF그래프는 MA(∞)처럼 지속적으로 진동하는 것을 보여줌
  • PACF그래프는 AR(1)처럼 하나의 값에서까지 상관계수가 나와있음

ARMA(2,0) = AR(2)

  • ϕ1 > 0, ϕ2 < 0 일때

ARMA(0,1) = MA(1)

  • ACF그래프는 MA(1)처럼 하나의 값에서까지 상관계수가 나와있음
  • PACF그래프는 AR(∞)처럼 지속적으로 진동하는 것을 보여줌

ARMA(0,2) = MA(2)

  • ϕ1 > 0, ϕ2 < 0 일때

ARMA(1,1)

  • 기본함수로 많이 사용됨
  • X(t) = { a * X(t-1)} + {b * e(t-1)} + c + u*e(t)

  • ACF : MA의 특성이 나타남
  • PACF : AR의 특성이 나타남

ARMA(2,2)

  • X(t) = { a1 * X(t-1)} + { a2 * X(t-2)} + {b1 * e(t-1)} + {b2 * e(t-2)} + c + u*e(t)

ARMA(5,5)

  • ACF가 ARMA(2,2)보다 높아진 이유는 파라미터를 적합하게 쓰지 않아 과적합이 일어나 자기상관이 높아졌기 때문
  • 파라미터가 증가하면 과적합이 일아날 확률이 높아지기 때문에 적절하게 사용하여야 한다.
  • 성과가 좋게 나왔더라도 자기상관성이 높아 과적합이 일어났을 수 있음

 

모형 차수결정 정리

  1. 추정 및 예측을 하기 전에 파라미터에 따라 모형이 어떠한 결과를 도출할지 이해(예상) 필요
  2. 결과이해(예상)는 기계의 실수를 방지하고 결과의 확신을 증가시킴
  • p, q 파라미터 추론(by ACF and PACF):
  1. 정상성 형태 변환: 차분/로그변환/계절성제거 등을 통해 데이터를 정상성 형태로 변환  
  2. ACF, PACF를 도식화 하여 ARMA의 파라미터 차수를 추론  

 

항체형성 호르몬수지 ARMA 모델링

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# 데이터로딩 및 확인
data = sm.datasets.get_rdataset("lh")
raw = data.data
raw.plot(x='time', y='value')
plt.show()

# ACF/PACF 확인
plt.figure(figsize=(10, 8))
sm.graphics.tsa.plot_acf(raw.value, lags=10, ax=plt.subplot(211))
plt.xlim(-1, 11)
plt.ylim(-1.1, 1.1)
plt.title("ACF")

sm.graphics.tsa.plot_pacf(raw.value, lags=10, ax=plt.subplot(212))
plt.xlim(-1, 11)
plt.ylim(-1.1, 1.1)
plt.title("PACF")
plt.tight_layout()
plt.show()

# MA(1) 모델링
fit = sm.tsa.ARMA(raw.value, (0,1)).fit()
display(fit.summary())

# AR(1) 모델링
fit = sm.tsa.ARMA(raw.value, (1,0)).fit()
display(fit.summary())

# ARMA(1,1) 모델링
fit = sm.tsa.ARMA(raw.value, (1,1)).fit()
display(fit.summary())

 

ACF와 PACF가 lag1에서 상관성이 있다 -> arma(1,1)이 적당하다고 잠정적인 결론을 내릴 수 있음

  • ARMA(1,1)은 AR(1) & MA(1) 모델에 비해 p-value를 봤을 때 유의하지 않는다
  • AR(1) & MA(1) 에 비해 성능(SD of innovations, AIC, BIC 등)이 좋은것도 아니다.

 

호흡기질환 사망자수 ARMA 모델링

import warnings
warnings.filterwarnings('always')
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# 데이터로딩 및 확인
data = sm.datasets.get_rdataset("deaths", "MASS")
raw = data.data
raw.value = np.log(raw.value) ## 정상성 확보
raw.plot(x='time', y='value')
plt.show()

# ACF/PACF 확인
plt.figure(figsize=(10, 8))
sm.graphics.tsa.plot_acf(raw.value.values, lags=50, ax=plt.subplot(211))
plt.xlim(-1, 51)
plt.ylim(-1.1, 1.1)
plt.title("ACF")

sm.graphics.tsa.plot_pacf(raw.value.values, lags=50, ax=plt.subplot(212))
plt.xlim(-1, 51)
plt.ylim(-1.1, 1.1)
plt.title("PACF")
plt.tight_layout()
plt.show()

# ARMA(1,1) 모델링
fit = sm.tsa.ARMA(raw.value, (1,1)).fit()
display(fit.summary())

  • ACF, PACF는 정상성이 아니다.
  • 계수는 유의하게 나오고 성능이 좋다.
  • 따라서 다양한 변수를 체크해야한다.

 

잔차 진단을 포함한 모델링

from itertools import product

# ARMA(p,q) 모델링
result = []
for p, q in product(range(4), range(2)):
    if (p == 0 & q == 0):
        continue
    model = sm.tsa.ARMA(raw.value, (p, q)).fit()
    try:
        result.append({"p": p, "q": q, "LLF": model.llf, "AIC": model.aic, "BIC": model.bic})
    except:
        pass
   
# 모형 최적모수 선택
result = pd.DataFrame(result)
display(result)
opt_ar = result.iloc[np.argmin(result['AIC']), 0] ## AIC가 가장 작게 나타나는 p & q를 추출
opt_ma = result.iloc[np.argmin(result['AIC']), 1]

# ARMA 모델링
fit = sm.tsa.ARMA(raw.value, (opt_ar,opt_ma)).fit()
display(fit.summary())

# 잔차 ACF/PACF 확인
plt.figure(figsize=(10, 8))
sm.graphics.tsa.plot_acf(fit.resid, lags=50, ax=plt.subplot(211))
plt.xlim(-1, 51)
plt.ylim(-1.1, 1.1)
plt.title("ACF")

sm.graphics.tsa.plot_pacf(fit.resid, lags=50, ax=plt.subplot(212))
plt.xlim(-1, 51)
plt.ylim(-1.1, 1.1)
plt.title("PACF")
plt.tight_layout()
plt.show()

  • p가 2, q가 1일 때 LLF가 가장 높고, AIC, BIC가 가장 낮았다 -> ARMA(2,1) 모델링 진행

  • ACF는 다 유의해졌고, 좀더 강력한 성능인 PACF에서는 유의해졌긴 했지만 lag35부터는 잘 안잡히긴함
  • 계수는 유의하게 나오고 성능도 좋다.

 

해당 포스팅은 패스트캠퍼스의 <파이썬을 활용한 시계열 데이터 분석 A-Z 올인원 패키지> 강의를 듣고 정리한 내용입니다

728x90
반응형