Cuando se piensa en el análisis de la seguridad vial, a menudo se empieza por la ubicación de los accidentes.
- ¿Dónde ocurrieron los accidentes?
- ¿Qué intersecciones registran más accidentes?
- ¿Dónde están los puntos críticos actuales?
Son preguntas útiles. Pero no siempre son las más importantes. Durante nuestra sesión técnica «Ciencia de datos espaciales en ArcGIS», exploramos una pregunta distinta:
¿Qué ubicaciones muestran un riesgo persistente a lo largo del tiempo?
En lugar de analizar accidentes de tráfico individuales, utilizamos datos históricos de accidentes de Frankfurt am Main entre 2019 y 2024 para identificar patrones espaciales que se mantuvieron estables durante varios años. El objetivo no era explicar un incidente aislado, sino entender si algunas ubicaciones presentan sistemáticamente un riesgo elevado, independientemente de las fluctuaciones a corto plazo.
%load_ext dotenv
%dotenv
from arcgis.gis import GIS
from arcgis.map import Map
import dotenv
import os
import pandas as pd
from traffic_safety.utils import combine_yearly_hotspots, list_feature_classes, summarize_hotspot_bins, generate_hotspots_renderer, filter_hotspot_bins, publish_hotspot_layer
home_portal = GIS("home")
gdb_path = os.getenv("HOTSPOT_GDB")
feature_classes = list_feature_classes(gdb_path)
Más allá de los puntos críticos individuales
El análisis de puntos críticos de un solo año ofrece una instantánea. Sin embargo, las ciudades son sistemas dinámicos. Los volúmenes de tráfico cambian. Las obras empiezan y terminan. El transporte público evoluciona. El comportamiento humano cambia con el tiempo. Un punto crítico identificado en un año puede desaparecer al siguiente. Para comprender mejor los riesgos a largo plazo, realizamos análisis anuales de puntos críticos Getis-Ord Gi* para cada año y luego comparamos los resultados a lo largo del tiempo.
El reto es que los polígonos de los puntos críticos no son idénticos de un año a otro. Sus límites se desplazan a medida que cambian las condiciones subyacentes. Para abordar esto, creamos un flujo de trabajo de alineación espacial:
- Ejecutar el análisis anual de puntos críticos
- Calcular los centroides de las celdas de puntos críticos
- Utilizar un marco común de referencia espacial
- Emparejar las ubicaciones de los puntos críticos a lo largo de los años
- Crear un perfil temporal para cada ubicación
- Calcular puntuaciones de persistencia de los puntos críticos
- Normalizar los resultados en un índice de riesgo
Esto transformó varios análisis independientes en una única superficie de riesgo fácil de interpretar.
from ipywidgets import HBox, VBox, Label, Layout
from traffic_safety.utils import generate_hotspots_renderer, read_feature_classes
def show_hotspot_map(portal: GIS, df: pd.DataFrame):
basemap_item_id = os.getenv("CUSTOM_BASEMAP_ITEM_ID")
if basemap_item_id:
portal_item = portal.content.get(basemap_item_id)
map_view = Map(portal_item)
else:
map_view = portal.map("Germany")
map_view.basemap.basemap = "osm"
drawing_info = {
"renderer": generate_hotspots_renderer()
}
fset = df.spatial.to_featureset()
map_view.content.add(fset, drawing_info=drawing_info, options={"opacity": 0.7})
map_view.zoom_to_layer(fset)
return map_view
hotspots_dict = read_feature_classes(gdb_path, [feature_classes[0], feature_classes[-1]])
hotspots_2019_df, hotspots_2025_df = hotspots_dict.values()
left_map = show_hotspot_map(home_portal, hotspots_2019_df)
right_map = show_hotspot_map(home_portal, hotspots_2025_df)
def side_by_side(left_map, left_label, right_map, right_label):
# sincronizar la navegación de los mapas
#left_map.sync_navigation(right_map)
"""
def sync_navigation(change):
if right_map.center != left_map.center:
right_map.center = left_map.center
if right_map.zoom != left_map.zoom:
right_map.zoom = left_map.zoom
left_map.observe(sync_navigation, names=["center", "zoom"])
"""
# Crear VBoxes para cada mapa y etiqueta
box1 = VBox([Label(left_label), left_map], layout=Layout(width='50%'))
box2 = VBox([Label(right_label), right_map], layout=Layout(width='50%'))
# Colocar las VBoxes una junto a otra mediante una HBox
hbox = HBox([box1, box2])
# Mostrar la HBox
display(hbox)
side_by_side(left_map, "2019", right_map, "2025")
left_map.sync_navigation(right_map)
De los datos de accidentes a una capa de riesgo
La capa resultante no representaba el número de accidentes. Representaba algo posiblemente más valioso: evidencia de riesgo persistente.
Las ubicaciones que aparecían repetidamente como puntos críticos estadísticamente significativos recibieron puntuaciones de persistencia más altas. Las ubicaciones donde los puntos críticos aparecían ocasionalmente recibieron puntuaciones más bajas. Esta distinción es importante. Un solo accidente grave puede llamar la atención, pero los patrones espaciales recurrentes suelen revelar características más profundas del sistema de transporte. El riesgo persistente puede indicar limitaciones de infraestructura, patrones de comportamiento del tráfico, centros de movilidad u otros factores subyacentes que merecen investigarse.
base_feature_class = feature_classes[0]
combined_df: pd.DataFrame = combine_yearly_hotspots(gdb_path, base_feature_class)
summarized_df: pd.DataFrame = summarize_hotspot_bins(combined_df, min_years_observed=len(feature_classes))
show_hotspot_map(home_portal, combined_df)
hottest_df = filter_hotspot_bins(summarized_df, min_value=2, max_value=3)
hottest_df.sort_values(by="Gi_Bin_median", ascending=False).head()
Lo que aprendimos
Una de las observaciones más interesantes fue que algunas de las ubicaciones con mayor riesgo no eran necesariamente las que tenían más tráfico. En cambio, el riesgo solía surgir de la interacción de varios factores. En trabajos relacionados con el Gemelo Digital Urbano de Frankfurt, descubrimos que las ubicaciones relevantes desde el punto de vista operativo solían aparecer allí donde varios indicadores se reforzaban mutuamente. Los patrones históricos de accidentes, las simulaciones de tráfico, el contexto de la infraestructura y el comportamiento de movilidad ofrecían en conjunto una visión más completa de la que podía aportar cualquier conjunto de datos por sí solo.
Esto pone de relieve una de las fortalezas de la ciencia de datos espaciales: La ubicación aporta contexto. Las relaciones espaciales suelen revelar patrones que permanecen invisibles cuando los conjuntos de datos se analizan por separado.
Por qué es importante
Muchas organizaciones se enfrentan a retos similares. Ya se trate de seguridad vial, infraestructura de servicios públicos, vigilancia medioambiental, salud pública o gestión de activos, quienes toman decisiones suelen necesitar distinguir entre anomalías temporales y patrones persistentes. La ciencia de datos espaciales ayuda a responder preguntas como las siguientes:
- ¿Qué ubicaciones presentan sistemáticamente un riesgo elevado?
- ¿Qué patrones se mantienen estables a lo largo del tiempo?
- ¿Qué zonas merecen una investigación más profunda?
- ¿Dónde deberían priorizarse los recursos limitados?
Estas preguntas son cada vez más importantes, ya que las organizaciones buscan pasar de la analítica descriptiva a la toma de decisiones basada en evidencias.
La ciencia de datos espaciales como fundamento
Para nosotros, la capa de riesgo se convirtió en algo más que un resultado analítico. Se convirtió en la base de las siguientes etapas de la presentación de Frankfurt. El flujo de trabajo siguió una progresión sencilla:
- Ciencia de datos espaciales identifica los riesgos persistentes.
- IA agéntica con fundamentación espacial utiliza esas evidencias para generar recomendaciones explicables.
- GeoAI fiable incorpora gobernanza y supervisión humana antes de actuar.
Esta progresión refleja un principio importante: la IA no sustituye a las evidencias. La IA resulta más útil cuando puede razonar a partir de evidencias fiables obtenidas mediante análisis espacial.
Reflexiones finales
Uno de los mensajes clave de la sesión fue sencillo:
No identificamos dónde ocurrieron los accidentes. Identificamos dónde persiste el riesgo.
Los patrones espaciales persistentes aportan las evidencias necesarias para formular recomendaciones explicables, crear sistemas de IA fiables y, en última instancia, tomar mejores decisiones. Cuando las organizaciones exploran la ciencia de datos espaciales, GeoAI y la IA agéntica, el reto a menudo no consiste en recopilar más datos, sino en identificar los patrones importantes. Y, en muchos casos, esos patrones son espaciales.
Cuaderno de seguridad vial @Github