Привет, Хабр!
Сегодня мы поговорим о временных рядах, и как мы можем работать с ними, используя ЯП R. Временные ряды позволяют понять динамику процессов, изменяющихся со временем, и предсказывать тенденции.
Основные концепции временных рядов
Стационарность
Стационарность — это свойство временного ряда, при котором его основные статистические характеристики, такие как среднее (математическое ожидание) и дисперсия, остаются постоянными со временем. Во временных рядов это означает, что ряд не должен проявлять трендов, сезонных паттернов или изменять свою волатильность с течением времени.
Существуют различные тесты для проверки стационарности, например, расширенный тест Дики-Фуллера. Нужно всегда проверять временные ряды на стационарность, поскольку большинство методов прогнозирования временных рядов предполагают, что данные стационарны. Если ряд нестационарен, его часто преобразуют, например, с помощью дифференцирования, чтобы сделать более стационарным.
Тренды
Тренд в временном ряду — это долгосрочное направление движения данных. Он может быть восходящим, нисходящим или горизонтальным (стабильным). Тренды указывают на фундаментальные изменения в данных, которые могут быть вызваны различными факторами, такими как экономические, экологические или социальные изменения.
Сезонность
Сезонность относится к периодическим колебаниям в данных временных рядов, которые происходят в определенные временные интервалы. Это могут быть ежедневные, еженедельные, ежемесячные или годовые паттерны. Например, в розничной торговле наблюдается повышение продаж в праздничные периоды, а в погодных данных — изменение температуры в зависимости от времени года.
Основы работы с временными рядами в R
RStudio является удобной ide, которая упрощает работу с R.
После запуска RStudio нужно воспользоваться консолью R для установки пакетов.
Пакет forecast
предоставляет широкий спектр методов для анализа и прогнозирования временных рядов. Вы можете установить его, используя следующую команду:
install.packages("forecast")
После установки загрузите пакет, выполнив:
library(forecast)
Пакет tseries
содержит функции для анализа временных рядов, включая тесты на стационарность и другие статистические тесты:
install.packages("tseries")
Затем загрузите пакет в сессию R:
library(tseries)
После установки пакетов можно ознакомиться с их документацией. В RStudio можно заюзать команду help(package = "forecast")
или help(package = "tseries")
для доступа к документации.
Чтобы начать анализ, вам нужно загрузить ваш временной ряд в R. Это может быть сделано различными способами, в зависимости от формата и источника ваших данных.
Загрузка и предварительная обработка данных временных рядов
Для загрузки данных в R можно использовать различные функции в зависимости от формата файла. К примеру, для CSV используется функция read.csv()
:
data <- read.csv("path_to_your_data.csv")
Нужно обязательно чекнуть, что колонка с временными метками имеет правильный формат даты и времени. В R это можно сделать с помощью функций, таких как as.Date()
или as.POSIXct()
.
Временные ряды часто содержат пропущенные значения. Важно определить, как их обрабатывать — удалить, заполнить средним значением, интерполировать и т.д. В зависимости от анализа, возможно потребуется преобразовать данные. Например, это может быть логарифмическое преобразование для стабилизации дисперсии.
Иногда было бы круто разложить временной ряд на тренд, сезонность и остаточную компоненту, используя функции, такие как decompose()
или stl()
.
Для использования функций анализа временных рядов в R, данные должны быть преобразованы в объект временного ряда с помощью функций ts()
или xts()
.
К примеру выполнение этих шагов может выглядеть так:
# Загрузка данных
data <- read.csv("path_to_your_data.csv")
# Преобразование столбца с датой в формат даты
data$Date <- as.Date(data$Date, format="%Y-%m-%d")
# Обработка пропущенных значений
data <- na.omit(data) # или другой метод обработки
# Преобразование данных в объект временного ряда
time_series_data <- ts(data$Value, start=c(2023,1), frequency=12) # Пример для месячных данных начиная с января 2023
plot(time_series_data)
Визуализации в R
Стандартная функция plot()
: Это базовая функция для создания графиков в R. Она может быть использована для быстрого и простого отображения временных рядов:
plot(time_series_data, main="Временной ряд", xlab="Время", ylab="Значения")
ggplot2
- самый попсовый пакет для графической визуализации в R. Он позволяет создавать сложные и эстетически приятные графики. Для работы с ggplot2
, временной ряд обычно преобразуется в формат data.frame
:
library(ggplot2)
ggplot(data_frame_time_series, aes(x=Date, y=Value)) + geom_line() + labs(title="Временной ряд", x="Время", y="Значения")
Если есть несколько временных рядов для сравнения, можно использовать многоуровневые графики. ggplot2
позволяет легко добавлять дополнительные временные ряды на график с помощью дополнительных geom_line()
слоев.
Для выявления сезонных паттернов и трендов можно использовать функцию seasonplot
из пакета forecast
или создать кастомизированные графики с использованием ggplot2
, показывающие разложение временного ряда на компоненты.
Тепловые карты полезны для визуализации сезонных паттернов, особенно когда ряд содержит несколько циклов. Можно использовать функцию geom_tile()
в ggplot2
для создания тепловых карт временных рядов.
Пакеты, такие как plotly
и shiny
, позволяют создавать интерактивные графики, которые могут быть полезны для более детального исследования временных рядов.
Пример кода
# Использование ggplot2 для создания многоуровневого графика
ggplot(data_frame_time_series, aes(x=Date)) +
geom_line(aes(y=Value1, colour="Series 1")) +
geom_line(aes(y=Value2, colour="Series 2")) +
labs(title="Сравнение временных рядов", x="Время", y="Значения")
seasonplot(time_series_data, year.labels=TRUE, year.labels.left=TRUE)
Методы анализа временных рядов
Метод ARIMA
ARIMA сочетает в себе три концепции: авторегрессию (AR), интеграцию (I) и скользящее среднее (MA):
Авторегрессия (AR): Этот компонент моделирует временной ряд, используя зависимость между текущим наблюдением и наблюдениями в предыдущие периоды.
Интеграция (I): Этот компонент делает данные более стационарными, устраняя тренды и сезонность за счет дифференцирования.
Скользящее среднее (MA): Этот компонент моделирует ошибку временного ряда как линейную комбинацию ошибок предыдущих временных периодов.
Модель ARIMA обозначается как ARIMA(p, d, q), где p
– порядок компонента AR, d
– порядок дифференцирования (I), q
– порядок компонента MA.
Для работы с ARIMA в R используется пакет forecast
.
Прежде чем приступить к моделированию ARIMA, нужно убедиться, что временной ряд стационарен. Если это не так, можно использовать дифференцирование (например, с помощью функции diff()
).
Выбор правильных параметров (p, d, q) для модели ARIMA может быть осуществлен с помощью автоматического подбора модели в forecast
, используя функцию auto.arima()
:
auto_model <- auto.arima(time_series_data)
После определения параметров можно построить модель ARIMA. Это можно сделать вручную или использовать результаты auto.arima()
:
arima_model <- arima(time_series_data, order=c(p, d, q))
После построения модели важно провести анализ ее качества, проверив остатки на случайность и отсутствие автокорреляции, используя диаграммы ACF и PACF, а также проведя статистические тесты.
Используя построенную модель ARIMA, можно делать прогнозы на будущие периоды:
forecast <- forecast(arima_model, h=10) # h - количество периодов для прогнозирования
Методы экспоненциального сглаживания
Экспоненциальное сглаживание работает путем придания весов наблюдениям, где веса уменьшаются экспоненциально по мере увеличения возраста данных. Основные варианты метода включают:
Простое экспоненциальное сглаживание, которое лучше всего подходит для временных рядов без явного тренда или сезонности. Это базовая форма экспоненциального сглаживания, где прогнозы являются взвешенным средним прошлых наблюдений.
Двойное экспоненциальное сглаживание (метод Хольта), которое применяется к данным с трендом, но без сезонности. Здесь вводится дополнительный компонент для учета тренда в данных.
Тройное экспоненциальное сглаживание (метод Хольта-Винтерса), который расширяет метод Хольта для включения сезонности. В этом методе используются три компонента: уровень, тренд и сезонность.
Вforecast
есть соответствующие функции для анализа временных рядов:
ses()
- Простое экспоненциальное сглаживание. Этот метод используется для одномерных временных рядов без тренда и сезонности.
library(forecast)
# в R набор данных AirPassengers, который содержит информацию о количестве пассажиров авиалиний в течение определенного периода времени
data(AirPassengers)
# Применение простого экспоненциального сглаживания
ses_model <- ses(AirPassengers, h=10)
holt()
- Двойное экспоненциальное сглаживание, также известное как метод Холта. Это расширение простого экспоненциального сглаживания, которое добавляет поддержку линейного тренда.
library(forecast)
data(AirPassengers)
# Применение двойного экспоненциального сглаживания
holt_model <- holt(AirPassengers, h=10)
hw()
- Тройное экспоненциальное сглаживание, известное также как метод Хольта-Винтерса. Этот метод учитывает тренд и сезонность.
library(forecast)
# Загрузка примера временного ряда
data(AirPassengers)
hw_model <- hw(AirPassengers, h=10, seasonal="additive")
Сезонные модели (например, Holt-Winters)
Модель Хольта-Винтерса разработана для прогнозирования данных временных рядов, которые имеют как тренд, так и сезонные компоненты. Она является расширением модели экспоненциального сглаживания Хольта, добавляя к ней сезонную корректировку.
Компоненты модели:
Уровень (Level): Отражает среднее значение ряда в данной точке времени.
Тренд (Trend): Показывает увеличение или уменьшение уровня ряда во времени.
Сезонность (Seasonality): Описывает повторяющиеся колебания в ряде в течение фиксированного периода (например, ежедневно, еженедельно, ежемесячно).
Существуют две основные формы модели:
Аддитивная модель: Подходит для временных рядов, где сезонные колебания примерно одинаковы на всем протяжении ряда.
Мультипликативная модель: Используется, когда сезонные колебания увеличиваются или уменьшаются пропорционально уровню ряда.
Модель Хольта-Винтерса обновляет оценки уровня, тренда и сезонности на каждом шаге времени.
Для аддитивной модели:
Уровень: Lt=α(yt−St−s)+(1−α)(Lt−1+Tt−1)
Тренд: Tt=β(Lt−Lt−1)+(1−β)Tt−1
Сезонность: St=γ(yt−Lt)+(1−γ)St−s
Прогноз: y^t+h=Lt+hTt+St−s+hm
Для мультипликативной модели:
Уровень: Lt=αSt−syt+(1−α)(Lt−1+Tt−1
Тренд: Tt=β(Lt−Lt−1)+(1−β)Tt−1
Сезонность: St=γLtyt+(1−γ)St−s
Прогноз: y^t+h=(Lt+hTt)×St−s+hm
где:
yt - наблюдаемое значение во времени t,
Lt - оценка уровня ряда во времени t,
Tt - оценка тренда во времени t,
St - оценка сезонности во времени t,
α, β, γ - параметры сглаживания (обычно определяются через оптимизацию),
s - длина сезонного периода,
ℎ - горизонт прогнозирования,
ℎm - остаток от деления ℎ на s.
Для работы с моделью Хольта-Винтерса в R используется пакет forecast
. Глянем на пару примеров кода.
В R существует набор данных AirPassengers
, который содержит информацию о количестве пассажиров авиалиний в течение определенного периода времени
Используем аддитивную модель Хольта-Винтерса для временного ряда, где сезонные колебания примерно одинаковы на всем протяжении ряда.
library(forecast)
data(AirPassengers)
# Применение аддитивной модели Хольта-Винтерса
hw_additive <- hw(AirPassengers, seasonal="additive", h=12)
Мультипликативная модель для временного ряда, где сезонные колебания увеличиваются или уменьшаются пропорционально уровню ряда.
library(forecast)
data(AirPassengers)
# Применение мультипликативной модели Хольта-Винтерса
hw_multiplicative <- hw(AirPassengers, seasonal="multiplicative", h=12)
Функция ets()
, которая автоматически выбирает наилучшую модель (аддитивную или мультипликативную) на основе данных.
library(forecast)
data(AirPassengers)
# Автоматический выбор модели и прогноз
ets_model <- ets(AirPassengers)
forecast_ets <- forecast(ets_model, h=12)
Больше про временные ряды и практические инструменты аналитики коллеги из OTUS рассказывают в рамках онлайн-курсов. Ознакомиться с каталогом курсов вы можете тут. А в календаре мероприятий можете зарегистрироваться на заинтересовавшие вас бесплатные вебинары.