пʼятницю, 27 січня 2012 р.

Часові ряди в R. Прогнозування декомпозицією

Часовий ряд - набір значень певної змінної через задані проміжки часу. Прикладом може бути температура повітря протягом дня.  Тут є можливість ознайомитись з числовими рядами в різних сферах.  Аналіз часових рядів дозволяє робити припущення про наступні значення змінної у майбутньому.  Точність цього прогнозу залежить від характеру ряду та методу аналізу, який застосовується. 
R надає потужні інструменти для дослідження часових рядів. Спробуємо сьогодні проаналізувати ряд з такими характеристиками:
Змінна величина: кількість клієнтів, які чекають на обслуговування.
Часовий інтервал: 5 хв.
Вхідні дані  у форматі .csv



 # зчитуємо дані та приводимо час у формат 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 квартиль)
  • застосувати іншу модель для прогнозу
  • побудувати прогноз для максимального значення кількості клієнтів, які очікують в кожній годині


Немає коментарів:

Дописати коментар