Прогнозирование временных рядов - это метод прогнозирования будущего движения продаж, фондовых рынков, доходов и т. д. По сути, временные ряды - это статистическая модель, которая пытается определить будущие грубые данные на основе исторических закономерностей. Данные временных рядов должны иметь даты как одну из функций. Прогнозирование можно делать на годовой, ежемесячной, ежеквартальной, еженедельной, ежедневной основе. Разработка нескольких мощных пакетов, таких как fbprophet, позволяет делать прогнозы по часам, минутам и даже по секундам.

  • Временной ряд - это последовательный набор точек данных, обычно измеряемых в течение последовательных периодов времени.
  • Математически он определяется как набор векторов x (t), t = 0,1,2,…, где t представляет собой прошедшее время.
  • Переменная x (t) рассматривается как случайная величина.
  • Измерения, сделанные во время события во временном ряду, расположены в правильном хронологическом порядке.
  • Временной ряд, содержащий записи одной переменной, называется одномерным, а несколько переменных - многомерным.

Бизнес-вариант использования может относиться к одной из следующих областей, как указано ниже:

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

Перед тем, как перейти к какой-либо части моделирования, мы проведем обработку данных и проверим свойства наших временных рядов.

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

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

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

#Import the Analysis Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
import matplotlib
import seaborn as sns
from random import random
#Data Reading
df = pd.read_csv('international-airline-passengers.csv',header=None)
df.columns = ['year','passengers']
df.head(3)

#Converting the column into datetime format
df['year'] = pd.to_datetime(df['year'], format='%Y-%m')
#Set index as years
y = df.set_index('year')
y.isnull().sum()
#Plot the series
y.plot(figsize=(15, 6))
plt.show()

  • Проверка распределения рядов. Временные ряды должны соответствовать гауссовскому (нормальному) распределению. Если распределение не является нормальным или искаженным, перед моделированием могут быть полезны преобразования.
from pandas import Series
from matplotlib import pyplot
pyplot.figure(1)
pyplot.subplot(211)
y.passengers.hist()
pyplot.subplot(212)
y.passengers.plot(kind='kde')
pyplot.show()

  • Проверка стационарности. Временной ряд считается стационарным, если его статистические свойства, такие как среднее значение и дисперсия, остаются постоянными во времени. Большинство моделей временных рядов работают в предположении, что TS стационарен. Основная причина этого в том, что ряд может быть нестационарным множеством способов, но только одним способом достижения стационарности. Интуитивно мы можем сказать, что если временной ряд имеет определенное поведение с течением времени, существует очень высокая вероятность того, что он будет следовать тому же самому в будущем. Кроме того, теории, относящиеся к стационарным рядам, являются более зрелыми и более простыми для реализации по сравнению с нестационарными рядами. Мы можем проверить стационарность ряда, используя различные методы, такие как:
  1. Графики ACF и PACF. Если временной ряд является стационарным, на графиках ACF / PACF будет показано быстрое падение корреляции после небольшого запаздывания между точками.
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf

pyplot.figure()
pyplot.subplot(211)
plot_acf(y.passengers, ax=pyplot.gca(), lags = 30)
pyplot.subplot(212)
plot_pacf(y.passengers, ax=pyplot.gca(), lags = 30)
pyplot.show()

Эти данные нестационарны, поскольку большое количество предыдущих наблюдений коррелирует с будущими значениями. Доверительные интервалы изображены в виде конуса. По умолчанию установлен доверительный интервал 95%, что предполагает, что значения корреляции за пределами этого конуса, скорее всего, являются корреляцией, а не статистической случайностью. Частичная автокорреляция при лаге k - это корреляция, которая возникает после удаления эффекта любых корреляций из-за членов с более короткими лагами.

2. Построение скользящей статистики: мы можем построить скользящую среднюю или скользящую дисперсию и посмотреть, меняется ли она со временем. Скользящее среднее / дисперсия - это любое мгновенное значение «t», среднее / дисперсия за последний год, то есть за последние 12 месяцев.

#Determing rolling statistics
rolmean = pd.rolling_mean(y, window=12)
rolstd = pd.rolling_std(y, window=12)

#Plot rolling statistics:
orig = plt.plot(y, color='blue',label='Original')
mean = plt.plot(rolmean, color='red', label='Rolling Mean')
std = plt.plot(rolstd, color='black', label = 'Rolling Std')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
plt.show(block=False)

Здесь скользящее среднее и стандартное отклонение непостоянны во времени (тенденция к увеличению). Следовательно, временной ряд не является стационарным.

3. Расширенный тест Дики-Фуллера: это один из статистических тестов для проверки стационарности. Здесь нулевая гипотеза состоит в том, что ТС нестационарна. Результаты теста включают статистику теста и некоторые критические значения для различий уровней достоверности. Если «Статистика теста» меньше «Критического значения», мы можем отклонить нулевую гипотезу и сказать, что ряд является стационарным.

from statsmodels.tsa.stattools import adfuller
print ('Results of Dickey-Fuller Test:')
dftest = adfuller(y.passengers, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
    dfoutput['Critical Value (%s)'%key] = value
print (dfoutput)

Этот тест показывает, что если ряд интегрирован, то запаздывающий уровень ряда y (t-1) не предоставит релевантной информации для прогнозирования изменения y (t). Нулевая гипотеза: временной ряд не является стационарным. Отказ от нулевой гипотезы (т.е. очень низкое значение p) укажет на стационарность.

Преобразование нестационарных рядов в стационарные

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

  1. Тенденция - среднее значение, меняющееся во времени. Например, в приведенной выше задаче мы видели, что в среднем количество пассажиров со временем росло.
  2. Сезонность - вариации в определенные периоды времени. например, люди могут иметь тенденцию покупать мороженое в конкретный месяц из-за лета или фестивалей.

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

  • Преобразования журнала. Преобразование журнала наказывает более высокие значения больше, чем меньшие. Это может быть ведение журнала.
ts_log = np.log(y)
plt.plot(ts_log)

  • Удаление или сглаживание тренда. Для сглаживания используются скользящие средние по окнам времени. Мы берем среднее значение «k» последовательных значений в зависимости от частоты временных рядов. Здесь мы можем взять среднее значение за последний год, т.е. за последние 12 значений. Недостатком этого конкретного подхода является то, что период времени должен быть строго определен.
moving_avg = pd.rolling_mean(ts_log,12)
plt.plot(ts_log)
plt.plot(moving_avg, color='red')
ts_log_moving_avg_diff = ts_log.passengers - moving_avg.passengers
ts_log_moving_avg_diff.head(12)
ts_log_moving_avg_diff.dropna(inplace=True)
#Using Dickeys Fuller Test
CheckForStationarity(ts_log_moving_avg_diff)

  • Различие. Обсуждаемые ранее простые методы уменьшения тренда работают не во всех случаях, особенно в тех, которые связаны с высокой сезонностью. В этом методе мы берем разницу между наблюдением в конкретный момент и наблюдением в предыдущий момент.
ts_log_diff = ts_log.passengers - ts_log.passengers.shift()
plt.plot(ts_log_diff)

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

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

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





Вы можете связаться со мной в Linkedin: