단위근 검정
시계열 데이터의 정상성을 테스트하는 단위근 검정에 대해 알아보겠습니다.
단위근 검정은 통계적 가설 검정 방법 중 하나로, 시계열 데이터가 정상인지를 판단하는 절차입니다. 여러 종류의 검정을 통틀어 '단위근 검정'이라고 부릅니다. '단위근'이란 이름은 '단위(1)'와 '근(방정식의 해)'을 합친 말로, 어떤 문제를 풀었을 때 그 답이 1인 경우를 의미합니다.
단위근 검정이 정상성을 판단하는 데 사용되는데, 그 이유는 AR(1) 모델을 예로 들 수 있습니다. 이 모델은 다음과 같은 식으로 나타냅니다.
$$ y_t = \alpha y_{t-1} + e_{t-1} $$
만일 $\alpha = 0$, y는 대부분 외부 충격에 의해 발생하게되며, 외부 충격이 랜덤하게 발생하기 때문에 y값도 랜덤하게 결정됩니다. 이런 경우, 자기 상관 그래프 ACF
를 그려보면 오차 한계선 내로 그려집니다. 이는 데이터가 랜덤하기 때문에 앞뒤 데이터가 서로 연관이 없으므로, 이 모델은 완전한 정상성을 가집니다. 이 모델에서 오차 값은 일정하게 발생하므로, 왼쪽 혹은 아래로 변동할 수 있지만, 그 변동성 자체는 일정합니다.
$\alpha < 1$이면, 과거에 어떠한 외부 충격으로 오차가 생겼을 때 시간이 경과할수록 외부 충격으로 인해 발생한 변화의 비율은 점차 줄어들어, 원래의 상태로 돌아가게 됩니다. 결과적으로 시계열은 계속해서 안정상태를 유지하게 됩니다.
만일 여기서 $\alpha = 1$이라면 어떻게 될까요? $y_t$는 지금까지 오차의 누적과 같게 됩니다.
$$ y_t = e_0 + e_1 + \cdots + e_{t-1} $$
이 경우, 외부 충격으로 인한 변동이 계속 유지되어 한 번 충격을 받으면 원상태로 돌아가지 못합니다. 이런 경우는 고정된 상태를 유지하는 것이 아니라, 다양한 상태를 계속해서 경험하게 됩니다. 이러한 현상을 랜덤워크라고 표현하며, 이는 대표적인 비정상 시계열의 예입니다. 이런 시계열은 앞으로 어느 방향으로 움직일지 예상할 수 없습니다.
경제학의 효율적 시장 가설에 따르면 주가 시계열은 랜덤워크합니다. 이것은 차트를 보고 주가가 어떠한 방향으로 움직일지 예측하는 것은 불가능하다는 것을 뜻합니다.
$\alpha > 1$인 경우도 있을 수 있습니다. 이는 시간이 경과함에 따라 효과가 배로 늘어난다는 것을 의미합니다. 예를 들어, 외부 충격으로 인해 처음에 1만큼의 효과가 있었다면, 다음 시점에는 그 효과가 2배가 되고, 그 후에는 4배로 늘어납니다. 따라서 과거에 있었던 일이 시간이 경과함에 따라 폭발적으로 증가한다는 것이지만, 이는 현실적으로 거의 발생하기 어렵습니다.
따라서 $\alpha = 1$이면 비정상, $\alpha < 1$은 정상 시계열로 나뉩니다. $\alpha = 1$인지 아닌지를 확인하는 통계적 가설 검정을 모두 단위근 검정이라고 부릅니다.
단위근 검정에는 여러 종류가 있으나, 이번에는 가장 널리 사용되는 ADF 검정과 KPSS 검정을 살펴보도록 하겠습니다.
ADF 검정
Augmented Dickey Fuller 검정은 y의 차수, 즉 이전 시점과 이후 시점의 차이 값이 복잡한 수식에 따라 결정된다는 가정을 설정합니다.
이 수식에서 감마가 0인지 아닌지를 검정하게 됩니다. 귀무 가설은 감마가 0인 경우를 가정합니다. 감마가 0인 경우, 현재 y를 보고 이전 시점의 y를 통해 y가 어떻게 변할지 예측할 수 없습니다. 이는 이전 시점의 yt-1
이 다음 시점의 변화를 예측하는데 도움을 주지 못함을 의미합니다. 따라서 이런 상황은 비정상 시계열에 해당됩니다.
예를 들어, 선형적으로 증가하는 데이터가 있다면 이전 시점의 변화량과 다음 시점의 변화량이 동일합니다. 나머지는 모두 0 이고, 이 경우 1이 됩니다. 이는 추세가 있는 비정상 시계열이므로, 추세가 있기 때문에 비정상으로 여겨집니다.
따라서 귀무 가설은 감마가 0이라고 가정합니다. 만약 이 가설이 기각된다면, 시계열은 정상이라고 결론을 내릴 수 있습니다.
ADF 테스트는 특정한 종류의 비정상 시계열, 즉 간격이 0인 비정상을 배제하려는 것입니다. 다른 종류의 비정상 시계열이 존재할 수도 있지만, 대부분의 경우 이 타입에 속하기 때문입니다. 예를 들어 이전에 다루었던 비어 데이터는 명확하게 비정상입니다.
ADF 테스트를 실행하면 다양한 숫자들이 나오는데, 이 중에서 중요한 것은 두 번째에 위치한 P-value입니다. 나머지 숫자들은 참고용이므로 주의깊게 보지 않아도 됩니다. P-value가 0.0보다 작아야 귀무가설을 기각할 수 있습니다. 이 귀무 가설은 시계열이 비정상이라는 것이므로, 만약 P-value가 0.0보다 크다면 비정상 가설을 기각할 수 없다는 뜻입니다. 즉, 이 시계열은 비정상일 가능성이 있다는 것을 의미합니다.
다른 관점으로 보면, 검정 통계량을 이용해 P-value를 계산하는 것입니다. 이 검정 통계량을 직접 임계치와 비교해보실 수도 있습니다. 현재 5%의 임계치는 -2.87입니다. 이 말은 검정 통계량이 -2.87일 때 P-value가 정확히 0.05가 된다는 것입니다. 검정통계량이 -2.6이므로, -2.87보다 큰 값입니다. 따라서 P-value는 0.05보다 크게 나올 것입니다.
from statsmodels.tsa.stattools import adfuller
adfuller(beer.production)
(-2.6113380049073505, 0.09067650132417931, 14, 203, {'1%': -3.462980134086401, '5%': -2.875885461947131, '10%': -2.5744164898444515}, 1705.9257319685298)
알파벳 주가
df = pd.read_excel('GOOG.xlsx')
y = df.Price
y.plot()
<Axes: >
plot_acf(y);
KPSS 검정
다른 단위근 검정 중 하나는 KPSS 검정이라는 것이 있는데, 이것은 네 사람의 이름이 합쳐진 것이며, 이들 사람들은 키아트코프스키(K), 필립스(P), 슈미트(S), 신(S)입니다. 특히 신은 한국에서 출신입니다.
KPSS 검정의 귀무 가설은 ADF 검정과 반대인데, ADF 검정의 귀무 가설은 데이터가 비정상 시계열이라는 것이고, 이를 기각하면 데이터가 정상 시계열이라는 결론을 내릴 수 있습니다.
반면에 KPSS 검정의 귀무 가설은 데이터가 정상 시계열이라는 것이며, 이를 기각하면 데이터가 비정상 시계열이라는 결론이 도출됩니다. 이처럼 귀무가설의 형태가 서로 반대이기 때문에, 이를 주의하여 사용해야 합니다.
KPSS 검정을 실행하면 결과가 0.01으로 나타납니다. 그 다음으로 경고 메시지가 나오는데, 이는 실제 P-value가 표시된 것보다 더 작을 수 있다는 내용입니다. 우리가 일반적으로 유의수준 0.05를 기준으로 판단한다면, 이 경고 메시지에도 불구하고 귀무 가설이 기각되는 것을 알 수 있습니다.
KPSS의 귀무 가설은 해당 시계열이 정상시계열이라는 것이지만, 값이 0.05보다 작으므로 귀무가설을 기각하고, 따라서 이 시계열은 비정상시계열임을 결론짓게 됩니다.
from statsmodels.tsa.stattools import kpss
kpss(y)
C:\Users\eupho\AppData\Local\Temp\ipykernel_35980\4027067367.py:2: InterpolationWarning: The test statistic is outside of the range of p-values available in the look-up table. The actual p-value is smaller than the p-value returned. kpss(y)
(5.51118618798788, 0.01, 27, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
우리가 구글 주가 데이터를 차분한 이후, 다시 ACF를 그려보면 거의 무작위적인 움직임의 전형적인 ACF를 확인할 수 있습니다.
세로 축에 있는 첫 번째 값은 시차가 0일 때의 자기상관이므로 항상 1입니다. 이를 제외하면 ACF 값들이 거의 0에 가까운 값을 가지며, 이는 정상시계열의 전형적인 특징입니다.
yd = y.diff().dropna()
plot_acf(yd);
그러나 KPSS 검정 결과는 여전히 비정상시계열을 나타내고 있습니다.
kpss(yd)
(0.6359166917050625, 0.019371209844994318, 18, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
한 번 더 차분을 해보겠습니다.
yd2 = yd.diff().dropna()
plot_acf(yd2);
이제 KPSS 검정을 실시하면 "실제 p-value는 구해진 p-value보다 크다"는 경고가 발생합니다. 이제 p-value가 10% 이상이므로, 유의수준 5%보다 크기 때문에 '정상 시계열이다'라는 귀무가설을 기각할 수 없게 됩니다. 그런 논리를 통해, 이 시계열은 정상성을 가짐을 알 수 있습니다.
kpss(yd2)
c:\Users\eupho\anaconda3\lib\site-packages\statsmodels\tsa\stattools.py:2022: InterpolationWarning: The test statistic is outside of the range of p-values available in the look-up table. The actual p-value is greater than the p-value returned. warnings.warn(
(0.08506039919927151, 0.1, 216, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
미국 전기생산량 데이터
다음으로 미국의 전기 생산량 데이터를 살펴보겠습니다. 이 데이터에는 연월과 함께 전기 생산량이 표시되어 있습니다.
el = pd.read_excel('usmelec.xlsx')
el.head()
year | month | elec | |
---|---|---|---|
0 | 1973 | 1 | 160.218 |
1 | 1973 | 2 | 143.539 |
2 | 1973 | 3 | 148.158 |
3 | 1973 | 4 | 139.589 |
4 | 1973 | 5 | 147.395 |
만약 전기 생산량만을 따로 추출해 그래프로 그려본다면, 계절성을 나타내는 증감 패턴을 관찰할 수 있을 것입니다. 예를 들어, 여름에는 에어컨 사용량이 증가하므로 전기 생산량이 증가하고, 겨울에는 반대로 감소하는 경향을 보일 것입니다.
y = el.elec
y.plot()
<Axes: >
이 데이터를 ACF
를 통해 그래프로 표현해보면 완만하게 감소하는 패턴이 보이는데, 이는 계절성이 존재함을 의미합니다.
plot_acf(y);
우리는 일반 차분과 계절성 차분 중 선택하여 사용할 수 있습니다. 계절성 차분을 이용한다면, 이는 추세 뿐만 아니라 계절성까지 제거합니다. 반면 일반 차분을 사용한다면 오직 추세만을 제거하게 됩니다.
차분을 진행할 때, 일반 차분과 계절성 차분 중 무엇을 먼저 적용하든 상관은 없습니다. 하지만 계절성 차분을 먼저 적용하는 경우가 흔히 사용됩니다. 이는 계절성 차분만으로도 추세를 제거할 수 있기 때문입니다.
차분을 먼저 적용한 후에 계절성 차분을 적용해도 되지만, 계절성 차분을 먼저 적용하면 추세를 더욱 효과적으로 제거할 수 있어, 차분을 한 번만 적용해도 충분합니다.
ys = y.diff(12).dropna()
ys.plot()
<Axes: >
ACF가 빠르게 감소하는 형태를 보입니다.
plot_acf(ys);
계절성 차분과 추가 차분을 통해 차트를 생성하면, 자기 상관성이 거의 사라지는 모습을 확인할 수 있습니다.
ysd = y.diff(12).diff().dropna()
ysd.plot()
<Axes: >
하지만 아직도 몇몇 곳에 계절성이 남아 있음을 볼 수 있습니다. 그 특성이 마이너스와 상관관계를 보입니다.
plot_acf(ysd);
차분을 통해 다양한 방식으로 추세나 계절성을 제거할 수 있습니다. 일반적으로 비정상 시계열의 분석은 어렵기 때문에, 계절성 차분이나 일반 차분을 사용하여 추세를 없애고, 정상 시계열로 변환한 후 다양한 시계열 분석 기법을 적용하게 됩니다.