Informe Técnico - Trabajo Final Analítica Predictiva

Alejandro Henao Ruiz - Janick Alberto Reales Salas - David Andres Gallego Martinez

7/8/2020

INTRODUCCIÓN

Los datos abiertos son una gran fuente de información para aquellos que deseen estudiar las características del entorno en que se encuentran en aras de brindar alternativas que permitan mejorar la situación actual. Dichas alternativas varían desde un sencillo análisis descriptivo para entender los sucesos que se han venido presentando históricamente, hasta la implementación de programas más avanzadas como las herramientas de Aprendizaje de Máquinas que permiten encontrar patrones en los datos que no se pueden visualizar a simple vista por un humano o el entrenamiento de un algoritmo predictivo que ayude a realizar estimaciones de lo que pasará en el futuro, con lo que se pueden apoyar sistemas de toma de decisiones o el desarrollo de estrategias de optimización.

En este trabajo se propone la utilización de herramientas de aprendizaje de máquinas para realizar un agrupamiento y predicción de la accidentalidad en Medellín a partir de los datos recientes de accidentalidad reportados en las bases de datos abiertos de MEData.
Las tablas descargadas, elcódigo y la limpieza de los datos se encuentran alojadas en este repositorio. Se construyó además una aplicación en Shiny para que los usuarios pueda explorar de forma interactiva el estudio de accidentalidad realizado.

Como parte de los lineamientos para la realización de este trabajo, se solicitó considerar fechas especiales dentro de los años de 2014 a 2018. En este caso, se crea una nueva variable en la base de datos que contenga información sobre los días para determinar si es un día laboral o no y adicional para identificar cuáles de los días laborales es un día festivo, a partir de un conjunto de datos encontrado en internet con información de los días festivos en Colombia. Se puede consultar el archivo de limpieza de datos para ver la integración de las fechas especiales al conjunto de datos.

EXPLORACIÓN DE LOS DATOS

Se realiza un análisis exploratorio para descubrir las principales características de la información contenida en la base de datos de accidentalidad a través de gráficos. Con este análisis se busca completar la limpieza de los datos de manera que se adecuen para realizar los procesos posteriores de predicción y agrupamiento.

Tabla de datos y variables

Se muestra a continuación los primeros seis registros de la base de datos “limpia”.

X FECHA DIA PERIODO CLASE GRAVEDAD DIA_NOMBRE MES MES_NOMBRE LONGITUD LATITUD SEMANA BARRIO COMUNA FECHAS_ESP
1 2014-01-01 1 2014 CHOQUE HERIDO MIERCOLES 1 ENERO -75.60273 6.219016 1 LOMA DE LOS BERNAL BELEN FESTIVO
2 2014-01-01 1 2014 ATROPELLO HERIDO MIERCOLES 1 ENERO -75.56818 6.260009 1 JESUS NAZARENO LA CANDELARIA FESTIVO
3 2014-01-01 1 2014 ATROPELLO HERIDO MIERCOLES 1 ENERO -75.54994 6.264765 1 MANRIQUE ORIENTAL MANRIQUE FESTIVO
4 2014-01-01 1 2014 ATROPELLO HERIDO MIERCOLES 1 ENERO -75.60761 6.234327 1 LAS MERCEDES BELEN FESTIVO
5 2014-01-01 1 2014 CAIDA OCUPANTE HERIDO MIERCOLES 1 ENERO -75.57969 6.299968 1 DOCE DE OCTUBRE NO. 2 DOCE DE OCTUBRE FESTIVO
6 2014-01-01 1 2014 CHOQUE HERIDO MIERCOLES 1 ENERO -75.55543 6.284499 1 BERLIN ARANJUEZ FESTIVO

Definición de las variables

  • FECHA: fecha completa de ocurrencia del accidente.
  • DIA: día de ocurrencia del accidene (día del mes) de acuerdo a las fechas.
  • PERIODO: año de occurrencia del accidente, de acuerdo a las fechas.
  • CLASE: indica el tipo de accidente: choque, atropello, caída ocupante, incendio, volcamiento.
  • GRAVEDAD: indica las consecuencias del accidente: herido, muerto, solo daños.
  • DIA_NOMBRE: nombre del día de la semana, correspondiente a la fecha de ocurrencia del accidente.
  • MES: tiempo de ocurrencia del accidente, mes del año, de acuerdo a las fechas registradas.
  • MES_NOMBRE: corresponde al cambio del mes de formato numérico a texto, donde ocurrieron los accidentes.
  • LATITUD Y LONGITUD: coordenadas de los accidentes de la base de datos de movilidad de Medellín.
  • SEMANA: semana del año de ocurrencia del accidente.
  • BARRIO: lugar de la ciudad de Medellín donde ocurrieron los accidentes registrados.
  • COMUNA: subdivisión administrativa donde se encuentran contenidos los barrios de una ciudad, y donde ocurrieron los accidentes registrados.
  • FECHAS_ESP: es una diferenciación de los días en: día laborar, día no laboral y festivos.

Distribución de los datos por comunas

Con la ayuda de un gráfico de barras se identifica la distribución de los accidentes por comuna durante el periodo de estudio. En este gráfico se muestra el porcentaje de la accidentalidad total que corresponde a cada comuna y corregimiento de Medellín.

La menor ocurrencia de accidentes se presenta en los corregimientos. Este resultado era de esperarse, ya que los corregimientos correspondes a zonas rurales de la ciudad, las cuales no alcanza a llegar al 1% de la accidentalidad total reistrada durante el periodo de estudio, por tanto, se toma la decisión de eliminar los datos de los corregimientos para no afectar los análisis y los modelos predictivos.

Se vuelve a graficar la distribución de la acciedentalidad por comunas para verificar el cambio realizado y los nuevos porcentajes de accidentalidad.

La comuna con mayor porcentaje de accidentes entre los años 2014 y 2018 es La Candelaria, que se compone de los barrios de la zona central de la ciudad y con mayor flujo vehicular, debido a la alta concentración de comercios y entidades administrativas de la ciudad. A esta comuna le sigue la de Laureles - Estadio, en la cual confluyen diferentes vías principales de la ciudad como son la avenida San Juan y las carreras 70 y 80. A estás comunas les sigue la de Castilla, que ocupa cierto tramo de la autopista norte.

Accidentalidad por barrios

Se realiza a continuación un pareto donde se muestran los 10 primeros barrios de acuerdo al número de accidentes ocurridos durante el periodo comprendido entre 2014 y 2018.

Se observa que entre los 265 barrios de la ciudad de Medellín, fueron La Candelaria y Caribe los que presentaron la mayor cantidad de accidentes durante el periodo de estudio. El primer barrio se encuentra en la zona central de la ciudad, con mayor accidentalidad debido a lo explicado antes. El segundo cuenta con una alta afluencia de vehículos ya que por el cruza la carrera 46 C, muy utilizada por los vehículos que se dirigen hacia el norte de la ciudad.

Gráfico clase y tipo de accidente

En las bases de datos la ocurrencia de accidentes se encuentra clasificada de acuerdo a la gravedad y clase de acccidentes. En la siguiente gráfica se muestra cómo están distribuídos los accidentes respecto a estos parámetros.

La mayor cantidad de accidentes presentados son CHOQUES, de los cuales en su mayoría solo ocurren daños, seguido de eventos con heridos y eventos con muertes. La clase OTROS presenta una alta participación en la ocurrencia de accidentes. Habría que realizar un estudio más profundo para identificar qué tipo de eventos se presentan en estos casos.

Los ATROPELLOS y CAIDA DE OCUPANTES presentan una alta cantidad de personas heridas, en ninguno de estos casos se observa solo ocurrencia de daños y ocurren muchas más muertes por los atropellos que por las caídas.

Los VOLCAMIENTOS se presentan en su mayoría heridos, seguido de solo daños y solo 4 muertes ocurridas en el período de estudio. Finalmente, la clase con menos participación es la de INCENDIO, con 15 eventos con daños y 14 con heridos sin ninguna ocurrencia de muertes. Se procede a eliminar esta clase del estudio debido a su baja participación y se muestra la cantidad total de accidentes para las otras clases:


     ATROPELLO CAIDA OCUPANTE         CHOQUE           OTRO    VOLCAMIENTO 
         19919          17791         138229          21243           6351 

Accidentalidad por año y mes

El siguiente gráfico muestra la distribución de la accidentalidad por mes cada año.

En general, la menor ocurrencia de accidentes se encuentra en el mes de enero, que es un mes donde no se celebra alguna festividad importante en la ciudad y el flujo de personas es relativamente bajo, debido a los foráneos que regresan a sus lugares de procedencia en el mes de diciembre.

En contraste, en promedio, agosto es el mes con la mayor ocurrencia de accidentes. Se debe tener en cuenta que en este mes se celebra la Feria de las Flores y que la afluencia de personas es alta y la ciudad cuenta con la llegada de personas de todas partes en estas fechas.

En los meses de marzo, mayo, septiembre y octubre también se observan valores altos de accidentalidad en la ciudad, mentras que el resto de los meses la accidentalidad parece mantenerse en un promedio.

Modelamiento

Para la selección del modelo predictivo que se utilizará para construir la aplicación en Shiny a partir de los datos de accidentalidad en Medellín, se procede a comparar diferentes modelos y evaluar su desempeño en entrenamiento y prueba calculando la el error cuadrático medio (MSE). En este caso, variaciones de más del 15% entre los MSE obtenidos en ambos conjuntos, se considerarán sospechosas de sobreentrenamiento del modelo.

Primero se seleccionan las variables que se utilizarán, que para este trabajo serán: DIA, MES, SEMANA, FECHAS_ESP, PERIODO, COMUNA, BARRIO y CLASE. Además de que se agrega la variable DIA_ANNO que muestra el número del día del año (1-365).

Luego se procede a dar un formato adecuado a las variables; se convertirá las variables BARRIO, COMUNAS y CLASE a categóricas (factor). Se tiene un número finito de barrios, sin embargo es bastante alto (271), por lo que se manejará la variable como continua y no como categórica. Las otras variables se convertirán nuevamente a factor luego de convertirlas en numéricas, ya que los modelos pueden trabajar mejor si se ingresan números en lugar de texo. Adicionalmente, las variables MES y FECHAS_ESP se trabajarán como categórica, mientras que se tratarán las variables DIA, SEMANA y PERIODO como continuas.

FECHA DIA MES SEMANA FECHAS_ESP PERIODO COMUNA BARRIO CLASE DIA_ANNO
2014-01-01 1 1 1 1 2014 16 156 3 1
2014-01-01 1 1 1 1 2014 10 107 1 1
2014-01-01 1 1 1 1 2014 3 174 1 1
2014-01-01 1 1 1 1 2014 16 150 1 1
2014-01-01 1 1 1 1 2014 6 62 2 1
2014-01-01 1 1 1 1 2014 4 28 3 1

Se pretende precedir la accidentalidad por mes, semana y día, por lo que se crean tres nuevos dataframes. El primero, realizando un conteo de la accidentalidad por día, en el segundo se cuenta la accidentalidad por semana, y el tercero cuenta la accidentalidad por mes para cada año. Para esto se utilizan las funciones group_by y summarise del paquete dplyr.

Para cada dataframe se procede a entrenar 3 modelos y calcular su desempeño tanto en los datos de entrenamiento como en los datos de validación. Debido a que la cantidad de accidentes es un conteo, se hará uso del modelo lineal generalizado con distribución Poisson. El segundo modelo a entrenar será el de k-Vecinos cercanos, para el cual se planea realizar un proceso previo para seleccionar un k óptimo para cada conjunto de datos. Por último, se ajustará un modelo de Bosque Aleatorio, para un determinado número de árboles.

Se procederá a calcular el MSE de entrenamiento y prueba para cada modelo y calcular la diferencia porcentual entre los mismos, de manera que se pueda establecer si el modelo está sobreentrenado (diferencia mayor al 15%) o no.

Modelamiento de accidentalidad por día

Se realiza el conteo del número de accidentes ocurridos cada día durante el período comprendido entre el 2014 y el 2018.

PERIODO DIA_ANNO FECHAS_ESP COMUNA BARRIO CLASE CANTIDAD
2014 1 1 1 184 1 1
2014 1 1 1 206 1 1
2014 1 1 1 224 1 1
2014 1 1 1 224 3 1
2014 1 1 1 236 3 1
2014 1 1 3 46 3 1

Se observa la distribución de la ocurrencia de accidentes.

En este caso la mayoría de los accidentes son únicos, debido a que el conteo se encuentra discretizado por diferentes variables.

Se dividen los datos en entrenamiento y prueba.

[1] "El conjunto de entrenamiento tiene 129975 filas y 7 columnas"
[1] "El conjunto de prueba tiene 30820 filas y 7 columnas"

Ahora se procede realizar el entrenamiento y predicción de accidentalidad utilizando los modelos mencionados anteriormente.

Modelo lineal generalizado - Distribución Poisson

Se procede a ajustar el modelo con todas las variables utilizando la función glm, especificando la distribución Poisson como argumento.


Call:
glm(formula = CANTIDAD ~ ., family = "poisson", data = trainSet_dia)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.6043  -0.2795  -0.1560   0.0783   4.1997  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.507e+00  4.458e+00  -0.787  0.43149    
PERIODO      1.670e-03  2.212e-03   0.755  0.45023    
DIA_ANNO     4.303e-05  2.372e-05   1.814  0.06963 .  
FECHAS_ESP2  7.951e-02  1.482e-02   5.366 8.04e-08 ***
FECHAS_ESP3  1.148e-02  1.538e-02   0.747  0.45535    
COMUNA2     -1.773e-02  2.923e-02  -0.607  0.54405    
COMUNA3      2.394e-02  2.455e-02   0.975  0.32945    
COMUNA4      3.341e-02  2.265e-02   1.475  0.14022    
COMUNA5      1.838e-01  2.188e-02   8.403  < 2e-16 ***
COMUNA6      2.695e-02  2.501e-02   1.078  0.28125    
COMUNA7      4.454e-02  2.251e-02   1.979  0.04782 *  
COMUNA8      2.417e-03  2.523e-02   0.096  0.92366    
COMUNA9      1.206e-02  2.423e-02   0.498  0.61877    
COMUNA10     3.301e-01  2.112e-02  15.632  < 2e-16 ***
COMUNA11     2.075e-01  2.167e-02   9.578  < 2e-16 ***
COMUNA12     3.212e-03  2.441e-02   0.132  0.89534    
COMUNA13    -1.373e-02  2.702e-02  -0.508  0.61137    
COMUNA14     9.735e-02  2.223e-02   4.380 1.19e-05 ***
COMUNA15     2.727e-01  2.233e-02  12.209  < 2e-16 ***
COMUNA16     6.253e-02  2.256e-02   2.772  0.00557 ** 
BARRIO       2.733e-05  3.318e-05   0.823  0.41024    
CLASE2      -2.017e-02  1.147e-02  -1.758  0.07878 .  
CLASE3       2.549e-01  8.474e-03  30.082  < 2e-16 ***
CLASE4      -1.069e-02  1.090e-02  -0.981  0.32679    
CLASE5      -4.803e-02  1.591e-02  -3.018  0.00254 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 32478  on 129974  degrees of freedom
Residual deviance: 26697  on 129950  degrees of freedom
AIC: 304929

Number of Fisher Scoring iterations: 4

El PERIODO no resulta ser significativo para el modelo, con un valor p bastante alto que no brinda evidencia para rechazar la hipótesis nula, por lo que se concluye que en este modelo ingresar el año no aporta información.

La inclusión de las comunas 5, 10, 11, 14, 15 y 16 es bastante significativa para el modelo. Cabe destacar que las comunas mencionadas son las de mayor ocurrencia de accidentalidad en Medellín durante el periodo de estudio. Entre las clases de accidentes, los CHOQUES (CLASE3) son los de mayor ocurrencia, además de los más significativos para el modelo ajustado, con un valor p que es esencialmente cero, seguido de la clase de accidentes VOLCAMIENTO (CLASE6).

Por último, los días No Laborales no parecen ser significativos para el ajuste, de acuerdo con este modelo. En contraste la inclusión de los días laborales es muy significativa. Además de que la variable clave para la predicción con este modelo (columna DIA_ANNO) muestra un valor p bastante alto, que indica que no puede favorecer la hipótesis alternativa y por tanto dicha variable no presenta relación alguna con la variable de respuesta bajo este escenario. Esto representa un inconveniente, ya que el objetivo es predecir la accidentalidad en Medellín por día.

Se procede a continuación a eliminar variables del modelo de una en una para observar el efecto separado sobre el ajuste del modelo y las otras variables.


Call:
glm(formula = CANTIDAD ~ . - PERIODO, family = "poisson", data = trainSet_dia)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.6013  -0.2795  -0.1559   0.0783   4.1950  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.410e-01  2.651e-02  -5.319 1.04e-07 ***
DIA_ANNO     4.310e-05  2.372e-05   1.817  0.06921 .  
FECHAS_ESP2  7.951e-02  1.482e-02   5.366 8.03e-08 ***
FECHAS_ESP3  1.146e-02  1.538e-02   0.745  0.45610    
COMUNA2     -1.778e-02  2.923e-02  -0.608  0.54308    
COMUNA3      2.392e-02  2.455e-02   0.974  0.32986    
COMUNA4      3.346e-02  2.265e-02   1.477  0.13964    
COMUNA5      1.839e-01  2.187e-02   8.408  < 2e-16 ***
COMUNA6      2.706e-02  2.501e-02   1.082  0.27936    
COMUNA7      4.458e-02  2.251e-02   1.981  0.04764 *  
COMUNA8      2.436e-03  2.523e-02   0.097  0.92307    
COMUNA9      1.212e-02  2.423e-02   0.500  0.61700    
COMUNA10     3.302e-01  2.112e-02  15.634  < 2e-16 ***
COMUNA11     2.076e-01  2.167e-02   9.582  < 2e-16 ***
COMUNA12     3.307e-03  2.441e-02   0.135  0.89223    
COMUNA13    -1.367e-02  2.702e-02  -0.506  0.61290    
COMUNA14     9.749e-02  2.223e-02   4.387 1.15e-05 ***
COMUNA15     2.728e-01  2.233e-02  12.214  < 2e-16 ***
COMUNA16     6.267e-02  2.256e-02   2.778  0.00546 ** 
BARRIO       2.734e-05  3.318e-05   0.824  0.41005    
CLASE2      -2.012e-02  1.147e-02  -1.753  0.07954 .  
CLASE3       2.551e-01  8.470e-03  30.118  < 2e-16 ***
CLASE4      -1.048e-02  1.089e-02  -0.962  0.33629    
CLASE5      -4.759e-02  1.590e-02  -2.993  0.00276 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 32478  on 129974  degrees of freedom
Residual deviance: 26697  on 129951  degrees of freedom
AIC: 304928

Number of Fisher Scoring iterations: 4

La eliminación de la columna PERIODO no altera demasiado la interacción de las demás variables con la variable de respuesta, salvo el INTERCEPTO, que ahora se hace muy significativo para el modelo, con un valor p bastante bajo. La interacción de la columna DIA_ANNO con la variable respuesta no se vio afectada.

Se procede ahora a eliminar la variable CLASE, para observar si la interacción deseada mejora.


Call:
glm(formula = CANTIDAD ~ . - CLASE, family = "poisson", data = trainSet_dia)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.5059  -0.3000  -0.1345  -0.0444   4.3911  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -6.472e+00  4.455e+00  -1.453 0.146309    
PERIODO      3.185e-03  2.210e-03   1.441 0.149635    
DIA_ANNO     4.637e-05  2.373e-05   1.954 0.050648 .  
FECHAS_ESP2  8.676e-02  1.482e-02   5.856 4.75e-09 ***
FECHAS_ESP3  1.946e-02  1.538e-02   1.265 0.205752    
COMUNA2      7.475e-03  2.922e-02   0.256 0.798111    
COMUNA3      4.660e-02  2.454e-02   1.899 0.057581 .  
COMUNA4      8.380e-02  2.261e-02   3.706 0.000211 ***
COMUNA5      2.361e-01  2.181e-02  10.825  < 2e-16 ***
COMUNA6      2.993e-02  2.500e-02   1.197 0.231195    
COMUNA7      8.399e-02  2.245e-02   3.741 0.000183 ***
COMUNA8      3.839e-02  2.520e-02   1.523 0.127671    
COMUNA9      6.416e-02  2.418e-02   2.654 0.007964 ** 
COMUNA10     3.963e-01  2.106e-02  18.820  < 2e-16 ***
COMUNA11     2.848e-01  2.158e-02  13.199  < 2e-16 ***
COMUNA12     7.604e-02  2.435e-02   3.123 0.001789 ** 
COMUNA13     1.041e-02  2.700e-02   0.386 0.699802    
COMUNA14     2.004e-01  2.210e-02   9.070  < 2e-16 ***
COMUNA15     3.365e-01  2.226e-02  15.114  < 2e-16 ***
COMUNA16     1.334e-01  2.248e-02   5.933 2.97e-09 ***
BARRIO       5.595e-05  3.319e-05   1.686 0.091879 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 32478  on 129974  degrees of freedom
Residual deviance: 29306  on 129954  degrees of freedom
AIC: 307531

Number of Fisher Scoring iterations: 4

Se observa en este caso que el eliminar la variable CLASE tiene un efecto positivo en la interacción de las demás variables con la vaiable de respuesta. En este caso, aumenta el número de comunas que el modelo considera significativas para el ajuste. Además de que el valor p para la columna BARRIO disminuyó considerablemente.

La inclusión de la columna PERIODO provoca que el INTERCEPTO deje de ser significativo para el modelo. Además, la columna DIA_ANNO sigue mostrando un valor p que no permite rechazar la hipótesis nula.

Se ajusta ahora un cuarto modelo eliminando las columnas CLASE y PERIODO.


Call:
glm(formula = CANTIDAD ~ . - PERIODO - CLASE, family = "poisson", 
    data = trainSet_dia)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.5004  -0.3002  -0.1348  -0.0450   4.3825  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -5.301e-02  2.586e-02  -2.050 0.040386 *  
DIA_ANNO     4.649e-05  2.373e-05   1.960 0.050035 .  
FECHAS_ESP2  8.677e-02  1.482e-02   5.856 4.73e-09 ***
FECHAS_ESP3  1.941e-02  1.538e-02   1.262 0.206780    
COMUNA2      7.424e-03  2.922e-02   0.254 0.799474    
COMUNA3      4.657e-02  2.454e-02   1.898 0.057713 .  
COMUNA4      8.397e-02  2.261e-02   3.714 0.000204 ***
COMUNA5      2.364e-01  2.181e-02  10.840  < 2e-16 ***
COMUNA6      3.016e-02  2.500e-02   1.206 0.227648    
COMUNA7      8.414e-02  2.245e-02   3.748 0.000178 ***
COMUNA8      3.847e-02  2.520e-02   1.527 0.126866    
COMUNA9      6.436e-02  2.418e-02   2.662 0.007772 ** 
COMUNA10     3.965e-01  2.106e-02  18.826  < 2e-16 ***
COMUNA11     2.851e-01  2.158e-02  13.212  < 2e-16 ***
COMUNA12     7.631e-02  2.434e-02   3.135 0.001721 ** 
COMUNA13     1.057e-02  2.700e-02   0.392 0.695385    
COMUNA14     2.008e-01  2.210e-02   9.088  < 2e-16 ***
COMUNA15     3.368e-01  2.226e-02  15.128  < 2e-16 ***
COMUNA16     1.338e-01  2.248e-02   5.950 2.68e-09 ***
BARRIO       5.602e-05  3.319e-05   1.688 0.091436 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 32478  on 129974  degrees of freedom
Residual deviance: 29309  on 129955  degrees of freedom
AIC: 307531

Number of Fisher Scoring iterations: 4

En este caso tanto el INTERCEPTO como DIA_ANNO pasan a ser ligeramente significativas para el modelo, con un valor p menor al 5% que no es muy contundente para rechazar la hippótesis nula, pero es mejor que los resultados arrojados por los ajustes anteriores, tomando en cuenta el objetivo del ajuste, que es poder predecir la accidentalidad por día en Medellín con cierto grado de seguridad.

A continuación se calcula el MSE para los datos de entrenamiento y validación con cada uno de los cuatro ajustes anteriores. Además se calcula el porcentaje de variación para descartar sobreentrenamiento.

Ajuste.Poisson MSE.Entrenamiento MSE.Prueba Porcentaje.Variacion
Ajuste1 1.481775 1.474705 0.4771792
Ajuste2 1.481776 1.483358 0.1067355
Ajuste3 1.488708 1.488884 0.0118282
Ajuste4 1.488714 1.505348 1.1173117

Los resultados obtenidos para los cuatro ajustes son buenos, teniendo en cuenta que la variación máxima del MSE caculado para ambos conjuntos debe ser de 15%. El cuarto ajuste presenta una variación de 1.11% y es la más alta. Este ajuste, aunque sacrifica la variable CLASE, permite ganar significancia a la variable DIA_ANNO, y por tanto se toma para realizar la comparación con los modelos que se estudiarán más adelante.

K Vecinos Cercanos

El segundo modelo a ajustar es el K-Vecinos Cercanos para Regresión. Este hace parte de la librería caret.

Antes de realizar el ajuste del modelo, se selecciona un valor de \(K\) óptimo de acuerdo al valor mínimo obtenido para el RMSE. Para hacerlo se tomará una muestra del 5% de los datos de entrenamiento ya que debido a la alta dimensionalidad de los datos conllevaría un alto costo computacional el poder realizar el proceso con los datos completos.

k-Nearest Neighbors 

6499 samples
   6 predictor

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (15 reps, 75%) 
Summary of sample sizes: 4875, 4875, 4875, 4875, 4875, 4875, ... 
Resampling results across tuning parameters:

  k   RMSE       Rsquared     MAE      
   1  0.9334002  0.006538715  0.4541598
   2  0.8131204  0.008727420  0.4407191
   3  0.7737921  0.008535358  0.4381089
   4  0.7507789  0.009421495  0.4376415
   5  0.7366937  0.009539959  0.4374020
   6  0.7258625  0.010976364  0.4357040
   7  0.7205006  0.010629708  0.4356655
   8  0.7170707  0.010076601  0.4366437
   9  0.7130671  0.010679289  0.4365483
  10  0.7096793  0.010973084  0.4356434
  11  0.7073537  0.011038732  0.4355543
  12  0.7053150  0.011019814  0.4352602
  13  0.7034602  0.011152480  0.4351307
  14  0.7023586  0.010713981  0.4353982
  15  0.7011746  0.010602367  0.4356120
  16  0.7006561  0.010007158  0.4361337
  17  0.6989062  0.010731097  0.4356499
  18  0.6977098  0.011028482  0.4357237
  19  0.6967296  0.011145812  0.4362060
  20  0.6957943  0.011460122  0.4365931
  21  0.6951555  0.011520160  0.4369619
  22  0.6946478  0.011517317  0.4375259
  23  0.6938387  0.011909987  0.4379116
  24  0.6936921  0.011621847  0.4385096
  25  0.6930351  0.011975907  0.4385341
  26  0.6930061  0.011656489  0.4391564
  27  0.6924136  0.012069203  0.4391381
  28  0.6920373  0.012280088  0.4395216
  29  0.6914613  0.012803811  0.4398924
  30  0.6913134  0.012765639  0.4401895
  31  0.6910443  0.012868980  0.4405082
  32  0.6909929  0.012695084  0.4409699
  33  0.6908668  0.012614822  0.4412837
  34  0.6907494  0.012570141  0.4415893
  35  0.6907018  0.012405088  0.4419263
  36  0.6907884  0.012047977  0.4424350
  37  0.6906026  0.012055169  0.4425381
  38  0.6905827  0.011833607  0.4428213
  39  0.6904841  0.011709709  0.4430212
  40  0.6904212  0.011533032  0.4432252
  41  0.6903585  0.011446223  0.4434486
  42  0.6902230  0.011383592  0.4435179
  43  0.6901213  0.011324710  0.4436829
  44  0.6902502  0.010920146  0.4440078
  45  0.6902102  0.010837749  0.4441532
  46  0.6901407  0.010765209  0.4442043
  47  0.6900967  0.010697535  0.4442710
  48  0.6900337  0.010674487  0.4443658
  49  0.6900974  0.010454928  0.4445716
  50  0.6900256  0.010438456  0.4446361

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 50.

De acuerdo con el modelo, el valor óptimo de \(k\) es \(k=50\), sin embargo, se observa que el mse no varía mucho a partir de \(k=15\), por lo que se toma este valor para el entrenamiento posterior.

15-nearest neighbor regression model

Se realiza la predicción para los datos de entrenamiento y se calcula el MSE.

[1] 0.3695411

Para el conjunto de prueba:

[1] 0.4236879

Se calcula la diferencia porcentual.

[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Vecinos cercanos es de 14.65%"

Los valores de MSE obtenidos en este con el modelo de Vecinos Cercanos son más bajos que para el modelo anterior. En este caso se calcula una diferencia en el MSE de 14.9%, que se encuentra en el límite. Se puede decir entonces que el modelo no está sobreentrenado, aunque la diferencia entre ambos valores de MSE es alta.

Bosque Aleatorio

Antes de entrenar el modelo, se debe seleccionar un número óptimo de árboles. Para esto se toma una muestra del 10% de los datos de entrenamiento y se realiza el siguiente proceso, guiado de lo encontrado en este RPubs.

A partir de 100 árboles el error no varía mucho. Se selecciona este valor para entrenar el modelo con los datos de entrenamiento.


Call:
 randomForest(formula = CANTIDAD ~ ., data = trainSet_dia, ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 2

          Mean of squared residuals: 0.3378411
                    % Var explained: 22.77

El ajuste del modelo con 50 árboles solo explica el 22.94% de la varianza, lo cual es un valor bastamnnte bajo y puede indicar que al modelo le hacen falta variables que aporten más información. A continuación se calcula el mse para los datos de entrenamiento y prueba.

[1] "El MSE para el conjunto de entrenamiento es: 0.308830367506836"
[1] "El MSE para el conjunto de prueba es: 0.349864891944701"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio entrenado con 20 árboles es de 13.29%"

La variación del MSE es de 13.42% menor que la variación obtenida para el ajuste anterior y que el límite establecido, por lo que el modelo no se encuentra sobreentrenado. El ajuste del modelo con 100 árboles conlleva un costo computacional bastante alto, puesto que el ajustar el modelo demora al menos 30 minutos.

Se muestra a continuación la importancia de las variables en aras de saber qué tan influyente es la variable DIA_ANNO para la predicción de la accidentalidad.

Se observa que la variable COMUNA es la de mayor influencia, seguida de BARRIO, CLASE y DIA_ANNO. Las variables FECHAS_ESP y PERIODO no son tan inlfuyentes para el modelo. Se realiza un segundo ajuste sin contar estas variables.


Call:
 randomForest(formula = CANTIDAD ~ . - FECHAS_ESP - PERIODO, data = trainSet_dia,      ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 1

          Mean of squared residuals: 0.3595494
                    % Var explained: 17.8

Se observa una disminución considerable en el porcentaje de varianza explicada por el modelo, que para el primer ajuste también era baja. Esto indica que pueden hacer falta variables dentro del ajuste que permitan alcanzar un mayor valor de varianza explicada y permitan mejores predicciones de la accidentalidad. A continuación se calcula el MSE para los conjuntos de entrenamiento y validación.

[1] "El MSE para el conjunto de prueba es: 0.35577046003082"
[1] "El MSE para el conjunto de prueba es: 0.373205648304266"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio entrenado con 20 árboles es de 4.9%"

Aunque los valores de MSE en este segundo ajuste son más alto, la diferencia entre el MSE calculado para ambos conjuntos fue más baja que la obtenida con el modelo ajustado con todas las variables. Se toma este segundo ajuste para realizar la comparación entre los tres modelos.

A continuación se presenta un resumen de los resultados obtenidos para los tres modelos.

Modelo mse_train mse_test Diff_mse
GLM(Poisson) 1.4887142 1.5053478 1.12%
KNN 0.3695411 0.4236879 14.65%
Random Forest 0.3557705 0.3732056 4.9%

Se observa que los valores más altos de MSE se obtuvieron para el GLM (Poisson), seguido de KNN y Random Forest. Sin embargo, la diferencia entre dicho valor para ambos conjuntos aumenta, siendo GLM (Poisson) el que arrojó la menor diferencia y KNN el de mayor.

El error cuadrático para los datos de validación es bastante alto con el modelo GLM (Poisson), tomando en cuenta que la cantidad máxima de accidentes de acuerdo a los filtros introducidos sería de 9, y que se tienen muchos datos únicos. Por otro lado, el modelo KNN muestra una diferencia de MSE bastante cercana al límite, por lo que es propenso a estar sobreestimado, además de que el tiempo necesario para el ajuste del modelo es un poco alto. En este caso, el mejor modelo para la predicción de la accidentalidad por días sería el modelo de Bosque Aleatorio, el cual no solo muestra una diferencia en el MSE bastante baja, si no que los valores calculados de MSE son bajos individualmente.

Modelamiento de accidentalidad por semana

Se realiza un proceso similar al hecho para los datos de accidentalidad por día, solo que ahora se excluye la variable DIA del conteo. Ya que la variable FECHAS_ESP hace referencia a un díua puntual, no tiene sentido incluirlo en esta parte del análisis.

PERIODO MES SEMANA COMUNA BARRIO CLASE CANTIDAD
2014 1 1 1 49 4 1
2014 1 1 1 66 3 1
2014 1 1 1 101 1 1
2014 1 1 1 120 2 1
2014 1 1 1 184 1 1
2014 1 1 1 206 1 1

Se observa la distribución de la cantidad de accidentes por semanas.

Nuevamente, se observa un alto número de accidentes únicos, esto debido a que el conteo se encuentra discretizado por diferentes variables. Si se observa la relación entre la accidentalidad con la variable semana.

No se observa un patrón definido al graficar la accidentalidad por semana. Se procede ahora a dividir los datos en entrenamiento (2014 a 2017) y prueba (datos del 2018).

[1] "El conjunto de entrenamiento tiene 79181 filas y 7 columnas"
[1] "El conjunto de prueba tiene 18741 filas y 7 columnas"

Se ajustan los mismos tres modelos que se entrenaron en la sección anterior, esta vez para predecir la accidentalidad en Medellín por semana.

Modelo lineal generalizado - Distribución Poisson

Se ajusta el modelo con todas las variables para los datos de entrenamiento.


Call:
glm(formula = CANTIDAD ~ ., family = "poisson", data = trainSet_sem)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4163  -0.6908  -0.0661   0.2533   8.0154  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.405e+01  4.454e+00  -3.155 0.001606 ** 
PERIODO      6.802e-03  2.210e-03   3.078 0.002084 ** 
MES2         6.021e-02  1.464e-02   4.113 3.90e-05 ***
MES3         7.872e-02  1.933e-02   4.072 4.66e-05 ***
MES4         5.617e-02  2.616e-02   2.147 0.031769 *  
MES5         7.764e-02  3.325e-02   2.335 0.019531 *  
MES6         2.682e-02  4.041e-02   0.664 0.506871    
MES7         3.022e-02  4.828e-02   0.626 0.531389    
MES8         6.124e-02  5.585e-02   1.096 0.272907    
MES9         7.527e-02  6.347e-02   1.186 0.235665    
MES10        5.255e-02  7.165e-02   0.733 0.463294    
MES11        1.672e-02  7.917e-02   0.211 0.832742    
MES12        1.552e-02  8.687e-02   0.179 0.858194    
SEMANA       1.220e-03  1.811e-03   0.674 0.500406    
COMUNA2     -6.332e-02  2.923e-02  -2.166 0.030277 *  
COMUNA3      1.849e-01  2.454e-02   7.535 4.89e-14 ***
COMUNA4      2.850e-01  2.262e-02  12.599  < 2e-16 ***
COMUNA5      6.267e-01  2.181e-02  28.739  < 2e-16 ***
COMUNA6      1.683e-01  2.500e-02   6.732 1.67e-11 ***
COMUNA7      2.673e-01  2.248e-02  11.891  < 2e-16 ***
COMUNA8      8.600e-02  2.521e-02   3.411 0.000647 ***
COMUNA9      1.375e-01  2.418e-02   5.687 1.29e-08 ***
COMUNA10     1.051e+00  2.106e-02  49.926  < 2e-16 ***
COMUNA11     7.492e-01  2.159e-02  34.706  < 2e-16 ***
COMUNA12     1.630e-01  2.435e-02   6.691 2.21e-11 ***
COMUNA13    -1.670e-02  2.701e-02  -0.618 0.536391    
COMUNA14     4.467e-01  2.214e-02  20.173  < 2e-16 ***
COMUNA15     8.652e-01  2.225e-02  38.885  < 2e-16 ***
COMUNA16     3.131e-01  2.248e-02  13.926  < 2e-16 ***
BARRIO       2.003e-04  3.340e-05   5.996 2.02e-09 ***
CLASE2      -6.179e-02  1.145e-02  -5.396 6.83e-08 ***
CLASE3       8.481e-01  8.416e-03 100.773  < 2e-16 ***
CLASE4      -2.307e-02  1.087e-02  -2.123 0.033795 *  
CLASE5      -2.192e-01  1.589e-02 -13.792  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 117403  on 79180  degrees of freedom
Residual deviance:  67757  on 79147  degrees of freedom
AIC: 258202

Number of Fisher Scoring iterations: 5

En este caso, la variable SEMANA no es significativa para el ajuste del modelo. Se observa, además, que en promedio solo la adición de los meses de febrero y marzo aporta información para el ajuste. En este caso, la mayoría de las comunas son significativas para el ajuste, como muestran sus valores p, además de que para la variable BARRIO dicho valor es bastante bajo, permitiendo rechazar la hipótesis nula.

Solo la clase INCENDIO no es significativa para el modelo. Cabe destacar que la ocurrencia de incendios es muy baja, en comparación con las otras clases de accidentes. La variable PERIODO tiene una influencia sobre la variable de respuesta en este caso, a diferencia del ajuste del modelo para predicción de accidentalidad por días.
Se realiza un segundo ajuste del modelo eliminando la columna MES para observar el comportamiento de la variable SEMANA respecto a la variable de respuesta.


Call:
glm(formula = CANTIDAD ~ . - MES, family = "poisson", data = trainSet_sem)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3897  -0.6868  -0.0630   0.2570   8.0993  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.394e+01  4.454e+00  -3.131 0.001744 ** 
PERIODO      6.777e-03  2.210e-03   3.067 0.002166 ** 
SEMANA       8.784e-04  1.653e-04   5.316 1.06e-07 ***
COMUNA2     -6.441e-02  2.923e-02  -2.204 0.027527 *  
COMUNA3      1.849e-01  2.454e-02   7.535 4.90e-14 ***
COMUNA4      2.844e-01  2.262e-02  12.572  < 2e-16 ***
COMUNA5      6.263e-01  2.181e-02  28.722  < 2e-16 ***
COMUNA6      1.678e-01  2.500e-02   6.711 1.94e-11 ***
COMUNA7      2.672e-01  2.248e-02  11.888  < 2e-16 ***
COMUNA8      8.560e-02  2.521e-02   3.396 0.000684 ***
COMUNA9      1.373e-01  2.418e-02   5.678 1.37e-08 ***
COMUNA10     1.051e+00  2.106e-02  49.891  < 2e-16 ***
COMUNA11     7.492e-01  2.159e-02  34.707  < 2e-16 ***
COMUNA12     1.634e-01  2.435e-02   6.708 1.97e-11 ***
COMUNA13    -1.703e-02  2.701e-02  -0.630 0.528419    
COMUNA14     4.467e-01  2.214e-02  20.172  < 2e-16 ***
COMUNA15     8.651e-01  2.225e-02  38.882  < 2e-16 ***
COMUNA16     3.133e-01  2.248e-02  13.934  < 2e-16 ***
BARRIO       2.006e-04  3.340e-05   6.006 1.90e-09 ***
CLASE2      -6.114e-02  1.145e-02  -5.339 9.34e-08 ***
CLASE3       8.476e-01  8.415e-03 100.720  < 2e-16 ***
CLASE4      -2.291e-02  1.087e-02  -2.108 0.035012 *  
CLASE5      -2.186e-01  1.589e-02 -13.755  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 117403  on 79180  degrees of freedom
Residual deviance:  67860  on 79158  degrees of freedom
AIC: 258283

Number of Fisher Scoring iterations: 5

Se observa una disminución considerable en el valor p calculado para la variable SEMANA en comparación con el ajuste anterior. Este valor es lo suficientemente contundente para rechazar la hipótesis nula de entrada. Además, el ajuste muestra que las otras variables son bastante significativas para el modelo, por lo que no se realizan más modificaciones.

A continuación se calcula el MSE para los datos de entrenamiento y validación con cada uno de los dos ajustes anteriores. Además se calcula el porcentaje de variación para descartar sobreentrenamiento.

Ajuste_Pois MSE_train MSE_test variacion_percent
Ajuste1 6.326080 6.424384 1.553946
Ajuste2 6.327083 6.424770 1.543949

Se observa que el modelo se desempeña ligeramente mejor en con los datos de entrenamiento para ambos ajustes. La diferencia porcentual entre los valores calculados de MSE es menor para el segundo ajuste del modelo.

Debido a que en el segundo ajuste la variable SEMANA muestra cierto grado de significancia, se toma este como el modelo a comparar con el ajuste de K vecinos cercanos y Random Forest para la predicción de la accidentalidad por semana en Medellín.

K Vecinos Cercanos

Se selecciona un valor de \(K\) óptimo de acuerdo al valor mínimo obtenido para el MSE. Para hacerlo se tomará una muestra del 5% de los datos de entrenamiento ya que debido a la alta dimensionalidad de los datos conllevaría un alto costo computacional el poder realizar el proceso con los datos completos.

k-Nearest Neighbors 

3959 samples
   6 predictor

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (15 reps, 75%) 
Summary of sample sizes: 2970, 2970, 2970, 2970, 2970, 2970, ... 
Resampling results across tuning parameters:

  k    RMSE      Rsquared    MAE     
    1  3.001184  0.03769401  1.613398
    2  2.635161  0.03047857  1.540418
    3  2.487686  0.03576602  1.496311
    4  2.414659  0.03753239  1.476593
    5  2.385950  0.03411782  1.469324
    6  2.363848  0.03308873  1.458918
    7  2.346175  0.03196413  1.451412
    8  2.334790  0.03108350  1.446250
    9  2.325897  0.03034868  1.443707
   10  2.319206  0.02985139  1.439485
   11  2.312266  0.03023662  1.434445
   12  2.305698  0.03072253  1.431016
   13  2.299844  0.03111351  1.427637
   14  2.295617  0.03134484  1.423914
   15  2.291884  0.03123249  1.420012
   16  2.291529  0.03049281  1.419608
   17  2.288720  0.03074631  1.418588
   18  2.287126  0.03054187  1.416569
   19  2.281934  0.03218322  1.412781
   20  2.279083  0.03264578  1.411426
   21  2.276440  0.03336310  1.410526
   22  2.274549  0.03376623  1.409412
   23  2.273857  0.03367281  1.408302
   24  2.272238  0.03406435  1.407398
   25  2.270635  0.03480575  1.406761
   26  2.270455  0.03436022  1.405604
   27  2.270789  0.03376631  1.405356
   28  2.270544  0.03351337  1.403815
   29  2.272263  0.03222512  1.404756
   30  2.273603  0.03100777  1.404880
   31  2.275655  0.02953304  1.406156
   32  2.275466  0.02933853  1.405573
   33  2.275797  0.02877310  1.405611
   34  2.275963  0.02826992  1.404891
   35  2.275714  0.02813160  1.404392
   36  2.275558  0.02805573  1.403971
   37  2.275870  0.02756844  1.403130
   38  2.276843  0.02672998  1.403217
   39  2.276346  0.02687494  1.402184
   40  2.275968  0.02689107  1.401569
   41  2.275709  0.02699833  1.400305
   42  2.275339  0.02705483  1.399660
   43  2.275092  0.02693672  1.399269
   44  2.274968  0.02683409  1.399151
   45  2.275379  0.02625087  1.399127
   46  2.275886  0.02582075  1.399230
   47  2.276439  0.02529847  1.398847
   48  2.277504  0.02450816  1.399565
   49  2.277879  0.02413382  1.399504
   50  2.278369  0.02372722  1.399600
   51  2.278996  0.02325473  1.399779
   52  2.279086  0.02311917  1.399344
   53  2.279641  0.02264163  1.399624
   54  2.279308  0.02270464  1.399034
   55  2.279515  0.02251350  1.399162
   56  2.280166  0.02194077  1.399214
   57  2.279797  0.02205476  1.398599
   58  2.279470  0.02221728  1.398362
   59  2.279624  0.02207214  1.398176
   60  2.279989  0.02170410  1.397964
   61  2.279994  0.02163697  1.397752
   62  2.280380  0.02127202  1.398006
   63  2.281370  0.02053316  1.398300
   64  2.281799  0.02017349  1.398601
   65  2.282121  0.01993692  1.398967
   66  2.282078  0.01984716  1.398619
   67  2.282621  0.01951776  1.398872
   68  2.282891  0.01924469  1.398714
   69  2.282893  0.01914500  1.398668
   70  2.283051  0.01898761  1.398860
   71  2.283406  0.01872425  1.399191
   72  2.283584  0.01843071  1.399114
   73  2.283886  0.01824773  1.399090
   74  2.283981  0.01817953  1.398908
   75  2.284186  0.01794812  1.398969
   76  2.284322  0.01780906  1.398784
   77  2.284588  0.01747893  1.399108
   78  2.284597  0.01737589  1.398915
   79  2.284286  0.01753510  1.398804
   80  2.284452  0.01736055  1.398969
   81  2.284819  0.01705330  1.399265
   82  2.284852  0.01700616  1.399495
   83  2.284993  0.01686518  1.399682
   84  2.284882  0.01693905  1.399845
   85  2.284946  0.01683840  1.399849
   86  2.285324  0.01653430  1.400438
   87  2.285426  0.01642144  1.400683
   88  2.285312  0.01642023  1.400874
   89  2.285438  0.01628096  1.401063
   90  2.285226  0.01637443  1.400968
   91  2.285177  0.01631187  1.401018
   92  2.285104  0.01628496  1.401298
   93  2.285269  0.01608434  1.401547
   94  2.285331  0.01601172  1.402109
   95  2.284846  0.01633256  1.402115
   96  2.284527  0.01655361  1.402001
   97  2.284549  0.01650585  1.402134
   98  2.284700  0.01638537  1.402132
   99  2.284422  0.01653963  1.401916
  100  2.284303  0.01662658  1.402127

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 26.

Según el modelo, el valor óptimo de vecinos para este escenario es de 78, sin embargo, la disminución del error no es muy pronunciada a partir de los 10 vecinos, por lo que se toma \(k=20\) para realizar el ajuste del modelo.

20-nearest neighbor regression model

Se calcula el MSE para los datos de entrenamiento:

[1] 3.746555

Ahora para los datos de prueba:

[1] 4.306304
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Vecinos cercanos es de 14.94%"

Se tienen una diferencia del 23.3% entre el MSE para los datos de entrenamiento y validación. Dicha diferencia está por encima del 15% establecido como límite, por lo que en este caso hay evidencia de sobreentrenamiento del modelo. Se entrena nuevamente el modelo con \(k=40\) vecinos para observar si el desempeño mejora.

40-nearest neighbor regression model

Ahora se calcula el MSE para el conjunto de entrenamiento:

[1] 4.112394

El MSE para el conjunto de prueba es:

[1] 4.411655
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Vecinos cercanos es de 7.28%"

En este caso la diferencia entre el desempeño del modelo en los conjuntos de entrenamiento y prueba es de solo 8.51%, más bajo que el valor obtenido al ajustar el modelo con 20 vecinos y que el valor límite (15%). Los valores calculados de MSE son más altos que los obtenidos con el modelo Poisson en este caso.

Se toma este ajuste para las comparaciones con los otros dos modelos.

Bosque Aleatorio

Se realiza el proceso para seleccionar un número óptimo de árboles para predecir la accidentalidad por semana tomando una muestra del 10% de los datos de entrenamiento.

Alrededor de los 100 árboles no se observa una disminución significativa del error. Se toma este valor y se ajusta el modelo perdictivo.


Call:
 randomForest(formula = CANTIDAD ~ ., data = trainSet_sem, ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 2

          Mean of squared residuals: 2.029293
                    % Var explained: 59.68

El modelo ajustado con 100 árboles explica un 59.59% de la varianza, puede que hagan falta variables para poder aumentar el porcentaje de varianza explicada por el modelo. Se realiza ahora la predicción para los conjuntos de entrenamiento y prueba y se calcula el MSE.

[1] "El MSE para el conjunto de prueba es: 1.5238620671935"
[1] "El MSE para el conjunto de prueba es: 2.08857471076245"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio entrenado con 150 árboles es de 37.06%"

La diferencia entre el MSE para ambos conjuntos está por encima del límite (15%), indicando que el modelo ajustado con todas las variables está sobreentrenado. El modelo se desempeña mejor para el conjunto de entrenamiento. Además, los valores de MSE son más bajos que los obtenidos para el método de Vecinos Cercanos.

Se observa la importancia de las variables en el ajuste.

En este caso las variables MES y PERIODO son las de menor importancia. Se procede a realizar un segundo ajuste sin contar estas variables para observar el desempeño del modelo de Bosque Aleatorio.


Call:
 randomForest(formula = CANTIDAD ~ . - PERIODO - MES, data = trainSet_sem,      ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 1

          Mean of squared residuals: 3.028943
                    % Var explained: 39.82

Este ajuste explica un 41.21% de la varianza, menos que el ajuste anterior. Se procede a calcular su desempeño con los conjuntos de entrenamiento y prueba calculando el MSE.

[1] "El MSE para el conjunto de prueba es: 2.98749733700832"
[1] "El MSE para el conjunto de prueba es: 3.17470557598906"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio sin la variable PERIODO es de 6.27%"

En este caso la diferencia entre el MSE obtenido para los conjuntos de entrenamiento y validación es de solo 6.46%, más bajo que el obtenido para el ajuste anterior. Se toma este ajuste para comparar con los mejores ajustes de los otros dos modelos, ya que la eliminación de las dos variables redujo signficativamente la diferencia de MSE.

A continuación se presenta una tabla con los resultados de los ajustes para los tres modelos.

Modelo mse_train mse_test Diff_mse
GLM(Poisson) 6.327083 6.424770 1.54%
KNN 4.112394 4.411655 7.28%
Random Forest 2.987497 3.174706 6.27%

El MSE obtenido para ambos conjuntos con GLM(Poisson) es el más alto. Sin embargo, la diferencia entre ambos valores fue baja (1.54%) en comparación a la obtenida con los otros modelos. Los valores más bajos de MSE se obtuvieron para el modelo de Bosque Aleatorio, el cual se selecciona para realizar la predicción de la accidentalidad por semana en Medellín.

Modelamiento de accidentalidad por mes

Por último, se procede a entrenar un modelo para predecir la accidentalidad por mes. Se crea la tabla al igual que en los casos anteriores y se particionan los datos en los conjuntos de entrenamiento y validación.

PERIODO MES COMUNA BARRIO CLASE CANTIDAD
2014 1 1 1 3 1
2014 1 1 1 4 1
2014 1 1 49 2 1
2014 1 1 49 4 1
2014 1 1 66 3 1
2014 1 1 101 1 3
[1] "El conjunto de entrenamiento tiene 36199 filas y 6 columnas"
[1] "El conjunto de prueba tiene 8696 filas y 6 columnas"

Se observa cómo está distribuida la accidentalidad en este caso.

La mayoría de los accidentes en la tabla son únicos, debido a que estos se discretizan por diferentes variables, sin embargo, se puede observar que la ocurrencia de accidentes varía entre 1 y 64 en esta ocasión, sebido a que la resolución temporal es mayor.

Modelo lineal generalizado - Distribución Poisson

Se procede a entrenar el modelo con todas las variables inicialmente.


Call:
glm(formula = CANTIDAD ~ ., family = "poisson", data = trainSet_mes)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-6.5406  -0.9419  -0.2078   0.5757  12.4788  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.078e+01  4.450e+00  -2.423 0.015395 *  
PERIODO      5.210e-03  2.208e-03   2.360 0.018285 *  
MES2         1.016e-01  1.268e-02   8.012 1.13e-15 ***
MES3         1.548e-01  1.246e-02  12.427  < 2e-16 ***
MES4         1.099e-01  1.263e-02   8.704  < 2e-16 ***
MES5         1.707e-01  1.245e-02  13.704  < 2e-16 ***
MES6         8.507e-02  1.270e-02   6.696 2.14e-11 ***
MES7         1.498e-01  1.248e-02  12.000  < 2e-16 ***
MES8         1.858e-01  1.238e-02  15.016  < 2e-16 ***
MES9         1.611e-01  1.242e-02  12.969  < 2e-16 ***
MES10        1.524e-01  1.248e-02  12.218  < 2e-16 ***
MES11        9.417e-02  1.266e-02   7.438 1.02e-13 ***
MES12        1.354e-01  1.256e-02  10.775  < 2e-16 ***
COMUNA2     -1.089e-01  2.922e-02  -3.727 0.000194 ***
COMUNA3      4.968e-01  2.452e-02  20.263  < 2e-16 ***
COMUNA4      7.360e-01  2.261e-02  32.556  < 2e-16 ***
COMUNA5      1.183e+00  2.175e-02  54.383  < 2e-16 ***
COMUNA6      5.133e-01  2.499e-02  20.545  < 2e-16 ***
COMUNA7      6.196e-01  2.244e-02  27.615  < 2e-16 ***
COMUNA8      2.598e-01  2.520e-02  10.307  < 2e-16 ***
COMUNA9      4.425e-01  2.410e-02  18.356  < 2e-16 ***
COMUNA10     1.788e+00  2.103e-02  84.994  < 2e-16 ***
COMUNA11     1.369e+00  2.154e-02  63.546  < 2e-16 ***
COMUNA12     5.188e-01  2.430e-02  21.347  < 2e-16 ***
COMUNA13    -2.993e-02  2.701e-02  -1.108 0.267789    
COMUNA14     9.164e-01  2.208e-02  41.500  < 2e-16 ***
COMUNA15     1.511e+00  2.222e-02  68.010  < 2e-16 ***
COMUNA16     7.062e-01  2.242e-02  31.491  < 2e-16 ***
BARRIO       3.366e-04  3.356e-05  10.032  < 2e-16 ***
CLASE2      -1.096e-01  1.144e-02  -9.584  < 2e-16 ***
CLASE3       1.519e+00  8.376e-03 181.308  < 2e-16 ***
CLASE4       1.392e-02  1.085e-02   1.284 0.199301    
CLASE5      -5.761e-01  1.588e-02 -36.282  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 231920  on 36198  degrees of freedom
Residual deviance:  88018  on 36166  degrees of freedom
AIC: 190966

Number of Fisher Scoring iterations: 5

Para este modelo, salvo la COMUNA13 y la clase de accidente “Otro”, todas las variables son significativas, con valores p lo suficientemente bajos para poder rechazar la hipótesis nula y poder concluir que cada variable aporta información. Sin embargo, el PERIODO parace no ser muy significativo para el modelo. Se ajusta un segundo modelo sin contar dicha variable.


Call:
glm(formula = CANTIDAD ~ . - PERIODO, family = "poisson", data = trainSet_mes)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-6.5515  -0.9409  -0.2085   0.5752  12.4361  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.812e-01  2.397e-02 -11.734  < 2e-16 ***
MES2         1.017e-01  1.268e-02   8.017 1.08e-15 ***
MES3         1.548e-01  1.246e-02  12.427  < 2e-16 ***
MES4         1.099e-01  1.263e-02   8.704  < 2e-16 ***
MES5         1.707e-01  1.245e-02  13.705  < 2e-16 ***
MES6         8.506e-02  1.270e-02   6.695 2.15e-11 ***
MES7         1.498e-01  1.248e-02  12.003  < 2e-16 ***
MES8         1.859e-01  1.238e-02  15.016  < 2e-16 ***
MES9         1.611e-01  1.242e-02  12.974  < 2e-16 ***
MES10        1.525e-01  1.248e-02  12.224  < 2e-16 ***
MES11        9.426e-02  1.266e-02   7.445 9.72e-14 ***
MES12        1.354e-01  1.256e-02  10.779  < 2e-16 ***
COMUNA2     -1.090e-01  2.922e-02  -3.731  0.00019 ***
COMUNA3      4.967e-01  2.452e-02  20.261  < 2e-16 ***
COMUNA4      7.360e-01  2.261e-02  32.554  < 2e-16 ***
COMUNA5      1.183e+00  2.175e-02  54.387  < 2e-16 ***
COMUNA6      5.135e-01  2.499e-02  20.551  < 2e-16 ***
COMUNA7      6.198e-01  2.244e-02  27.622  < 2e-16 ***
COMUNA8      2.597e-01  2.520e-02  10.306  < 2e-16 ***
COMUNA9      4.425e-01  2.410e-02  18.359  < 2e-16 ***
COMUNA10     1.788e+00  2.103e-02  84.995  < 2e-16 ***
COMUNA11     1.369e+00  2.154e-02  63.550  < 2e-16 ***
COMUNA12     5.188e-01  2.430e-02  21.348  < 2e-16 ***
COMUNA13    -2.985e-02  2.701e-02  -1.105  0.26903    
COMUNA14     9.165e-01  2.208e-02  41.503  < 2e-16 ***
COMUNA15     1.511e+00  2.222e-02  68.012  < 2e-16 ***
COMUNA16     7.062e-01  2.242e-02  31.494  < 2e-16 ***
BARRIO       3.368e-04  3.356e-05  10.038  < 2e-16 ***
CLASE2      -1.096e-01  1.144e-02  -9.581  < 2e-16 ***
CLASE3       1.519e+00  8.376e-03 181.343  < 2e-16 ***
CLASE4       1.416e-02  1.085e-02   1.305  0.19177    
CLASE5      -5.753e-01  1.588e-02 -36.239  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 231920  on 36198  degrees of freedom
Residual deviance:  88024  on 36167  degrees of freedom
AIC: 190970

Number of Fisher Scoring iterations: 5

Se observa una mejora en la interacción de las variables predictoras con la variable de respuesta para este segundo ajuste. Se toma el ajuste y se calcula el MSE para los datos de entrenamiento y prueba.

Se procede a realizar la predicción y realizar del MSE para los datos de entrenamiento:

[1] 62.23592

Ahora para los datos de prueba:

[1] 62.56759

Se calcula la diferencia porcentual entre ambos resultados.

[1] "La variación entre los mse calculados para los datos entrenamiento y prueba con el GLM con distribución Poisson es de 0.53%"

La diferencia obtenida para los MSE en entrenamiento y prueba es mucho menor que el valor límite (15%). El ajuste realizado en este caso no sufre de sobreentrenamiento. Sin embargo, los valores de MSE obtenidos para el ajuste son bastante altos.

K Vecinos Cercanos

Se selecciona un valor de \(K\) óptimo de acuerdo al valor mínimo obtenido para el rmse. Para hacerlo se tomará una muestra del 10% de los datos de entrenamiento ya que debido a la alta dimensionalidad de los datos conllevaría un alto costo computacional el poder realizar el proceso con los datos completos.

k-Nearest Neighbors 

3620 samples
   5 predictor

No pre-processing
Resampling: Repeated Train/Test Splits Estimated (15 reps, 75%) 
Summary of sample sizes: 2717, 2717, 2717, 2717, 2717, 2717, ... 
Resampling results across tuning parameters:

  k   RMSE      Rsquared    MAE     
   1  5.881482  0.47689578  2.842152
   2  5.650723  0.48197369  2.927454
   3  5.901948  0.43194601  3.120463
   4  6.175556  0.37780419  3.307284
   5  6.413204  0.32965715  3.462802
   6  6.600546  0.28965071  3.578220
   7  6.700207  0.26766293  3.656508
   8  6.764265  0.25423926  3.715264
   9  6.840048  0.23726348  3.760408
  10  6.906294  0.22230208  3.799990
  11  6.948036  0.21247774  3.824835
  12  6.983087  0.20414857  3.842669
  13  7.011206  0.19766154  3.852327
  14  7.040297  0.19102399  3.869068
  15  7.064937  0.18512205  3.877648
  16  7.071397  0.18411284  3.886201
  17  7.089042  0.17988637  3.893887
  18  7.119096  0.17321257  3.907959
  19  7.150880  0.16537628  3.922706
  20  7.164603  0.16219047  3.933974
  21  7.182331  0.15813963  3.942950
  22  7.199420  0.15414930  3.953537
  23  7.217417  0.14979192  3.963063
  24  7.238773  0.14449616  3.970477
  25  7.248483  0.14220705  3.974324
  26  7.264116  0.13864068  3.979141
  27  7.281195  0.13435870  3.983443
  28  7.289233  0.13241822  3.982845
  29  7.301697  0.12943754  3.987380
  30  7.313825  0.12645909  3.994797
  31  7.321455  0.12438677  3.996652
  32  7.335660  0.12077470  4.004292
  33  7.348042  0.11762494  4.010268
  34  7.354780  0.11589914  4.017496
  35  7.363192  0.11377840  4.022122
  36  7.372675  0.11150624  4.027065
  37  7.389319  0.10732077  4.033379
  38  7.396425  0.10554893  4.034875
  39  7.399292  0.10480332  4.032829
  40  7.403088  0.10393427  4.031510
  41  7.407131  0.10298003  4.034567
  42  7.410357  0.10230596  4.035781
  43  7.416976  0.10066241  4.038557
  44  7.418579  0.10038857  4.038284
  45  7.422540  0.09948024  4.040323
  46  7.425618  0.09887438  4.044156
  47  7.429408  0.09798641  4.045104
  48  7.435890  0.09643201  4.048512
  49  7.440997  0.09510778  4.048771
  50  7.448183  0.09322388  4.053025

RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 2.

El comportamiento del rmse en este caso es distinto al obtenido para los ajustes realizado para las predicciones de accidentalidad por día y semana. En este caso, el error aumenta a medida que incrementa el número de vecinos y se encuentra que el k óptimo es \(k=2\). Sin embargo, al entrenar el modelo con dicho valor no se obtuvieron resultados concluyentes, por lo que se optó por utilizar un \(k=40\) para entrenar el modelo como sigue, ya que con este valor se logra que el error esté por debajo del 15%.

40-nearest neighbor regression model

Se realiza la predicción para los datos de entrenamiento y se calcula el MSE:

[1] 43.60028

El MSE para el conjunto de prueba es:

[1] 48.0726

Se calcula la diferencia porcentual.

[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Vecinos cercanos es de 10.26%"

El desempeño del modelo en la predicción es mejor para el conjunto de entrenamiento. Los valores obtenidos para el MSE calculado para los conjuntos de entrenamiento y validación son mayores a los obtenidos para el modelo anterior. Sin embargo, la diferencia entre ambos (12.57%) permanece por debajo del límite, por lo que no se sufre de sobreentrenamiento en este caso.

Bosque Aleatorio

Se realiza el proceso para seleccionar un número óptimo de árboles para predecir la accidentalidad por mes tomando una muestra del 10% de los datos de entrenamiento.

Para este modelo se observa que a partir de 100 árboles el error comienza a variar muy poco, por lo que se toma este valor para el ajuste del modelo de predicción de la accidentalidad por mes.


Call:
 randomForest(formula = CANTIDAD ~ ., data = trainSet_mes, ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 1

          Mean of squared residuals: 28.59936
                    % Var explained: 50.12

El ajuste del modelo con 100 árboles explica el 68.07% de la varianza. A continuación se calcula el MSE para los datos de entrenamiento y prueba para este ajuste.

[1] "El MSE para el conjunto de prueba es: 27.279714049818"
[1] "El MSE para el conjunto de prueba es: 29.2152784617111"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio entrenado con 100 árboles es de 7.1%"

La diferencia entre el MSE calculado para los conjuntos de entrenamiento y prueba es más alta que el valor límite, por lo que este ajuste se encuentra sobreentrenado. Se observa a continuación la importancia de las variables para este modelo.

En este caso las variables de menor importancia son MES y PERIODO. Se ajusta a continuación un modelo eliminando la variable PERIODO, para observar su desempeño.


Call:
 randomForest(formula = CANTIDAD ~ . - PERIODO, data = trainSet_mes,      ntree = 100) 
               Type of random forest: regression
                     Number of trees: 100
No. of variables tried at each split: 1

          Mean of squared residuals: 25.9904
                    % Var explained: 54.67

El ajuste en este caso explica 55.54% de la varianza, mayor que el ajuste anterior. Se observa el MSE para los conjuntos de entrenamiento y prueba.

[1] "El MSE para el conjunto de prueba es: 25.2200969980806"
[1] "El MSE para el conjunto de prueba es: 26.083810971577"
[1] "La variación entre los mse de entrenamiento y prueba para el modelo de Bosque Aleatorio sin la variable PERIODO es de 3.42%"

En este caso la variación del MSE para los conjuntos de entrenamiento y prueba es de solo 3.08%, además de que los valores calculados de MSE son menores que los obtenidos para el primer ajuste. Se tiene entonces que esta diferencia se encuentra por debajo del límite, por lo que se toma este ajuste como el modelo final de Bosque Aleatorio.

A continuación se presenta una tabla con los resultados de los ajustes para los tres modelos.

Modelo mse_train mse_test Diff_mse
GLM(Poisson) 62.23592 62.56759 0.53%
KNN 43.60028 48.07260 10.26%
Random Forest 25.22010 26.08381 3.42%

Los valores más bajos de MSE se obtuvieron con el modelo Random Forest, que presentó un MSE más bajo que para los dos modelos anteriores. Se tomará como el modelo para predecir la accidentalidad por mes en la aplicación de Shiny.

Clusterización de los Barrios

Se realiza una copia del dataframe original.

LATITUD LONGITUD FECHA DIA SEMANA MES FECHAS_ESP PERIODO DIA_NOMBRE MES_NOMBRE COMUNA BARRIO CLASE GRAVEDAD
6.219016 -75.60273 2014-01-01 1 1 1 FESTIVO 2014 MIERCOLES ENERO BELEN LOMA DE LOS BERNAL CHOQUE HERIDO
6.260009 -75.56818 2014-01-01 1 1 1 FESTIVO 2014 MIERCOLES ENERO LA CANDELARIA JESUS NAZARENO ATROPELLO HERIDO
6.264765 -75.54994 2014-01-01 1 1 1 FESTIVO 2014 MIERCOLES ENERO MANRIQUE MANRIQUE ORIENTAL ATROPELLO HERIDO
6.234327 -75.60761 2014-01-01 1 1 1 FESTIVO 2014 MIERCOLES ENERO BELEN LAS MERCEDES ATROPELLO HERIDO
6.299968 -75.57969 2014-01-01 1 1 1 FESTIVO 2014 MIERCOLES ENERO DOCE DE OCTUBRE DOCE DE OCTUBRE NO. 2 CAIDA OCUPANTE HERIDO

Se realiza el cambio de la ñ por n para la columna gravedad.

Luego, se importan algunas librerias para establecer las mejores alternativas de clusterización.

El siguiente paso consiste en crear 4 tablas que van a ser necesarias para realizar la clusterización. Al final todas se unen con un full joint para crear los indicadores.

La primera tabla que se crea es la de barrio/Gravedad.

BARRIO GRAVEDAD total
ALDEA PABLO VI HERIDO 64
ALDEA PABLO VI MUERTO 2
ALDEA PABLO VI SOLO_DANOS 17
ALEJANDRIA HERIDO 132
ALEJANDRIA MUERTO 1

La segunda tabla creada contiene la agrupación Barrio/Fechas especiales.

BARRIO FECHAS_ESP total
ALDEA PABLO VI FESTIVO 5
ALDEA PABLO VI LABORAL 44
ALDEA PABLO VI NO LABORAL 34
ALEJANDRIA FESTIVO 18
ALEJANDRIA LABORAL 405

La tercera tabla contiene la agrupación de barrios y periodos.

BARRIO PERIODO total
ALDEA PABLO VI 2014 17
ALDEA PABLO VI 2015 15
ALDEA PABLO VI 2016 20
ALDEA PABLO VI 2017 11
ALDEA PABLO VI 2018 20

La ultima tabla contiene la agrupación barrio / clase (choque, atropello, caida ocupante, incendio, volcamiento, otro).

BARRIO CLASE total
ALDEA PABLO VI ATROPELLO 27
ALDEA PABLO VI CAIDA OCUPANTE 12
ALDEA PABLO VI CHOQUE 35
ALDEA PABLO VI OTRO 8
ALDEA PABLO VI VOLCAMIENTO 1

Antes de unir todas las tablas, se transformas las variables de interés de cada una de filas a columnas.

Finalmente se unen todas las tablas para crear el consolidado.

BARRIO HERIDO MUERTO SOLO_DANOS FESTIVO LABORAL NO LABORAL 2014 2015 2016 2017 2018 ATROPELLO CAIDA OCUPANTE CHOQUE OTRO VOLCAMIENTO
ALDEA PABLO VI 64 2 17 5 44 34 17 15 20 11 20 27 12 35 8 1
ALEJANDRIA 132 1 366 18 405 76 78 64 105 123 129 14 18 434 25 8
ALEJANDRO ECHAVARRIA 595 3 243 41 558 242 159 145 187 181 169 98 84 483 125 51
ALFONSO LOPEZ 772 7 370 50 779 320 234 244 289 196 186 133 178 607 182 49
ALTAMIRA 504 2 270 14 598 164 216 162 137 142 119 50 144 466 100 16

Después se realiza el cambio de NA por cero para evitar inconsistencias.

Se crea el primer indicador que establece la proporción de accidentes los fines de semana y festivos vs el total de accidentes: (suma de accidentes en dias festivos y no laborales)/ suma total de accidentes.

El segundo indicador establece la proporción entre el número de accidentes fatales vs el total de accidentes: suma de accidentes faltales / suma total de accidentes.

El tercer indicador permite conocer el número de accidentes promedio por año: suma de los accidentes de todos los años / nro de años.

El ultimo indicador permite establecer que porcentaje de los accidentes que se presentaron fueron atropellos: suma de accidentes con atropellos / suma total de accidentes.

Finalmente se crea un subset para dejar el dataframe unicamente con las columnas necesarias.

BARRIO Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
ALDEA PABLO VI 0.4698795 0.0240964 16.6 0.3253012
ALEJANDRIA 0.1883768 0.0020040 99.8 0.0280561
ALEJANDRO ECHAVARRIA 0.3365042 0.0035672 168.2 0.1165279
ALFONSO LOPEZ 0.3220191 0.0060923 229.8 0.1157528
ALTAMIRA 0.2293814 0.0025773 155.2 0.0644330

Se reemplazan los na del dataframe cluster.

Para poder realizar los calculos se nombran las filas del dataframe con el nombre de los barrios y así poder eliminar esta columna.

Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
ALDEA PABLO VI 0.4698795 0.0240964 16.6 0.3253012
ALEJANDRIA 0.1883768 0.0020040 99.8 0.0280561
ALEJANDRO ECHAVARRIA 0.3365042 0.0035672 168.2 0.1165279
ALFONSO LOPEZ 0.3220191 0.0060923 229.8 0.1157528
ALTAMIRA 0.2293814 0.0025773 155.2 0.0644330

Finalmente se escalan los datos del dataframe para evitar problemas en el algorimo k-means por la dimensionalidad de los datos.

Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
ALDEA PABLO VI 2.5000455 2.7311436 -0.8009166 2.0260755
ALEJANDRIA -1.6626592 -0.6584602 -0.3145554 -1.1405583
ALEJANDRO ECHAVARRIA 0.5277657 -0.4186245 0.0852897 -0.1980435
ALFONSO LOPEZ 0.3135695 -0.0312061 0.4453841 -0.2063011
ALTAMIRA -1.0563049 -0.5704978 0.0092957 -0.7530254

Nuevamente se hace un resumen de los indicadores a utilizar la para la clusterización:

  1. Promedio anual de accidentes: Suma de los accidentes desde el 2014 a 2018 dividido 5 (nro de años)
  2. Tasa de accidentes fines de semana y festivos: accidentes fines de semana y festivos sobre el total de accidentes
  3. Tasa de fatalidad: accidentes fatales sobre el total de accidentes
  4. tasa de atropellos: atropellos sobre el total de accidentes

Una forma sencilla para encontrar el k óptimo de clusters es aplicar el algoritmo de k-means para un rango de valores de K. Luego de esto, se procede a identificar aquel valor a partir del cual la reducción en la suma total de la varianza intra-cluster deja de ser significativa (médoto del códo).

Método del codo: Según este método y la interpretación que se da de la gráfica, el k óptimo es igual a 5.

Metodo Silhouette: el número óptimo de clusters (aquel que maximiza la media del slhouette coeficient de todas las observaciones) se logra con k=2.

Según el método clusgap, el k óptimo estaría en 6.

A continuación se crean diferentes clusters variando K, con el objetivo de ver la representación espacial de diversas formas.

Luego, se genera un dataframe con las agrupaciones con diferentes k.

Cl1G Cl2G Cl3G Cl4G Cl5G Cl6G Cl7G Cl8G Cl9G C10G
ALDEA PABLO VI 1 1 2 1 4 2 6 6 5 6
ALEJANDRIA 2 2 1 4 1 6 3 4 8 4
ALEJANDRO ECHAVARRIA 2 2 1 4 3 1 7 7 9 7
ALFONSO LOPEZ 2 2 1 4 3 1 7 7 9 2
ALTAMIRA 2 2 1 4 1 6 3 4 8 4

Después de utlizar varios métodos para encontrar el mejor valor de k, se decide trabajar con k=5.

[1] 111  28  90  16  20

Para poder crear el relato de los grupos, se observan las medias de cada una de las variables analizadas.

cluster5$cluster Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
1 0.2565408 0.0043729 135.92432 0.0690129
2 0.2320749 0.0060653 568.87143 0.0735121
3 0.3444111 0.0057171 93.98667 0.1709267
4 0.3629875 0.0248182 34.37500 0.2332957
5 0.3968397 0.0050750 34.09000 0.3485666

Con el proposito de tener más información, se agrega a la tabla de medias el tamaño de los grupos.

tamano_grupo cluster5$cluster Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
111 1 0.2565408 0.0043729 135.92432 0.0690129
28 2 0.2320749 0.0060653 568.87143 0.0735121
90 3 0.3444111 0.0057171 93.98667 0.1709267
16 4 0.3629875 0.0248182 34.37500 0.2332957
20 5 0.3968397 0.0050750 34.09000 0.3485666

Para el mismo análisis por grupo se calculan las desviaciones estándar de cada uno.

cluster5$cluster Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
1 0.0419666 0.0035937 84.69856 0.0347746
2 0.0324794 0.0026422 178.76599 0.0362630
3 0.0349268 0.0044966 62.32880 0.0480733
4 0.0581805 0.0089293 30.75814 0.0705911
5 0.0555088 0.0058447 30.33077 0.0743526

Al igual que en la tabla de medias, se agrega el tamaño de grupos para interpretar mejor los resultados. Para algunos.

tamano_grupo cluster5$cluster Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello
111 1 0.0419666 0.0035937 84.69856 0.0347746
28 2 0.0324794 0.0026422 178.76599 0.0362630
90 3 0.0349268 0.0044966 62.32880 0.0480733
16 4 0.0581805 0.0089293 30.75814 0.0705911
20 5 0.0555088 0.0058447 30.33077 0.0743526

Se crea el dataframe cluster_final que contiene las medidas calculadas por barrio y su agrupación.

BARRIO Porcentaje_accidentes_finsemyfestivos Porcentaje_fatalidad promedio_anual_accidentes Porcentaje_atropello Cl5G
ALDEA PABLO VI 0.4698795 0.0240964 16.6 0.3253012 4
ALEJANDRIA 0.1883768 0.0020040 99.8 0.0280561 1
ALEJANDRO ECHAVARRIA 0.3365042 0.0035672 168.2 0.1165279 3
ALFONSO LOPEZ 0.3220191 0.0060923 229.8 0.1157528 3
ALTAMIRA 0.2293814 0.0025773 155.2 0.0644330 1

Relato:

Los cinco grupos están agrupados de mayor a menor promedio anual de accidentalidad.

Los grupos con más accidentes promedio por año tienen la particularidad de tener una menor tasa de accidentalidad los fines de semana y festivo.

Tanto para los grupos de mayor y menor promedio anual de accidentes se presentan variaciones en la tasa de fatalidad de los accidentes:

Grupo 1: Promedio anual de accidentes alto, tasa de accidentes fines de semana y festivos alto, tasa de fatalidad baja y tasa de atropellos baja.

Grupo 2: Promedio anual de accidentes alto, tasa de accidentes fines de semana y festivos bajo, tasa de fatalidad baja y tasa de atropellos baja.

Grupo 3: Promedio anual de accidentes medio, tasa de accidentes fines de semana y festivos media, tasa de fatalidad media y tasa de atropellos media.

Grupo 4: Promedio anual de accidentes bajo, tasa de accidentes fines de semana y festivos alta, tasa de fatalidad alta y tasa de atropellos alta.

Grupo 5: Promedio anual de accidentes bajo, tasa de accidentes fines de semana y festivos alta, tasa de fatalidad baja y tasa de atropellos alta.

Luego se procede a utilizar la libreria leaflet para realizar el análisis espacial. Se une el dataframe que contiene el clustering con el dataframe de poligonos que permite identificar los barrios en el mapa.

Se eliminan las comunas del dataframe med, ya que no se consideraron para este análisis

Se cambian los nombres de algunos barrios en el dataframe med para que coincidan con los del dataframe cluster_final

Se reemplazan los caracteres con tilde por caracteres sin tilde

Se ponen los nombres de los barrios del dataframe med en mayuscula para poder hacer el join con el dataframe cluster_final

Se eliminan filas que contienen barrios repetidos y el centro administrativo la alpujarra, donde no se han presentado accidentes en los años analizados

tibble [265 x 9] (S3: sf/tbl_df/tbl/data.frame)
 $ OBJECTID  : int [1:265] 14 15 16 17 18 66 67 68 69 70 ...
 $ SHAPEAREA : num [1:265] 100044 481662 413759 677361 358612 ...
 $ SHAPELEN  : num [1:265] 1525 2813 2892 4781 2612 ...
 $ COMUNA    : chr [1:265] "13" "07" "05" "15" ...
 $ BARRIO    : chr [1:265] "05" "01" "10" "11" ...
 $ CODIGO    : chr [1:265] "1305" "0701" "0510" "1511" ...
 $ NOMBRE_BAR: chr [1:265] "METROPOLITANO" "UNIVERSIDAD NACIONAL" "TRICENTENARIO" "LA COLINA" ...
 $ NOMBRE_COM: chr [1:265] "SAN JAVIER" "ROBLEDO" "CASTILLA" "GUAYABAL" ...
 $ geometry  :sfc_MULTIPOLYGON of length 265; first list element: List of 1
  ..$ :List of 1
  .. ..$ : num [1:137, 1:2] -75.6 -75.6 -75.6 -75.6 -75.6 ...
  ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA
  ..- attr(*, "names")= chr [1:8] "OBJECTID" "SHAPEAREA" "SHAPELEN" "COMUNA" ...

Se cambiar el nombre de la columna barrio al dataframe cluster_final

Se fusionan el dataframe med que contiene los polígonos con el dataframe cluster_final que tiene la agrupación de los barrios

tibble [265 x 14] (S3: sf/tbl_df/tbl/data.frame)
 $ OBJECTID                             : int [1:265] 14 15 16 17 18 66 67 68 69 70 ...
 $ SHAPEAREA                            : num [1:265] 100044 481662 413759 677361 358612 ...
 $ SHAPELEN                             : num [1:265] 1525 2813 2892 4781 2612 ...
 $ COMUNA                               : chr [1:265] "13" "07" "05" "15" ...
 $ BARRIO                               : chr [1:265] "05" "01" "10" "11" ...
 $ CODIGO                               : chr [1:265] "1305" "0701" "0510" "1511" ...
 $ NOMBRE_BAR                           : chr [1:265] "METROPOLITANO" "UNIVERSIDAD NACIONAL" "TRICENTENARIO" "LA COLINA" ...
 $ NOMBRE_COM                           : chr [1:265] "SAN JAVIER" "ROBLEDO" "CASTILLA" "GUAYABAL" ...
 $ geometry                             :sfc_MULTIPOLYGON of length 265; first list element: List of 1
  ..$ :List of 1
  .. ..$ : num [1:137, 1:2] -75.6 -75.6 -75.6 -75.6 -75.6 ...
  ..- attr(*, "class")= chr [1:3] "XY" "MULTIPOLYGON" "sfg"
 $ Porcentaje_accidentes_finsemyfestivos: num [1:265] 0.359 0.25 0.284 0.322 0.264 ...
 $ Porcentaje_fatalidad                 : num [1:265] 0 0.0065 0.00514 0.00784 0.00217 ...
 $ promedio_anual_accidentes            : num [1:265] 7.8 369 194.4 102 276.4 ...
 $ Porcentaje_atropello                 : num [1:265] 0.1538 0.0488 0.0494 0.1 0.0904 ...
 $ Cl5G                                 : int [1:265] 3 2 1 3 1 3 1 3 3 1 ...
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "names")= chr [1:13] "OBJECTID" "SHAPEAREA" "SHAPELEN" "COMUNA" ...

A continuación se importa la librereia leaflet para hacer el gráfico de los barrios

Se carga el mapa base

Se definen los colores de la paleta de colores (Set3), la cual establece un color de grupo distinto para cada uno de los que se encuentra en la columna Cl5G del datraframe.

Luego se añaden los poligonos de los barrios, los colores y la leyenda.

Finalmente se definen las propiedades de los polígonos como opacidad, tamaño de las lineas, etc y las propiedades de la leyenda.

Características espaciales:

Se encuentra que los barrios con mayor promedio de accidentes por año están ubicados cerca al rio Medellín que es precisamente donde se encuentran las principales vías de la ciudad. El siguiente grupo con mayor promedio de accidentes se ubica un poco más hacia las laderas, sin embargo, este patrón es más visible hacia el sur que hacia el norte. Esto puede deberse a que los barrios del sur por lo general tienen mejores vías y mayor flujo vehicular. Los barrios con menor accidentalidad se encuentran totalmente concentrados en las partes altas de las laderas, con una tendencia más clara hacia el norte. La mayoría de los barrios con menor accidentalidad se encuentran en dos sectores específicos de la ciudad: la comuna 13 y la comuna 1 (Popular).

Retos que el agrupamiento puede resolver y posibles planes de acción:

La estrategia principal se basa en destinar más recursos a los barrios donde más accidentes se presenten. Sin embargo, los demás indicadores servirán para optimizar el uso de los recursos en cada barrio independiente de la cantidad de accidentes que se presenten.

Grupo 1:

Por tener un promedio alto de accidentes, estos barrios deben tener una mayor disponibilidad de agentes de tránsito, ambulancias, cámaras y grúas para atender los incidentes. Los porcentajes de atropellos y fatalidad no son tan altos como los otros grupos, lo que indica que principalmente lo que se presentan son choques. Pueden realizarse mejoras en la señalización, evaluar la necesidad de nuevos policías acostados y todo aquello que ayude a que se presenten menos incidentes menores en horas pico.

Grupo 2: Presenta el promedio mayor de accidentes por año en comparación con el resto del grupo, por lo que son a los que más se les debe prestar atención. Al estar ubicados muy cerca a la avenida regional, las vegas y demás vías céntricas de la ciudad, estos barrios deben de contar con presencia permanente del tránsito en horas pico para mejorar la movilidad. La accidentalidad no es tan alta los fines de semana comparada con los porcentajes de los otros grupos, por lo tanto, la mayor atención debe presentarse en las grandes concentraciones de vehículos que ocurren en los días laborales.

Grupo 3: Este es un grupo con indicadores intermedios, con barrios ubicados principalmente en las laderas occidental, oriental y norte de la ciudad. Aunque no requieren una presencia permanente del tránsito, pueden mejorarse las condiciones de movilidad utilizando herramientas tecnológicas como cámaras.

Grupo 4: Si bien este grupo tiene un promedio anual de accidentes bajo, presenta un porcentaje alto de accidentes los fines de semana en relación con los demás grupos. Sumado a esto tiene tasas de fatalidad y atropello más altas. La estrategia para estos barrios está más enfocada en campañas educativas que permitan disminuir los accidentes fatales, como son aquellas relacionadas con controlar los excesos de velocidad. Al mismo tiempo, pueden realizarse retenes de tránsito con más frecuencia los fines de semana para hacer diferentes tipos de controles, entre ellos el de la alcoholemia, ya que conducir bajo los efectos del alcohol es una de las razones por las que ocurren más accidentes fatales.

Grupo 5: Pueden realizarse acciones muy similares a la del grupo 4, con la diferencia de que este grupo presenta una tasa menor de accidentalidad, razón por la cual no es necesario hacer retenes con tanta frecuencia.