1 MODELO ARIMA

  • Un modelo autorregresivo integrado de promedio movil o ARIMA es un modelo estadistico que utiliza variaciones y regresiones de datos estadisticos con el fin de encontrar patrones para una prediccion hacia el futuro. Se trata de un modelo dinamico de series temporales, es decir, las estimaciones futuras vienen explicadas por los datos del pasado y no por variables independientes.

2 CUESTIONES IMPORTANTES A TENER EN CUENTA

  • 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.

3 PROCESO DEL MODELO

  • 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
  • Primero importamos y analizamos las variables que tenemos
BaseDatos <- read_excel("C:\\Users\\lzavalaga\\Desktop\\Luis\\Proyecto_ Modelo_ Predictivo_Estilos_Ventas\\BaseDatos.xlsx")
BaseDatos
  • Tranformamos lo valores de la lista a un objeto de serie temporal, desde el año 2017-Enero hasta 2022-Octubre.Los valores estan en miles
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
  • Analizamos visualmente la serie temporal
# Plot the series
ts_plot(VentasNetas,
        title = "Ventas Netas 2017 Ene-2022 Octubre",
        Ytitle = "Miles de soles",
        Xtitle = "Años", 
        slider = TRUE)
  • Descomponemos la serie temporal
ts_decompose(VentasNetas)
  • Observamos un analisis estacional
ts_seasonal(VentasNetas, type = "all")
  • Observamos el componente estacional sin tendencia
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
  • Ploteamos un gráfico de calor
ts_heatmap(VentasNetas)
  • Analizamos e identificamos el nivel de correlación entre la serie y sus retrasos, utilizando la función ts_cor una interfaz interactiva para la función.
ts_cor(VentasNetas)
ts_lags(VentasNetas)
V_df <- ts_to_prophet(VentasNetas) 
head(V_df)
  • Transformamos las series en training Y test
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)
  • Visualizamos los valores ajustados frente a los valores de partición de entrenamiento
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
  • Revisamos el comportamiento del modelo
# Actual vs Forecast vs Test

test_forecast(forecast.obj = fc1, actual = VentasNetas, test = test) %>% 
  layout(legend = list(x = 0.6, y = 0.95))
  • Evaluación de residuos del Modelo 1 SARIMA
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))
  • Valores finales de las ventas Netas proyectadas
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

4 CONCLUSIONES

  • El modelo Arima logra capturar la tendencia mensual, lo cual nos permite tener un mejor modelo(BIC)
  • El Modelo que logra mejor precision es el ARIMA(1,0,2)(1,1,0)(12)
  • El Modelo cumple a cabalidad con un supuesto ya que los residuos son independientes
  • Se recomienda realizar el modelaje Arima para series mensuales y anuales con data mayor a 75 datos.