Análisis de Accidentes e Infracciones de Tráfico — Bogotá

Iker
13 min readJan 23, 2023
Accidentes de Tráfico — Visualización de Mapa

English Version

Hace un par de semanas, me encontraba en un recorrido casual a través de la ciudad, el cual sufrió una demora, debido a un accidente de trafico; afortunadamente (Al menos para mi), no me involucro, pero fue bastante grave. Eso me hizo pensar acerca de los accidentes de tráfico en Bogotá, la ciudad que ocupa el cuarto lugar en el índice tomtom [i] de congestión urbana, haciéndoles pasar a los conductores y pasajeros, 126 horas por año envueltos en trancones. Y de esta forma es como este articulo tuvo su origen.

El acceso a la información producto del análisis está disponible en una instancia ElasticCloud que contiene todos los datos, tableros de control, y mapas. Detalles de la plataforma

- URL: No Disponible
- Usuario y Contraseña: No Disponible
- Periodo de Disponibilidad: No Disponible
- Espacios de Trabajo: No Disponible
-Repositorio de datos y scripts: https://github.com/IkerSaint/Accidentes-Bogota

Una vez el periodo de disponibilidad finalice, la plataforma y toda la información contenida será eliminada. Si desean tener acceso a los datos de la instancia de Elastic o explorarlos en otra instancia, por favor dejen una nota privada (How to write a private note on a Medium) con un email y les enviare un snapshot de los índices, así como los tableros de control de Kibana, para que los restauren en otro clúster.

Datos, Datos, Datos!

Datos Abiertos [ii] es una plataforma operada por la Secretaría Distrital de Movilidad, en ella podemos encontrar información acerca del tráfico de la ciudad y la movilidad en general; si bien algunas de las visualizaciones o métricas expuestas no funcionan muy bien, para nuestro caso, estamos más interesados en los datos. Existen múltiples categorías a las que podemos acceder en el portal, aunque la mayoría de los datos no resultan interesantes, se encuentran incompletos o no contienen información relevante. Para el análisis que pretendemos realizar, se seleccionaron solamente los conjuntos de datos que contienen comparendos/infracciones y aquellos asociados a accidentes. Los conjuntos de datos y las estadísticas generales son las siguientes:

Conjuntos de Datos

El próximo paso es realizar un análisis exploratorio. Claramente tenemos una gran cantidad de información, y, si bien es posible iniciar nuestro análisis con una herramienta estándar como lo es Excel, esto no va a ser suficiente para todo el proceso (Lo siento fans de Excel, nunca es suficiente); así que debemos usar python y pandas :).

import numpy as np
import pandas as pd

accidentes = pd.read_csv('./data/Siniestros/Siniestros_Viales_Bogota_Accidente.csv')
lesionados = pd.read_csv('./data/Siniestros/Siniestros_Viales_Bogota_Lesionados.csv')
muertos = pd.read_csv('./data/Siniestros/Siniestros_Viales_Bogota_Muertos.csv')
vehiculos = pd.read_csv('./data/Siniestros/AnA1lisis_Siniestralidad_vehiculos.csv')
causas = pd.read_csv('./data/Siniestros/AnA1lisis_Siniestralidad_causas.csv')

pd.set_option('display.max_colwidth', None)
accidentes.head()
lesionados.head()
muertos.head()
vehiculos.head()
causas.head()

Por otra parte, mi sospecha es que los conjuntos de datos obtenidos vienen de una base de datos SQL y pueden ser unidos mediante múltiples columnas (La columna FORMULARIO parece ser la más utilizada) con excepción del conjunto de datos de Comparendos. Probablemente nuestra primera intención seria insertar los datos en una base de datos SQL y reconstruir la original con toda la información; después de todo, Grafana/Databox/Tableau/PowerBi+TimeScale puede manejar perfectamente el volumen de datos y mantener un excelente desempeño para las consultas. Sin embargo, para los datos de series de tiempo, la mayoría de las veces, me inclino hacia alternativas NoSQL, aunque para este caso no será InfluxDB, principalmente por que seleccionar que columnas son “measurements” y adicionalmente la alta cardinalidad de los datos puede convertir el proceso rápidamente en una completa pesadilla. En este caso, queremos utilizar ElasticSearch u OpenSearch (Cualquiera sea su preferencia), no solamente porque es más sencillo crear el “template”, si no, también por que el análisis y las visualizaciones son más sencillas e intuitivas de desarrollar.

Y las cámaras de tráfico? (Cámaras Salvavidas)

Existe una discrepancia entre los datos que vienen de la plataforma de Datos Abiertos y los de la Agencia Nacional de Seguridad Vial (ANSV), con 92 y 129 registros, respectivamente. Los datos de la ANSV parecen ser más confiables e incluir más información acerca de las cámaras. Al final, la información contenida en los conjuntos de datos no es realmente relevante, dado que los comparendos incluyen el medio de detección (Tal vez si deriváramos y calculáramos una nueva columna “DistanciaCamara”).

Consolidación de Datos

Revisando todas las columnas y los datos disponibles, podemos identificar rápidamente que algunas de las columnas no son necesarias, y otras necesitan ser manipuladas, incluyendo agregaciones sobre otras. Esto puede parecer raro desde una perspectiva SQL de “Normalization” [iii]. Aun así, nuestra base de datos es NoSQL, así que queremos realizar el proceso contrario, “Denormalization” [iv], esto con el objetivo de mejorar el desempeño a expensas de sacrificar la posibilidad de realizar uniones o combinaciones de los datos fácilmente. Los “templates” [v] utilizados para insertar los datos en la instancia de Elastic son los siguientes:

No es el objetivo aburrirlos con todas las manipulaciones realizadas sobre los conjuntos de datos, si así lo prefieren, pueden acceder a los Jupyter Notebooks en el repositorio del proyecto. aquí solamente presentare el resumen grafico:

Conjuntos de Datos de Accidentes
Conjuntos de Datos de Infracciones

En este punto es importante destacar varias cosas:

  1. Los datos de “Causas” no son muy confiables, dado que contienen bastantes valores de “Otra/Otras” como las causas del accidente.
  2. Los datos de “Comparendos” presenta algunos inconvenientes con las coordenadas de longitud y latitud, hora, código de la infracción y, para ser honesto, no confió en la precisión y datos de varias de las columnas; ya que, por ejemplo, existen múltiples registros con la misma latitud y longitud, pero que pertenecen a Localidades diferentes, otros con la hora equivocada, y en general una gran cantidad de inconsistencias.
  3. La operación de “groupby” también aplica una función lambda para convertir los grupos en objetos, y posteriormente asignarlos como una lista de objetos a una columna. Esto no es exactamente una buena práctica de acuerdo con los estándares de pandas, y puede resultar problemática si planeáramos utilizar el conjunto de datos resultante para otros propósitos como Machine Learning, agregaciones estadísticas entre otros.
  4. Realizar la derivación de columnas que ya se encuentran presentes (Mes, día, día de la semana, etc.), puede parecer innecesaria, pero la idea es asegurarnos que todos los datos poseen los valores y formatos correctos.
  5. Existen dos campos que derivamos de la localización, uno es el campo GEO, el cual es una representación de un punto geoespacial a partir de la latitud y la longitud compatible con Elastic, el segundo es GEOHASH [vi], que es una columna especial que nos permite agrupar datos de manera sencilla a un nivel de precisión que especifiquemos (±610 metros en nuestro caso), esto resulta bastante útil para múltiples propósitos, ya que no nos encontramos limitados a puntos en el espacio específicos.

Después de este proceso, podemos comenzar el proceso de inserción de los datos en nuestro clúster y dar comienzo al análisis.

Visualización de Datos y Análisis

Dentro de la plataforma existen dos índices, uno para accidentes y otro para comparendos; utilizando estos, creamos tres diferentes tableros, uno para accidentes, otro para comparendos y un último, que incluye el mapa general, y la proporción de accidentes y comparendos junto con otras columnas. (Localidades, mes, día, día de la semana, geohash, etc.)

Tablero de Control de Bienvenida

Si jugamos un poco con las visualizaciones, podemos extraer múltiples información que nos resulte útil, alguna bastante obvia y otra que pueden resultar sorprendente (Al menos para mi).

Accidentes de Tráfico

  • Los automóviles son el vehículo número uno involucrado en accidentes, sin embargo, las motocicletas en conjunto con las bicicletas son significativamente más propensas a estar involucradas en accidentes con heridos o muertos; en la otra punta, las camionetas/SUVs son los vehículos más seguros, inclusive más que los vehículos de transporte público.
Accidentes de Tráfico — Top diez por clase de vehículo y severidad
  • La causa número uno de accidentes sin importar el tipo de vehículo es no mantener la distancia de seguridad. La segunda causa varía dependiendo el tipo de vehículo, pero en general, es o bien adelantar cerrando o desobedecer señales de tránsito. Estas mismas causas aplican para los accidentes que involucran heridos, pero no es así para aquellos que involucran muertos; en este último caso, el top tres de causas son desobedecer señales de tránsito, exceso de velocidad y transitar entre vehículos, y para cada una de estas causas, el vehículo más involucrado son las motocicletas.
  • Uno de los accidentes más ridículos que generalmente involucra heridos y muertes es la caída de ocupante, con un total de 329 heridos y 18 muertos solamente por causa de transitar con las puertas abiertas.
Accidentes de Tráfico — Tipo de Accidentes y Top cinco causas
  • El top tres de los días de la semana, son los que esperaríamos, Viernes y Sábados, junto con un inesperado día, Martes. Obviamente, con una cantidad alta de accidentes, existe una cantidad alta de heridos y muertos, los cuales ocurren mayormente en estos días; inclusive, si eres mujer, existe una probabilidad más alta de morir los Martes o Lunes en comparación a los Sábados.
Accidentes de Tráfico — Heridos y Muertos por día de la semana y hora
Tengan cuidado Mujeres!
  • El top diez de localizaciones pueden ser fácilmente identificadas utilizando el campo geohash, estos se encuentran bien distribuidos, con algunos lugares que no resultan intuitivos y probablemente merecen un análisis más profundo.
Accidentes de Tráfico — Top diez localizaciones
  • Por último, no todas las muertes por accidentes de tránsito son inmediatas, casi la mitad de estas muertes ocurren después del accidente, el 95% de las muertes ocurren entre un día y seis meses después del accidente.
Accidentes de Tráfico — Distribución de tiempo de las muertes después del accidente

Inclusive si alguna de la información puede parecer algo extraña, no hay demasiadas sorpresas de lo que esperaríamos, lo cual no resulta ser igual de cierto para las infracciones.

Infracciones/Comparendos

Con este conjunto de datos, hay varios inconvenientes, y sobre todo, no estoy seguro de la confiabilidad de los datos; tal vez porque hay múltiples discrepancias en múltiples columnas, pero mayormente por que no hace demasiado sentido desde una vista general (Por ejemplo, hay casi dos meses de datos faltantes entre 2021–05 y 2021–06).

  • La línea de tiempo de los comparendos, muestra un cambio drástico en el tipo de medio de detección utilizado, para finales de 2018 e inicios de 2019, el dispositivo DEAP (Dispositivos Electrónicos de Atención al Policía) se convirtió en el medio de detección predominante; poco después, con la pandemia y el final del 2021, los medios de detección más usados cambiaron a las cámaras de tráfico y los dispositivos en vía (Asumimos que estos son los mejor denominados “retenes”) de forma casi exclusiva. Esto puede ser debido a que faltan reportes por parte de los órganos oficiales de movilidad, ya que, si bien ya estamos en el 2023, no hay ningún dato acerca del 2022.
Infracciones — Linea de tiempo por mes desglosado por medio de detección
  • Igual que con el anterior, este es un tanto extraño; la infracción que más se presenta, cambio de la C02 (Estacionar un Vehículo en Sitios Prohibidos) a la C29 (Conducir un Vehículo a Velocidad Superior a la máxima Permitida); podemos culpar de esto a las cámaras de tráfico, sin embargo, la diferencia para finales de 2021 entre la C02 y la C29 es de 1 a 4 respectivamente.
Infracciones — Linea de tiempo por mes desglosado por código de infracción
  • Las infracciones son mayormente las mismas para todos los tipos de carros, siendo el top C02 (Estacionar un Vehículo en Sitios Prohibidos) y C14 (Transitar por Sitios Prohibidos o en Horas Prohibidas-Pico y Placa). Para las motocicletas la infracción más recurrente es C24 (Conducir Motocicleta Sin Observar Las Normas Establecidas En El Presente Código) y la segunda es C02 (Estacionar un Vehículo en Sitios Prohibidos). Pareciera ser que los conductores de motocicleta en Bogotá no son los más hábiles.
Infracciones — Agregación por tipo de vehículo y código de infracción
  • Opuesto a lo que podríamos pensar, la mayoría de las infracciones ocurren los Miércoles y Jueves, con algunas excepciones en meses puntuales, los días con menor cantidad de infracciones son los Sábados y Domingos, lo cual no se correlaciona con los datos de los accidentes y sugiere que no es la priorización utilizada por la Secretaria de Movilidad, o bien puede que yo tenga demasiados sesgos…
Infracciones — Agregación por Mes y día de la semana

Mapas y Correlaciones…

La principal forma que identifique para correlacionar infracciones y accidentes de tránsito fue a través de la proporción de estos; bien sea utilizando la localización, el tipo de vehículo, o alguna de las características asociadas a la fecha (Año, mes, día, etc.)

  • El top diez de lugares donde ocurren la mayoría de los accidentes no se relaciona con el top diez de lugares donde se presentan la mayoría de las infracciones. Podríamos llegar a pensar que esto es debido a que la actividades de la Secretaria de Movilidad son reactivas, verifican que lugares tienen la mayor cantidad de accidentes y actúan de acuerdo a ello, esto es parcialmente cierto, ya que esa correlación existe para algunos de los lugares, o al menos si lo analizamos en el mismo año o de un año a otro; sin embargo, no es completamente claro cómo se realiza el proceso de cobertura o si existen algunos lugares con mayor prioridad o a los que se les preste especial atención. (Igualmente un año de pandemia dificulta los análisis).
Top 10 — Localizaciones para Accidentes y Comparendos
  • El lugar con mayor número de infracciones (En proporción a los accidentes) es el aeropuerto, con más de 43k infracciones y una proporción de 325.11 (Por cada accidente, hay 325.11 infracciones); el segundo es un lugar completamente olvidado por dios al sur de la ciudad (A unos cuantos cientos de metros del relleno sanitario de Doña Juana) con 6K infracciones y una proporción de 322.22; como comparación, el tercer y cuarto lugar tienen una proporción menor a 150. Un análisis más profundo podría involucrar la identificación de que tipo de infracciones se presentan en estos lugares.
Top diez localizaciones por proporción
  • La proporción por localidades, tampoco se alinea con los accidentes, y, a partir de la visualización del mapa, podría parecer que existe una concentración justo en el centro de la ciudad; sin embargo, como mencione anteriormente los datos de localización no son confiables y podrían dificultar el obtener conclusiones a partir de estos.
Localidades por Proporción
Mapa de Infracciones
  • La proporción es casi el doble que la media durante la segunda semana de enero, probablemente porque hay una cantidad alta de tráfico en estos días y operativos especiales.
Proporción por Mes y Día

Comentarios Finales y Cierre

En general, las estadísticas de Bogotá para accidentes de tráfico, heridos y muertos no son tan malas comparadas con el promedio mundial [vii], probablemente porque no tenemos oportunidad de transitar a alta velocidad, y por ende, el riesgo de sufrir accidentes graves es menor. Sin embargo, siempre podemos intentar mejorar, dar especial atención a los lugares con mayor accidentalidad puede mejorar la velocidad y prevenir muchas muertes, así como también enfocarse en acciones preventivas mediante el uso de algoritmos de Machine Learning u obtener información útil en tiempo real a partir de los datos.

En definitiva, este articulo no intenta ser la principal referencia en cuanto a infracción y accidentes de tráfico en Bogotá (No soy un experto en movilidad), si no, un punto de inicio. La plataforma y los datos están disponibles para que cualquier desarrolle sus propios análisis, obteniendo nuevas conclusiones o inclusive detectando patrones en los datos. Este artículo es realmente una invitación a explorar la plataforma, jugar con los datos, profundizar en algunos de los datos acá mostrados u obtener sus propias conclusiones y compartirlas.

Para cerrar, si acceden a la plataforma, probablemente habrán identificado dos espacios de trabajo:

  • Base (Solo Lectura): Este espacio contiene todas las visualizaciones y tableros de control utilizados como referencia para este artículo. Puedes explorar y filtrar todos los datos, pero no es posible modificar nada.
  • Playground: Este espacio es para que cualquiera que lo desee, cree sus propias visualizaciones y explore los datos y detalles, sin embargo, se debe tener en cuenta que todos los usuarios comparten la misma cuenta, lo que significa que las visualizaciones, mapas y demás trabajo realizado o cualquier información allí estará disponible para que cualquier la pueda ver, modificar o incluso eliminar. (Confió en que se comportaran adecuadamente… No, realmente no lo hago)

Preguntas Frecuentes

  • Cuando intento acceder a la plataforma, recibo el mensaje, “Este sitio no pudo ser consultado”
    Probablemente estas intentando ingresar fuera del horario disponible (23:00 and 05:00 UTC) o el periodo de disponibilidad (18/01/2023–18/03/2023)
  • Intento ingresar a la plataforma, pero recibo el mensaje “user or password is incorrect.”
    Verifica las credenciales al inicio de este articulo e inténtelo de nuevo
  • He intentado crear una nueva visualización, pero no tengo claro cómo hacerlo
    Asegurarte de estar en el espacio de trabajo llamado “Playground”. Es probable que también quieras revisar la siguiente guía https://www.elastic.co/guide/en/kibana/current/get-started.html#explore-the-data
  • Como puedo acceder a los datos originales
    Los datos originales y los scripts de Python están disponibles en el repositorio de GitHub
  • Estoy intentando crear un nuevo tablero de control/Visualización, pero no parece que esté funcionando correctamente
    Deja un comentario en este artículo, y con suerte yo (O alguien) te ayudara
  • La plataforma se siente lenta y no responde rápidamente a las consultas
    La velocidad y respuesta de la plataforma depende de la cantidad de recursos disponibles y los usuarios activo, por favor intenta en otro horario.
  • Es posible utilizar estos conjuntos de datos o parte de ellos para predecir la accidentalidad de Bogotá?
    Si, realmente no es tan difícil, ya que los algoritmos de predicción para series de tiempo son bien conocidos. Puedes encontrar múltiples ejemplos (Time-related feature engineering — scikit-learn 1.2.0 documentation — https://scikit-learn.org/stable/auto_examples/applications/plot_cyclical_feature_engineering.html#sphx-glr-auto-examples-applications-plot-cyclical-feature-engineering-py) que funcionan bastante bien sobre este conjunto de datos (Tip, utiliza el campo geohash y cambia la precisión según te convenga más), o inclusive usar alguna plataforma de AutoML. Personalmente he intentado varios y han funcionado bastante bien, pero este articulo ya es lo suficientemente largo como para incluir secciones adicionales dedicadas a Machine Learning.
Mi gata después de estar involucrada en un terrible accidente… cosquillas de humano

[i] Bogota traffic report | TomTom Traffic Index — https://www.tomtom.com/traffic-index/bogota-traffic
[ii] Datos Abiertos Secretaría Distrital de Movilidad — https://datos.movilidadbogota.gov.co
[iii] Database Normalization — https://www.w3schools.in/dbms/database-normalization
[iv] Denormalization in Databases — GeeksforGeeks — https://www.geeksforgeeks.org/denormalization-in-databases/
[v] Index Templates | Elasticsearch — https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html
[vi] Geohash encoding/decoding — https://www.movable-type.co.uk/scripts/geohash.html
[vii] Global status report on road safety 2018 — https://www.who.int/publications/i/item/9789241565684

--

--

Iker

CyberSecurity, Information Security, Tech and Data Enthusiast, Amateur Developer