Вопрос или проблема
Предположим, вы пытаетесь измерить, является ли сезонность определенного потока событий последовательно наблюдаемой, то есть события в временном ряду происходят более или менее в одинаковом шаблоне. Как можно алгоритмически измерить и извлечь сезонность?
В настоящее время я использую автокорреляцию для анализа явно сезонных (месячных) данных. Мне сложно понять, как написать алгоритм, который мог бы тестировать, является ли что-то сезонным по месяцам. На рисунке ниже приведены результаты функции pacf
из библиотеки statsmodels.tsa.stattools
. Из графика ясно, как я могу использовать массив для определения сезонности? Есть ли полезная для этого библиотека?
Этот вопрос похож, но не получил хороших ответов: https://stats.stackexchange.com/questions/225003/test-for-trend-and-seasonality-in-time-series
Вы можете попробовать FBProphet для анализа ваших временных рядов. Вы сможете проверить сезонность, стационарность ваших данных.
Я бы порекомендовал вам попробовать этот классический аддитивный или мультипликативный метод декомпозиции от профессора Хиндмана (ссылка на главу его книги, где он говорит об этом конкретно https://otexts.com/fpp2/classical-decomposition.html); его очень легко реализовать на Python.
Чтобы подвести итог подходу (для аддитивного):
- Возьмите скользящее среднее порядком Q, чтобы извлечь тренд из ваших данных. тренд = MA(Q)
- Сделайте y-тренд = детрендированные_y
- Чтобы оценить сезонный компонент для каждого сезона, просто усредните детрендированные значения для этого сезона. Например, для месячных данных сезонный компонент для марта – это среднее всех детрендированных значений марта в данных. Эти значения сезонного компонента затем корректируются, чтобы в сумме они давали ноль. Сезонный компонент получается путем объединения этих месячных значений, а затем повторения последовательности для каждого года данных. Это дает сезонный компонент.
- Если хотите, получите остаток, сделав y-тренд-сезонный_компонент=остаток.
Если вам нужна помощь в реализации, пожалуйста, дайте знать, и я также ее опубликую.
Ответ или решение
Алгоритмическое извлечение сезонности из временных рядов
Измерение сезонности в данных временных рядов является актуальной задачей в области анализа данных и прогнозирования. В данной статье будет рассмотрено, как алгоритмически выделить сезонные компоненты, используя методы, основанные на автокорреляции и декомпозиции временных рядов.
Понимание сезонности
Сезонность — это повторяющийся паттерн поведения данных с определенной периодичностью. Временные ряды с явной сезонностью можно исследовать с помощью различных statistik и визуальных методов. Применение автокорреляции – верный шаг для выявления этих повторяющихся паттернов, однако существует ряд более структурированных подходов для выделения сезонных компонентов.
1. Использование функции PACF для определения сезонности
Функция частичной автокорреляции (PACF) помогает понять, насколько текущее значение временного ряда связано с его прошлыми значениями, исключая влияние промежуточных лагов. Обратите внимание на пики в графике PACF. Если у вас имеется четко выраженный пик на ожидании сезонного окна (например, 12 для месячных данных), можно утверждать о существовании сезонности.
Пример использования PACF в Python выглядит следующим образом:
import pandas as pd
from statsmodels.tsa.stattools import pacf
import matplotlib.pyplot as plt
# Загрузка данных
data = pd.read_csv('your_data.csv', parse_dates=['date'], index_col='date')
monthly_data = data.resample('M').sum()
# Расчет PACF
lag_pacf = pacf(monthly_data)
plt.bar(range(len(lag_pacf)), lag_pacf)
plt.title('PACF')
plt.show()
2. Декарционная методология
Один из классических подходов к анализу временных рядов — это декомпозиция. Этот метод состоит в разделении временного ряда на три компонента: тренд, сезонность и остаток.
Шаги декомпозиции
-
Выделение тренда: Используйте метод скользящей средней (MA) для получения сглаженного значения пациент. Для этого выберите порядок Q, достаточно большой чтобы выявить общий тренд.
moving_avg = monthly_data.rolling(window=12).mean() # для месячных данных
-
Детрендирование: Вычтите тренд из исходных данных.
detrended = monthly_data - moving_avg
-
Расчет сезонного компонента: Сгруппируйте детрендированные данные по месяцам и найдите средние значения для каждого месяца, добавляя шкалу для сбалансированности.
seasonal = detrended.groupby(detrended.index.month).mean() seasonal = seasonal - seasonal.mean() # Нормализация
-
Резидуализация: Для учета непредсказуемых колебаний вычтите сезонный компонент из данных.
residual = detrended - seasonal
3. Библиотеки для анализа временных рядов
Для анализа временных рядов существует несколько библиотек, которые помогут упростить задачу:
- Statsmodels: Предоставляет средства для построения модели ARIMA и оценки сезонности через Power Spectral Density (PSD).
-
FBProphet: Этот инструмент был создан для прогнозирования временных рядов, который автоматически учитывает сезонность, праздники и тренды.
Пример использования FBProphet:
from fbprophet import Prophet df = pd.DataFrame({'ds': monthly_data.index, 'y': monthly_data['value']}) model = Prophet(yearly_seasonality=True, daily_seasonality=False) model.fit(df) forecast = model.predict(df) model.plot(forecast)
Заключение
Сезонность временных рядов — это ключевой аспект анализа данных, который можно эффективно исследовать с использованием методов, основанных на автокорреляции и декомпозиции. Применение подходов, изложенных в этой статье, позволит вам не только обнаружить сезонные паттерны, но и построить прогнозные модели для более точного принятия бизнес-решений. Если вам требуется дальнейшая помощь в реализации предложенных методов, не стесняйтесь обращаться за дополнительной информацией.