#Cargar la serie de tiempo de la venta de sodas (refrescos) en notación científica o formato general. Existen varias maneras de cargar la serie, puede ser crear manualmente el vector como en este caso, o bien cargar la serie desde un archivo creado en excel o CSV, revisar el tema de exportación e importación de archivos en R. Cuando la serie es muy grande, es muy útil usar los recursos de importanción de archivos. En este ejemplo, el ventor “ventas” contiene el registro de ventas mensuales de enero 2017 a agosto 2020 de la productora de bebidas.

ventas<-c(7.744,7.892,9.073,9.691,10.582,10.370,9.815,9.843,9.649,9.317,8.778,9.790,8.299,7.664,9.164,9.139,10.676,10.475,9.248,10.048,9.187,9.018,9.533,9.857,8.258,8.032,9.943,10.168,11.437,10.615,10.223,10.709,9.036,9.261,9.092,9.818,8.231,8.350,9.856,9.961,11.327,10.527,10.360,10.461)

#Con la siguiente función se despliega en el scrip la serie de tiempo de ventas de sodas, la cual inicia en enero de 2017 y termina en agosto de 2021.

ventas
##  [1]  7.744  7.892  9.073  9.691 10.582 10.370  9.815  9.843  9.649  9.317
## [11]  8.778  9.790  8.299  7.664  9.164  9.139 10.676 10.475  9.248 10.048
## [21]  9.187  9.018  9.533  9.857  8.258  8.032  9.943 10.168 11.437 10.615
## [31] 10.223 10.709  9.036  9.261  9.092  9.818  8.231  8.350  9.856  9.961
## [41] 11.327 10.527 10.360 10.461

#Instalar y cargar las librerías o paquetes “forecast”,“tseries”, y “TSPred”, estas paqueterías contienen un sin número de funciones para el análisis de series de tiempo.

#install.packages("tseries")
#install.packages("forecast")
#install.packages("TSPred")
library(forecast)
## Warning: package 'forecast' was built under R version 4.0.5
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tseries)
library(TSPred)
## 
## Attaching package: 'TSPred'
## The following object is masked from 'package:base':
## 
##     subset

#Generar con el siguiente código la serie de tiempo con frecuencia 12 (mensual).

ts.ventas=ts(ventas, frequency =12, start=c(2017,1), end = c(2021,8))

#Graficar la serie de tiempo con la función “plot”. Se onserva una estacionalidad muy marcada, existen picos de venta en ek mes de mayo y valles en los meses de enero y febrero.

plot(ts.ventas)

#Generar una tabla (data frame) con los datos de la serie de tiempo de la venta de sodas. Visualmente podemos obervar los números para un analisis exploratorio.

ts.ventas
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
## 2017  7.744  7.892  9.073  9.691 10.582 10.370  9.815  9.843  9.649  9.317
## 2018  8.299  7.664  9.164  9.139 10.676 10.475  9.248 10.048  9.187  9.018
## 2019  8.258  8.032  9.943 10.168 11.437 10.615 10.223 10.709  9.036  9.261
## 2020  8.231  8.350  9.856  9.961 11.327 10.527 10.360 10.461  7.744  7.892
## 2021 10.582 10.370  9.815  9.843  9.649  9.317  8.778  9.790              
##         Nov    Dec
## 2017  8.778  9.790
## 2018  9.533  9.857
## 2019  9.092  9.818
## 2020  9.073  9.691
## 2021

#Comprobar la dimensión de la matriz o data frame de la base de datos: es de 56x1

dim(as.matrix(ts.ventas))
## [1] 56  1

#Se define una serie de tiempo de entrenamiento como diagnóstico para la eficiencia del modelo.

ventas.train=window(ts.ventas, start=c(2019,1), end=c(2021,8))
plot(ventas.train)

#Se crea una serie de tiempo más corta con fines de entrenamiento para proyectar, y así el sistema genere modelos propuestos con el mínimo error esperado.

ventas.train
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
## 2019  8.258  8.032  9.943 10.168 11.437 10.615 10.223 10.709  9.036  9.261
## 2020  8.231  8.350  9.856  9.961 11.327 10.527 10.360 10.461  7.744  7.892
## 2021 10.582 10.370  9.815  9.843  9.649  9.317  8.778  9.790              
##         Nov    Dec
## 2019  9.092  9.818
## 2020  9.073  9.691
## 2021
dim(as.matrix(ventas.train))
## [1] 32  1
ventas.test=window(ts.ventas, start=c(2019,1), end=c(2021,8))
plot(ventas.test)

#Se realiza una prueba para encontrar el mejor modelo, en este caso, con la serie de ventas de sodas el modelo que arroja el menor AIC es el modelo ARIMA(1,0,0) (0,1,0), este será el mejor modelo con fines de proyección en el corto y mediano plazo de la serie.

library(forecast)

arima1=auto.arima(ventas.train, trace=TRUE, test = "kpss",ic="bic" )
## 
##  ARIMA(2,0,2)(0,1,0)[12] with drift         : Inf
##  ARIMA(0,0,0)(0,1,0)[12] with drift         : 62.59738
##  ARIMA(1,0,0)(0,1,0)[12] with drift         : 58.58503
##  ARIMA(0,0,1)(0,1,0)[12] with drift         : 59.26101
##  ARIMA(0,0,0)(0,1,0)[12]                    : 60.41061
##  ARIMA(2,0,0)(0,1,0)[12] with drift         : 60.69405
##  ARIMA(1,0,1)(0,1,0)[12] with drift         : 61.20513
##  ARIMA(2,0,1)(0,1,0)[12] with drift         : Inf
##  ARIMA(1,0,0)(0,1,0)[12]                    : 55.91194
##  ARIMA(2,0,0)(0,1,0)[12]                    : 58.07764
##  ARIMA(1,0,1)(0,1,0)[12]                    : 58.5473
##  ARIMA(0,0,1)(0,1,0)[12]                    : 56.74207
##  ARIMA(2,0,1)(0,1,0)[12]                    : 55.94041
## 
##  Best model: ARIMA(1,0,0)(0,1,0)[12]

#Se obtiene el nivel de confianza (diagnóstico de residuales) del modelo con fines de proyección con el siguiente código:

summary(arima1)
confint(arima1)
##         2.5 %    97.5 %
## ar1 0.2011139 0.8982215

#Con el siguiente código se calculan los pronósticos puntuales y los intervalos de proyección (Lo, Hi) con un horizonte (h) de 16 meses, de septiembre 2020 a diciembre 2021. Ese horizonte pudiera ser más amplio, pero recordemos que mientras más largo el horizonte menos probable es la ocurrencia de ese pronóstico.

arima1.forecast=forecast(arima1, h=16)

arima1.forecast
##          Point Forecast    Lo 80     Hi 80    Lo 95     Hi 95
## Sep 2021       7.375173 6.276790  8.473556 5.695341  9.055005
## Oct 2021       7.689268 6.435890  8.942645 5.772392  9.606143
## Nov 2021       8.961565 7.664998 10.258132 6.978637 10.944493
## Dec 2021       9.629748 8.320412 10.939083 7.627291 11.632204
## Jan 2022      10.548332 9.235162 11.861501 8.540012 12.556651
## Feb 2022      10.351494 9.037168 11.665819 8.341406 12.361581
## Mar 2022       9.804828 8.490153 11.119502 7.794207 11.815448
## Apr 2022       9.837409 8.522629 11.152188 7.826626 11.848191
## May 2022       9.645927 8.331115 10.960738 7.635096 11.656757
## Jun 2022       9.315311 8.000489 10.630132 7.304465 11.326156
## Jul 2022       8.777071 7.462247 10.091896 6.766221 10.787921
## Aug 2022       9.789490 8.474665 11.104315 7.778638 11.800341
## Sep 2022       7.374892 5.661111  9.088674 4.753890  9.995895
## Oct 2022       7.689113 5.871942  9.506285 4.909990 10.468237
## Nov 2022       8.961480 7.114209 10.808751 6.136323 11.786637
## Dec 2022       9.629701 7.773432 11.485970 6.790783 12.468619

#Con el siguiente código se plasman visualmente en un gráfico los datos históricos y la proyección con un pronóstico puntual (Point Forecast y los intervalos de pronóstico en gris).

plot(arima1.forecast, xlab="Año", ylab="Venta de sodas (millones $))")

library(TSPred)

#Con el siguiente código se plasman visualmente en un gráfico los datos históricos y la proyección con un pronóstico puntual (Point Forecast y los intervalos de pronóstico en gris).

plotarimapred(ventas.test,arima1,xlim=c(2019,2022), range.percent = 0.05, ylab = "Venta de sodas (millones)",
xlab = "---- real  ____ proyección")

arima1.forecast=forecast(arima1, h=16)

arima1.forecast
##          Point Forecast    Lo 80     Hi 80    Lo 95     Hi 95
## Sep 2021       7.375173 6.276790  8.473556 5.695341  9.055005
## Oct 2021       7.689268 6.435890  8.942645 5.772392  9.606143
## Nov 2021       8.961565 7.664998 10.258132 6.978637 10.944493
## Dec 2021       9.629748 8.320412 10.939083 7.627291 11.632204
## Jan 2022      10.548332 9.235162 11.861501 8.540012 12.556651
## Feb 2022      10.351494 9.037168 11.665819 8.341406 12.361581
## Mar 2022       9.804828 8.490153 11.119502 7.794207 11.815448
## Apr 2022       9.837409 8.522629 11.152188 7.826626 11.848191
## May 2022       9.645927 8.331115 10.960738 7.635096 11.656757
## Jun 2022       9.315311 8.000489 10.630132 7.304465 11.326156
## Jul 2022       8.777071 7.462247 10.091896 6.766221 10.787921
## Aug 2022       9.789490 8.474665 11.104315 7.778638 11.800341
## Sep 2022       7.374892 5.661111  9.088674 4.753890  9.995895
## Oct 2022       7.689113 5.871942  9.506285 4.909990 10.468237
## Nov 2022       8.961480 7.114209 10.808751 6.136323 11.786637
## Dec 2022       9.629701 7.773432 11.485970 6.790783 12.468619

#Con el siguiente código se plasman visualmente en un gráfico los datos históricos y la proyección con un pronóstico puntual (Point Forecast y los intervalos de pronóstico en gris).

plot(arima1.forecast)

#Con estos resultados de proyección la productora de sodas podrá partir de una base sólida de pronóstico (base line) e integrar otras variables cuantitativas y cualitativas a través de su S&OP para armar un plan de demanda integro y funcional para la toma de decisiones, este proceso se debe repetir religiosamente cada mes a la luz de nuevos datos. Aquí se demuestra la utilidad invaluable de este tipo de herramientas para la analítica de datos en general y para fines de proyección en particular.

#Elaboración propia