Часовий ряд - набір значень певної змінної через задані проміжки часу. Прикладом може бути температура повітря протягом дня. Тут є можливість ознайомитись з числовими рядами в різних сферах. Аналіз часових рядів дозволяє робити припущення про наступні значення змінної у майбутньому. Точність цього прогнозу залежить від характеру ряду та методу аналізу, який застосовується.
R надає потужні інструменти для дослідження часових рядів. Спробуємо сьогодні проаналізувати ряд з такими характеристиками:
Змінна величина: кількість клієнтів, які чекають на обслуговування.
Часовий інтервал: 5 хв.
# зчитуємо дані та приводимо час у формат POSIXlt:
cl_queue <- read.csv("~/Projects/queue/data/queue.csv")
cl_queue$Time <- as.POSIXlt(queue$ts)
# перетворємо в ЧР, інтервал 5 хв (за добу 288 спостережень)
cl_queue.ts <- ts(cl_queue$Clients, freq = 288)# побудуємо графік даного ряду
plot(cl_queue.ts, ylab = 'Клієнти', xlab = 'Дні')
Загальну модель ряду можна представити як
x = m + s + z
, де m - тренд, s - сезонність, z - похибка. R дозволяє легко розкласти ряд на ці компоненти.Для цього можна використати функції decompose()
та stl()
.
decompose()
використовує для розкладу ковзаючі середні, a stl()
згладжування loess. Розкладемо ряд та порівняємо результати. В якості прогнозу наступних значень спробуємо використати функцію x = m + s.
Сезонність у нашому випадку - добовість.
decompose():
dec.cl_queue <- decompose(cl_queue.ts)
cl_queue_trend <- dec.cl_queue$trend # виділяємо тренд
cl_queue_seasonal <- dec.cl_queue$seasonal # виділяємо сезонність
plot(dec.cl_queue)
З графіка видно, що випадкова складова має дуже великий вплив. Побудуємо графік нашої моделі для прогнозування
x = m + s.
plot(cl_queue.trend+cl_queue.seasonal, main = "Прогноз для ряду", ylab = "Клієнтів")
Тепер відобразимо на одному графіку вихідний ряд та модель прогнозу: ts.plot(cbind(cl_queue.ts, cl_queue.trend+cl_queue.seasonal), col = c("red", "black"), main = "Ряд та прогноз")
Аналогічно для stl()
:
# розклад на компоненти
stl_cl_queue <- stl(queue.ts, "per")
plot(stl_cl_queue)
# будуємо прогноз
pstl_cl_queue <- stl_cl_queue$time.series
pred = (pstl_cl_queue[ ,1] + pstl_cl_queue[ ,2])
plot(pred, main = "Прогноз", ylab = "Клієнтів")
# будуємо графік вихідного ряду та прогноз
pstl_cl_queue <- stl_cl_queue$time.series
pred = (pstl_cl_queue[ ,1] + pstl_cl_queue[ ,2])
plot(pred, main = "Прогноз", ylab = "Клієнтів")
# розміщуємо обидві прогнозні моделі на одному графіку
ts.plot(cbind(cl_queue.trend+cl_queue.seasonal, pred), col = c("red", "black"))
plot(cbind(cl_queue.trend+cl_queue.seasonal, pred))
- в даних є яскраво виражена добова залежність;
- при декомпозиції обома функціями для моделі прогнозу
x = m + s
отримали однакові дані; - обрана модель для прогнозування нашого ряду є неточною, оскільки в даних наявний значний шум, крім того, тренд є нелінійним;
Можливі варіанти покращення точності прогнозу:
- очищення даних (відкинути 1 та 4 квартиль)
- застосувати іншу модель для прогнозу
- побудувати прогноз для максимального значення кількості клієнтів, які очікують в кожній годині
Немає коментарів:
Дописати коментар