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)의 합으로 예측가능
- ϕ: 자기회귀 모형의 모수
- θ: 이동평균 모형의 모수
- 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)보다 높아진 이유는 파라미터를 적합하게 쓰지 않아 과적합이 일어나 자기상관이 높아졌기 때문
- 파라미터가 증가하면 과적합이 일아날 확률이 높아지기 때문에 적절하게 사용하여야 한다.
- 성과가 좋게 나왔더라도 자기상관성이 높아 과적합이 일어났을 수 있음
모형 차수결정 정리
- 추정 및 예측을 하기 전에 파라미터에 따라 모형이 어떠한 결과를 도출할지 이해(예상) 필요
- 결과이해(예상)는 기계의 실수를 방지하고 결과의 확신을 증가시킴
- p, q 파라미터 추론(by ACF and PACF):
- 정상성 형태 변환: 차분/로그변환/계절성제거 등을 통해 데이터를 정상성 형태로 변환
- 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())
- 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
반응형
'Data Analysis & ML > 시계열분석' 카테고리의 다른 글
[시계열분석] 시계열 알고리즘 - 적분 선형확률 과정(1) - ARIMA (0) | 2021.09.11 |
---|---|
[시계열분석] 시계열 알고리즘 - 일반 선형확률 과정(4) - ARMAX / SARMAX (0) | 2021.08.28 |
[시계열분석] 시계열 알고리즘 - 일반 선형확률 과정(2) - AR(자기회귀) (0) | 2021.08.14 |
[시계열분석] 시계열 알고리즘 - 일반 선형확률 과정(1) - MA(이동평균) (0) | 2021.08.07 |
[시계열분석] 항공사 승객수요 스케일 및 정상성 변환 (1) | 2021.06.27 |