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

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

Я собираюсь представить свой подход к анализу временных рядов продаж вина в 20 веке. Ниже будут предприняты шаги:

  1. Исследовательский анализ данных
  2. Разложение ряда
  3. Вывод

Примечание. Это упражнение реализовано на Python. Ниже я добавил фрагменты кода.

Давайте посмотрим на первые несколько строк набора данных и его график:

sparkling_df = pd.read_csv("Sparkling.csv", parse_dates= True, index_col= 'YearMonth')  # Sparkling
#index_col= 'YearMonth'
display(sparkling_df.index)
sparkling_df.head()

from pylab import rcParams
rcParams['figure.figsize'] = 10,5
sparkling_df.plot(grid = True)
plt.show()

График показывает небольшое увеличение тренда после 1985 г., прежде чем он станет постоянным после 1991 г., однако он показывает четкую сезонность (повторяющаяся модель из года в год), хотя ее нельзя назвать постоянной. Мы больше изучим тенденции и сезонность, но сначала давайте больше изучим сам набор данных.

Гистограмма:

plt.figure(figsize=(20, 10))
ax1= plt.subplot(2,1,1)
sns.barplot(x = sparkling_df1['Year'], 
y = sparkling_df1['Sparkling'], hue= sparkling_df1['Month'], ax= ax1)
ax2= plt.subplot(2,1,2)
plt.show()

Общий вид гистограммы показывает, что продажи вина растут к концу каждого года.

Бокс-сюжет:

ax = sparkling_df1.boxplot('Sparkling', by= 'Year')
ax1 = sparkling_df1.boxplot('Sparkling', by= 'Month')
plt.show()

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

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

я. Тренд (Tx) — тренд является компонентом временного ряда, который представляет вариации низкой частоты, при этом высокочастотные и среднечастотные флуктуации были отфильтрованы. Тренд используется для фиксации долгосрочных движений, и если значение переменной остается установленным законом в течение длительного времени, говорят, что ряд не имеет тренда.

II. Seasonality(Sx) — Повторяющиеся циклы в серии с фиксированными частотами

III. Остаток (Ix) — часть ряда, не представляющая ни тренда, ни сезонности, в основном шум.

Есть два типа декомпозиции, которые можно выполнить в зависимости от наилучшей интуиции, полученной из графика набора данных:

  1. Аддитивная декомпозиция, поскольку название предполагает, что временной ряд является функцией суммы его компонентов (TS = Tx + Sx + Ix), в то время как
  2. Мультипликативное разложение, функция произведения его компонентов (TS = Tx * Sx * Ix)

Мы рассмотрим оба графика разложения для нашей серии:

#additive decompose
decompose_sparkling_add = seasonal_decompose(sparkling_df, model='additive', period=10)
ax = decompose_sparkling_add.plot()
plt.show()

В аддитивной декомпозиции мы видим недостаточно сглаженный тренд, однако наблюдается небольшой подъем тренда после 1986-1990 гг., за которым следует небольшой спад. Одна вещь, которую следует отметить об остатках, заключается в том, что остаток должен быть случайным, что может представлять собой флуктуации, которые в конечном итоге могут помочь обнаружить выбросы, действующие иначе, чем обычно. Остаток не должен захватывать какую-либо закономерность из серии. Здесь он показывает случайность. Поскольку мы уже знаем, что существует сезонность, наш единственный мотив теперь состоит в том, чтобы выяснить, что повторяющиеся блоки изменяются с коэффициентом тренда и остатка или просто с некоторым добавлением шума (флуктуаций). Теперь давайте посмотрим на мультипликативную декомпозицию.

#multiplicative decompose
decompose_sparkling_mul = seasonal_decompose(sparkling_df, model='multiplicative', period=10)
ax1 = decompose_sparkling_mul.plot()
plt.show()

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

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

Мультипликатив — TS = Tx * Sx * Ix

Аддитивное — Log(TS) = Log(Tx) + Log(Sx) + Log(Ix)

from pylab import rcParams
rcParams['figure.figsize'] = 10,5
np.log(sparkling_df).plot(grid = True)
plt.show()

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

Исходя из нашей лучшей интуиции, мы резюмируем следующие пункты:

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

Это был мой взгляд на анализ серии, пожалуйста, дайте мне знать, как вы, ребята, анализируете свою серию. Спасибо!