Модель ARIMA - один из широко используемых и мощных статистических алгоритмов временных рядов, который можно использовать для анализа и прогнозирования данных временных рядов.

ARIMA означает интегрированное скользящее среднее с авторегрессией. Это комбинация двух моделей: авторегрессии и скользящего среднего.

Модель ARIMA имеет три параметра:

  1. p: это количество лагов авторегрессии.
  2. d: это порядок разности, необходимый для получения стационарного ряда.
  3. q: это количество лагов скользящего среднего.

Типы модели ARIMA

  • ARIMA. Это несезонная модель интегрированного скользящего среднего с авторегрессией.
  • SARIMA: это сезонная модель ARIMA.
  • SARIMAX: это сезонный ARIMA с экзогенными переменными.
  • Pyramid Auto-ARIMA: функция 'auto_arima' из библиотеки pmdarima помогает нам определить наиболее оптимальные параметры для модели ARIMA и возвращает подогнанная модель ARIMA.

Если вы хотите использовать модель ARIMA, ваши временные ряды должны быть стационарными, что означает, что ваши временные ряды должны содержать данные за разные периоды времени. Он должен удовлетворять трем условиям:

  1. Временные ряды должны иметь постоянное среднее значение.
  2. Временные ряды должны иметь постоянное стандартное отклонение.
  3. Автоковариация временного ряда не должна зависеть от времени.

Тесты, чтобы проверить, является ли временной ряд стационарным или нет:

  • Скользящая статистика. Скользящая статистика - это метод визуализации, при котором вы строите скользящую среднюю, чтобы увидеть, меняется ли она с течением времени.
  • Тест ADCF: ADCF означает расширенный тест Дики-Фуллера, который представляет собой статистический тест единичного корня. Он дает нам различные значения, которые могут помочь нам определить стационарность. Он включает статистику тестирования и некоторые критические значения для некоторых уровней достоверности. Если статистика теста меньше критических значений, мы можем отклонить нулевую гипотезу и сказать, что ряд является стационарным. Гипотеза нуля говорит, что временной ряд нестационарен. Тест ADCF также дает нам p-значение. Согласно нулевой гипотезе, чем ниже значение p, тем лучше.

Давайте разберемся во всем подробно на примере.

Чтение данных

Мы будем использовать набор данных, который содержит количество пассажиров авиакомпании в месяц с 1949 по 1960 год. Вы можете использовать этот набор данных из здесь.

df = pd.read_csv('AirPassengers.csv',
                  index_col='Month',
                  parse_dates=True)
df=df.dropna()
print('Shape of data',df.shape)
df.head()

Построение данных

Теперь мы визуализируем набор данных для обнаружения закономерностей. Это дает вам представление о том, являются ли данные стационарными или нет.

df['#Passengers'].plot(figsize=(12,5));

Разделите набор данных

Нам нужно разделить наш набор данных на набор данных для обучения и тестирования.

train=df.iloc[-100:]
test=df.iloc[:-100]

Теперь мы проведем расширенный тест Дики-Фуллера:

from statsmodels.tsa.stattools import adfuller
def ad_test(dataset):
     dftest = adfuller(dataset, autolag = 'AIC')
     print("1. ADF : ",dftest[0])
     print("2. P-Value : ", dftest[1])
     print("3. Num Of Lags : ", dftest[2])
     print("4. Num Of Observations",dftest[3])
     print("5. Critical Values :")
     for key, val in dftest[4].items():
         print("\t",key, ": ", val)
ad_test(train['#Passengers'])

Здесь значение p равно 0,99, что больше, чем наше значение достоверности, равное 0,05, что означает, что мы принимаем нулевую гипотезу и наши данные нестационарны.

Обучение модели

Мы будем использовать функцию auto_arima из pmdarima, которая автоматически обнаруживает лучший порядок для модели ARIMA. Проще говоря, он автоматически определит параметры модели ARIMA.

Функция в основном использует оценку AIC, чтобы судить о том, насколько хорош тот или иной заказ. Он просто пытается минимизировать оценку AIC. Мы видим, что лучшая модель ARIMA имеет порядок (4,1,3) с минимальной оценкой AIC.

import pmdarima as pmd
def arimamodel(timeseriesarray):
    autoarima_model = pmd.auto_arima(timeseriesarray, 
                              start_p=1, 
                              start_q=1,
                              test="adf",
                              trace=True)
    return autoarima_model
arima_model = arimamodel(train)
arima_model.summary()

Прогнозы на основе тестовых данных

test['ARIMA'] = arima_model.predict(len(test))
test.head(5)

Оцените модель

Мы будем использовать среднюю абсолютную процентную ошибку в качестве метрики оценки для этой модели.

mean_absolute_percentage_error(test['#Passengers'], test.ARIMA)