Modelo de pronóstico para Ventas en Volumen
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.
Contenido
- Data (Serie Temporal)
- Análisis exploratorio
- Descomposición de la serie
- Análisis estacional
- Análisis de correlación
- Resumen de exploración y análisis
- Pronósticos de la serie (forecasting)
- Enfoque tradicional
- Backtesting
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.
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)
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:
- Patrón estacional: Simple o múltiple.
- Tipo de tendencia: Lineal, exponencial, polinómica.
- Roturas estructurales y valores atípicos.
- Cualquier otro patrón en la serie.
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.
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.
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:
- El primer ciclo de trazado de la serie es mensual y cumple el año completo. La vista permite comparar la variación de cada unidad de frecuencia (mes) de año en año.
- En el caso de las series mensuales cada linea representa un mes de ventas a lo largo del tiempo. Permite verificar si el patrón estacional permanece igual en el tiempo.
- Al final aparecen los diagramas de caja. Son unos gráficos que permiten visualizar la distribución de datos en cada unidad de frecuencia.
Componente estacional:
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:
- La estructura del patrón estacional al eliminar la tendencia se mantiene de la siguiente manera: Decrecimiento de enero a junio y crecimiento de julio a diciembre.
- Ese comportamiento puede estar relacionado con un aumento del ingreso durante el segundo semestre del año por incrementos de salario, sumado a vacaciones colectivas remuneradas y utilidades o prestaciones de fin de año.
- En general, se han venido deteriorando los niveles de ventas en la evolución del histórico, motivado entre otros factores a la grave coyuntura económica que tiene el país en su último quinquenio.
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.
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.
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
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
Resumen de exploración y análisis
Puntos clave del análisis exploratorio:- La serie tiene un patrón estacional fuerte, sin estacionalidad múltiple.
- La tendencia muestra una ruptura estructural alrededor del año 2016 y un decrecimiento no lineal.
- La serie presenta una fuerte correlación con sus rezagos estacionales.
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.
- El enfoque tradicional divide la serie en particiones de capacitación y prueba (muestra). Entrena a cada modelo en el conjunto de entrenamiento y se evalúa el desempeño en el conjunto de pruebas. Se utilizarán los modelos: ARIMA, SARIMA, ETS y TSLM.
-
El enfoque de Backtesting utiliza una ventana expansiva para entrenar y probar cada modelo en múltiples conjuntos de entrenamiento y prueba.
-
Para la ruptura de la serie se utilizará una bandera (flag) binaria con un valor de 0 para cualquier observación antes del 2016 y 1 después.
## 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)
Enfoque Tradicional
Práctica con tres enfoques de pronósticos:- ARIMA: Modelo Autorregresivo Integrado de Promedio Móvil que aplicaremos a través de la función auto.arima.
- ETS: Estima un modelo de pronóstico de series temporales univariantes utilizando un método de suavizado exponencial. Se aplica con la función ETS (error, tendencia y componente estacional).
- TSLM: Modelo de regresión lineal para series temporales.
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.
## ME RMSE MAE MPE MAPE MASE
## Training set -82.13979 556.855 383.9783 -2.608326 13.84001 0.2263472
## Test set -392.41103 435.644 392.4110 -43.645006 43.64501 0.2313181
## ACF1 Theil's U
## Training set -0.0493298 NA
## Test set 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
## ME RMSE MAE MPE MAPE MASE
## Training set -61.40921 506.7398 365.2970 -3.409075 11.90957 0.2153350
## Test set -717.56487 757.7077 717.5649 -88.479636 88.47964 0.4229895
## ACF1 Theil's U
## Training set -0.03604148 NA
## Test set 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 MASE
## Training set -3.881386e-15 1069.5895 858.5997 -7.580223 26.88832 0.5061266
## Test set 8.132139e+02 877.8898 813.2139 85.610982 85.61098 0.4793727
## ACF1 Theil's U
## Training set 0.8757935 NA
## Test set 0.5699836 6.143616
Modelo 3 TSLM Gráfica
test_forecast(forecast.obj = fc3, actual = Vol, test = test) %>%
layout(legend = list(x = 0.6, y = 0.95))
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.
md3a <- tslm(train ~ season + trend + flag, data = train_df)
fc3a <- forecast(md3a, h = h1, newdata = test_df)
accuracy(fc3a, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 4.551406e-14 884.0708 697.6263 -6.503608 20.34271 0.4112362
## Test set -4.156753e+02 531.1869 415.6753 -54.033866 54.03387 0.2450319
## ACF1 Theil's U
## Training set 0.7131667 NA
## Test set 0.5699836 3.831884
Modelo 4 TSLM Gráfica
test_forecast(forecast.obj = fc3a, actual = Vol, test = test) %>%
layout(legend = list(x = 0.6, y = 0.95))
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
.
md3b <- tslm(train ~ season + trend + I(trend ^ 2))
fc3b <- forecast(md3b, h = h1)
accuracy(fc3b, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 1.515778e-13 1066.328 860.3846 -7.377058 28.18054 0.5071788
## Test set 1.127234e+03 1197.111 1127.2340 119.660207 119.66021 0.6644810
## ACF1 Theil's U
## Training set 0.8794995 NA
## Test set 0.6325127 8.3801
Modelo 5 TSLM Gráfica -Polinómico-
test_forecast(forecast.obj = fc3b, actual = Vol, test = test) %>%
layout(legend = list(x = 0.6, y = 0.95))
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
md_final <- auto.arima(Vol,
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))
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.
methods <- list(ets1 = list(method = "ets",
method_arg = list(opt.crit = "mse"),
notes = "ETS model with opt.crit = mse"),
ets2 = list(method = "ets",
method_arg = list(opt.crit = "amse"),
notes = "ETS model with opt.crit = amse"),
arima1 = list(method = "arima",
method_arg = list(order = c(1,0,0)),
notes = "ARIMA(1,0,0)"),
Sarima = list(method = "arima",
method_arg = list(order = c(1,0,0),
seasonal = list(order = c(1,1,0))),
notes = "SARIMA(1,0,0)(1,1,0)"),
tslm = list(method = "tslm",
method_arg = list(formula = input ~ trend + season),
notes = "tslm model with trend and seasonal components"))
md <- train_model(input = Vol,
methods = methods,
train_method = list(partitions = 6,
sample.out = 12,
space = 3),
horizon = 12,
error = "MAPE")
## # A tibble: 5 x 7
## model_id model notes avg_mape avg_rmse `avg_coverage_8~ `avg_coverage_9~
## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Sarima arima SARIMA(1,0~ 0.325 460. 0.986 0.986
## 2 ets2 ets ETS model ~ 0.573 678. 0.75 0.917
## 3 ets1 ets ETS model ~ 0.587 694. 0.694 0.917
## 4 tslm tslm tslm model~ 0.602 748. 1 1
## 5 arima1 arima ARIMA(1,0,~ 0.944 1101. 0.889 1
Backtesting Gráfica
Resultados de búsqueda
Resultado web con enlaces de partes del sitio
Referencias
[1] Rami Krispin, Time Series Analysis and Forecasting with the TSstudio Package, 2019. Recuperado de: https://rpubs.com/ramkrisp/TSstudioDemo
[2] 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
| FINANCE | INTELLIGENCE BUSSINES | FORECASTING | TIME SERIES | FINANCIAL DASHBOARD | FINANCIAL BUDGET | SPATIAL ECONOMETRICS |
| FINANCE | INTELLIGENCE BUSSINES | FORECASTING | TIME SERIES | FINANCIAL DASHBOARD | FINANCIAL BUDGET | SPATIAL ECONOMETRICS |