Тест Дики-Фуллера (ADF) - Лена Капаца
Тест Дики-Фуллера (ADF) by Лена Капаца April 9, 2022 Статистика

Тест ADF (расширенный тест Дики – Фуллера) – проверка Статистической значимости (Statistical Significance), которая демонстрирует результаты проверки Нулевой гипотезы (Null Hypothesis) и Альтернативной (Alternative Hypothesis). В результате мы получим P-значение (P Value), из которого можно сделать вывод о Стационарности (Stationarity) Временного ряда (Time Series). Был предложен в 1979 году Дэвидом Дики и Уэйном Фуллером.

Когда мы создаем прогнозирующую Модель (Model) для временных рядов, нам требуются стационарные временные ряды, то есть обладающие одинаковой Ковариацией (Covariance) Выборок (Sample) одного размера. Ковариация – мера взаимосвязи двух случайных величин, измеряющая общее отклонение двух случайных величин от их ожидаемых значений. Метрика оценивает, в какой степени переменные изменяются вместе. Другими словами, это мера Дисперсии (Variance) между двумя переменными.

Стационарный временной ряд (сверху) и нестационарный

Тестирование на стационарность часто используется в Авторегрессионном моделях (Autoregressive Model). Мы можем выполнять различные тесты, такие как Критерий KPSS, Тест Филлипса – Перрона (Phillips-Perron Test) и ADF – тема этой статьи. Мы рассмотрим логику, стоящую за тестом, и реализуем ее с помощью временного ряда.

Мы проведем ADF-тест с нестационарными данными о пассажирах авиакомпаний и стационарными данными о температуре.

ADF: statsmodels

Для начала импортируем необходимые библиотеки:

from statsmodels.tsa.stattools import adfuller
import pandas as pd
import numpy as np

Нестационарный временной ряд

Мы будем использовать Датасет (Dataset) о числе пассажиров одной авиакомпании:

path = 'https://www.dropbox.com/s/cdjjafehpd0tmbw/AirPassengers.csv?dl=1'
data = pd.read_csv(path)
data.plot(figsize = (14, 8), title = 'Число пассажиров')

Теперь, когда у нас есть все, что нужно, мы можем выполнить ADF-тест:

result = adfuller(data['#Passengers'], autolag='AIC')

print('Критерий ADF: %f' % result[0])

print('P-значение: %f' % result[1])

print('Критические значения:')

for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
if result[0] < result[4]["5%"]:
print ("Нулевая гипотеза отвергнута – Временной ряд стационарен")
else:
print ("Нулевая гипотеза не отвергнута – Временной ряд не стационарен")

Вот такие мы получим метрики:

Критерий ADF: 0.815369
P-значение: 0.991880
Критические значения:
1%: -3.482
5%: -2.884
10%: -2.579
Нулевая гипотеза не отвергнута – Временной ряд не стационарен

P-значение для временного ряда больше 5%, и, соответственно, нулевая гипотеза не отвергнута, а временной ряд нестационарен.

Стационарный временной ряд

Загрузим данные о температуре в Австралии:

path = 'https://www.dropbox.com/s/i8xs9myposohyp9/temperature.csv?dl=1'
data = pd.read_csv(path)
data.plot(figsize = (14, 8), title = 'Температура')

Это средние значения температуры за день в течение нескольких лет:

Проверим этот временной ряд на стационарность:

result = adfuller(data['Temp'], autolag = 'AIC')

print('Критерий ADF: %f' % result[0])

print('P-значение: %f' % result[1])

print('Критические значения:')

for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
if result[0] > result[4]["5%"]:
print ("Нулевая гипотеза отвергнута – Временной ряд не стационарен")
else:
print ("Нулевая гипотеза не отвергнута – Временной ряд стационарен")

В результате мы видим, что P-значение, полученное в результате теста, меньше 0,05, поэтому мы собираемся отклонить нулевую гипотезу о нестационарности:

Критерий ADF: -4.444805
P-значение: 0.000247
Критические значения:
1%: -3.432
5%: -2.862
10%: -2.567
Нулевая гипотеза не отвергнута – Временной ряд стационарен

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

© Лена Капаца. Все права защищены.