El RUNT significa Registro Único Nacional de Tránsito, que es un sistema de información que permite registrar y mantener actualizada, centralizada, autorizada y validada la misma sobre los registros de automotores, conductores, licencias de tránsito, empresas de transporte público, infractores, accidentes de tránsito, seguros, remolques y semirremolques, maquinaria agrícola y de construcción autopropulsada y de personas naturales o jurídicas que prestan servicio al sector. (artículos ocho y nueve de la ley 769 de 2002 y la parte pertinente de la ley 1005 de 2006).
El modelo de operación del Registro Único Nacional de Tránsito RUNT gira alrededor de un sistema centralizado de información de tránsito y transporte el cual opera bajo un esquema de colaboración que depende de la información provista, en línea y en tiempo real, por múltiples entidades, incluidos el Ministerio de Transporte, las Direcciones Territoriales y los Organismos de Tránsito de todo el país.
Este trabajo abordará el problema de generar un modelo predictivo que permita proyectar la cantidad de vehículos registrados por día en el RUNT durante el 2018.
En el siguiente proyecto se aborda el problema de crear un modelo para predecir el número de vehículos registrados diariamente en el RUNT. Los datos es una serie temporal del número de vehículos registrados diariamente durante los años 2012 a 2017. Para el análisis y modelamiento se incluyeron algunas variables que consideramos relevantes.
Para la realización de este informe técnico, así como el planteamiento de la mayoría de los modelos predictivos que se presentarán más adelante se empló la versión 4.0.5 de \(\color{#00008b}{\textsf{R}}\), el cual es un software de programación especializado en estadística y ciencia de datos. Además, para la escritura del código de este lenguaje se empleó la versión 2021.09.1 del enterno de desarrollo integrado \(\color{#1ac5ff}{\textsf{R}}\)\(\color{#696969}{\textsf{Studio}}\). Además, para el desarrollo de uno de los modelos se usó \(\color{cyan}{\textsf{Python}}\), uno de los lenguajes de programación más empleados en la actualidad y con una gran acogida por parte de los desarrolladores.
Vale la pena mencionar los paquetes de \(\color{#00008b}{\textsf{R}}\) que más se emplearon en el marco de este trabajo para conseguir el desarrollo del modelo predictivo del número de vehículos registrados en el RUNT en el 2018:
\(\color{purple}{\texttt{caret}}\). Versión 6.0-90 de octubre de 2021. Este paquete resalta como el más importante de todos, puesto que con él fue posible desarrollar algunos de los modelos que se presentarán más adelante. Este paquete es útil para la creación de modelos de clasificación y regresión, así como para la generación de gráficos que permitan estudiar los resultados que se obtienen con sus funciones. Este un paquete desarrollado por el R Core Team (el equipo base que ayuda a desarrollar y mantener al lenguaje R), Max Kuhn, Jed Wing, Steve Weston, Andre Williams, Chris Keefer, Allan Engelhardt, Tony Cooper y Breton Kenkel, entre otros.
\(\color{purple}{\texttt{DT}}\). Versión 0.20 Este paquete permite formatear tablas creadas con código de \(\color{#00008b}{\textsf{R}}\) para luego ser presentadas con un estilo sobrio, elegante y sencillo, de forma que los lectores puedan entender amigablemente las tablas presentadas.
\(\color{purple}{\texttt{tidyverse}}\). Versión 1.3.1. Este es un paquete desarrollado por Hadley Wickham que incluye otros paquetes como \(\texttt{dplyr}\) y \(\texttt{ggplot2}\), que fueron usados con frecuencia en este trabajo y que facilitan el manejo, análisis, transformación de bases de datos, así como la creación de gráficos elegantes y llamativos.
La base de datos que se va a emplear para proyectar el número de vehículos a registrar en el Registro Único Nacional de Tránsito, RUNT contiene un registro del número de vehículos que han sido registrados diariamente entre el primero de enero de 2012 (2012-01-01) y el 31 de diciembre de 2017 (2017-12-31), lo que implica que parte con solo dos variables: la fecha y el número de vehículos registrados en el RUNT en cada fecha, con 2,192 observaciones que abarcan la totalidad de días que transcurrieron entre las dos fechas límite. Así, vale la pena comenzar observando la estructura de la base de datos que va a ser empleada:
\[\fbox{ Tabla 1: Características y descripción de los datos. }\]
Característica | Tipo | Primera observación | Segunda observación |
---|---|---|---|
Fecha | Fecha (dttm) | 2012-01-01 | 2012-01-02 |
Unidades | Doble (dbl) | 0 | 188 |
Y se puede observar que es una base de datos bastante simple, pues simplemente incluye las fechas y el respectivo número de vehículos que han sido registrados en el RUNT. Además, es bueno destacar que esta cuenta con dos columnas, una para cada una de las características recién discutidas, y 2,192 filas, una por cada observación, es decir, por cada día.
Luego, vale la pena revisar el siguiente gráfico con el que se podrá observar la generalidad del número de vehículos registrados por día en el RUNT:
De la figura 1 se pueden destacar varias cosas. La primera de ellas es que la venta de vehículos presenta con bastante frecuencias días con cero registros nuevos, aspecto que se indagará más adelante. Asimismo, parece que las ventas medias se preservan en la mayor parte del año, con un pequeño pico al finalizar el primer trimestre y otro más destacado finalizando el año. Asimismo, se puede ver que el número de vehículos registrados en el RUNT parece tener un decenso a partir del año 2016, pues antes de este año es frecuente que se superasen los mil carros registrados por día, toda vez que a partir de este año esto pasa a ser menos frecuente. Así, considerando estos datos, se obtienen los siguientes resúmenes numéricos para el número de vehículos registrado por día:
\[\fbox{ Tabla 2: Resúmen numérico de los datos. }\]
Parámetro | Valor |
---|---|
Media | 782.17 |
Desviación estándar | 551.16 |
Mínimo | 0 |
Primer cuantil (Q1) | 293 |
Mediana (Q2) | 865.5 |
Tercer cuantil (Q3) | 1,173 |
Máximo (Q4) | 3,603 |
Rango intercuartídico | 880 |
Coeficiente de variación | 0.7 |
Coeficiente de asimetría | 0.05 |
Curtosis | 0.35 |
Como se observa, cada día entre los años 2012 y 2017 (inclusive) se registraron 782.17 vehículos en el RUNT en promedio, con una desviación estándar de 551.16 vehículos por día, y presentando un mínimo en cero vehículos por día (lo cual sucede durante varios días como se podrá verificar más adelante), y un máximo de 3,603 vehículos, lo cual ocurrió el 29 de diciembre del 2016. Además, se tiene que la mediana se da en 865.5 vehículos, lo que quiere decir que en al menos la mitad de los días del periodo mencionado se registraron 366 vehículos o más, y en el resto de días 365 vehículos o menos. Por último, se debe destacar que el coeficiente de variación es de 0.7 (70%), lo que muestra que el promedio no es representativo del conjunto de datos; asimismo, el coeficiente de asimetría es de 0.05, lo cual muestra que los datos están concentrados hacia el promedio de 782.17 vehículos registrados por día en el RUNT, pero con una ligera tendencia hacia un menor número de registros diarios, toda vez que la curtosis de 0.35, lo que implica que la distribución presenta una menor cantidad de datos atípicos comparado con una distribución normal y una mayor concentración alrededor de su media. Esto se ilustra bien mediante el siguiente gráfico:
Como se aprecia en la figura 2, lo más frecuente es que en un día se inscriban en el RUNT entre cero y 124 vehpiculos aproximadamente, ya que esto sucedió en 422 de los 2,192 días que abarca el periodo de interés, seguido por entre 746 y 870 vehículos por día, pues en 239 días se registraron un número de vehículos incluido en tal intervalo. De la misma forma, destaca el hecho de que hay pocos días que tengan dos mil o más vehículos registrados por día.
Ahora bien, con el objetivo de entender mejor la dinámica del registro de vehículos en el RUNT, es útil observar el comportamiento por mes, año, semana y día de la semana, para lo cual se van a crear tales variables auxiliares con ayuda de \(\color{blue}{\textsf{R}}\), lo cual deja la estructura de la base de datos como sigue:
\[\fbox{ Tabla 3: Nueva estructura de los datos. }\]
Característica | Tipo | Primera observación | Segunda observación |
---|---|---|---|
Fecha | Fecha (dttm) | 2012-01-01 | 2012-01-02 |
Unidades | Doble (dbl) | 0 | 188 |
Día | Entero (int) | 1 | 2 |
Mes | Doble (dbl) | 1 | 1 |
Año | Doble (dbl) | 2012 | 2012 |
Día de la semana | Doble (dbl) | 1 | 2 |
Semana del año | Doble (dbl) | 1 | 1 |
Y con esto, se va a revisar el comportamiento por mes entre el 2012 y el 2017 (inclusive) del registro de vehículos en el RUNT mediante la siguiente serie de tiempo:
Y como se puede observar en la figura 3, no se puede hablar de que haya una cantidad semejante de vehículos vendidos por mes, ya que en cada año se evidencia que hay una tendencia a la baja al iniciar el año, pues en cada uno de los meses de enero hay un mínimo de vehículos registrados en el RUNT para sus respectivos años, ocurriendo luego un incremento hacia los meses de marzo, abril y mayo para mantenerse en niveles semejantes hasta que se presenta un máximo en el mes de diciembre, siendo el más destacado el del año 2014, ya que en dicho diciembre se registraron 40,518 vehículos. Así mismo, se evidencia nuevamente una tendencia bajista en el comportamiento global, ya que hay un menor número de registros hacia los años 2018 y 2017 comparado con los demás, siendo 2014 el año con mejores registros, como se verá más adelante. Ahora, se va a analizar el número de vehículos registrados por mes sin importar el año.
En la figura 4 se observa algo que fue confirmado previamente y es que diciembre es el mes con más registros diarios en el RUNT, toda vez que enero es el que menos. Asimismo, se observa que en el resto de meses se estabiliza aproximadamente el registro con al menos de 15,000 registros por mes, siendo febrero y una excepción probablemente por una recuperación luego del mínimo de enero. Además, con ayuda de estos boxplots se puede afirmar que existe evidencia de que los registros de vehículos en el mes de diciembre son mayores que en el resto de meses del año, lo cual se evidencia porque la caja asociada a este mes se ubica por encima de las cajas del resto de meses. Asimismo, se tiene evidencia de que el registro diario de vehículos en el RUNT durante el mes de enero es menor que en los meses de marzo, junio, agosto, septiembre, noviembre y diciembre, lo cual se corresponde con las tendencias descritas previamente.
En la gráfica de boxplot anterior (Figura 5), se observa que la media de la serie no es constante en los diferentes periodos del año, siendo el promedio menor en el mes de enero que en cualquiera de los demás meses. Es decir, la media sí depende del periodo del año, lo que confirma la existencia de un patrón estacional que se repite de forma constante o aproximadamente constante año tras año.
Con el fin de generar un modelo de predicción de vehículos registrados en el RUNT durante en el 2018, se van a crear algunas variables adicionales que podrían incidir positivamente en la forma en la que los diferentes modelos a plantear trabajar. Se debe tener en cuenta que lo buenas que resulten dichas variables solo será descubierto una vez se generen los diferentes modelos.
Colombia es un país con un débil aparato productivo de vehículos, lo cual se refleja en que en el 2019 se produjeron solo 127,541 vehículos en Colombia (lo cual resulta bajo comparado con los más de 3.9 millones de vehículos fabricados en México) y que contraste con los 223,755 vehículos de uso particular que fueron vendidos en el país durante el mismo año [1]. En ese sentido, es fundamental para abastecer la demanda de vehículos del país buscar en los mercados internacionales tales vehículos, y así, teniendo en cuenta que estas operaciones se tranzan generalmente dólares estadounidenses (USD), se puede considerar el precio de esta divisa en cada día, para lo cual resulta útil consultar el histórico de la tasa representativa del mercado (TRM) calculado por el Banco de la República al final de cada día [2].
Para poder identificar patrones estacionarios y otros asociados con el tiempo, se van a crear las siguientes variables:
La mayoría de puntos del país donde es posible realizar un registro al RUNT solo operan en días laborales, es decir, entre el lunes y el sábado de cada semana, con la excepción de aquellos días que sean festivos, por lo que es importante identificar dichos días para que el modelo pueda incorporarlos y trabajar con ellos. Nótese que es de utilidad tener en consideración los días festivos y los domingos simultáneamente en una sola variable, ya que tenerlas separadas podría implicar una redundancia.
Realizado lo anterior, se tiene que la tabla de datos que finalmente será considerada para poder estudiar los diferentes modelos predictivos que permitan dar con una adecuada proyección del número de vehículos registrados en el RUNT para todo el 2018 es la que se ve enseguida:
\[\fbox{ Tabla 4: Datos definitivos. }\]
Para poder emplear el modelo con las variables requeridas del año, se va a generar una base de datos con ayuda de \(\color{blue}{\textsf{R}}\) que permita determinar los valores de las variables regresoras para cada uno de los 365 días de este año. El resultado observado puede ser visto a continuación:
\[\fbox{ Tabla 5: Datos 2018. }\]
Un archivo en formato .RData puede ser encontrado en el repositario de Git-Hub de este trabajo bajo el nombre yr2018.RData.
A continuación se van a implentar diferentes técnicas de aprendizaje automático para realizar regresiones que permitan predecir la cantidad de vehículos que van a ser registrados diariamente en el RUNT. En la mayoría de ellos se va a apelar al paquete \(\color{purple}{\texttt{caret}}\) del software de programación especializado en estadística \(\color{blue}{\textsf{R}}\), el cual permite de forma sencilla implementar los diferentes modelos y verificarlos usando cross validation, que, en particular, será aplicado empleando diez iteraciones.
Se va a comenzar analizando un modelo de regresión lineal múltiple, para el cual se obtiene el siguiente resumen:
\[\fbox{ Tabla 6: Ajuste regresión lineal múltiple. }\]
Unidades | |||
---|---|---|---|
Predictors | Estimates | CI | p |
(Intercept) | 52718.81 | 3553.45 – 101884.17 | 0.036 |
dia | -3.86 | -12.47 – 4.74 | 0.379 |
mes | -484.72 | -740.00 – -229.45 | <0.001 |
anno | -26.00 | -50.49 – -1.50 | 0.038 |
dia semana | -54.24 | -65.28 – -43.19 | <0.001 |
semana | 115.80 | 57.07 – 174.52 | <0.001 |
TRM | -0.05 | -0.13 – 0.02 | 0.176 |
Laboral | 1131.91 | 1075.53 – 1188.29 | <0.001 |
Observations | 1644 | ||
R2 / R2 adjusted | 0.568 / 0.566 |
Como se puede observar, el valor del \(R^2\) que se obtiene para este modelo es de \(R^2 = 0.5682\), y la versión ajustada es \(R^2_{adj} = 0.5663\), los cuales son valores regulares que van a tratar de ser mejorados de cara al modelo que finalmente sea empleado. Sin embargo, es interesante observar qué sucede con todos los modelos de regresión posible, que son 127 en total, para lo cual se desarrolla la siguiente tabla:
Y se puede observar que el mejor modelo ajustado es justamente el que tiene en consideración a todas las variables empleadas.
Se va a emplear el método de los k vecinos más cercanos, conocido como KNN por sus siglas en inglés (k nearest neighbors), y esto será realizado en dos etapas: la primera de ellas ignorando el preprocesamiento, es decir, usando los datos puros sin ninguna especie de modificación y luego preprocesándolos, lo cual implica que se los va a ajustar de acuerdo a sus medias y varianzas.
Un resumen de los resultados de este modelo empleando \(k = 5, 7, 9\) vecinos es el que se observa en la siguiente tabla:
\[\fbox{ Tabla 7: RMSE, R - CUADRADO Y MAE Para cada K. }\]
Núm. vecinos (k) | RMSE | \(R^2\) | MAE |
---|---|---|---|
5 | 551.4903 | 0.06591 | 44.2648 |
7 | 552.5287 | 0.0545 | 451.6000 |
9 | 54.2284 | 0.0522 | 451.3888 |
Y como se puede ver, para tres valores diferentes del número de vecinos a considerar, se obtienes valores de \(R^2\) bastante bajos, lo cual impide que las variables regresoras consideradas sean útiles para explicar la variabilidad de la variable unidades, que es la que quiere ser predicha para cada día del 2018, lo cual lleva a que este modelo sea descartado inmediatamente.
Al realizar un preprocesamiento, el cual implica estandarizar los datos de acuerdo a sus medias y sus varianzas, se obtienen los siguientes resultados para \(k = 5, 7, 9\).
\[\fbox{ Tabla 8:RMSE, R - CUADRADO Y MAE Para cada K (Datos con procesamiento) . }\]
Núm. vecinos (k) | RMSE | \(R^2\) | MAE |
---|---|---|---|
5 | 237.9352 | 0.8176 | 151.4622 |
7 | 244.9491 | 0.8068 | 157.2997 |
9 | 249.8848 | 0.7999 | 161.5048 |
Y se evidencia una notable mejoría que en el caso en el que el preprocesamiento no fue realizado, pues para cada una de las tres iteraciones evaluadas (\(k = 5, \ 7, \ 9\)), se obtuvieron valores de \(R^2\) de al menos \(0.80\), lo cual es bueno. Sin embargo, es interesante evaluar si es posible mejorar estos valores al ensayar aún más iteraciones, para lo cual se generará un grilla que posibilite evaluar valores de \(k\) entre uno y cien.
\[\fbox{ Tabla 9: RMSE, R - CUADRADO Y MAE Para cada K 0-100. }\]
Y como se puede observar en la tabla nueve, el mejor para el \(R^2\), así como las otras dos métricas (RMSE y MSE) se obtiene cuando se utilizan \(k = 5\) vecinos, con un \(R^2 = 0.8247\), lo cual es un muy buen valor. A continuación se presenta la figura seis, la cual muestra el valor de la raíz del error cuadrático medio (RMSE) como función del número de vecinos \(k\). En esta gráfica también es posible visualizar que es en el quinto punto, de izquierda a derecho, y asociado justamente a \(k = 5\) donde se alcanza el menor valor para esta métrica.
A continuación, se tiene un ejercicio interesante que consiste en emplear este modelo para los días de los años 2012 a 2017, puesto que los datos para estos años son conocidos y observarlos mediante una gráfica, lo cual se logra con la figura siete, donde los datos observados se muestran en rojo y los observados en azul.
En la figura siete se puede observar que el modelo generado con KNN con \(k = 5\) vecinos y haciendo preprocesamiento, esto es, normalizando los datos, ajusta muy bien la tendencia de los datos realmente observados entre los años 2012 y 2017. Sin embargo, este en este gráfico se puede observar que el modelo generado presenta dificultades para estimar los valores máximos que puedan presentarse en cada año, lo cual se refleja en el hecho de que existen múltiples barras rojas que resaltan sobre las barras azules, y esto es dado a que el modelo predice menos vehículos de los que realmente son registrados en estos casos.
Otro modelo que se desea probar es una red neuronal en \(\color{cyan}{\textsf{Python}}\). Para ello, se se utiliza 75 % de los datos para su entrenamiento y 25% para validación y por supuesto, se normalizan. El código de la red neuronal se encuentra en el repositorio de Git-Hub en un archivo titulado “NN” en la carpeta \(\texttt{RUNT}\). Luego de entrenarlo, se llegó a un \(R^2\) de 0.84 para entrenamiento y de 0.74 para validación. La gráfica ocho muestra su comportamiento para los datos entre 2012 y 2017:
Con el esquema de la figura ocho se observa una situación semejante a la obtenido con KNN, y es que la red neuronal es exitosa para predecir la tendencia general del número de vehículos que son registrados cada día, pero su dificultad es que, al igual que KNN, infraestima la cantidad de vehículos que pueden ser registrados día a día en el RUNT, especialmente cuando se tienen días donde se presentan máximos; no obstante, al hacer una comparación entre esta figura y la siete, se evidencia que el modelo obtenido a partir de redes neuronales infravalora más la cantidad de vehículos registrados por día en el RUNT en comparación con el KNN.
Después de tener estos tres modelos se hace el análisis: el modelo de regresión lineal es el que tiene un \(R^2\) menor por lo que queda descartado, dejando así el modelo de KNN y la red neuronal. A pesar de que la red neuronal tiene un \(R^2\) decente, con la gráfica de predichos vs observados se ve que no se desempeña tan bien con los valores extremos, a diferencia del KNN que lo hace mejor. De esta manera, el modelo que se escoje es el de KNN.
A continuación, en la figura 9, se observa la serie de tiempo para este modelo en el año 2017 únicamente:
Además, en la figura 10, se evidencia toda la serie completa: los datos reales observados entre los años 2012 y 2017, y los valores predichos para el número de vehículos registrados en el RUNT a lo largo del 2018.
Estos datos pueden ser observados en la tabla diez:
\[\fbox{ Tabla 10: Vehículos registrados entre el 2012 y el 2018 en el RUNT. }\]
Los datos presentan un patron estacional, es decir, un patrón que se repite anualmente, siendo enero el mes en el que hay menos cantidad de vehículos registrados y diciembre el mes en que más se registran.
Para un mejor entrenamiento del modelo, se hizo necesario agregar nuevas características a los datos, como lo fueron días laborales y tasa representativa del mercado (TRM), así como también características que se agregaron a partir de la fecha inicial dada, como lo fue el día, mes, año, día de la semana y número de la semana del año.
El mejor modelo, considerando como criterio el \(R^2\), fue el de la red neuronal con 0.84 en entrenamiento y 0.74 para validación. Y el segundo mejor modelo fue KNN con \(R^2 = 0.8247\) y \(K=5\), pero se decide emplear el finalmente el modelo KNN ya que éste predice mejor los datos extremos, además de que la diferencia entre \(R^2\) de ambos es poca.
Finalmente, los datos predichos para el primer semestre de 2018 tienen un comportamiento esperado, ya que tiene características similares a los datos originales, enero es el mes en el que menos cantidad de vehículos se registrarán y dicho valor aumentará a medida que pasan los meses.
[1] PROCOLOMBIA. “Industria automotriz en Colombia”. Procolombia. https://www.colombiatrade.com.co/noticias/industria-automotriz-en-colombia (accedido el 8 de enero de 2022).
[2] Banco de la República de Colombia. “Tasa representativa del mercado (TRM - peso por dólar)”. Banco de la República. https://www.banrep.gov.co/es/estadisticas/trm (accedido el 8 de enero de 2022).
[3] Ridge, Lasso and Elastic-Net Regression in R. https://www.youtube.com/watch?v=ctmNq7FgbvI
[4] Ander J. Cómo programar una red neuronal desde 0 en Python. https://anderfernandez.com/blog/como-programar-una-red-neuronal-desde-0-en-python/#:~:text=Programando%20una%20red%20neuronal%20en,cada%20una%20de%20las%20capas.
[5] Joaquín A. (2017, abril). Máquinas de Vector Soporte (Support Vector Machines, SVMs). https://www.cienciadedatos.net/documentos/34_maquinas_de_vector_soporte_support_vector_machines
[6] Ander J. Programar algoritmo kNN desde cero en R https://anderfernandez.com/blog/programar-knn-r/#:~:text=As%C3%AD%20pues%2C%20la%20clave%20del,los%20que%20se%20debe%20observar.