You are on page 1of 15

Міністерство освіти і науки України

Національний університет «Львівська Політехніка»


Інститут комп’ютерних наук та інформаційних технологій
Кафедра інформаційних систем та мереж

ЗВІТ
До лабораторної роботи №7
З дисципліни «Інтелектуальний аналіз даних»

На тему «Статистичне опрацювання часових рядів»

Виконали:
Команда групи ФЛ-35
Микулинська Марта
Мельник Лоліта
Хлян О.
Прийняв:
Андруник В.А.

Львів 2021
Мета роботи: вивчити принцип розкладання часових рядів на складові в
вигляді тренду, циклічних, сезонних, випадкових складових.

Хід роботи

1. Спочатку варто ознайомитися з теоретичними відомостями та лекційним


матеріалом:

Часовим рядом називається ряд спостережуваних значень досліджуваного


показника, розташованих в хронологічному порядку або в порядку зростання часу.
Вони можуть містити два види компонент – систематичну і випадкову складові.
Систематична складова часового ряду буде результатом впливу постійно діючих
факторів.

Виділяють три основних систематичних компоненти часового ряду:

Тренд

Трендом називається систематична лінійна або нелінійна компонента, що


змінюється в часі.

сезонність

Сезонністю називаються періодичні коливання рівнів часового ряду всередині


року.

циклічність.

Циклічністю називаються періодичні коливання, виходять за рамки одного


року. Проміжок часу між двома сусідніми вершинами або впадинами в масштабах
року визначають як довжину циклу.

Систематичні складові характеризуються тим, що вони можуть одночасно бути


присутнім в часовому ряді. Випадковою складовою називається випадковий шум або
помилка, котра впливає на часовий ряд нерегулярно.

В основному виділяють дві моделі розкладання часового ряду. Для того, щоб
отримати успішне розкладання, важливо вибирати між адитивною або
мультиплікативною моделями. Для того, щоб вибрати правильну модель, ми повинні
дивитися на часові ряди. Якщо сезонна змінна виглядає постійною, тобто вона не
змінюється, коли збільшується часовий ряд, використовуємо адитивну модель. Коли
тимчасові ряди збільшуються і сезонна складова збільшується більше і більше, то ми
повинні використовувати мультиплікативну модель.
2. Виконати Приклад з методичного посібника, використовуючи набір даних
series_g.csv

Для початку, потрібно підключити бібліотеку forecast.


install.packages("forecast")
library(forecast)
library(dplyr)
library(Hmisc)
library(ggplot2)
library(lmtest)

Після цього потрібно імпортувати дані з файлу та зробити з них динамічний ряд:

drawPlot <- function(dataParam, maxX, maxY, stepX, stepY)

opar <- par(no.readonly=TRUE)

plot(as.ts(dataParam), ann = F, axes = F)

title(main = "", xlab = "Case numbers", ylab = "Air passengers")

box()

axis(1, dataParam, at = seq(0, maxX, by = stepX), labels = seq(0, maxX, by = stepX))

axis(2, dataParam, at = seq(0, maxY, by = stepY), labels = seq(0, maxY, by = stepY),


las = 2)

minor.tick(nx = 1, ny = 2, tick.ratio = 0.5)

grid()

par(opar)

Функція ts() створює об’єкт часового ряду.


myDataTS– вихідний часовий ряд. Має такий вигляд:

myData <- read.csv("C:/Users/NaNa/Desktop/Series_G.csv", sep = ";", header = F,


stringsAsFactors = F)

myDataTS <- ts(data = myData)

drawPlot(myDataTS, 140, 600, 20, 100)


Рис.1. Вихідний числовий ряд.

З отриманого графіку бачимо, що сезонність у нашому випадку складає 12


місяців. Щоб виконати розкладання, використаємо ковзаюче вікно відповідно
розмірністю 12.

trendTS = ma(myDataTS, order = 12)

lines(trendTS)

drawPlot(trendTS, 140, 600, 20, 100)

Рис.2. Результат трансформації вихідного ряду ковзаючим середнім з лагом 12


(тренд).

Проведемо видалення раніше обчисленого тренду з тимчасового ряду, що


призведе до нового часового ряду, який дозволяє нам викрити сезонність.
Використаємо функцію detrendTS – це різниця між вихідним рядом та трендом.

detrendTS = myDataTS / trendTS

drawPlot(detrendTS, 140, 1.3, 20, 0.1)

Рис.3. Отриманий числовий ряд.


Зауважимо, що модель мультиплікативна, то в даному випадку буде
використовуватись не різниця, а частка між вихідним рядом та трендом.

Від часового ряду тренду, легко обчислити усереднені значення сезонної


складової. Тому додаємо сезонності і ділимо на кількість сезонної змінної. З технічної
точки зору, ми записуємо часовий ряд в матрицю. Потім ми перетворюємо матрицю,
так що кожен стовпець містить елементи одного і того ж періоду і обчислюємо
середнє значення кожного стовпчика.

mDataTS = t(matrix(data = detrendTS, nrow = 12))


sesonalDataTS = colMeans(mDataTS, na.rm = T)
drawPlot(rep(sesonalDataTS, 12), 140, 1.3, 20, 0.1)

Рис.4. Отриманий результат: усереднені значення сезонної складової.

Також розглянемо принцип роботи з випадковою величиною. Випадкова


складова часового ряду – це помилка, яка нерегулярно впливає на часовий ряд.

randomDataTS = myDataTS / trendTS / sesonalDataTS


drawPlot(randomDataTS, 140, 1.3, 20, 0.1)

Рис. 5. Результат роботи з випадковою величиною часового ряду.

Повторно складемо часовий ряд з використанням формули моделі. Це повинно


відтворювати вихідний сигнал. Деякі дані відсутні на початку і в кінці відтворення
часових рядів. Це відбувається через вікна ковзаючого середнього.

recomposedMyDataTS = randomDataTS * trendTS * sesonalDataTS


drawPlot(recomposedMyDataTS, 140, 600, 20, 100)
Рис.6. Повторно складений часовий ряд.

Застосуємо експоненціальне згладжування до вже розглянутого попередньо ряду


series_G. Для цього використаємо метод Хольта-Вінтерса. Зауважимо також, що
сезонна складова = 12, тому включимо це до об’єкту часового ряду і отримаємо
наступний код:

myData <- read.csv("C:/Users/NaNa/Desktop/Series_G.csv", sep = ";", header = F,


stringsAsFactors = F)

myDataTS <- ts(data = myData, frequency = 12)

HW1 = HoltWinters(myDataTS, alpha = 0.1, beta = 0.1, gamma = 0.1)

HW2 = HoltWinters(myDataTS)

Рис.7. Використання методу Хольта-Вінтерса.

Зауважимо, що у випадку HW1 перший вхідний параметр – часовий ряд;


alphа застосовується для згладжування;
beta використовується, коли є тренд;
gamma використовується, коли є сезонна складова.
Для HW2ми дозволили системі самій підібрати коефіцієнти.
Далі відобразимо отримані результати на графіку:

plot.ts(myDataTS, ylab = 'Air passengers', xlim = c(1, 14), ylim = c(0, 800))
lines(HW1$fitted[,1], lty = 2, lwd = 2, col = 'blue')
lines(HW2$fitted[,1], lty = 2, lwd = 2, col = 'red')
legend('topright', legend=c('Real Data', 'HW1', 'HW2'),
col=c('black', 'blue', 'red'), lty=c(1,2,2), lwd=c(5,3,3))
grid()
Рис.8. Отриманий результат згладжування.

За допомогою функції predict() зробимо прогноз на наступні 12 місяців. Також


врахуємо довірчий інтервал прогнозу.

grid()
HW1.pred = predict(HW1, n.ahead = 12, prediction.interval = T)
HW2.pred = predict(HW2, n.ahead = 12, prediction.interval = T)
plot.ts(myDataTS, ylab = 'Air passengers', xlim = c(1, 14), ylim = c(0, 800))
lines(HW1$fitted[,1], lty = 2, lwd = 2, col = 'blue')
lines(HW1.pred[,1], lty = 2, lwd = 2, col = 'green')
lines(HW1.pred[,2], lty = 2, lwd = 2, col = 'red')
lines(HW1.pred[,3], lty = 2, lwd = 2, col = 'red')
legend('topright', legend=c('Real Data', 'HW2'),
col=c('black','blue'), lty=c(1,2), lwd=c(5,3))

Рис.9. Результати прогнозу для HW1.

grid()
plot.ts(myDataTS, ylab = 'Air passengers', xlim = c(1, 14), ylim = c(0, 800))
lines(HW2$fitted[,1], lty = 2, lwd = 2, col = 'blue')
lines(HW2.pred[,1], lty = 2, lwd = 2, col = 'green')
lines(HW2.pred[,2], lty = 2, lwd = 2, col = 'red')
lines(HW2.pred[,3], lty = 2, lwd = 2, col = 'red')
legend('topright', legend=c('Real Data', 'HW2'),
col=c('black','blue'), lty=c(1,2), lwd=c(5,3))
grid()

Рис.10. Результати прогнозу для HW2.

Висновок: під час виконання лабораторної роботи №7 було вивчено принцип


розкладання часових рядів на складові в вигляді тренду, циклічних, сезонних,
випадкових складових. Виконано приклад з методички та даного ресурсу.

3. Стаціонарність часових рядів залежить від середнього значення, дисперсії, ко-


дисперсії. Середнє значення ряду не повинно бути функцією часу, а має бути
константою.

ARIMA – це Авторегресійне інтегроване ковзне середнє. Моделі ARIMA


класифікуються за трьома факторами:

p - кількість авторегресивних термінів (AR)


d - скільки несезонних різниць потрібно для досягнення стаціонарності (I)
q - кількість зареєстрованих помилок прогнозу в рівнянні прогнозування (MA)

З точки зору регресивної моделі, авторегресивні компоненти відносяться до


попереднього значення поточного значення.

ARIMA моделі працюють на основі припущення про стаціонарність. Щоб


перевірити, чи є серія та термін помилок автокореляцією використовується функція
автокореляції (ACF) або функція часткової автоматичної кореляції (PACF).
Автокореляція - це подібність між значеннями однієї і тієї ж змінної в
спостереженнях.

Функція автокореляції (ACF) повідомляє про співвідношення точок між собою


на основі того, скількома часовими кроками вони розділені. Вона використовується
для визначення взаємозв'язку минулих та майбутніх точок даних у часовому ряді. Це
значення може коливатися від -1 до 1.

Коли ми будуємо графік ACF для нашого набору даних, він перетинає синю
пунктирну лінію, яка вказує на співвідношення значень. Отже, він нестаціонарний.

Функція PACF демонструє певний шаблон, який не повторюється, ми можемо


зробити висновок, що дані не показують сезонності

Виконаємо приклад, метою якого є передбачити обсяг продажів авіаквитків на


1961 рік за допомогою аналізу часових рядів. Опис даних: 10-річні дані про продаж
авіаквитків авіакомпанії за 1949-1960 роки.

Мета часових рядів: ідентифікація поведінки компонентів часових рядів, таких


як сезонність та тенденції для опису поведінки. А також прогнозування значень
часових рядів залежно від його фактичних та минулих значень.

Рис.11 Ініціалізація пакету forecast


Можливо переглянути наступні дані:

Рис.12 Дані датасету AirPassengers

А також початкову та кінцеву точку, частоту:

Рис.13 Дані датасету AirPassengers

За допомогою команди sum (is.na(tsdata)) перевіряємо чи є пропущені дані:

Рис.14 Перевірка пропущених даних

Переглянемо summary:

Рис. 15 перегляд summary


Використовуючи функцію plot(AirPassengers) побудуємо графік:

Рис.16 Побудований графік

Переглянемо циклічність даних за допомогою функції cycle (AirPassengers):

Рис.17 Циклічність даних

Щоб визначити наявність сезонності використаємо функцію boxplot():

Рис.18 Отриманий боксплот

З отриманих даних, можемо зробити висновки, що кількість пасажирів зростала з


часом. Щодо сезонності, в боксплоті бачимо, що більше пасажирів подорожують у
місяці 6-9, вказуючи на сезонність із очевидним циклом у 12 місяців.
Наступним кроком, ми розкладемо часові ряди. Розклад означає розділення
вихідного часового ряду на його складові (тренд, сезонність, нерегулярність).

Використовуємо наступний код та будуємо графік:

Рис.19 Отриманий графік

Наступним кроком, виконаємо припасування ARIMA моделі. Спершу


переглянемо параметри моделі за допомогою наступної функції:

Рис.20 Код припасування ARIMA моделі

Рис.21 Результат виконання функції auto.arima()


У разі доповнення функції

auto.arima(AirPassengers, ic="aic", trace = TRUE)

Отримаємо значення p, d, q та найкращий варіант ARIMA моделі:

Рис.22 Отримані результати

Припасована ARIMA модель:

де Е – це помилка

Побудуємо графік, щоб перевірити залишки, які показують стаціонарність


(команда plot.ts(mymodel$residuals)):

Отриманий графік:
Рис.23 Отриманий графік

Можливо побудувати прогноз часових рядів, використовуючи функцію прогнозу


з 95-відсотковим довірчим інтервалом, де h - періоди горизонту прогнозу в місяцях.

Команда:

myforecast<-forecast(mymodel, level = c(95), h=10*12)

plot(myforecast)

Отримуємо наступний графік:

Рис.24 Графік прогнозування часових рядів

На графіку можливо побачити запропонований прогноз на наступних 10 років.


Ми також можемо перевірити цю ARIMA модель за допомогою Ljung-Box тесту.
Lagged values будуть 5, 10 та 15.

Програмний код:

Box.test(mymodel$resid,lag=5, type = "Ljung-Box")

Box.test(mymodel$resid,lag=10, type = "Ljung-Box")

Box.test(mymodel$resid,lag=15, type = "Ljung-Box")


Отримані дані:

Рис.25 Результат перевірки за допомогою Ljung-Box тесту

Зі значень p, можливо зробити відсумки, що наша модель є незалежною від


автокореляції.

You might also like