Введение:

Цель этого проекта - анализировать и прогнозировать данные в реальном времени. Отчеты и набор данных были взяты с веб-сайта NHS England, который сообщает о количестве случаев травм, неотложной помощи и госпитализации в национальные службы здравоохранения и независимые отраслевые организации в Англии.

Период данных с августа 2010 г. по июль 2018 г. Как вы заметите, я сосредоточился и работал над основным столбцом, который называется «Общая посещаемость», и планирую расширить его на другие столбцы, если будет получен какой-либо интерес к анализу. Вот скриншот набора данных:

Об анализе временных рядов:

Анализ временных рядов - одна из важных тем в науке о данных. В этом типе анализа специалист по данным работает, чтобы предсказать будущее как можно точнее, и это называется прогнозированием. Мы можем придумать множество приложений и идей, в которых анализ и прогнозирование временных рядов могут быть полезны для принятия решений. В своей предыдущей статье (нажмите здесь) я обсуждал одно из приложений в сфере здравоохранения. Однако давайте подумаем о еще нескольких приложениях в разных секторах.

1) Вы можете использовать анализ временных рядов, чтобы предсказать или спрогнозировать количество посещений и кликов на вашем веб-сайте в будущем, анализируя исторические события.

2) Прогнозировать или предсказать цену и тенденцию акций или золота.

3) Еще одно приложение для производителя для прогнозирования темпов производства и потребления. .. так далее

Ценностное предложение:

Я считаю, что специалисту по анализу данных важно думать о потенциальной ценности проекта и о том, как он может быть полезен для лиц, принимающих решения. Лично я этим занимаюсь в начале проекта.

Я считаю, что для этого проекта, прогнозируя ежемесячную посещаемость неотложной и неотложной помощи, можно легко принять многие важные решения. Либо в отношении закупки медицинского и немедицинского инвентаря, либо набора персонала и расписания их дежурств. В дополнение к ряду логистических приготовлений к размещению участников. Таким образом, вы сможете повысить качество обслуживания и сократить время ожидания пациента.

Проэкт:

Я буду использовать пакеты временных рядов в R для анализа и прогнозирования общей посещаемости A&E NHS в Англии. Вот краткое изложение основных шагов:

1. Загрузка библиотек и набора данных

2. Построение и анализ временных рядов

3. Разведка

4. Разложение

5. Средний и наивный метод прогноза

6. Прогноз с линейной регрессией.

7. Прогноз модели ARIMA.

8. Ссылки

Примечание. Я использую R через среду Jupyter Notebook.

Загрузка библиотек и наборов данных

В этом разделе я загружу необходимые библиотеки, набор данных, а затем проведу некоторую обработку данных:

library(dplyr)
library(urca)
library(forecast)
library(dygraphs)
require(ggplot2)

Загрузка набора данных:

df <- read.csv ( file= ".. A&E admissions.csv", header = TRUE, sep = "\t")

Измените имена заголовков и сделайте их более удобными для R. Теперь столбец «Общая посещаемость» будет представлен как «TA»:

setnames ( df, old= c("Period","Total.Attendances), new=c("dateTime", "TA")

Проверьте недостающие данные в столбце TA:

summary(is.na(df$TA))
> Mode   FALSE
> logical      96

Похоже, что недостающих данных нет, отлично! Теперь я конвертирую столбец «dateTime» в объект даты и времени со спецификацией часового пояса, используя функцию POSIX:

to.POSIXct <- function(col) {
## Function to create a POSIXct time series
 
  ## Create a character vector from the numeric input
dateStr <- paste(as.character(col))
## Return the POSIXct time series object
as.POSIXct( strptime(dateStr, "%d/%m/%Y"))}
df$dateTime <- to.POSIXct(df$dateTime)
class(df$dateTime)
>'POSIXct' 'POSIXt'

Построение и анализ временных рядов

Теперь преобразуйте TA в класс временных рядов:

TA.ts <- ts ( df[,'TA'] , frequency = 12,  start=c(2010,8), end= c(2018,7) )
class(TA.ts)
> 'ts'

Сводка временного ряда:

summary(TA.ts)
> Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
> 1599364 1784570 1871972 1875892 1950438 2176022

График ежемесячной общей посещаемости A&E в Англии

plot.ts(TA.ts, main = "Monthly Total A&E Attendance in England",  
         xlab = "Year", ylab = "TA")

График квартальной и годовой общей посещаемости A&E в Англии:

TA.ts.qtr <- aggregate (TA.ts, nfrequency = 4)
TA.ts.yr <- aggregate (TA.ts, nfrequency = 1)
plot.ts(TA.ts.qtr, main = "Quarterly Total A&E Attendance in England", xlab = "Year", ylab = "TA")
plot.ts(TA.ts.yr, main = " Yearly Total A&E Attendance in England", xlab = "Year", ylab = "TA")

Постройте гистограмму и коробчатую диаграмму, чтобы проверить распределение ТА:

hist (TA.ts, breaks = 20, main = paste('Distribution of Total A&E Attendance in England'), xlab = "TA")

boxplot(TA.ts ~ cycle(TA.ts), xlab = "Month", ylab = "TA", main = "Monthly Total A&E Attendance in England - Boxplot")

Мы можем заметить распределение и изменение TA в том же месяце и среди других месяцев. Май, июль и март соответственно - самые загруженные месяцы за последние 8 лет.

Исследование

Теперь внимательно посмотрим на общее количество участников за последние 8 лет. Это можно сделать, применив технику скользящего среднего, чтобы сгладить сигнал тренда. Мы рассчитаем среднее значение за 6, 12, 24 и 36 месяцев, чтобы контролировать плавность тренда.

par(mfrow = c(2,2))
plot(TA.ts, col="gray", main = "Half Year Moving Average Smoothing")
lines(ma(TA.ts, order = 6), col = "red", lwd=3)
plot(TA.ts, col="gray", main = "1 Year Moving Average Smoothing")
lines(ma(TA.ts, order = 12), col = "blue", lwd=3)
plot(TA.ts, col="gray", main = "2 Year Moving Average Smoothing")
lines(ma(TA.ts, order = 24), col = "green", lwd=3)
plot(TA.ts, col="gray", main = "3 Year Moving Average Smoothing")
lines(ma(TA.ts, order = 36), col = "yellow4", lwd=3)

Мы видим, что количество посетителей A&E росло почти линейно за последние годы.

Затем давайте проверим влияние населения Англии на количество посещений A&E с 2010 по 2017 год. Во-первых, мне нужно собрать данные временного ряда для населения Англии. К счастью, я нашел нужные данные на сайте национальной статистики Великобритании.

Eng.Pop <- read.csv(file= ".. /England Pop.csv", header = TRUE,  sep = ",")
head(Eng.Pop)
> Year Population
> 2010 52642500
> 2011 53107200
> 2012 53493700
> 2013 53865800
> 2014 54316600
> 2015 54786300

Создание данных о населении временных рядов с масштабом (1000)

pop.ts <- ts((Eng.Pop$Population)/1000, frequency = 1, start= 2010, end= 2017)

Постройте временной ряд населения:

plot(pop.ts, main = "England Popuation", xlab = "Year", ylab = "Number of People in 1,000")

Теперь давайте удалим эффект возрастания численности населения Англии из данных годовой общей посещаемости A&E, а затем сравним эти две кривые:

par(mfrow = c(1,2))
plot.ts((TA.ts.yr/pop.ts), lwd=2,col = "red", main = "Yearly Total A&E Attendance in England Adjusted by Population", xlab = "Year", ylab = "TA")
plot.ts(TA.ts.yr, col = "blue", lwd=2, main = " Yearly Total A&E Attendance in England", xlab = "Year", ylab = "TA")

Очевидно, мы можем заметить, что рост числа населения в Англии оказывает минимальное влияние на общее годовое количество посещений A&E в период с 2010 по 2017 год. В период с середины 2011 по 2014 год число посетителей почти не меняется. с середины 2014 года до конца 2015 года. Требуются дополнительные расследования и данные, чтобы выяснить, почему в конце 2014 года в Англии стало неожиданно большое количество аварий и чрезвычайных ситуаций.

Разложение

На этом этапе мы разложим данные временного ряда на три компонента: тренд, сезонный и остаток. Остальная составляющая должна быть стационарной (случайный шум). Другими словами, среднее значение и дисперсия должны быть постоянными. Кроме того, функция автоковариации не зависит от времени.

Я буду использовать разложение STL (разложение по сезонам и трендам с использованием Лесса) для зарегистрированных временных рядов TA:

autoplot( stl(log(TA.ts), s.window="periodic", robust=TRUE))

Теперь нам нужно проверить и протестировать оставшиеся данные, чтобы убедиться, что они неподвижны. Сначала мы построим автокорреляционную функцию и частичную автокорреляционную функцию:

par(mfrow = c(1,2))
Acf(TA_rem, main ="ACF for Remainder")
Pacf(TA_rem, main ="PACF for Remainder")

Нет ни значительных лагов в ACF, ни сезонного эффекта, что означает, что автоковариация не зависит от времени. Давайте проверим постоянное среднее значение и дисперсию, построив коробчатую диаграмму для остатка:

boxplot(TA.ts_rem ~ cycle(TA.ts), xlab = "Month", ylab = "TA", main = "Boxplot of Total Attendance Remainder")

Среднее значение и дисперсия постоянны (без значительных изменений). Кроме того, я применю модульный корневой тест (тест KPSS) для проверки сигнала. Нулевая гипотеза теста KPSS утверждает, что данные являются стационарными, и мы будем искать любые доказательства, чтобы отклонить нулевую гипотезу.

TA.ts_rem %>% ur.kpss()  %>% summary()
####################### 
# KPSS Unit Root Test # 
#######################
> Test is of type: mu with 3 lags.
> Value of test-statistic is: 0.0287 
 
> Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
> critical values 0.347 0.463  0.574 0.739

Статистика теста меньше критического значения 10%, что указывает на то, что нулевая гипотеза пройдена и данные являются стационарными.

Средний и наивный метод прогноза

Здесь мы применим некоторые базовые модели, чтобы спрогнозировать общее количество посещений A&E на 12 месяцев (с августа 2018 г. по июль 2019 г.). Метод среднего - это просто усреднение всех точек выборки. В то время как Наивный и Наивный сезонный прогноз использует последний период для прогноза следующего периода.

TA.fit.sa <- meanf(TA.ts, h = 12)
TA.fit.na <- naive(TA.ts, h = 12)
TA.fit.sna <- snaive(TA.ts, h = 12)
plot.ts(TA.ts, main = "Monthly Total Attendance NHS in England", xlab = "Year", ylab = "TA", xlim = c(2010, 2019))
lines(TA.fit.sa$mean, col = "blue")
lines(TA.fit.na$mean, col = "green")
lines(TA.fit.sna$mean, col = "red")
legend("topleft",lty=1,col=c("blue","green", "red"), cex = 0.75, legend=c("Mean method","Naive method", "Seasonal naive method"))

Прогноз с линейной регрессией

Сначала будет соответствовать модели линейной регрессии временных рядов, а затем с помощью пакета «прогноз» будут предсказаны значения за 12 месяцев (с августа 2018 г. по июль 2019 г.) с доверительными интервалами 80 и 95 процентов:

fit.lm_TA.ts <- tslm(TA.ts ~ trend+season)
frcst.lm <- forecast(fit.lm_TA.ts, h = 12, level = c(80,95))
plot.ts(TA.ts, main = "Monthly Total A&E Attendance in England", xlab = "Year", ylab = "TA", xlim = c(2010,2019))lis(frcst.lm$fitted, col = "b

Модель линейной регрессии ведет себя довольно хорошо, поскольку мы визуализировали подогнанные данные (синий) по сравнению с фактическими данными (черный). Затем давайте оценим модель, проверив остатки. Среднее значение остатков и дисперсия должны быть постоянными во времени, как показано:

boxplot(residuals(fit.lm_TA.ts) ~ cycle(TA.ts), xlab = "Month", ylab = "TA", main = "Boxplot of Residuals")

Диаграмма рассеяния между установленным и фактическим значениями:

df[,"TA.fitted"] <- as.numeric(fit.lm_TA.ts$fitted.values)
plot(df$TA, df$TA.fitted, main = "Scatterplot between fitted & actual values", xlab = "Fitted Value", ylab = "Actual")
abline(0, 1, col="blue")

Построение и листинг годового прогноза с августа по июль 2018 года:

plot.ts(TA.ts, main = "Monthly Total Attendance NHS in England", xlab = "Year", ylab = "TA", xlim = c(2010,2019))
lines(frcst.lm$mean, col = "blue")

frcst.lm
> Point          Forecast   Lo 80   Hi 80   Lo 95   Hi 95
> Aug 2018        1990708 1932450 2048965 1901013 2080402
> Sep 2018        1984479 1926222 2042736 1894784 2074174
> Oct 2018        2045357 1987100 2103614 1955662 2135051
> Nov 2018        1957509 1899252 2015766 1867814 2047204
> Dec 2018        1997633 1939376 2055890 1907939 2087328
> Jan 2019        1957718 1899461 2015975 1868023 2047413
> Feb 2019        1860605 1802347 1918862 1770910 1950299
> Mar 2019        2113073 2054816 2171330 2023378 2202768
> Apr 2019        2022652 1964395 2080909 1932957 2112347
> May 2019        2137346 2079089 2195603 2047651 2227040
> Jun 2019        2073922 2015664 2132179 1984227 2163616
> Jul 2019        2153840 2095583 2212097 2064145 2243535

Прогноз модели ARIMA

ARIMA расшифровывается как Autoregressive Integrated Moving Average. Это еще один подход к прогнозированию временных рядов. Действительно, это наиболее широко используемый подход в прогнозировании временных рядов.

В этом разделе мы выполним дифференциальное преобразование данных с поправкой на сезонность, чтобы получить стационарный сигнал. Затем проведите несколько экспериментов, чтобы определить параметры p, d, q для несезонной модели ARIMA. Затем установите значения P, D, Q для сезонной модели ARIMA. Наконец, сравним результаты сезонного ARIMA с моделью Auto-ARIMA. Вот сводная диаграмма из книги Принципы прогнозирования и Практика общего процесса прогнозирования с использованием модели ARIMA.

Помните, что модель ARIMA (p, d, q) (P, D, Q):

p = порядок авторегрессионной части для несезонной части

d = степень первого дифференцирования для несезонной части

q = порядок части скользящего среднего для несезонной части

P = порядок авторегрессионной части для сезонной части

D = степень первого дифференцирования для сезонной части

Q = порядок части скользящего среднего для сезонной части

Сначала мы разложим данные, а затем воссоздадим их без сезонной составляющей - функция Seasadj (): возвращает данные, скорректированные с учётом сезонных колебаний:

TA.ts %>% stl(s.window='periodic') %>% seasadj() -> TA.ts_seasadj
autoplot(TA.ts_seasadj, main= " Seasonal Adjusted Monthly A&E Attendance", lwt= 3)

ggtsdisplay(TA.ts_seasadj, main="Seasonal Adjusted Data with ACF and PACF plots")

Ясно, что мы видим, что данные с поправкой на сезонность не являются стационарными. Давайте дважды проверим с помощью теста KPSS unit root:

TA.ts_seasadj %>% ur.kpss() %>% summary()
####################### 
# KPSS Unit Root Test # 
####################### 
 
> Test is of type: mu with 3 lags. 
 
> Value of test-statistic is: 2.2591 
 
> Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
> critical values 0.347 0.463  0.574 0.739

Значение тестовой статистики намного превышает 1% критического значения. Это означает, что сигнал не является стационарным. Для этого мы применим полезное преобразование, называемое дифференцированием. «Дифференциация может помочь стабилизировать среднее значение временного ряда, удаляя изменения в уровне временного ряда и, следовательно, устраняя (или уменьшая) тенденцию и сезонность» *.

TA.ts_seasadj %>% diff() -> TA.ts_diff
ggtsdisplay(TA.ts_diff, main="Differencing Seasonal Adjusted Data with ACF and PACF plots")

Несколько значительных лагов на графике ACF и PACF помогут нам определить значения p и q для AR и MA. Но в целом сигнал выглядит стационарным, давайте еще раз подтвердим с помощью теста KPSS unit root:

TA.ts_diff %>% ur.kpss() %>% summary()
####################### 
# KPSS Unit Root Test # 
#######################
> Test is of type: mu with 3 lags.
> Value of test-statistic is: 0.0547
> Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
> critical values 0.347 0.463  0.574 0.739

значение test-statistics меньше 10% критического значения, что означает, что данные являются стационарными. Это означает, что одного разностного преобразования достаточно для получения стационарных данных. Давайте оценим и сравним несколько моделей ARIMA - ARIMA (0,1,2), ARIMA (1,1,2) и ARIMA (1,1,1):

# ARIMA(0,1,2)
summary(Arima (TA.ts_seasadj, order= c(0,1,2)))
> Series: TA.ts_seasadj 
> ARIMA(0,1,2)
> Coefficients:
>          ma1      ma2
>       -0.4453  -0.2117
> s.e.   0.0999   0.0937
> sigma^2 estimated as 1.459e+09:  log likelihood=-1136.32
> AIC=2278.64   AICc=2278.9   BIC=2286.3
> Training set error measures:
>                 ME     RMSE      MAE       MPE     MAPE      MASE        ACF1
> Training set 8044.3 37593.57 29865.46 0.3906696 1.586877 0.5389833 -0.05881525

# ARIMA(1,1,2)
summary(Arima (TA.ts_seasadj, order= c(1,1,2)))
> Series: TA.ts_seasadj 
> ARIMA(1,1,2) 
 
> Coefficients:
>          ar1      ma1      ma2
>      -0.0782  -0.3745  -0.2516
> s.e.   0.3092   0.2901   0.1742
 
> sigma^2 estimated as 1.474e+09:  log likelihood=-1136.29
> AIC=2280.58   AICc=2281.02   BIC=2290.8
 
> Training set error measures:
>                   ME     RMSE      MAE      MPE     MAPE      MASE       ACF1
> Training set 7978.19 37581.15 29927.57 0.387108 1.589947 0.5401043 -0.0523739

# ARIMA(1,1,1)
summary(Arima (TA.ts_seasadj, order= c(1,1,1)))
> Series: TA.ts_seasadj 
> ARIMA(1,1,1)
> Coefficients:
>         ar1      ma1
>       0.2644  -0.7487
> s.e.  0.1427   0.0907
> sigma^2 estimated as 1.477e+09:  log likelihood=-1136.91
> AIC=2279.82   AICc=2280.08   BIC=2287.48
> Training set error measures:
>                    ME     RMSE      MAE       MPE     MAPE      MASE       ACF1
> Training set 8057.644 37831.55 29899.12 0.3908637 1.589457 0.5395909 -0.019330

ARIMA (0,1,2) является лучшим, потому что квадратные ошибки намного ниже, чем значения коэффициентов. Кроме того, он имеет самые низкие значения AIC, BIC и меры ошибок, такие как RMSE. Подберем выбранную модель, проверим остатки и сделаем прогноз на 12 месяцев:

fit_TA.ts <- Arima (TA.ts_seasadj, order= c(0,1,2))
checkresiduals(fit_TA.ts, lag = 10)
> Ljung-Box test
 
> data:  Residuals from ARIMA(0,1,2)
> Q* = 7.0949, df = 8, p-value = 0.5264
 
> Model df: 2.   Total lags used: 10

Остатки почти нормально распределены, слегка искажены. ACF не показывает значимых значений, кроме лага 12. Тест Люнга-Бокса со значительными p-значениями делает вывод, что остатки являются случайными (белый шум).

Прогноз на 12 месяцев, с августа 2018 г. по июль 2019 г .:

frcst_TA.ts = forecast (fit_TA.ts, h=12)
plot(frcst_TA.ts)

После многих итераций я оценил значения сезонной части (P, D, Q) как (1,1,1). Далее будет соответствовать, оценивать и прогнозировать сезонную модель ARIMA:

fit.seas_TA.ts <- Arima (TA.ts, order= c(0,1,2), seasonal=c(1,1,1))
summary(fit.seas_TA.ts)
> Series: TA.ts 
> ARIMA(0,1,2)(1,1,1)[12] 
 
> Coefficients:
>           ma1      ma2     sar1     sma1
>       -0.5537  -0.2862  -0.3102  -0.6428
> s.e.   0.1050   0.1036   0.1416   0.1891
 
> sigma^2 estimated as 1.741e+09:  log likelihood=-1005.48
> AIC=2020.96   AICc=2021.74   BIC=2033.06
 
> Training set error measures:
>                    ME     RMSE      MAE       MPE     MAPE      MASE
> Training set 3386.278 37856.27 28465.13 0.1337672 1.513877 0.5137116
>                      ACF1
> Training set -0.009264586

Все квадратные ошибки намного ниже абсолютного значения коэффициентов. AIC и BIC ведут себя лучше, чем несезонная модель ARIMA (0,1,2). Опять же, нам нужно убедиться, что остатки случайны и неструктурированы:

checkresiduals(fit.seas_TA.ts)
> Ljung-Box test
 
> data:  Residuals from ARIMA(0,1,2)(1,1,1)[12]
> Q* = 23.202, df = 20, p-value = 0.279
 
> Model df: 4.   Total lags used: 24

Распределение гистограммы немного искажено, но все же модель проходит тест Льюнга-Бокса. p-значение является значительным, и на графике ACF нет значительных лагов. Таким образом, теперь у нас есть сезонная модель ARIMA, которая прошла проверку и готова для прогнозирования. Прогнозы модели на следующий год показаны ниже:

frcs.seas_TA.ts <- forecast (fit.seas_TA.ts, h=12)
summary(frcs.seas_TA.ts)
> Forecast method: ARIMA(0,1,2)(1,1,1)[12]
 
> Model Information:
> Series: TA.ts 
> ARIMA(0,1,2)(1,1,1)[12] 
 
> Coefficients:
>           ma1      ma2     sar1     sma1
>       -0.5537  -0.2862  -0.3102  -0.6428
> s.e.   0.1050   0.1036   0.1416   0.1891
 
> sigma^2 estimated as 1.741e+09:  log likelihood=-1005.48
> AIC=2020.96   AICc=2021.74   BIC=2033.06
 
> Error measures:
>                    ME     RMSE      MAE       MPE     MAPE      MASE
> Training set 3386.278 37856.27 28465.13 0.1337672 1.513877 0.5137116
>                      ACF1
> Training set -0.009264586
 
> Forecasts:
>          Point Forecast   Lo 80   Hi 80   Lo 95   Hi 95
> Aug 2018        2021727 1968205 2075248 1939872 2103581
> Sep 2018        2014485 1955875 2073094 1924849 2104121
> Oct 2018        2070211 2010979 2129444 1979623 2160800
> Nov 2018        1990520 1930671 2050369 1898988 2082052
> Dec 2018        2024607 1964148 2085067 1932142 2117072
> Jan 2019        1981844 1920780 2042907 1888455 2075233
> Feb 2019        1880516 1818854 1942178 1786212 1974820
> Mar 2019        2139569 2077315 2201824 2044359 2234780
> Apr 2019        2036234 1973392 2099076 1940126 2132342
> May 2019        2161701 2098278 2225124 2064703 2258698
> Jun 2019        2092552 2028553 2156552 1994674 2190431
> Jul 2019        2175445 2110872 2240018 2076689 2274200

График 12-месячного прогноза ARIMA (0,1,2) (1,1,1) [12]:

plot(frcs.seas_TA.ts)

С другой стороны, мы можем просто использовать auto.arima () для выполнения большей части работы. Это даст следующий результат:

fit_TA = auto.arima(TA.ts, max.p=5, max.q=5,
                   max.P=2 , max.Q=2, max.order=5, max.d=2, max.D=2, 
                   start.p=0, start.q=0, start.P=0, start.Q=0)
frcst_TA = forecast(fit_TA, h=12)
summary(frcst_TA)
> Forecast method: ARIMA(1,0,0)(1,1,1)[12] with drift
> Model Information:
> Series: TA.ts 
> ARIMA(1,0,0)(1,1,1)[12] with drift
> Coefficients:
>          ar1     sar1     sma1      drift
>       0.4134  -0.2152  -0.7774  2753.7605
> s.e.  0.1001   0.1514   0.2567   225.8097
> sigma^2 estimated as 1.667e+09:  log likelihood=-1016.63
> AIC=2043.26   AICc=2044.03   BIC=2055.41
> Error measures:
>                     ME     RMSE      MAE        MPE     MAPE      MASE
> Training set -1930.433 37268.02 28165.95 -0.1540752 1.507049 0.5083123
>                    ACF1
> Training set 0.01430932
> Forecasts:
>          Point Forecast   Lo 80   Hi 80   Lo 95   Hi 95
> Aug 2018        2015362 1962792 2067932 1934963 2095761
> Sep 2018        1997133 1940272 2053995 1910171 2084096
> Oct 2018        2044986 1987423 2102549 1956951 2133021
> Nov 2018        1958307 1900624 2015989 1870089 2046524
> Dec 2018        1994969 1937266 2052671 1906720 2083217
> Jan 2019        1949321 1891615 2007027 1861067 2037575
> Feb 2019        1857882 1800176 1915589 1769627 1946137
> Mar 2019        2115227 2057520 2172934 2026972 2203482
> Apr 2019        2015541 1957834 2073247 1927286 2103795
> May 2019        2131158 2073452 2188864 2042904 2219412
> Jun 2019        2066159 2008456 2123863 1977909 2154410
> Jul 2019        2147445 2089755 2205135 2059215 2235674

Постройте 12-месячный прогноз ARIMA (1,0,0) (1,1,1) [12]:

plot(frcst_TA)

Сводка прогнозов

В конце, давайте объединим все результаты прогнозирования с помощью Seasonal Naive, Linear Regressing, ARIMA (0,1,2) (1,1,1) и Auto ARIMA (1,0,0) (1,1,1) в один фрейм данных с именем summary.ts, а затем выполните построение графика:

summary.ts
>    Seas.Naive	Linear.Reg	ARIMA	Auto.ARIMA
> Aug-18	1924663	1990708	2021727	2015362
> Sep-18	1925961	1984479	2014485	1997133
> Oct-18	2044137	2045357	2070211	2044986
> Nov-18	1976971	1957509	1990520	1958307
> Dec-18	2003954	1997633	2024607	1994969
> Jan-19	2000086	1957718	1981844	1949321
> Feb-19	1820012	1860605	1880516	1857882
> Mar-19	2049785	2113073	2139569	2115227
> Apr-19	1978084	2022652	2036234	2015541
> May-19	2161779	2137346	2161701	2131158
> Jun-19	2091318	2073922	2092552	2066159
> Jul-19	2176022	2153840	2175445	2147445

— — -

summary(summary.ts)
>       Seas.Naive        Linear.Reg          ARIMA           Auto.ARIMA     
> Min.   :1820012   Min.   :1860605   Min.   :1880516   Min.   :1857882  
> 1st Qu.:1964219   1st Qu.:1977789   1st Qu.:2008494   1st Qu.:1985803  
> Median :2002020   Median :2010143   Median :2030421   Median :2015451  
> Mean   :2012731   Mean   :2024570   Mean   :2049118   Mean   :2024458  
> 3rd Qu.:2060168   3rd Qu.:2083709   3rd Qu.:2104307   3rd Qu.:2078426  
> Max.   :2176022   Max.   :2153840   Max.   :2175445   Max.   :2147445

Ссылки

На самом деле, я прочитал много статей, чтобы попрактиковаться в анализе временных рядов. В конце концов, самым полезным из них было: «Прогнозирование: принципы и практика». Книга Роба Дж. Хайндмана (автор), Джорджа Атанасопулоса (автор).

Кроме того, мне очень помогли курс и сертификат от Microsoft (прикладное машинное обучение). Помимо ценной информации об анализе временных рядов, были и практические занятия.