Para definir un modelo ARIMA, debemos tener en cuenta que los datos deben ser estacionarios,es decir cuando su distribucion y sus parametros no varian con el tiempo.
Otra cuestion para tener en cuenta es que los datos deben ser univariantes, ARIMA trabaja en una sola variable.
La regresion automatica tiene que ver con los valores pasados, es decir necesitamos un historico de los datos para poder realizar el modelo y asi predecir datos futuros.
Comenzamos cargando las librerias previamente instaladas, que nos hacen falta para ejecutar el modelo tal como “tidyverse” para realizar transformaciones en general de nuestro conjunto de datos, ademas de otras funciones asociadas ,“readxl” para leer los datos de un archivo excel, “lubridate” para hacer transformaciones en un campo fecha, y forecast que es una libreria empleada para pronosticos de series de tiempo
Librerias utilizadas
library(dplyr) #Libreria utilizada para manipulacion de datos
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyverse) #libreria que ayuda en el proceso de importar transformar, visualiza,r modelar y comunicar toda la información que normalmente utilizamos en procesos de ciencia de datos.
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2
## ──
## ✔ ggplot2 3.4.1 ✔ purrr 1.0.1
## ✔ tibble 3.1.8 ✔ stringr 1.5.0
## ✔ tidyr 1.3.0 ✔ forcats 1.0.0
## ✔ readr 2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(readxl) #libreria utilizada para importar archivos xls (excel)
library(forecast) #Libreria utlizada para realizar pronósticos de series temporales
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(tseries) #Libreria utilizada para trabajar con series temporales
library(tsoutliers) #Libreria utlizada para encontrar outliers
library(TSstudio) #Libreria utilizada para graficas series temporales
library(plotly) #Libreria para plotear
##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
library(lubridate) #Libreria para manejo de fechas
##
## Attaching package: 'lubridate'
##
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
BaseDatos <- read_excel("C:\\Users\\lzavalaga\\Desktop\\Luis\\Proyecto_ Modelo_ Predictivo_Estilos_Ventas\\BaseDatos.xlsx")
BaseDatos
VentasNetas=ts(BaseDatos,freq=12,start=c(2017,1))
VentasNetas
## Jan Feb Mar Apr May Jun
## 2017 16698.7879 16978.4731 19338.0359 18424.7988 22048.4784 19136.4312
## 2018 17484.3815 18343.9238 23558.3121 21448.4126 26802.3510 27773.7811
## 2019 19192.3784 20635.0110 23899.8117 21242.4131 27672.7472 25289.6419
## 2020 20541.3095 22815.7991 11669.2515 224.1678 2189.4365 5401.2221
## 2021 21366.0017 10025.9816 25274.3703 16675.4814 21819.8292 21390.5762
## 2022 18387.5252 18850.5117 23773.5039 20585.7454 24065.8216 24342.2879
## Jul Aug Sep Oct Nov Dec
## 2017 22980.2103 20194.3969 18414.0499 18104.4641 18499.2845 38484.9820
## 2018 24204.7908 22882.4775 20557.0634 21562.8139 21363.8053 43457.2501
## 2019 26125.2888 22961.2811 21542.7927 22566.2272 23860.9213 46378.8805
## 2020 11372.7421 12103.6804 15346.1077 18951.8942 19915.1936 37480.1207
## 2021 25727.4782 23380.2587 21335.2588 21201.6881 20776.5213 38318.1140
## 2022 25796.7729 21819.5890 19574.2863 21952.7176
# Plot the series
ts_plot(VentasNetas,
title = "Ventas Netas 2017 Ene-2022 Octubre",
Ytitle = "Miles de soles",
Xtitle = "Años",
slider = TRUE)
ts_decompose(VentasNetas)
ts_seasonal(VentasNetas, type = "all")
ts_seasonal(VentasNetas - decompose(VentasNetas)$trend,
type = "all",
title = "Seasonal Plot - Ventas Netas (sin tendencia)")
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 2 observations
## Warning: Ignoring 2 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
## Warning: Ignoring 1 observations
ts_heatmap(VentasNetas)
ts_cor(VentasNetas)
ts_lags(VentasNetas)
V_df <- ts_to_prophet(VentasNetas)
head(V_df)
V_df$flag <- ifelse(year(V_df$ds) >= 2020, 1, 0)
h1 <- 5
h2 <- 65
V_split <- ts_split(VentasNetas, sample.out = h1)
train <- V_split$train
test <- V_split$test
train_df <- V_df[1:(nrow(V_df) - h1), ]
test_df <- V_df[(nrow(V_df) - h1 + 1):nrow(V_df), ]
set.seed(1234)
md1 <- auto.arima(train,
stepwise = FALSE,
approximation = FALSE,
D = 1)
fc1 <- forecast(md1, h = h1)
accuracy(fc1, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 141.5693 3843.061 2357.393 -89.168383 101.328231 0.3877995
## Test set -1159.9764 1392.853 1159.976 -5.407168 5.407168 0.1908202
## ACF1 Theil's U
## Training set 0.03672543 NA
## Test set -0.08098469 0.5981323
# Actual vs Forecast vs Test
test_forecast(forecast.obj = fc1, actual = VentasNetas, test = test) %>%
layout(legend = list(x = 0.6, y = 0.95))
check_res(md1)
## Warning: Ignoring 36 observations
## Warning: Ignoring 34 observations
## Warning: Ignoring 4 observations
Pasamos a continuacion a elaborar el modelo de pronostico ARIMA, con la funcion auto.arima. la funcion auto.arima esta diseñada para una estimacion rapida del modelo ARIMA probando varias series de tiempo.
La funcion auto.arima, realiza la funcion ARIMA de forma automatica, va a ir iterando, va a ir buscando el modelo que mas se ajusta a los datos, y nos da respuesta del mejor modelo, como puede verse al ejecutar el print del mismo. El resultado despues de sucesivas iteraciones, se queda con el modelo que tuvo el menor valor de AIC.
#Pronostico de las ventas para 12 meses posteriores
md_final <- auto.arima(VentasNetas,
stepwise = FALSE,
approximation = FALSE,
D = 1)
fc_final <- forecast(md_final, h = 12)
plot_forecast(fc_final) %>%
layout(legend = list(x = 0.6, y = 0.95))
fc_final
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Nov 2022 21141.73 15738.394 26545.07 12878.0393 29405.43
## Dec 2022 39095.50 32396.531 45794.47 28850.3108 49340.69
## Jan 2023 20797.58 12201.978 29393.18 7651.7432 33943.41
## Feb 2023 14649.47 5345.873 23953.06 420.8492 28878.08
## Mar 2023 24933.56 15337.050 34530.06 10256.9660 39610.15
## Apr 2023 18720.86 8999.155 28442.56 3852.7976 33588.91
## May 2023 23014.93 13239.046 32790.82 8064.0026 37965.87
## Jun 2023 22860.07 13060.603 32659.54 7873.0782 37847.06
## Jul 2023 25827.20 16017.452 35636.95 10824.4830 40829.92
## Aug 2023 22702.09 12887.846 32516.33 7692.5013 37711.67
## Sep 2023 20549.15 10732.954 30365.35 5536.5718 35561.74
## Oct 2023 21569.08 11752.021 31386.13 6555.1856 36582.97