Статистика
Временные ряды: ARIMA и декомпозиция
«Каким будет трафик сайта через месяц?» «Когда ждать следующего пика продаж?» - временные ряды окружают нас везде: биржевые курсы, погода, сердечный ритм, посещаемость сайта. Умение прогнозировать их - одно из самых востребованных навыков в data science.
- Цены акций и криптовалют: прогнозирование волатильности и торговые стратегии
- Метеорология: температурные аномалии, прогноз осадков
- Веб-аналитика: прогноз трафика для планирования инфраструктуры
- Ритейл: прогноз спроса для управления запасами
- Электроэнергетика: прогноз потребления электроэнергии для балансировки сети
Предварительные знания
Декомпозиция временного ряда
**Временной ряд** - последовательность наблюдений, упорядоченных во времени. Любой ряд можно разложить на три компонента: **тренд** (долгосрочное направление), **сезонность** (периодические колебания) и **шум** (случайная составляющая). Аддитивная модель: Y(t) = Тренд + Сезонность + Шум. Мультипликативная: Y(t) = Тренд × Сезонность × Шум.
**Когда использовать какую модель:** аддитивная - когда амплитуда сезонности постоянна (трафик сайта). Мультипликативная - когда амплитуда растёт вместе с трендом (продажи в ритейле: в декабре всегда «в X раз больше нормы», а не «на N единиц больше»). STL - универсальный выбор для зашумлённых реальных данных.
Продажи интернет-магазина растут из года в год, и всегда в декабре продаётся примерно в 3 раза больше обычного (не на фиксированное число единиц). Какая модель декомпозиции подходит?
Стационарность и тест Дики-Фуллера
**Стационарный ряд** - ряд, у которого среднее, дисперсия и автоковариация не зависят от времени. Большинство реальных рядов нестационарны из-за тренда или изменяющейся дисперсии. Нестационарный ряд нельзя напрямую использовать в ARIMA. **Дифференцирование** - главный способ достичь стационарности: Δy(t) = y(t) − y(t−1).
**Ложная регрессия:** два нестационарных ряда могут показывать высокую корреляцию просто потому, что оба растут со временем. Например, ВВП и число пиратов в 18-м веке. Прежде чем строить регрессию на временных рядах, проверьте стационарность или используйте коинтеграцию.
ADF-тест на дневных ценах акции дал p = 0.87. Что означает этот результат и что делать дальше?
Модели ARIMA: AR, MA и их комбинации
**ARIMA(p, d, q)** - семейство моделей для стационарных временных рядов. **AR(p)** - авторегрессия: текущее значение зависит от p прошлых значений. **MA(q)** - скользящее среднее: текущее значение зависит от q прошлых ошибок. **d** - порядок дифференцирования (из теста ADF). Выбор p и q: ACF (автокорреляционная функция) и PACF (частная автокорреляционная функция).
**Правило выбора p и q по графикам:** ACF (автокорреляционная функция) - обрыв на лаге q указывает на MA(q). PACF (частная АКФ) - обрыв на лаге p указывает на AR(p). На практике: используйте `pmdarima.auto_arima()` или перебирайте модели по AIC/BIC. Современная альтернатива ARIMA - Facebook Prophet для данных с выраженной сезонностью и праздниками.
ADF-тест на месячных продажах показал p = 0.03. ACF убывает медленно, PACF обрывается после лага 2. Какую модель выбрать?
Ключевые идеи
- Временной ряд = Тренд + Сезонность + Шум (аддитивная) или × (мультипликативная)
- Стационарность - обязательное условие для ARIMA: среднее и дисперсия постоянны
- ADF-тест: p < 0.05 → стационарен; p > 0.05 → дифференцировать
- ARIMA(p,d,q): p из PACF, d из ADF-теста, q из ACF
- SARIMA добавляет сезонные компоненты (P,D,Q)[s]
- Валидация: train/test split по времени, метрики MAE/RMSE/MAPE
Связь с другими методами
Временные ряды пересекаются с регрессией (ARIMAX = ARIMA + внешние регрессоры), машинным обучением (LSTM, Prophet, XGBoost на временных признаках) и спектральным анализом (преобразование Фурье).
- Линейная регрессия — ARIMAX расширяет ARIMA внешними предикторами, как регрессия
- Байесовская статистика — Байесовские структурные модели временных рядов (BSTS) от Google
Вопросы для размышления
- Возьмите любой публичный временной ряд (курс рубля, температура в вашем городе). Проведите декомпозицию. Какой компонент доминирует?
- Почему нельзя использовать обычную кросс-валидацию (random split) для временных рядов? Что использовать вместо неё?
- Facebook Prophet vs ARIMA: в каких ситуациях каждая модель предпочтительнее?