Введение:
Цель этого проекта - анализировать и прогнозировать данные в реальном времени. Отчеты и набор данных были взяты с веб-сайта 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 (прикладное машинное обучение). Помимо ценной информации об анализе временных рядов, были и практические занятия.