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

Аналитикам такие наборы данных позволяют выявлять закономерности, прогнозировать будущее и предлагать бизнесу обоснованные решения. В этой статье разберемся, с чего начать осваивать анализ временных рядов, вместе с Team Lead Data Scientist в VK Максимом Кулаевым. 

Что такое временные ряды?

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

Временные ряды помогают специалистам ответить на вопросы, что происходило в прошлом и что может случиться в будущем. С их помощью аналитики могут:

  1. Выявлять тренды и закономерности.

  2. Строить модели и прогнозировать будущее.

  3. Оптимизировать процессы.

Компоненты временного ряда

Каждый временной ряд состоит из нескольких компонентов:

  • Тренд — долгосрочная тенденция. Например, устойчивый рост спроса на электроавтомобили.

  • Сезонность — повторяющиеся изменения, связанные, как правило, с календарными изменениями: сменой времен года или наступлением праздничных дней. 

  • Цикличность — колебания, обусловленные экономическими циклами или циклами деловой активности. Период такого колебания в среднем составляет от двух до пяти лет.

  • Случайные колебания — ситуативные изменения, которые нельзя предсказать, например неожиданные события или технические сбои.

Эти компоненты накладываются друг на друга. Задача анализа в том, чтобы понять, что конкретно влияет на данные. Для этого аналитики используют декомпозицию — анализ временного ряда путем разложения его на отдельные компоненты.

Типы временных рядов

Предполагается, что данные временного ряда собираются регулярно, что в действительности не всегда возможно. Поэтому аналитики делят ряды на две большие группы: регулярные и нерегулярные. 

Данные регулярных рядов обладают систематическим характером. Нерегулярные ряды, напротив, собирают с разными интервалами времени — например, пополнения банковской карты.

Также для подготовки данных к анализу и выбору методов аналитики различают следующие виды временных рядов.

Детерминированные ряды

Подобные ряды полностью предсказуемы и описываются формулами. Это позволяет точно прогнозировать их будущее поведение

Недетерминированные ряды

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

Стационарные ряды

Ряды сохраняют постоянные статистические свойства со временем. Анализ и моделирование таких рядов проще. Примеры таких рядов: рождаемость в стране — несмотря на колебания, ряд остается относительно предсказуемым

Нестационарные ряды

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

Стационарные и нестационарные временные ряды

Стационарность — ключевое свойство ряда, необходимое для использования большинства «классических» методов анализа. Если данные нестационарны, анализ может быть неточным или вообще не привести к результатам.

Свойства стационарного ряда:

  • У ряда отсутствует тренд.

  • У ряда отсутствует сезонность.

  • У ряда не изменяется дисперсия — расстояние временного ряда от среднего значения.

Для проверки стационарности аналитики также используются специальные тесты: критерий Дики–Фуллера или KPSS. 

Согласно тесту Дики–Фуллера, если p-value значение теста меньше α, то ряд стационарен. Реализация теста есть в Python в пакете

import statsmodels.api as sm
p = sm.tsa.stattools.adfuller(df.time_series)[1]
print(f'Критерий Дики-Фуллера: p-value={p}')

Разберемся, как подготовить данные к анализу и что делать, если временной ряд не стационарен.

Как подготовить данные временного ряда к анализу?

Анализ временного ряда начинается с подготовки данных. Это важный этап, без которого результаты анализа могут быть ошибочными. 

«Изначально нужно убедиться в качестве данных — проверить, что по всем датам есть данные и нет пропусков. Исключение — когда у вас стоит задача заполнить этот пропуск. Нужно убедиться, что все собранные данные адекватны и корректны. Например, температура на улице в 150 градусов Цельсия в один из дней намекает, что это значение некорректно. В зависимости от задачи и применяемых методов анализа подготовка будет различаться». — Максим Кулаев, Team Lead Data Scientist в VK

Подготовка данных включает несколько ключевых этапов:

1. Проверка на полноту. Если данные отсутствуют, их нужно заполнить.

2. Корректность значений. Нужно избавить ряд от аномалий, которые могут указывать на ошибки ввода.

3. Приведение к стационарности. Многие модели анализа работают только со стационарными рядами, где основные статистические свойства (среднее, дисперсия) остаются неизменными.

Заполнение пропусков временного ряда

Существует несколько основных способов заполнить пропуски временных рядов. Какой из них лучше использовать, зависит от структуры данных и цели анализа. Рассмотрим их краткое описание:

1. Заполнение средним или медианным значением 

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

2. Использование предыдущих или последующих значений

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

3. Метод скользящего среднего

Для заполнения пропусков ряда также можно использовать скользящее среднее или медиану. Такой подход позволяет учесть тренды или локальные колебания, избегая грубых искажений.

4. Интерполяция

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

Преобразование нестационарного временного ряда

Для обработки нестационарного временного ряда следует устранить проблему изменяющейся во времени дисперсии. Популярным методом является логарифмирование ряда.

Пример логарифмирования временного ряда. Источник
Пример логарифмирования временного ряда. Источник

Более универсальный метод работы с рядом — преобразование Бокса–Кокса. Метод позволяет стабилизировать дисперсию и сделать ряд более пригодным для анализа. 

Преобразование Бокса–Кокса. Источник
Преобразование Бокса–Кокса. Источник

Перед применением преобразования нужно определить λ. И если λ = 0, то применяется логарифмирование. 

from scipy import stats
from scipy.special import inv_boxcox

# Преобразование
time_series, lambda = stats.boxcox(time_series)

# Обратное преобразование
time_series = inv_boxcos(time_series, lambda)

После стабилизации дисперсии стоит устранить сезонность. Это можно сделать посредством дифференцирования. Рассмотрим реализацию дифференцирования в библиотеке pandas на Python, для данных с сезонностью в 12 месяцев:

  1. Вычитаем из ряда этот же ряд, смещенный на длину периода. Важно: в результате сдвигов в новом ряде появятся пропуски (NaN).

  2. Если после дифференцирования в данных остается сезонность, можно провести еще одно дифференцирование, но уже с новым рядом:

df['time_series_s_diff'] = df.time_series - df.time_series.shift(12)
df['time_series_s_diff2'] = df.time_series_s_diff- df.time_series_s_diff.shift(12)

После устранения сезонности из ряда необходимо убрать тренд. Это также делается посредством дифференцирования: из текущего значения ряда вычитается предыдущее значение, смещенное на один

df['time_series_diff'] = df.time_series_s_diff2 - df.time_series_s_diff2.shift(1)

При необходимости преобразование можно повторять несколько раз.

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

Методы анализа временных рядов

Для анализа временных рядов существует длинный список методов, выбор которых зависит от задач. 

«Методы анализа временных рядов различаются в зависимости от задачи, которую вы решаете. Например, при выделении тренда поможет метод скользящего среднего и иные методы сглаживания. Если решаете задачу прогнозирования, поможет модель ARIMA, которая учитывает особенности временных рядов, например наличие тренда, автокорреляции и прочее». — Максим Кулаев, Team Lead Data Scientist в VK

Модели ARMA, ARIMA, SARIMA

ARMA и ARIMA были впервые применены для обработки сигналов во Второй мировой войне и стали широко использоваться в статистике и экономике с 1970-х годов.

ARMA, или Autoregressive Moving Average, сочетает авторегрессию (AR) и скользящее среднее (MA).

  • Авторегрессия (AR) предполагает, что будущее значение переменной зависит от ее прошлых значений.

  • Скользящее среднее (MA) оценивает влияние прошлых ошибок прогноза на текущие значения.

ARIMA, или Autoregressive Integrated Moving Average, — это расширенная версия ARMA. В эту модель включен компонент интеграции (I). Он относится к различным методам вычисления разницы между последовательными наблюдениями для получения стационарного процесса из нестационарного. 

В случае, если временные ряды имеют выраженные сезонные компоненты, аналитики используют SARIMA (Seasonal ARIMA). Модель добавляет сезонные параметры к модели ARIMA и учитывает повторяющиеся паттерны, например ежемесячные или годовые изменения. 

Экспоненциальное сглаживание

Метод экспоненциального сглаживания использует взвешенное среднее значение временного ряда для прогнозирования. Ключевая идея метода: большее значение при прогнозировании отдается более свежим наблюдениям. Это помогает строить эффективные долгосрочные прогнозы:

a (alfa) — коэффициент сглаживания, который принимает значения от 0 до 1. Он определяет, насколько продолжительность изменит существующие значения в базе данных;

x — текущее значение временного ряда (например, объем продаж);

y — сглаженная величина на текущий период;

t — значение тренда за предыдущий период.

Метод экспоненциального сглаживания. Источник 
Метод экспоненциального сглаживания. Источник 
Пример экспоненциального сглаживания. Источник
Пример экспоненциального сглаживания. Источник

На графике экспоненциальное сглаживание представлено темно-синей линией временного ряда с коэффициентом сглаживания 0,3, а оранжевая линия использует коэффициент сглаживания 0,05. Чем меньше коэффициент сглаживания, тем более плавным будет временной ряд. Следовательно, когда коэффициент сглаживания приближается к 0, мы подходим к модели скользящего среднего.

Итоги. С чего начать изучение анализа временных рядов?

«Важно перед изучением анализа временных рядов глубоко изучить математическую статистику, на которой их аналитика и зиждется. Дальше на этом фундаменте изучение пройдет с большей пользой». — Максим Кулаев, Team Lead Data Scientist в VK

  1. Изучить виды временных рядов и их компоненты: тренды, сезонность и случайные колебания. Знание этих элементов поможет правильно интерпретировать данные и выявлять закономерности. Отдельное внимание стоит уделять стационарности временных рядов.

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

  3. Познакомиться с моделями ARMA, ARIMA и SARIMA.

  4. Изучить экспоненциальное сглаживание. Это нужно для создания долгосрочных прогнозов.

  5. Практиковаться на реальных данных с помощью популярных библиотек, таких как pandas и statsmodels.

Комментарии (1)


  1. adeshere
    23.11.2024 02:48

    Очень странная статья. Одно только название вызывает .

    когнитивный диссонанс

    ассоциация: "Исчерпывающе полное изложение квантовой теории поля со всеми доказательствами и выводом всех формул для чайников в двух словах"

    И дальше не лучше. Буквально по каждому пункту сформулированы какие-то догмы, которые верны лишь в некоторых частных случаях, но сформулированы в таком стиле, будто бы они универсальные и всеобщие. Например:

    Каждый временной ряд состоит из нескольких компонентов: (...)

    Во-первых, не каждый. Есть куча временных рядов, где некоторые (или даже все) перечисленные составляющие отсутствуют. Например в солнечной активности практически нет сезонности. В огромной массе геофизических временных рядов (похожих на фликкер-шум) нет цикличности. А в выходном сигнале генератора белого шума нет вообще никаких компонент. Только БШ. Как и в ряде-константе. И т.д. и т.п.

    Во-вторых, кроме случайных колебаний, в сигналах очень часто присутствует некоррелированный шум. А под "случайными колебаниями" Вы, похоже, имеете в виду вовсе не колебания, а аномалии или выбросы по типу дельта-функций? Но тогда лучше так и напишите. Т.к. чтобы пронаблюдать именно колебание, оно должно длиться хотя бы несколько дискретов (квантов времени). Иначе странно так его называть.

    Типы временных рядов

    Тоже КД. Почему вдруг селектор "регулярные-нерегулярные" описан в тексте, а селекторы "детерминированные-недетерминированные" и "стационарные-нестационарные" в виде таблицы, да еще и организованной в виде линейного списка (а не таблички 2х2, как должно быть по сути)? Да-да, детерминированный ряд вполне может быть еще и стационарным (а может и нет). Вы хотите помочь начинающим - но такая таблица их только запутает. А еще, при чем тут аналитики? Кроме них, никто больше таких различий не делает? А "аналитики" больше никаких градаций не вводят?  

    Свойства стационарного ряда

    Из текста складывается впечатление, что это исчерпывающий список его свойств. Или по крайней мере достаточный. Что совершенно неверно. Кстати, критерий KPSS в общем случае настолько беспомощен, что тут я бы вообще про него не писал. Тут на Хабре совсем недавно была статья, где автор продемонстрировал его полную профнепригодность (там он не смог отклонить гипотезу о стационарности в вопиюще нестационарном случае, показанном на картинке). Будучи применен формально, он лишь введет в заблуждение неискушенного читателя. Проще сказать так: в природе (и в практике анализа эконометрических временных рядов) стационарных сигналов не бывает. Вообще никогда. Да, это некоторое преувеличение, но не слишком серьезное - вероятность столкнуться с по-настоящему стационарным сигналом в этой предметной области исчезающе мала. Как говорится,

    не бывает здоровых, есть недообследованные ;-)

    Может случиться такое, что ряд очень короткий, и данных совсем мало, и тогда мы не можем отклонить нулевую гипотезу о стационарности с приемлемым уровнем значимости. Приходится ее принимать. Но для реальных рядов хотя бы из сотни точек такое уже почти невозможно, за исключением крайне редко встречающихся аномалий. Только не надо молиться на KPSS - он тут не показатель. (Точнее, если он отвергает стационарность, то это надо принять за факт, а если нет - то это еще ничего не значит). Вообще, стационарность означает, что НИКАКИЕ свойства сигнала не зависят от времени. Это дает нам безумный простор для построения критериев стационарности. Дайте мне произвольный эмпирический ряд, и если я покажу, что хоть что-то там зависит от времени (как правило, это делается элементарно), то все, привет нулевой гипотезе!

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

    Как подготовить данные временного ряда к анализу?

    Тут вообще ерунда какая-то написана. Вы как промпт для ChatGPT формулировали? У всех языковых моделей сейчас есть доступ к базе научных статей. Неужели нельзя было попросить модель надергать из них чего-то более связного?

    В общем, тут и дальше можно придраться практически к каждому тезису. И это туториал?! Я мог бы написать в десять раз больше претензий, но жаль времени, так как уверен, что статья уже завтра будет в черновиках.

    Уважаемая Skillfactory! Я не против языковой модели в качестве помощника. Но ведь надо же потом проверять этот текст! Судя по Вашему профилю, у Вас должны быть компетентные специалисты в этой области. Почему бы не попросить кого-то из них отредактировать вывод ЯМ, прежде чем предлагать его публике? Это все равно, как выкладывать непроверенный перевод с грамматическими и синтаксическими ошибками. Такая статья просто дискредитирует не только Вашу репутацию, но и всю тематику работы с временными рядами.

    С огромным сожалением, что приходится все это писать, <автор коммента>