자기상관 함수
IT 위키
더 많은 작업
- Autocorrelation Function, ACF; 자기상관함수, 자기상관성 함수
- 시계열 데이터에서 시차(lag) k 만큼 떨어진 자기 자신의 값들 사이의 상관관계를 시차별로 나타낸 함수
시계열은 시간 순서로 관측되므로 오늘 값이 어제 값과 비슷하게 움직이는 경우가 많다. 이처럼 한 변수가 자기 자신의 과거 값과 상관되어 있는 성질을 자기상관(자기상관성)이라 하고, 그 크기를 시차 1, 2, 3, … 마다 계산해 늘어놓은 것이 자기상관 함수이다. 두 변수 사이의 상관을 보는 상관 분석을 한 시계열과 그 시차 이동본 사이에 적용한 것으로 볼 수 있다.
정상 시계열 Xt 의 시차 k 자기상관계수는
관측된 시계열 x1, …, xn 에서는 표본 자기상관계수로 추정한다.
- ρ0 = 1 이다. 자기 자신과의 상관이기 때문이다
- 값의 범위는 −1 ~ 1 이고, 시차에 대해 대칭이다(ρk = ρ−k)
- 분자가 공분산이므로 시차 k 에서의 공분산을 시차 0 의 분산으로 나눈 것이다
시차를 가로축, rk 를 세로축으로 막대를 그린 그림을 코렐로그램(correlogram, ACF 그림)이라 한다. 보통 ±1.96/√n 의 신뢰 한계를 함께 그려, 그 밖으로 나간 막대를 유의한 자기상관으로 본다.
| 코렐로그램 모양 | 해석 |
|---|---|
| 시차 1 이상에서 모두 신뢰 한계 안 | 백색잡음. 남은 자기상관이 없다 |
| 아주 천천히 줄어든다 | 추세가 있는 비정상 시계열. 차분이 필요하다 |
| 일정 간격(예: 12, 24)마다 크게 솟는다 | 계절성이 있다 |
| 어느 시차 뒤로 갑자기 0 근처로 떨어진다(절단) | MA 과정의 특징 |
| 지수 곡선이나 사인 곡선처럼 서서히 줄어든다(감소) | AR 과정의 특징 |
부분자기상관 함수(편자기상관 함수, Partial ACF, PACF)는 시차 k 의 상관에서 그 사이 시점(1, …, k−1)의 영향을 제거한 순수한 상관이다. ACF 는 중간 시점을 거쳐 이어진 간접 상관까지 모두 포함한다.
| 모형 | ACF | PACF |
|---|---|---|
| AR(p) | 서서히 감소 | 시차 p 이후 절단 |
| MA(q) | 시차 q 이후 절단 | 서서히 감소 |
| ARMA(p, q) | 서서히 감소 | 서서히 감소 |
- 정상성 판단 : 정상 시계열은 ACF 가 비교적 빨리 0 으로 줄어들고, 비정상 시계열은 아주 천천히 줄어든다. 통계적 검정은 디키-풀러 테스트로 한다
- 모형 식별 : ACF·PACF 의 절단과 감소 모양으로 AR·MA·ARMA 와 차수를 고른다
- 잔차 진단 : 시계열 모형의 잔차는 백색잡음(평균 0, 분산 일정, 자기상관 0)이어야 한다. 잔차의 ACF 가 모두 신뢰 한계 안이면 모형이 시계열의 구조를 다 설명한 것이다. 여러 시차를 한꺼번에 검정할 때는 융-박스(Ljung-Box) 검정을 쓴다
- 회귀 잔차 점검 : 회귀 분석은 오차끼리 독립이라고 가정한다. 시간 순서 자료에서 잔차에 자기상관이 있으면 이 가정이 깨진다. 1차 자기상관은 더빈-왓슨(Durbin-Watson) 통계량으로 보며, 2 근처이면 자기상관이 없다고 본다
| 개념 | 무엇을 보는가 |
|---|---|
| 자기상관 함수 | 한 시계열과 자기 자신의 시차 이동본 사이의 상관 |
| 부분자기상관 함수 | 중간 시점의 영향을 뺀 시차 k 의 상관 |
| 교차상관 함수 | 서로 다른 두 시계열 사이의 시차별 상관 |
| 시계열 분해 | 시계열을 추세·계절·순환·불규칙 요인으로 나누는 기법. 상관을 계산하는 함수가 아니다 |
| 실루엣 계수 | 군집 분석의 결과가 얼마나 잘 나뉘었는지 재는 지표 |
| 회귀계수 | 회귀식에서 독립변수가 종속변수에 미치는 크기 |
자기상관성은 시계열 자료가 가진 성질로, 시계열 모형을 세우거나 잔차를 진단할 때 확인한다. 일반적인 지도 학습 모델을 고를 때 따지는 것은 데이터의 형태와 양, 분석 목적, 변수의 중요도 등이며, 자기상관성은 이런 모델 선정 기준이 아니다.
import numpy as np
from statsmodels.tsa.stattools import acf, pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
rng = np.random.default_rng(0)
e = rng.normal(size=300)
x = np.zeros(300)
for t in range(1, 300): # AR(1): x_t = 0.7 x_{t-1} + e_t
x[t] = 0.7 * x[t - 1] + e[t]
print(acf(x, nlags=5)) # 0.7, 0.49, ... 처럼 서서히 감소
print(pacf(x, nlags=5)) # 시차 1 뒤로 0 근처(절단)
plot_acf(x, lags=20); plot_pacf(x, lags=20)
print(acorr_ljungbox(e, lags=[10])) # 백색잡음이면 p-값이 크다
- Box, G. E. P., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time Series Analysis: Forecasting and Control (5th ed.). Wiley.
- Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: Principles and Practice.