Noviembre del 2022

Índice.

  • Marco teórico.
  • Proceso de lectura y limpieza de la base de datos.
  • Metodologías nuevas de backtesting.
  • Modelo a utilizar y alternativas.
  • Presentación de los resultados
  • Predicciones
  • Conclusiones y recomendaciones

Importaciones mensuales de Juguetes, artículos para recreo, deporte; partes y accesorios

Marco teórico

Importaciones mensuales de Juguetes, artículos para recreo, deporte; partes y accesorios

Marco teórico

  • ¿De qué se trata?

Al definir qué son los aranceles en economía partimos de que el arancel es un impuesto que recae sobre los bienes que son importados a un país.

El objetivo principal es obtener información periódica sobre las compras que legalmente realiza el país al exterior o a una Zona Franca del territorio nacional.

Las importaciones corresponden a aquellos bienes que entran al país y son registrados en las aduanas. Estas se valoran a precios Miles de dólares CIF(por su sigla original en inglés Cost, insurance and freight, que significa “Costo, seguro y flete”).

  • ¿Por qué es importante?

El DANE debe asegurar la veracidad y la imparcialidad de la información básica y estratégica del país, y le compete garantizar la calidad de las estadísticas básicas.

Esta serie de documentos favorecen la transparencia, confianza y credibilidad de la calidad técnica de la institución para un mejor entendimiento, comprensión y aprovechamiento de la información estadística.

Proceso de lectura y limpieza de la base de datos.

Proceso de lectura y limpieza de la base de datos.

data<-read_excel("Impo_mensual_cap_arancel_ago22.xlsx",skip=7,range = cell_rows(308:319),col_names = FALSE)
## New names:
## • `` -> `...1`
## • `` -> `...2`
## • `` -> `...3`
## • `` -> `...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`
## • `` -> `...17`
## • `` -> `...18`
data %<>% clean_names()  #limpiar el nombre de las variables 

Proceso de lectura y limpieza de la base de datos.

data %>%  head()
## # A tibble: 6 × 18
##   x1        x2        x3     x4     x5     x6     x7     x8     x9    x10    x11
##   <chr>     <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 Juguetes… Enero 17798. 12490. 16772. 16142. 14225. 12100. 11074. 13611. 20076.
## 2 <NA>      Febr… 22471. 13881. 14907. 17108. 16311. 13535. 12068. 20551. 19401.
## 3 <NA>      Marzo 23999. 19497.  9475. 12697. 15966. 16238. 12636. 21211. 19297.
## 4 <NA>      Abril 16316. 13822.  7790. 16790. 21883. 14548. 11081. 17107. 24754.
## 5 <NA>      Mayo  20133. 10230.  6832. 20897. 18357. 17199. 13308. 19170. 26496.
## 6 <NA>      Junio 27345. 16543.  9498. 18770. 19142. 21080. 22537. 18579. 20130.
## # … with 7 more variables: x12 <dbl>, x13 <dbl>, x14 <dbl>, x15 <dbl>,
## #   x16 <dbl>, x17 <dbl>, x18 <dbl>

Proceso de lectura y limpieza de la base de datos.

values<- data[c(3:18)]
values %<>% 
  select(x18,x17,x16,x15,x14,x13,x12,x11,x10,x9,x8,x7,x6,
         x5,x4,x3)
values<- as.vector(as.matrix(values))

#eliminar Na´s  
values %<>% na.omit() 
head(values)

#crear una secuencia de fechas, de acuerdo a los años de regristro
date<-seq(as.Date("2007/1/1"),as.Date("2022/8/1"),"months")
toys<-data.frame(values,date)
toys %>% head()
##      values       date
## 1  8557.056 2007-01-01
## 2  5902.224 2007-02-01
## 3  9496.419 2007-03-01
## 4  7793.890 2007-04-01
## 5 11863.045 2007-05-01
## 6 12689.508 2007-06-01

Proceso de lectura y limpieza de la base de datos

Convirtiendo a objeto ts.

ts_toys <- ts(values, start =c(2007,01),
              end=c(2022,08), frequency = 12)

ts_info(ts_toys)
##  The ts_toys series is a ts object with 1 variable and 188 observations
##  Frequency: 12 
##  Start time: 2007 1 
##  End time: 2022 8
ts_toys %>% head()
##            Jan       Feb       Mar       Apr       May       Jun
## 2007  8557.056  5902.224  9496.419  7793.890 11863.045 12689.508
ts_toys %>%  tail()
##           Mar      Apr      May      Jun      Jul      Aug
## 2022 23998.93 16315.96 20133.45 27345.23 28167.36 39259.81
ts_toys_plot<-ts_plot(ts_toys,
                      title = " Serie de tiempo de importación de juguetes",
                      Xtitle = "Año",
                      Ytitle = "Número de juguetes ",
                      #slider = TRUE,
                      Xgrid = TRUE,
                      Ygrid = TRUE,
                      color = "blue"
)

ts_toys_plot 

Serie de tiempo importaciones mensuales de Juguetes.

Backtesting

Uno de los enfoques de entrenamiento más comunes es el uso de una sola partición de entrenamiento y prueba. Organizadas en orden cronológico.

Metodologías nuevas de backtesting

Ventana deslizante

Establezca las primeras N observaciones como la partición de entrenamiento inicial y desplaza la ventana en n observaciones para crear la siguiente partición de entrenamiento.

Metodologías nuevas de backtesting

Ventana de expansión

Utilizando las primeras N observaciones como la partición de entrenamiento inicial, añada las siguientes n observaciones para crear la siguiente partición de entrenamiento, donde n es una constante que representa el índice expandido de la ventana.La desventaja de este método es el entrenamiento del modelo con particiones de diferente longitud, ya que normalmente un modelo tiende a aprender más y, por tanto, a funcionar mejor cuando se dispone de más datos.

Función train_model

Método para entrenar, probar y comparar múltiples modelos de series temporales utilizando una única partición o múltiples particiones.

Input: serie de tiempo (en objeto tipo ts)

-Methods: Es una lista, que define los modelos a emplear para el entrenamiento y la prueba de la serie.

Modelos posibles:

  • ets: modelo del paquete de forecast, el modelo ETS es un método de pronóstico univariado de series temporales; su uso se centra en los componentes de tendencia y estacionales.
  • HoltWinters: modelo de suavizamiento exponencial del paquete de stats.
  • nnetar: modelo del paquete de forecast (modelo de redes neuronales, se trata de un modelo no lineal autorregresivo).
  • tslm: modelo de regresión del paquete de forecast.

Methods implementado

Para la serie de juguetes importados

methods <- list(hw = list(method = "HoltWinters",
                          method_arg = NULL,
                          notes = "HoltWinters Model"),
                autoarima_bic = list(method="auto.arima",
                                 method_arg = list(stepwise = FALSE,
                                                   approximation = FALSE,
                                                   ic = "bic"),
                                 notes= "Auto arima BIC"),
                ets1 = list(method = "ets",
                            method_arg = list(opt.crit = "mse"),
                            notes = "ETS model with opt.crit = mse"),
                tslm = list(method = "tslm",
                            method_arg = list(formula = input ~ trend+ season),
                            notes = "tslm model with trend and seasonal components"))

Función train_model

train_method, Es una lista, que define los parámetros de backtesting:

partitions: un número entero, que establece el número de particiones de entrenamiento y prueba que se utilizarán en el proceso de backtesting, cuando la partición se establece en 1 es un enfoque de entrenamiento de una única partición.

space: define el tamaño de la expansión de la ventana de backtesting, es decir el n para las particiones que define la longitud de expansión de la ventana de backtesting.

sample.in: un número entero, opcional, que define la longitud de las particiones de entrenamiento y, por lo tanto, la estructura de la ventana de backtesting. De forma predeterminada, se establece en NULL y, como resultado, el backtesting usa la ventana de expansión. De lo contrario, cuando se define sample.in, la estructura de la ventana es deslizante.

sample.out: El argumento define la longitud de la partición de prueba.

Función train_model

horizon: Un número entero que define el horizonte de pronóstico.

error: Define la métrica del error que se utilizará para ordenar la tabla de clasificación de los modelos. Métrica posible: “MAPE” o “RMSE”.

xreg: Opcional, una lista de regresores externos.

level: Un número entero, que establece el nivel de confianza de los intervalos de predicción, que por lo general son de 80 y 95% de confianza.

Función train_model

Para la serie de juguetes importados

md <- suppressWarnings(train_model(input = ts_toys,
                                  methods = methods,
                                   train_method = list(partitions = 3, 
                                                       sample.out = 6, 
                                                       space = 5),
                                   horizon = 6,
                                   error = "MAPE"))
## # A tibble: 4 × 7
##   model_id      model       notes                avg_m…¹ avg_r…² avg_c…³ avg_c…⁴
##   <chr>         <chr>       <chr>                  <dbl>   <dbl>   <dbl>   <dbl>
## 1 autoarima_bic auto.arima  Auto arima BIC         0.196   6725.   0.833   0.889
## 2 hw            HoltWinters HoltWinters Model      0.216   6420.   0.667   0.889
## 3 tslm          tslm        tslm model with tre…   0.254   7160.   0.833   0.889
## 4 ets1          ets         ETS model with opt.…   0.329   9927.   0.5     0.611
## # … with abbreviated variable names ¹​avg_mape, ²​avg_rmse, ³​`avg_coverage_80%`,
## #   ⁴​`avg_coverage_95%`

Función train_model

Para la serie de juguetes importados

Función train_model

Para la serie de juguetes importados

Función train_model

error en las particiones

md$error_summary$autoarima_bic
##              partition      model_id      mape     rmse coverage_80%
## coverage...1         1 autoarima_bic 0.2341807 7001.658    0.8333333
## coverage...2         2 autoarima_bic 0.2075581 8906.009    0.6666667
## coverage...3         3 autoarima_bic 0.1471040 4266.364    1.0000000
##              coverage_95%
## coverage...1    1.0000000
## coverage...2    0.6666667
## coverage...3    1.0000000

Función train_model

Particiones

md$train$partition_1$test
##           May      Jun      Jul      Aug      Sep      Oct
## 2021 10229.90 16542.63 18169.52 25268.35 41895.44 48165.34
md$train$partition_2$test
##           Jan      Feb      Mar Apr May Jun Jul Aug Sep      Oct      Nov
## 2021                                                    48165.34 48070.65
## 2022 17798.01 22471.01 23998.93                                          
##           Dec
## 2021 27671.95
## 2022
md$train$partition_3$test
##           Mar      Apr      May      Jun      Jul      Aug
## 2022 23998.93 16315.96 20133.45 27345.23 28167.36 39259.81

Función train_model

Modelo ajustado

md$forecast$autoarima_bic$model
## Series: structure(c(8557.05618, 5902.22362, 9496.41934, 7793.88987, 11863.04451,  12689.50815, 17421.96802, 28401.19492, 27883.56223, 24045.57302,  22168.06921, 12848.60803, 7884.29282, 10317.67647, 7725.27767,  12400.40601, 12233.81137, 14258.72338, 21592.60885, 30010.35472,  34219.85513, 39485.53097, 20391.64535, 18343.96733, 8552.31746999999,  8932.80710999999, 8304.51531, 9226.92544000001, 8216.73373999999,  12006.12301, 18337.8107, 22891.14458, 26757.1445299999, 25839.6211400001,  18902.68181, 16343.67036, 8860.36512, 8246.45361000001, 10525.41903,  12092.47775, 13321.31967, 14166.54375, 19453.09158, 29420.92275,  40051.42972, 35847.14887, 34482.68441, 19587.71961, 11271.25139,  11694.05954, 13769.59362, 11659.18374, 17877.42994, 22021.2541,  33659.33064, 42369.4890400001, 54550.5408100002, 47030.07208,  36031.45117, 22722.94451, 16424.3379, 19416.12184, 15761.26377,  17461.77492, 23034.18867, 25961.00149, 35632.5872900001, 60657.6473300001,  55100.3184400003, 61655.7761500001, 30761.99269, 29786.96525,  22656.00762, 16351.53555, 18015.74743, 23910.70351, 20995.39388,  20371.11763, 35233.2200699999, 47270.4236300001, 53802.7741499999,  53714.6655900001, 37278.88368, 21616.27635, 20075.94796, 19401.09063,  19297.18282, 24753.55655, 26496.27603, 20130.08216, 35058.80389,  48125.0677700001, 59969.08135, 57450.13203, 41753.05294, 24874.24726,  13610.99182, 20550.55517, 21210.90882, 17107.47709, 19169.57646,  18578.76088, 34744.47389, 44335.41631, 46347.7448900001, 41550.3942399999,  27755.91724, 13414.11281, 11074.46552, 12068.09558, 12635.94958,  11081.12223, 13308.23815, 22536.94408, 18105.44875, 34714.63068,  37437.38786, 36784.10513, 27154.86446, 23552.82666, 12099.5804,  13534.57088, 16237.6264, 14547.91032, 17199.1968, 21080.44842,  25085.36974, 39258.28851, 40603.46326, 37742.40849, 33620.18708,  20305.95371, 14225.0285, 16310.65407, 15965.69726, 21882.95871,  18356.99151, 19141.86357, 30531.37237, 39800.98787, 39354.91294,  42634.31533, 31650.05883, 20502.26432, 16141.67259, 17107.80332,  12697.38945, 16790.21574, 20896.63372, 18770.0884, 28972.74371,  39656.79033, 44340.99371, 44916.33668, 28115.79535, 19531.60955,  16771.57021, 14906.54845, 9474.66004, 7789.76465, 6832.06489,  9497.70645, 14834.9029, 24787.91273, 26257.65726, 28598.46215,  26921.74417, 20172.35918, 12489.69404, 13881.20071, 19496.62399,  13821.68343, 10229.89673, 16542.62827, 18169.52112, 25268.34917,  41895.43731, 48165.33864, 48070.64557, 27671.95099, 17798.00725,  22471.00625, 23998.9337, 16315.96127, 20133.44694, 27345.2284,  28167.35831, 39259.8106), tsp = c(2007, 2022.58333333333, 12), class = "ts") 
## ARIMA(1,0,1)(0,1,1)[12] 
## 
## Coefficients:
##          ar1      ma1     sma1
##       0.8930  -0.3315  -0.8149
## s.e.  0.0451   0.1067   0.1578
## 
## sigma^2 = 22268779:  log likelihood = -1743.87
## AIC=3495.74   AICc=3495.97   BIC=3508.42

Función train_model

Modelo ajustado

coeftest(md$forecast$autoarima_bic$model)
## 
## z test of coefficients:
## 
##       Estimate Std. Error z value  Pr(>|z|)    
## ar1   0.893012   0.045068 19.8149 < 2.2e-16 ***
## ma1  -0.331492   0.106746 -3.1054    0.0019 ** 
## sma1 -0.814854   0.157835 -5.1627 2.434e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Función train_model

Evaluación supuestos del modelo

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,1)(0,1,1)[12]
## Q* = 32.541, df = 21, p-value = 0.05156
## 
## Model df: 3.   Total lags used: 24

Función train_model

Evaluación Normalidad

Función train_model

Evaluación Normalidad

md$forecast$autoarima_bic$model$residuals %>% shapiro.test()
## 
##  Shapiro-Wilk normality test
## 
## data:  .
## W = 0.97048, p-value = 0.0005248
md$forecast$autoarima_bic$model$residuals %>% jarque.bera.test()
## 
##  Jarque Bera Test
## 
## data:  .
## X-squared = 35.174, df = 2, p-value = 2.302e-08

Función train_model

Realización y validación de las predicciones.

md$forecast$autoarima_bic$forecast
##          Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## Sep 2022       44514.19 38464.460 50563.92 35261.927 53766.45
## Oct 2022       45262.21 38324.073 52200.34 34651.247 55873.17
## Nov 2022       36378.70 28806.517 43950.89 24798.045 47959.36
## Dec 2022       24453.80 16411.829 32495.77 12154.667 36752.94
## Jan 2023       17316.13  8918.752 25713.51  4473.448 30158.82
## Feb 2023       18494.14  9823.466 27164.82  5233.488 31754.80

Función train_model

Gráfico de las predicciones.

Función train_model

Aplicando la transformación logaritmo.

methods_1 <- list(autoarima_bic = list(method="auto.arima",
                                       method_arg = list(stepwise = FALSE,
                                                         approximation = FALSE,
                                                         ic = "bic"),
                                                         notes= "Auto arima BIC"))
md1 <- suppressWarnings(train_model(input = log(ts_toys),
                                   methods = methods_1,
                                   train_method = list(partitions = 3, 
                                                       sample.out = 6, 
                                                       space = 5),
                                   horizon = 6,
                                   error = "MAPE"))
## # A tibble: 1 × 7
##   model_id      model      notes          avg_mape avg_rmse avg_covera…¹ avg_c…²
##   <chr>         <chr>      <chr>             <dbl>    <dbl>        <dbl>   <dbl>
## 1 autoarima_bic auto.arima Auto arima BIC   0.0310    0.348        0.444   0.722
## # … with abbreviated variable names ¹​`avg_coverage_80%`, ²​`avg_coverage_95%`

Función train_model

Evaluación supuestos del modelo

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,1)(2,1,1)[12]
## Q* = 17.851, df = 19, p-value = 0.5324
## 
## Model df: 5.   Total lags used: 24

Función train_model

Evaluación Normalidad

Función train_model

Evaluación Normalidad

md1$forecast$autoarima_bic$model$residuals %>% shapiro.test()
## 
##  Shapiro-Wilk normality test
## 
## data:  .
## W = 0.9803, p-value = 0.009417
md1$forecast$autoarima_bic$model$residuals %>% jarque.bera.test()
## 
##  Jarque Bera Test
## 
## data:  .
## X-squared = 9.2872, df = 2, p-value = 0.009623

Conclusiones y recomendaciones.

  • Esta función nos ayuda a automatizar el proceso entrenamiento, prueba, evaluación y pronósticar múltiples modelos de series de tiempo univariadas.

  • Aunque el enfoque de backtesting nos proporciona información intuitiva sobre la estabilidad y escalabilidad del modelo, está conlleva un mayor coste computacional en comparación con el comparado con el enfoque de una sola partición de entrenamiento y prueba. Por lo tanto, esta compensación entre los dos enfoques debe tenerse en cuenta al seleccionar el enfoque de entrenamiento.

  • Cabe resaltar que de igual manera se debe continuar con el análisis de la serie para así evaluar los resultados obtenidos.

  • Link código usado: Series de tiempo

Bibliografía