Наблюдения, которые были записаны упорядоченным образом и коррелированы во времени, составляют временной ряд. Очень общее приложение временных рядов использует его для прогнозирования того, что произойдет в будущем. Например, Прогнозирование продаж, анализ фондового рынка, прогнозирование запасов и т. д.
Другой интересующей областью, в которой используются временные ряды, отличные от прогнозирования, является обнаружение выбросов. Обнаружение выбросов — это целенаправленные выводы, сделанные в процессе интеллектуального анализа данных временных рядов. Интеллектуальный анализ данных временных рядов направлен на извлечение всех значимых знаний из исторических данных, представленных в виде последовательности значений переменной через равные промежутки времени.
Я собираюсь представить свой подход к анализу временных рядов продаж вина в 20 веке. Ниже будут предприняты шаги:
- Исследовательский анализ данных
- Разложение ряда
- Вывод
Примечание. Это упражнение реализовано на 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) — часть ряда, не представляющая ни тренда, ни сезонности, в основном шум.
Есть два типа декомпозиции, которые можно выполнить в зависимости от наилучшей интуиции, полученной из графика набора данных:
- Аддитивная декомпозиция, поскольку название предполагает, что временной ряд является функцией суммы его компонентов (TS = Tx + Sx + Ix), в то время как
- Мультипликативное разложение, функция произведения его компонентов (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()
Поскольку видимой разницы мы не видим, справедливо будет сказать, что сезонность не зависит от тренда, а неравномерности носят аддитивный характер.
Исходя из нашей лучшей интуиции, мы резюмируем следующие пункты:
- Колебания можно использовать для анализа выбросов, поскольку они являются своеобразными и не изменяются в процентах или кратны тренду или сезонности.
- Поскольку сезонность постоянна, ее можно визуализировать, а рекламные стратегии можно разрабатывать в периоды с провалами на протяжении всего периода.
- Тенденцию и сезонность можно рассматривать отдельно при разработке стратегий прогнозирования.
Это был мой взгляд на анализ серии, пожалуйста, дайте мне знать, как вы, ребята, анализируете свою серию. Спасибо!