본문 바로가기
시계열 데이터

시계열 데이터 - 자기상관함수 ACF와 PACF

by Tiabet 2023. 1. 15.

이 말을 포스팅 하면서 벌써 3번째 하는 것 같은데.. 이제 정말 ARIMA 함수로 들어가기 전 마지막 내용이 될 것 같다.

이전 포스팅에서 정상성을 판단하는 방법으로 3가지가 있음을 확인할 수 있었다.

정상성을 판단하는 3가지 방법

지난 포스팅까지 1번과 2번 내용을 다루었으니, 오늘 포스팅으로 자기상관함수에 대해 공부를 마치고 ARIMA 함수로 넘어갈 예정이다.

 

우선 자기상관 계수의 공식을 보고 넘어가고 싶다.

 

뭔가 복잡해 보이는 수식.

여기서 T는 전체 시계열의 길이를, k는 시간 사이의 간격을 의미한다. (lagged values 라는 용어가 존재하며 시차값으로 번역되는데 시간 사이의 간격 정도로 해석되는 것 같다.) 즉, T가 10이라면, k는 필연적으로 1부터 9까지 존재할 수 있게 된다. 그리고 이 자기상관 계수값을 가능한 모든 k 값에 대해서 구하면 그게 곧 자기상관함수, ACF가 된다. (Auto Correlation Function) 

 

그 전에 이 공식을 자세히 뜯어보고 싶다.

우선 분모는 y값, 즉 데이터 값의 분산에 T를 곱해준 값이다. 분자는, t=k+1부터 T까지 y(t) 와 평균의 차, y(t-k) 와 평균의 차를 곱한 것과 같다. 그런데 이는 공분산 공식과 닮은 점이 있다. 분산 공식과 공분산 공식을 나란히 놓고 살펴보자.

왼쪽이 분산 공식, 오른쪽이 확률변수 X와 Y의 공분산 공식이다.

물론 디테일의 차이는 있지만, (우선 분산의 분모는 n이지만 공분산의 분모는 n-1이다.) 내가 배운 바로는 통계학에서 n과 n-1의 차이는 크지 않다. 즉, 자기상관계수는 데이터의 분산과으로 시차값들의 공분산을 나누면 구할 수 있는 것으로 이해하면 될 것 같다. 자료 조사를 해보니 정확한 용어로는 Autocovariance, 즉 자기공분산이라고 칭한다고 한다.

 

이론적인 얘기는 했고, 이제 자기상관계수와 ACF가 무엇인지 확실히 짚고 넘어가자.

자기상관계수 r(k)는, 시차값이 k인 데이터들끼리 서로 얼마나 영향을 주고받는지를 알려주는 계수이다.

예를 들어, T가 10이고 k가 1이라면, y(1)-y(2), y(2)-y(3), ... , y(9)-y(10)끼리의 데이터를 비교하여 서로 얼마나 영향을 끼쳤는지 파악해 수치화한 것이 자기상관계수이다.

그리고 k=1부터 T-1까지 r(k)를 모두 구하면 ACF, 자기상관함수가 완성된다.

 

이렇게 개념을 정리하고 나면, 정상성 데이터와 연결하기가 쉽다.

"이전 데이터에 영향을 받지 않으면 정상성" 내가 가장 기본적으로 이해하고 있는 정상성 데이터의 개념이다.

즉, 자기상관계수가 작으면 정상성 데이터일 가능성이 크며, 정상성 데이터라면 k가 클수록 r(k)가 작아질 것이다.

내가 아주 많이 참고하고 있는 Otexts에 따르면, ACF가 빠르게 0으로 떨어지면 정상성, 느리게 떨어지면 비정상성 데이터라고 한다. 또한, ACF가 무작위한 값을 보인다면 이는 그 데이터가 무작위한 값이라는 것을 의미한다. 즉 정상성 데이터라는 것이다.

 

더 깊이 파헤치기 전에 코드를 하나 만들어보았다.

statmodes 패키지의 tsaplots 에 있는 plot_acf 함수를 사용하여 내 블로그에서 계속하여 사용하고 있는 애플 주식 가격의 ACF를 구해보았다.

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
 
# Load the stock price data for Apple Inc.
df = pd.read_csv('https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=AAPL&apikey=R1A10JZ8TS3877SK&datatype=csv&start_date=2010-01-01')
 
# Plot the ACF of the closing price
plot_acf(df["close"], title="Apple Stock Price ACF", lags=20)
 
# Show the plot
plt.show()
cs

애플 주식 가격의 ACF

역시나 자기상관함수가 들쭉날쭉한 것을 확인할 수 있다. 추가로 파란색으로 칠해져있는 영역을 볼 수 있는데, 이는 신뢰구간을 의미한다. 저 신뢰구간 안에 들어오면 자기상관이 없다고 판단할 수 있다고 한다.

 

아래처럼 statsmode 패키지의 stattools에 있는 acf 함수를 사용해도 쉽게 자기상관함수를 구할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
 
from statsmodels.tsa.stattools import acf
 
# calculate the autocorrelation values for different lags
acf_values = acf(df["close"],nlags=20)
print(acf_values)
 
# plot the autocorrelation values
plt.plot(acf_values)
plt.xlabel('Lag')
plt.ylabel('Autocorrelation')
plt.show()
cs

 

마찬가지로 애플 주식 가격의 ACF

추가로 로그와 차분 데이터에 대해서도 빠질 수 없다.

 

1
2
3
4
5
6
7
8
9
10
11
import numpy as np
 
plot_acf(np.log(df["close"]), title="Apple Stock Price ACF", lags=20)
 
df['diff'= df['close'].diff()
 
df = df.dropna(subset=['diff'])
 
plot_acf(df['diff'], title="Apple Stock Price ACF", lags=20)
 
plt.show()
cs

 

왼쪽이 로그 데이터, 오른쪽이 차분 데이터.

코드에서 lags는 시차를 의미한다. 시차를 무제한 늘리는 것은 크게 의미가 없다고 생각된다. 나중에 계절성 데이터를 다루면 유의미해지는 것 같긴 한데, 이는 현재로선 중요하진 않은 것 같아서 우선 접어두고 싶다. 하나만 짚고 넘어가면, 계절성을 갖는 데이터를 보면 일정 간격으로 ACF의 자기상관계수가 커지는 것을 확인할 수 있다. 이런 경우에서는 시차를 넓게 봐야겠지만, 특별히 이런 케이스가 아니라서 시차를 20까지만 보는 것으로 스스로 정했다.

또한 데이터에 로그를 씌운다고 한들 상관계수가 달라질 리가 없다. 로그 데이터와 원래 데이터의 ACF가 일치함을 볼 수 있다.

12개월 간격으로 ACF 값이 올랐다 내리는 것을 확인할 수 있다. 출처 : Otexts

하나 아쉬운 것이 있다. ADF Test로 애플 주식을 검정했을 때는 원래 데이터와 로그 데이터는 비정상성을, 차분 데이터는 정상성을 띄었는데, ACF로 확인해보니 딱히 그런 것 같지도 않다. 왜냐면 원래 데이터와 로그 데이터 모두 아무튼 0으로 떨어지기 때문이다. 그래서 ADF Test의 pvalue 값을 다시 한 번 확인해 보았다.

ADF Test로 확인한 정상성

원래 데이터와 로그 데이터에서 p-value가 0.5와 0.4 정도였는데, 이는 통계학적으로 귀무가설(데이터가 비정상적이다) 을 기각할 근거가 부족하다는 의미는 되어도, 귀무가설을 수용한다는 의미는 못 된다. 즉, 이 데이터들을 확실히 정상성을 띈다! 라고 하기엔 p-value가 너무 낮다. 좀 더 뚜렷한 비정상성 데이터가 있으면 좋을 것 같아서 비교하기 위해 코드를 하나 급조해보았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import matplotlib.pyplot as plt
 
# Generate a non-stationary time series with a linear trend
time = np.arange(01001)
population = 100 + 2*time
 
plt.plot(time, population)
plt.xlabel('Time')
plt.ylabel('Population')
plt.title('Population of a City over Time')
plt.show()
 
from statsmodels.graphics.tsaplots import plot_acf
 
# Plot the ACF of the non-stationary time series
plot_acf(population, title="Population of a City ACF", lags=20)
plt.show()
cs

 

너무 대놓고 비정상적인 데이터인 감이 있지만 확실한 비교를 위해 가져와보았다. 애플 주식 그래프보단 확실히 천천히 떨어지는 것을 확인할 수 있다. (k=20일 때의 값을 비교해보면 알 수 있다.)

 

이번엔 대놓고 정상적인 데이터인 백색 소음과 한 번 비교해보고 싶다.

1
2
3
4
5
6
7
8
9
# Generate a white noise time series
np.random.seed(0)
white_noise = np.random.normal(size=1000)
 
# Plot the ACF of the white noise time series
plot_acf(white_noise, title="White Noise ACF", lags=20)
 
# Show the plot
plt.show()
cs

 

확실히 그래프의 개형이 다름을 알 수 있다. 이런 식으로 ACF로 데이터의 정상성을 확인해보는 방법을 살펴볼 수 있었다.

 

ACF의 글이 너무 길어져서 PACF는 정말 간략하게 짚고 넘어가자.

 

PACF는 Auto Correlation Function 앞에 Partial이 붙어 만들어진 함수이다. 우리말로는 편자기상관함수가 된다.

왜 Partial이 붙었는지는 다음과 같다.

ACF에서, y(t-1)과 y(t)가 상관이 있었다면, y(t-2) 와 y(t-1)에도 상관이 존재해야 한다. 여기서 문제가 하나 발생한다. y(t-2)와 y(t)의 상관이 있는지 없는지가 y(t-1)에 결국 영향을 받게 된다는 것이다. 이렇게 되면 시차에 대해 명확한 자기상관계수를 구할 수가 없게 된다. PACF는 이러한 사잇값들의 영향을 제거하고 순수하게 y(t)와 y(t-k)의 상관만을 확인할 수 있는 함수이다. 

이러한 이유로 PACF의 공식은 비교하고자 하는 두 시차의 잔차의 상관계수와 같은데.. 솔직히 공식이 너무 어렵다. 단 이 개념만 짚고 넘어가면 좋겠다. 앞서 말한 사잇값들의 영향을 제거한다는 것의 의미가 결국엔 그 시점에서의 잔차만 확인한다는 의미이다. 여기서 잔차란 선형회귀모델에서의 그 잔차이다. 이를 더 자세히 설명하려면 최소제곱법, 다중선형회귀 모델 등등.. 설명할 것들이 아주 많아서 생략하고, 사진들로 용어 설명만 한 뒤 넘어가겠다.

여기서 빨간 점이 실제 데이터이고, 파란 선이 선형회귀모델이다. x축에 수직인 방향으로 빨간점과 파란점의 데이터 차이가 잔차이다.
상관계수란 X와 Y 두 데이터의 공분산을 두 데이터의 표준편차의 곱으로 나눈 것과 같다.

 

마지막으로 애플 주식의 PACF까지 확인한 뒤 마치도록 하겠다.

코드는 ACF와 진행이 똑같다. (ACF를 PACF로 바꾸어서 함수 진행만 해주면 됨)

주식 가격의 PACF가 ACF와는 사뭇 다름을 확인할 수 있다. k=1일 때는 상관이 많은 것으로 나오다가 k=2가 되자 갑자기 상관계수가 급락한다. PACF는 ACF처럼 정상성을 판단하는 기능은 없는 것 같다. 참고로 확실한 비정상성 데이터의 PACF는 다음과 같다.

오늘은 ACF와 PACF에 대해 자세히 알아보았다. ACF는 정상성을 판단하는 데에도 중요하지만, ARIMA 모델에서 자기회귀 부분의 차수를 정할 때 중요하게 쓰인다. 또한 PACF는 ARIMA 모델에서 이동 평균 부분의 차수를 구할 때 중요하게 사용되는 개념이다. 다음 포스팅부턴 AR, MA 모델을 다루고 나아가 ARIMA 모델까지 차근차근 공부할 예정이다.

 

 

 

참고 : https://datalabbit.tistory.com/113

 

[시계열분석] 부분자기상관함수(Partial Autocovariance Function, PACF)

Review 참고 포스팅 : 2021.07.12 - [Statistics/Time Series Analysis] - [시계열분석] 자기상관함수(AutoCovariance Function; ACF) [시계열분석] 자기상관함수(AutoCovariance Function; ACF) 안녕하십니까, 간토끼입니다. 이번

datalabbit.tistory.com

https://zephyrus1111.tistory.com/135

 

[시계열 분석] 5. 자기 상관 함수(Autocorrelation Function : ACF)과 부분 자기 상관 함수(Partial Autocorrelatio

이번 포스팅에서는 자기 상관 함수(Autocorrelation Function : ACF)와 부분 자기 상관 함수(Partial Autocorrelation Function : PACF)에 대하여 알아보고 파이썬을 이용하여 이를 구하는 방법을 살펴보고자 한다. 1.

zephyrus1111.tistory.com

위키피디아