Modelo de pronóstico para Ventas en Volumen en R


Pronóstico de Ventas en R



Contenido

Descripción

El siguiente entrenamiento es una traducción del trabajo de Rami Krispin (2019), Time Series Analysis and Forecasting with the TSstudio Package; con una base de datos distinta. Se utilizará la librería TSstudio (Versión 0.1.6) para realizar  exploración de datos y elaborar pronósticos a través de los modelos ARIMA, SARIMA, ETS y TSLM. Para completar el entrenamiento, se visualizarán los resultados en gráficos interactivos que permiten tener un acercamiento directo a los datos y al detalle, además se podrá realizar observaciones en las distintas regiones de la serie. Los datos utilizados pertenecen a las ventas en volumen (unidades) de una cadena de tiendas al detal en Venezuela para el período 2014-2019.

TSstudio

El paquete a utilizar será TSstudio el cual proporciona una serie de herramientas potentes para el análisis descriptivo y predictivo en datos de tipo temporal. Incluye funciones de preprocesamiento de datos para series temporales, visualizaciones interactivas de la librería plotly, así como configuraciones de herramientas para entrenar y evaluar en un ambiente dinámico modelos de pronósticos, contiene las funciones de forecast, forecast hybrid y bsts.

1. Data

La serie temporal está compuesta por los datos de ventas en volumen de una cadena de tiendas al detal con presencia en las principales ciudades de Venezuela, a la que denominaremos empresa “X”. El período seleccionado para el entrenamiento será 2014-2019 y para los pronósticos un horizonte a 12 meses.

El comportamiento de los datos se analizará bajo la perspectiva de la economía venezolana. Según datos de la CEPAL [2], al cierre del 2019 la economía tuvo una contracción en su Producto Interior Bruto (PIB) del 25%, el acumulado desde el 2013 al 2019 totalizó un decrecimiento del 62%. En la esfera monetaria, se diagnosticó hiperinflación a finales del 2017, en ese sentido, el INPC anualizado a septiembre del 2019 se ubicó en 39.113%. 

Finalmente, en dicho informe, se estimó una fuerte caída de los ingresos petroleros cercana al 36% con respecto al 2018. En la esfera cambiaria,  se espera una depreciación del tipo de cambio de 4.900%. 

Para completar la escena, el país se caracteriza por inestabilidad social y política en conjunto con fuertes sanciones financieras externas que limitan el margen de maniobra del Estado. Todo esto como telón de fondo para ubicar a la empresa “X” en un mercado atomizado con presencia de nichos de diferenciación oligopólica.  



library(TSstudio)
Vol<-ts(datax,start=c(2014,1),frequency=12)
ts_plot(Vol,
        title = "Ventas en Volumen Empresa X 2014-2019",
        Ytitle = "Unidades en miles",
        Xtitle = "Source: Empresa X Venezuela", 
        slider = TRUE)

2. Análisis exploratorio

El objetivo del análisis exploratorio es identificar las características clave de la serie con el uso de métodos de análisis descriptivo. 

En el entrenamiento buscamos detectar: 

Esta información proporciona una amplia comprensión del pasado y puede utilizarse para pronosticar el futuro. En el caso particular de Venezuela es complejo realizar pronósticos a largo plazo por la naturaleza misma del hábitat económico o entorno que rodea a los datos, lo que representa un reto extra para elaboración de estimaciones.

3. Descomposición de la serie

Los tres componentes principales de toda serie de tiempo son: los componentes de tendencia, estacionales y aleatorios. La función ts_decompose proporciona una inferencia interactiva para la función de descomposición. A menudo, esto se usa para ayudar a mejorar la comprensión en series de tiempo, pero también se puede usar para mejorar la precisión del pronóstico. 
ts_decompose(Vol)

4. Análisis estacional:


Se puede observar tanto en la serie como en los gráficos de descomposición, que la serie tiene un patrón estacional fuerte junto con una tendencia no lineal. Se utilizarán las funciones ts_seasonal y ts_heatmap para explorar el patrón estacional de la serie:

En el gráfico se podrá verificar lo observado en la descomposición de la serie. Un fuerte componente estacional y una tendencia no lineal. La función Ts_seasonal proporciona tres vistas diferentes de la estacionalidad de la serie:

Componente estacional:

ts_seasonal(Vol, type = "all")

Componente estacional sin tendencia

ts_seasonal(Vol - decompose(Vol)$trend, 
            type = "all", 
            title = "Seasonal Plot - Ventas en Volumen (sin tendencia)")

Componente estacional

Algunas observaciones son:

Añadiremos un mapa de calor para visualizar el patrón estacional desde otra perspectiva.

Mapa de calor

Un mapa de calor es una técnica de visualización de datos que muestra la magnitud de un fenómeno como color en dos dimensiones. Los colores intensos indican un valor más alto. En la gráfica se aprecia como el decrecimiento de las ventas se aceleró a partir del 2016.
ts_heatmap(Vol)

5. Análisis de correlación

El siguiente paso es identificar 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(Vol)
Se presume que la serie presenta una correlación con sus rezagos, es decir, dependencia entre ellos. Una forma más intuitiva de revisar la identificación de la relación entre la serie y sus rezagos es con la función ts_lags, veamos los gráficos que proporciona.


Serie versus rezagos I

ts_lags(Vol)
Al igual que con la función ts_cor, se puede observar que el rezago uno (1) y el dos (2) de la serie tiene una fuerte correlación lineal. Del mismo modo, podemos acercarnos a los rezagos estacionales de la serie utilizando el argumento de los retrasos:

Serie versus rezagos II

ts_lags(Vol, lags = c(12, 24, 36, 48))

6. Resumen de exploración y análisis

Puntos clave del análisis exploratorio:

7. Pronósticos de la serie 

Con todas las observaciones realizadas se diseñará un entrenamiento utilizando dos enfoques: El tradicional y el Backtesting. Seleccionando el que mejor se desempeñe en el conjunto de pruebas. 

Vol_df <- ts_to_prophet(Vol) 
head(Vol_df)
##           ds        y
## 1 2014-01-01 4890.608
## 2 2014-02-01 4630.269
## 3 2014-03-01 5062.862
## 4 2014-04-01 4776.355
## 5 2014-05-01 5015.127
## 6 2014-06-01 5344.647
library(lubridate)
Vol_df$flag <- ifelse(year(Vol_df$ds) >= 2016, 1, 0)
h1 <- 12 
h2 <- 60 
Vol_split <- ts_split(Vol, sample.out = h1)
train <- Vol_split$train
test <- Vol_split$test
train_df <- Vol_df[1:(nrow(Vol_df) - h1), ]
test_df <- Vol_df[(nrow(Vol_df) - h1 + 1):nrow(Vol_df), ]
set.seed(1234)
library(forecast)
library(plotly)
md1 <- auto.arima(train, 
                  stepwise = FALSE, 
                  approximation = FALSE,
                  D = 1)

8. Enfoque Tradicional

Práctica con tres enfoques de pronósticos:

Se recomienda diversificar el enfoque de modelado. El rendimiento de los modelos puede cambiar según la estructura de datos y los parámetros de ajuste. Se divide la serie en particiones de entrenamiento y prueba.

Información de entrenamiento (training) y prueba (test)

Training

El modelo se ajusta a los cambios en la tendencia pero no logra capturar los picos estacionales. La tasa de error (MAPE) en el conjunto de prueba (test) es más del doble que la del conjunto de entrenamiento (43%) (training). Posible sobreajuste.

fc1 <- forecast(md1, h = h1)
accuracy(fc1, test)
##                      ME    RMSE      MAE        MPE     MAPE
## Training set  -82.13979 556.855 383.9783  -2.608326 13.84001
## Test set     -392.41103 435.644 392.4110 -43.645006 43.64501
##                   MASE       ACF1 Theil's U
## Training set 0.2263472 -0.0493298        NA
## Test set     0.2313181  0.1821370  3.161741

Modelo SARIMA

test_forecast(forecast.obj = fc1, actual = Vol, test = test) %>% 
  layout(legend = list(x = 0.6, y = 0.95))

Modelo 2 ETS Training

md2 <- ets(train, opt.crit = "mse")
fc2 <- forecast(md2, h = h1)
accuracy(fc2, test)
##                      ME     RMSE      MAE        MPE     MAPE
## Training set  -61.40921 506.7398 365.2970  -3.409075 11.90957
## Test set     -717.56487 757.7077 717.5649 -88.479636 88.47964
##                   MASE        ACF1 Theil's U
## Training set 0.2153350 -0.03604148        NA
## Test set     0.4229895  0.69697855  6.156051

Modelo 2 ETS Gráfica

test_forecast(forecast.obj = fc2, actual = Vol, test = test) %>% 
  layout(legend = list(x = 0.6, y = 0.95))

Modelo 3 TSLM Training


No captura los picos ni la estructura de tendencia. Resultado del manejo de errores por encima del SARIMA, el TSLM obtiene una tasa de error alta del 85% en el conjunto de pruebas.
Aplicaremos la ruptura estructural agregando la variable flag que preparamos antes.

##                         ME      RMSE      MAE       MPE     MAPE
## Training set -3.881386e-15 1069.5895 858.5997 -7.580223 26.88832
## Test set      8.132139e+02  877.8898 813.2139 85.610982 85.61098
##                   MASE      ACF1 Theil's U
## Training set 0.5061266 0.8757935        NA
## Test set     0.4793727 0.5699836  6.143616

Modelo 3 TSLM Gráfica

 Modelo 4 TSLM con Flag -Training-

Sigue por encima de los valores del modelo SARIMA. Aplicaremos en el próximo modelo una regresión polinómica elevando al cuadrado la tendencia.
##                         ME     RMSE      MAE        MPE     MAPE
## Training set  4.551406e-14 884.0708 697.6263  -6.503608 20.34271
## Test set     -4.156753e+02 531.1869 415.6753 -54.033866 54.03387
##                   MASE      ACF1 Theil's U
## Training set 0.4112362 0.7131667        NA
## Test set     0.2450319 0.5699836  3.831884

Modelo 4 TSLM Gráfica

 Modelo 5 TSLM Training -Polinómico-

Manejo de errores por encima de todos los anteriores. Se selecciona el modelo 1 SARIMA y evaluaremos los residuos

.

##                        ME     RMSE       MAE        MPE      MAPE
## Training set 1.515778e-13 1066.328  860.3846  -7.377058  28.18054
## Test set     1.127234e+03 1197.111 1127.2340 119.660207 119.66021
##                   MASE      ACF1 Theil's U
## Training set 0.5071788 0.8794995        NA
## Test set     0.6644810 0.6325127    8.3801

Modelo 5 TSLM Gráfica -Polinómico-

Evaluación de residuos del Modelo 1 SARIMA

Evaluación de residuos SARIMA


Se observa en el correlograma que se logra el decrecimiento de los órdenes del polinomio puro, con alternancia de valores positivos y negativos. Estabilizado en media, y una distribución de errores que no es normal. Del mismo modo, queda correlación entre los rezagos de los residuos de la serie. Se podrían utilizar otros regresores para optimizar el modelo. No obstante, por razones de tiempo en el taller seguiremos con el SARIMA como ejemplo.

Para finalizar con el enfoque tradicional se realizarán los pronósticos para 12 meses del modelo SARIMA con intérvalos de confianza del 80% y 95%.

Pronósticos del modelo SARIMA

9. Enfoque Backtesting

La ventaja del enfoque backtesting sobre el enfoque tradicional, es que proporciona una visión general del rendimiento de cada modelo. Permite identificar, además de la precisión, la estabilidad del rendimiento del modelo en distintas particiones temporales. Es un tipo especial de validación cruzada.
## # A tibble: 5 x 7
##   model_id model notes avg_mape avg_rmse `avg_coverage_8~
##   <chr>    <chr> <chr>    <dbl>    <dbl>            <dbl>
## 1 Sarima   arima SARI~    0.325     460.            0.986
## 2 ets2     ets   ETS ~    0.573     678.            0.75 
## 3 ets1     ets   ETS ~    0.587     694.            0.694
## 4 tslm     tslm  tslm~    0.602     748.            1    
## 5 arima1   arima ARIM~    0.944    1101.            0.889
## # ... with 1 more variable: `avg_coverage_95%` <dbl>

Backtesting Gráfica

Resultados de búsqueda

Resultado web con enlaces de partes del sitio


Puedes compartir este material:

Referencias

Rami Krispin, Time Series Analysis and Forecasting with the TSstudio Package, 2019. Recuperado de: https://rpubs.com/ramkrisp/TSstudioDemo
[1] Comisión Económica para América Latina y el Caribe, balance Preliminar de las Economías de América Latina y el Caribe, 2019. Recuperado de https://repositorio.cepal.org/bitstream/handle/11362/45000/91/BPE2019_Venezuela_es.pdf

Por:
Jesús Benjamín Zerpa
Economista
JesusZerpaEconomia@Gmail.Com


Excepto donde se indique lo contrario, el contenido de esta obra está bajo una licencia de Creative Commons Reconocimiento 4.0 Internacional.


Copyright © 2020 Jesús B. Zerpa | Economist & Data Scientist | Site created with RStudio 

| FINANCE | INTELLIGENCE BUSSINES | FORECASTING | TIME SERIES | FINANCIAL DASHBOARD | FINANCIAL BUDGET | SPATIAL ECONOMETRICS |