Ответ
Да, применял SARIMA (Seasonal ARIMA) для прогнозирования бизнес-метрик с выраженной сезонностью, например, ежедневной активности пользователей или ежемесячных продаж.
Ключевые этапы работы:
- Анализ стационарности: Проверяю ряд с помощью теста Дики-Фуллера (ADF). Если ряд нестационарен, применяю дифференцирование (
dи сезонноеD). - Определение порядка модели: Анализирую ACF (автокорреляционную) и PACF (частичную автокорреляционную) функции для подбора параметров
p, q, P, Q. - Подбор модели: Часто использую
pmdarima.auto_arimaдля автоматического поиска наилучших параметров по критерию AIC/BIC.
Пример построения прогноза:
import pandas as pd
from statsmodels.tsa.statespace.sarimax import SARIMAX
import matplotlib.pyplot as plt
# data - временной ряд с DateTimeIndex
model = SARIMAX(data,
order=(1, 1, 1), # (p, d, q) несезонные
seasonal_order=(1, 1, 1, 7), # (P, D, Q, s) сезонные, s=7 (неделя)
enforce_stationarity=False)
results = model.fit(disp=False)
# Прогноз на 14 шагов вперед
forecast = results.get_forecast(steps=14)
forecast_mean = forecast.predicted_mean
confidence_intervals = forecast.conf_int()
# Визуализация
plt.plot(data, label='historical')
plt.plot(forecast_mean, label='forecast', color='red')
plt.fill_between(confidence_intervals.index,
confidence_intervals.iloc[:, 0],
confidence_intervals.iloc[:, 1], color='pink', alpha=0.3)
Сильные стороны SARIMA:
- Отлично работает с четкой сезонностью (сутки, неделя, год).
- Дает статистически обоснованный прогноз с доверительными интервалами.
- Интерпретируемость параметров.
Ограничения и когда ищу альтернативы:
- Множественные сезонности: Например, ежечасная + еженедельная. Тут лучше подходят модели типа TBATS или Prophet.
- Внешние регрессоры: SARIMAX позволяет добавить экзогенные переменные, но если их много и связи нелинейны, часто перехожу на градиентный бустинг (XGBoost, LightGBM) или LSTM.
- Большие объемы данных: Классические методы плохо масштабируются, в этом случае использую распределенные реализации или перехожу к ML-подходам.