La previsión no necesita introducción, y es una parte importante de los equipos de comercialización, a menudo utilizada para la previsión de ventas. Empecemos por cargar los datos.
Datos
Para este ejercicio de previsión, utilizaremos datos ficticios de ventas mensuales que contienen 81 observaciones, y la tarea será crear un modelo de previsión para predecir las ventas en los próximos 12 meses.
1234567library(forecast)library(fpp2)library(TTR)library(dplyr)dat <- read_csv("salesforecasting.csv")glimpse(dat)
{r}
Salida:
12345Observaciones: 81Variables: 3$ Fecha <chr ...; "01-Mar-13", "01-Abr-13", "01-May-13", "01-Jun-13", "01-Jul-13",...$ Ventas <int...; 192, 198, 197, 213, 202, 186, 215, 213, 213, 220, 210, 219, 233,. ...$ Clase...; "Tren", "Tren", "Tren", "Tren", "Tren", "Tren", "...
El siguiente paso es crear conjuntos de entrenamiento y pruebas para la validación del modelo. El primer par de líneas de código a continuación realizan esta tarea utilizando la variable Class, que ya tiene etiquetas Train y Test . La tercera línea de código imprime el número de filas en el entrenamiento y los datos de la prueba. Ten en cuenta que el conjunto de datos de la prueba tiene 12 filas porque construiremos el modelo para predecirlo para los próximos 12 meses.
1234dat_train = subconjunto(dat, Clase == $0027Tren$0027)dat_test = subconjunto(dat, Clase == $0027Prueba$0027) nrow(dat_train); nrow(dat_test)
{r}
Salida:
12[1] 69[1] 12
Preparando el objeto de la serie de tiempo
Para ejecutar modelos de previsión en $0027R$0027, necesitamos convertir los datos en un objeto de serie temporal, lo que se hace en la primera línea de código abajo. El argumento de inicio y final especifica el tiempo de la primera y la última observación, respectivamente. El argumento frecuencia especifica el número de observaciones por unidad de tiempo.
También crearemos una función de utilidad para el cálculo del porcentaje de error medio absoluto (o MAPE), que se utilizará para evaluar el rendimiento de los modelos de previsión. Cuanto más bajo sea el valor de MAPE, mejor será el modelo de previsión. Esto se hace en las líneas segunda a cuarta del código.
1234567dat_ts <- ts(dat_train[, 2], inicio = c(2013, 3), fin = c(2018, 11), frecuencia = 12) #líneas 2 a 4mape <- function(actual,pred){ mape <- mean(abs((actual - pred)/actual))*100 return (mape)}
{r}
Con los datos y la función de mapeo preparados, pasamos a la técnica de previsión que se utilizará en este caso.
Método de la tendencia de Holt
Utilizaremos el método de previsión de tendencias de Holt, un algoritmo estadístico tradicional, que considera el componente de la tendencia mientras genera previsiones. Este método implica dos ecuaciones de suavizado, una para el nivel y otra para el componente de tendencia.
La primera línea de código de abajo crea el modelo de invierno de Holt y lo almacena en un objeto $0027holt_model$0027. La segunda línea imprime el resumen y los pronósticos para los próximos 12 meses.
12holt_model <- holt(dat_ts, h = 12)summary(holt_model)
{r}
Salida:
123456789101112131415161718192021222324252627282930313233343536373839 Método de pronóstico: Método de HoltInformación del modelo:Método de Holt Llamada: holt(y = dat_ts, h = 12) Parámetros de suavizado: alpha = 0.8342 beta = 1e-04 Estados iniciales: l = 193.7099 b = 3.4287 sigma: 16.2391 AIC AICc BIC 682.6969 683.6492 693.8674 Medidas de error: ME RMSE MAE MPE MAPE MASE ACF1Juego de entrenamiento -0.8870433 15.76137 11.8633 -0.4614957 4.084311 0.2366019 0.004106845Previsiones: Punto Previsión Lo 80 Hi 80 Lo 95 Hi 95Dic 2018 382.4585 361.6473 403.2698 350.6305 414.2866Ene 2019 385.8799 358.7765 412.9833 344.4288 427.3309Feb 2019 389.3012 357.1116 421. 4908 340.0715 438.5309Mar 2019 392.7225 356.1461 429.2989 336.7838 448.6612Abr. 2019 396.1438 355.6521 436.6355 334.2171 458.0706Mayo 2019 399.5651 355.5036 443.6267 332. 1789 466.9514Junio 2019 402.9865 355.6225 450.3504 330.5496 475.4233Julio 2019 406.4078 355.9563 456.8593 329.2489 483.5667Agosto 2019 409.8291 356.4676 463.1906 328.2197 491. 4385Sep 2019 413.2504 357.1288 469.3721 327.4198 499.0811Oct 2019 416.6717 357.9187 475.4248 326.8168 506.5267Nov 2019 420.0931 358.8209 481.3652 326.3854 513.8008
El resultado anterior muestra que el MAPE para los datos de entrenamiento es de 4,1 por ciento. Evaluemos ahora el rendimiento del modelo en los datos de la prueba, lo cual se hace en las líneas de código de abajo. El error de MAPE en los datos de la prueba resulta ser del 2,7 por ciento, lo que supone una mejora con respecto al resultado de los datos de entrenamiento.
123df_holt = as.data.frame(holt_model)dat_test$holt = df_holt$`Previsión de puntos`mape(dat_test$Ventas, dat_test$holt)
{r}
Salida:
1[1] 2.735082
Previsión general para los próximos 12 meses
El número de precisión que obtuvimos es respetable, así que podemos crear el pronóstico para los próximos 12 meses usando la línea de códigos de abajo.
1234df_forecast <- ts(dat[, 2], start = c(2013, 3), end = c(2019, 11), frequency = 12)arima_model_ahead <- auto.arima(df_forecast)forecast_12 = forecast::forecast(arima_model_ahead, h=12)forecast_12
{r}
Salida:
12345678910111213 Punto Previsión Lo 80 Hi 80 Lo 95 Hi 95Dec 2019 438.1473 419.0833 457.2113 408.9915 467.3031Ene 2020 441.9584 417.3683 466.5485 404.3510 479.5658Feb 2020 446. 0598 416.9752 475.1444 401.5787 490.5409Mar 2020 442.3232 409.3512 475.2952 391.8968 492.7496Abr 2020 443.8119 407.3648 480.2591 388.0708 499.5530Mayo 2020 445.3007 405. 6821 484.9193 384.7092 505.8921Junio 2020 449.9827 407.4283 492.5370 384.9014 515.0640Jul 2020 459.3094 414.0091 504.6097 390.0286 528.5902Agosto 2020 463.9914 416.1024 511.8804 390. 7515 537.2313Sep 2020 462.8675 412.5227 513.2122 385.8718 539.8631Oct 2020 462.3241 409.6379 515.0103 381.7476 542.9007Nov 2020 463.5226 408.5947 518.4505 379.5176 547.5275