🖇 시계열 데이터 EDA
🖇 ACF와 PACF
🖇 ACF와 PACF 적용
🖇 비정상적 데이터에서 ACF와 PACF
🖇 허위 상관 주의하기
시계열 분석에서 첫 단계는 데이터가 어떤 구조를 갖고 있는지를 파악하는 것이다.
시계열 데이터에서는 패턴의 반복성이나 시차에 따른 자기의존성을 정확히 확인하는 것이 중요하다. 자기상관 함수(ACF, Autocorrelation Function)와 부분 자기상관 함수(PACF, Partial Autocorrelation Function)를 활용해 이를 확인할 수 있다.
이 글에서는 시계열 데이터 EDA 과정에서 ACF와 PACF가 어떤 의미를 가지며, 실제로 어떻게 해석해야 하는지를 사인 함수 예제를 통해 정리해 보았다.
시계열 데이터를 분석하기 전에는 반드시 데이터를 충분히 탐색(EDA: Exploratory Data Analysis)해야 한다. 시계열 데이터는 관측값 간에 시간 의존성이 존재하며, 일반적인 정형 데이터와는 다른 구조적 특성을 갖기 때문이다.
값이 증가하는 원인은 단순한 시간의 흐름 때문인지, 실제로 과거 값이 미래에 영향을 주는지, 혹은 계절성과 같은 반복 패턴이 있는지를 먼저 파악해야 이후 분석이 가능하다.
시계열 EDA에서는 아래의 질문을 고려해야 한다.
이러한 구조적 특성을 빠르게 파악하는 데 ACF와 PACF는 매우 유용하게 작용하며 이후 ARIMA 모델링이나 이상 탐지 등의 기반이 된다.
사인함수와 선형 시계열을 예로 들어 ACF, PACF가 어떤 정보를 제공하는지 시각화하여 확인해 보자.
▼ (왼쪽)사인함수와 (오른쪽)사인함수의 ACF Plot

ACF는 시계열 내에서의 시간 간격(lag)별 자기상관 정도를 나타낸다.
(자기 상관: 시계열 데이터에서 일정 간격이 있는 값들 사이의 상관관계)
시계열 데이터가 과거의 자기 자신과 얼마나 닮아 있는지를 수치로 계산해주는 함수라고 생각하면 이해하기 쉽다.
💡 시차가 0일 때 자기상관은 항상 1이며 이후 시차가 커질수록 상관관계가 어떻게 변화하는지를 보여준다.
💡 시계열이 자기상관이 없을 경우, 대부분의 lag 값이 암계값 범위 안에 존재해야 하며 이 범위 안의 값은 통계적으로 유의하지 않다.
▼ (왼쪽)사인함수와 (오른쪽)사인함수의 PACF Plot

PACF는 시차가 있는 두 시점 간의 직접적인 상관관계만을 보여준다.
(부분 자기상관 = 편자기상관: 자신에 대한 그 시차의 편상관)
두 시점 사이의 전체 상관관계에서 그 사이 다른 시점의 조건부 상관관계를 제거하고 나서 남는 순수한 상관관계를 나타낸다.
💡 ACF는 전체적인 상관관계를 포함하기 때문에 중복 정보가 많다.
💡 PACF는 각 lag 간의 독립적인 관계만 남기 때문에 모델 차수 파악(AR 차수 결정 등)에 자주 사용된다.
사인 함수 시계열에 ACF와 PACF를 적용해서 ~를 시각적으로 확인해 보자.
# statsmodels
# : 통계 모델 추정, 통계 결과, 통계 데이터 탐색을 지원하는 python 모듈
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
x = np.array(range(100)) # 0~99까지 생성
y = np.sin(x + np.pi/3) # 사인 함수 값 도출
plt.plot(y)
plt.title("Sine Wave Time Series")
plt.show()

이와 같은 데이터는 정상성(stationarity)을 만족하는 전형적인 예시로, ACF와 PACF를 적용하기에 적합하다.
plot_acf(y)
plt.show()

이는 사인 함수의 주기적 구조가 lag 간 반복되며 자기상관이 강하게 유지되고 있음을 보여준다.
plot_pacf(y)
plt.show()

ACF와 비교하면 보다 정제된 상관구조를 확인할 수 있다.
이는 PACF가 각 lag에 대해 중복 정보를 제거하고 직접적인 관계만 보여주기 때문이다.
▼ 1부터 100까지 선형적으로 증가하는 데이터의 ACF plot과 PACF plot

값들은 단순히 균등하게 증가하는 것이기 때문에, ACF와 PACF로부터도 크게 유의미한 정보를 얻을 수 없다.
선형 증가 시계열에 ACF와 PACF를 적용해서 ~를 시각적으로 확인해 보자.
x_linear = np.arange(1, 101)
plt.plot(x_linear)
plt.title("Linear Increasing Series")
plt.show()

plot_acf(x_linear)
plt.show()
plot_pacf(x_linear)
plt.show()

이처럼 비정상성(non-stationarity)을 가진 데이터에서는 ACF, PACF가 신뢰할 수 있는 통계 정보를 제공하지 못한다.
시계열 EDA에서 체크해야할 가장 중요한 위험은 허위 상관(spurious correlation)이다.
허위 상관은 두 개 이상의 변수가 통계적 상관은 있지만 인과관계가 없는 관계를 말한다. 두 시계열 간에 통계적으로 높은 상관이 있는 것처럼 보이지만, 실제로는 공통된 시간 추세만 존재하고 인과관계는 없는 경우다.
흔히 말하는 상관관계는 인과관계가 아니다 라는 것이 적용되는 사례라고 볼 수 있다.
지금까지 시계열 데이터를 해석하고 모델링 구조를 설계하는 데 있어 ACF와 PACF가 가지는 의미를 살펴보고, 간단한 시계열 데이터 예제에 적용 후 해석해 보았다.
중요한 건, 그 해석이 유의미하려면 데이터가 정상성(stationarity)을 만족하는지 먼저 확인해야 한다는 것이다. 또한 주기성 또는 추세성에 따라 달리 해석되어야 한다는 점도 유의해야 한다.
예제로 살펴본 사인 함수와 선형 증가 시계열은 각각 정상적인 주기 시계열과 비정상적인 추세 시계열을 대표하는 예시로, 두 경우에서 ACF와 PACF가 얼마나 다르게 나타나는지를 비교해볼 수 있었다.
시계열 데이터가 일반적인 정형 데이터와 구조적으로 다른 특징을 갖는 다는 것에 유의하며 분석해야겠다.