Прогнозирование временных рядов — ценный метод анализа и прогнозирования данных, которые меняются во времени. Одним из популярных методов прогнозирования временных рядов является ARIMA (авторегрессионное интегрированное скользящее среднее). В этой статье мы углубимся в концепции, лежащие в основе ARIMA, и рассмотрим, как ее можно использовать для построения точных моделей для анализа временных рядов.

Стационарность и дифференцирование

Прежде чем мы углубимся в ARIMA, важно понять концепции стационарности и разности. Стационарность относится к данным, которые демонстрируют последовательное статистическое распределение во времени. Другими словами, свойства данных не меняются с течением времени. Однако многие наборы данных реального мира нестационарны, то есть они демонстрируют тенденции или сезонность. Для анализа нестационарных данных нам необходимо преобразовать их в стационарную форму.

Дифференциация — это метод, используемый для превращения нестационарных данных в стационарные. Он включает в себя определение разницы между последовательными наблюдениями для устранения тенденции или сезонности. Применяя разность, мы стабилизируем среднее значение временного ряда и устраняем изменения уровня данных. Этот процесс необходим для работы с моделями ARIMA.

Понимание АРИМА

ARIMA сочетает концепции авторегрессионной (AR), интегрированной (I) и скользящей средней (MA) моделей для анализа и прогнозирования данных временных рядов.

Авторегрессия (AR). Модели авторегрессии оглядываются назад во времени и анализируют предыдущие значения в наборе данных. Модель делает предположения об этих запаздывающих значениях для прогнозирования будущего. Например, если у нас есть данные о ежемесячных продажах карандашей, авторегрессионная модель будет рассматривать общие объемы продаж за предыдущие месяцы в качестве предикторов продаж в текущем месяце. Интересующая «развивающаяся переменная» подвергается регрессии по своим собственным запаздывающим значениям.

Интегрированный (I). Интегрированный аспект ARIMA относится к шагам дифференцирования, применяемым к данным, чтобы сделать их стационарными. Интегрируя или различая данные, мы устраняем тенденции и сезонность, тем самым стабилизируя среднее значение временного ряда.

Скользящее среднее (MA):компонент скользящего среднего ARIMA анализирует прошлые и текущие значения запаздывающих переменных для определения выходной переменной. Он рассматривает средневзвешенное значение остатков предыдущих прогнозов, чтобы сделать текущий прогноз.

Комбинируя эти три компонента, модели ARIMA могут фиксировать основные закономерности и зависимости в данных временных рядов, что позволяет нам делать точные прогнозы.

Построение модели ARIMA

Теперь, когда у нас есть понимание ARIMA, давайте рассмотрим, как построить модель ARIMA, используя библиотеку statsmodels в Python. В следующем упражнении мы будем работать с набором данных, представляющим колебания электрической нагрузки во времени. Вот необходимые шаги:

  1. Импортируйте необходимые библиотеки для обработки данных и визуализации:
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math

from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler

%matplotlib inline
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore")

Загрузите набор данных в фрейм данных Pandas и визуализируйте данные:

energy = pd.read_csv('energy.csv')
energy['timestamp'] = pd.to_datetime(energy['timestamp'])
energy.set_index('timestamp', inplace=True)

plt.figure(figsize=(15, 8))
plt.plot(energy.index, energy['load'])
plt.xlabel('Timestamp')
plt.ylabel('Load')
plt.title('Electrical Load over Time')
plt.show()

Разделите данные на наборы для обучения и тестирования:

train_start_dt = '2014-09-01'
test_start_dt = '2014-11-01'

train = energy.loc[train_start_dt:test_start_dt].copy()
test = energy.loc[test_start_dt:].copy()

Масштабируйте данные, чтобы они попадали в определенный диапазон:

scaler = MinMaxScaler()
train['load_scaled'] = scaler.fit_transform(train[['load']])
test['load_scaled'] = scaler.transform(test[['load']])

Реализуйте модель ARIMA, используя библиотеку statsmodels:

model = SARIMAX(train['load_scaled'], order=(1, 1, 1))
model_fit = model.fit(disp=False)

Сопоставьте модель с обучающими данными и сделайте прогнозы

train['predictions'] = model_fit.predict(start=train_start_dt, end=test_start_dt)
test['predictions'] = model_fit.predict(start=test_start_dt, end=test.index[-1])

Оцените точность модели, используя тестовые данные:

from sklearn.metrics import mean_absolute_error, mean_squared_error

mae = mean_absolute_error(test['load_scaled'], test['predictions'])
mse = mean_squared_error(test['load_scaled'], test['predictions'])
rmse = np.sqrt(mse)

print(f"Mean Absolute Error: {mae:.4f}")
print(f"Mean Squared Error: {mse:.4f}")
print(f"Root Mean Squared Error: {rmse:.4f}")

Визуализируйте результаты модели ARIMA

plt.figure(figsize=(15, 8))
plt.plot(train.index, train['load'], label='Training Data')
plt.plot(test.index, test['load'], label='Actual Data')
plt.plot(test.index, scaler.inverse_transform(test['predictions']), label='Predictions')
plt.xlabel('Timestamp')
plt.ylabel('Load')
plt.title('ARIMA Model - Electrical Load Forecast')
plt.legend()
plt.show()

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

Модели ARIMA могут быть дополнительно оптимизированы путем настройки параметров модели (p, d, q) с использованием таких методов, как поиск по сетке или автоматические методы. Кроме того, другие варианты моделей ARIMA, такие как SARIMA (сезонный ARIMA), могут использоваться для сбора и прогнозирования сезонных закономерностей в данных.

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

Приятного чтения!