Разгледайте модела на подвижната средна и открийте как можем да използваме диаграмата на ACF, за да идентифицираме правилния модел MA(q) за нашата времева серия

Един от основополагащите модели за прогнозиране на времеви редове е моделът на пълзящата средна, означен като MA(q). Това е един от основните статистически модели, който е градивен елемент на по-сложни модели като моделите ARMA, ARIMA, SARIMA и SARIMAX. По този начин дълбокото разбиране на MA(q) е ключова стъпка преди използването на по-сложни модели за прогнозиране на сложни времеви редове.

В тази статия първо дефинираме процеса на пълзяща средна и изследваме вътрешната му работа. След това използваме набор от данни, за да приложим знанията си и използваме ACF графиката, за да определим реда на MA(q) модел.

Тази статия е откъс от предстоящата ми книга „Прогнозиране на времеви редове в Python“. Ако се интересувате да научите повече за прогнозирането на времеви редове, като използвате както статистически, така и модели за задълбочено обучение с приложени сценарии, можете да научите повече тук.

Предпоставки

Можете да вземете набора от данни тук. Обърнете внимание, че данните са синтетични, тъй като рядко наблюдаваме времеви серии в реалния живот, които могат да бъдат моделирани с чист процес на пълзяща средна. Следователно този набор от данни е за учебни цели.

Пълният изходен код е достъпен тук.

Дефиниране на процеса на пълзяща средна

Процесът на пълзяща средна стойност или моделът на пълзящата средна стойност заявява, че текущата стойност е линейно зависима от текущата и минала грешка. Отново се приема, че членовете на грешката са взаимно независими и нормално разпределени, точно като белия шум.

Модел на пълзяща средна се обозначава като MA(q), където q е редът. Моделът изразява текущата стойност като линейна комбинация от средната стойност на серията (mu), терминът за текуща грешка (epsilon) и термините за минали грешки ( епсилон). Големината на въздействието на минали грешки върху настоящата стойност се определя количествено с помощта на коефициент, означен с тета. Математически ние изразяваме общ процес на пълзяща средна, както следва:

Редът q на модела на пълзящата средна определя броя на членовете на минали грешки, които влияят на настоящата стойност. Например, ако е от първи ред, което означава, че имаме MA(1) процес, тогава моделът се изразява по следния начин:

Ако имаме процес на пълзяща средна от втори ред или MA(2), тогава изразяваме уравнението по следния начин:

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

Идентифициране на реда на процеса на пълзяща средна

За да идентифицираме реда на процеса на пълзяща средна, ние следваме стъпките, описани по-долу:

Както обикновено, първата стъпка е да се съберат данните. След това тестваме за стационарност. В случай, че нашата серия не е стационарна, ние прилагаме трансформации, като диференциране, докато серията е стационарна. След това начертаваме ACF и търсим значими автокорелационни коефициенти. В случай на произволна разходка няма да видим значими коефициенти след забавяне 0. От друга страна, ако видим значими коефициенти, тогава трябва да проверим дали те стават внезапно незначими след известно забавяне q. Ако случаят е такъв, тогава знаем, че имаме процес на пълзяща средна от порядък q. В противен случай трябва да следваме различен набор от стъпки, за да открием основния процес на нашите времеви редове.

Нека приложим това, като използваме нашите данни за обема на продажбите на джаджи за XYZ Widget Company. Наборът от данни съдържа данни за обема на продажбите за 500 дни, започвайки от 1 януари 2019 г. Ще следваме набора от стъпки, описани на фигура 4.3, и ще определим реда на основния процес на пълзяща средна.

Първата стъпка е да съберете данните. Въпреки че тази стъпка вече е направена за вас, това е чудесен момент да заредите данните в DataFrame с помощта на pandas и да покажете първите пет реда с данни:

import pandas as p
df = pd.read_csv('data/widget_sales.csv')
df.head() 

Виждате, че нашият обем на продажбите е в колоната widget_sales. Имайте предвид, че обемът на продажбите е в единици хиляди щатски долари.

След това можем да начертаем данните, като използваме следната част от кода:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(df.widget_sales)   
ax.set_xlabel('Time')      
ax.set_ylabel('Widget sales (k$)')
 
plt.xticks(
[0, 30, 57, 87, 116, 145, 175, 204, 234, 264, 293, 323, 352, 382, 409, 439, 468, 498],
['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', '2020', 'Feb', 'Mar', 'Apr', 'May', 'Jun'])      #D
fig.autofmt_xdate()
plt.tight_layout() 

Следващата стъпка е да се тества за стационарност. Интуитивно знаем, че серията не е неподвижна, тъй като има наблюдавана тенденция, както се вижда на фигурата по-горе. Все пак ще използваме ADF теста, за да се уверим. Отново използваме функцията adfuller от библиотеката statsmodels и извличаме ADF статистиката и p-стойността. Ако статистиката на ADF е голямо отрицателно число и p-стойността е по-малка от 0,05, тогава нашата серия е неподвижна. В противен случай трябва да приложим трансформации.

from statsmodels.tsa.stattools import adfuller
ADF_result = adfuller(df.widget_sales)   
print(f'ADF Statistic: {ADF_result[0]}') 
print(f'p-value: {ADF_result[1]}')

Това води до ADF статистика от -1,51 и p-стойност от 0,53. Тук статистиката на ADF не е голямо отрицателно число и p-стойността е по-голяма от 0,05. Следователно нашият времеви ред не е стационарен и трябва да приложим трансформации, за да го направим стационарен.

За да направим нашите серии стационарни, ще се опитаме да стабилизираме тенденцията, като приложим разлика от първи ред. Можем да го направим, като използваме метода diffот библиотеката numpy. Не забравяйте, че този метод приема параметър n, който определя реда на разликата. В този случай, тъй като това е разлика от първи ред, n ще бъде равно на 1.

import numpy as np
widget_sales_diff = np.diff(df.widget_sales, n=1)

С трансформация, приложена към нашата серия, можем отново да тестваме за стационарност, като използваме ADF теста. Този път не забравяйте да изпълните теста върху различните данни, съхранени в променливата widget_sales_diff.

ADF_result = adfuller(widget_sales_diff)
print(f'ADF Statistic: {ADF_result[0]}')
print(f'p-value: {ADF_result[1]}')

Това дава ADF статистика от -10,6 и p-стойност почти 0. Следователно, с голяма отрицателна ADF статистика и p-стойност много по-малка от 0,05, можем да кажем, че нашата серия е стационарна.

Следващата ни стъпка е да начертаем автокорелационната функция. Библиотеката statsmodelsудобно включва функцията plot_acfза нас. Ние просто предаваме нашата различна серия и определяме броя на закъсненията в параметъра за закъснения. Не забравяйте, че броят на закъсненията определя диапазона от стойности по оста x.

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(widget_sales_diff, lags=30);
plt.tight_layout()

Получената ACF диаграма е показана по-долу. Забелязваме, че има значими коефициенти след забавяне 0. Всъщност те са значими до забавяне 2. След това внезапно стават незначими, тъй като остават в защрихованата област на диаграмата. Можем да видим известно значение около изоставането 20, но това вероятно се дължи на случайност, тъй като следните коефициенти не са значими.

Тъй като имаме значителни коефициенти на автокорелация до лаг 2, това означава, че имаме процес на стационарна пълзяща средна от порядък 2. Следователно можем да използваме модел на пълзяща средна от втори ред или модел MA(2), за да прогнозираме нашето стационарно време серия.

По този начин можем да видим как ACF диаграмата ни помага да определим реда на процеса на пълзяща средна. Диаграмата на ACF ще показва значителни коефициенти на автокорелация до забавяне q, след което всички коефициенти ще бъдат незначими. След това можем да заключим, че имаме процес на пълзяща средна от ред q или MA(q) процес. В нашия случай, работейки с обема на продажбите на джаджи, открихме, че стационарният процес е процес на пълзяща средна от втори ред, тъй като графиката на ACF показва значителни коефициенти до лаг 2.

Заключение

В тази статия ние дефинирахме процеса на пълзяща средна и изпитахме как графиката на ACF може да се използва за намиране на правилния ред на модела MA(q). Този модел може да се използва за прогнозиране на времевия ред.

Надявам се да ви е харесало четенето!

Наздраве 🍺!

Източник: Прогнозиране на времеви редове в Python