Wanneer mensen nadenken over verkeersveiligheidsanalyses, beginnen ze vaak bij ongevalslocaties.
- Waar vonden ongevallen plaats?
- Op welke kruispunten gebeuren de meeste ongevallen?
- Waar bevinden zich de huidige hotspots?
Dat zijn nuttige vragen. Maar niet altijd de belangrijkste. Tijdens onze technische sessie "Ruimtelijke data science in ArcGIS", onderzochten we een andere vraag:
Op welke locaties is het risico langdurig aanwezig?
In plaats van afzonderlijke verkeersongevallen te analyseren, gebruikten we historische ongevalsgegevens uit Frankfurt am Main uit de periode 2019 tot en met 2024 om ruimtelijke patronen te identificeren die gedurende meerdere jaren stabiel bleven. Het doel was niet om één incident te verklaren, maar om te begrijpen of sommige locaties onafhankelijk van kortetermijnschommelingen consequent een verhoogd risico vertonen.
%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)
Verder kijken dan afzonderlijke hotspots
Een hotspotanalyse voor één jaar geeft een momentopname. Steden zijn echter dynamische systemen. Verkeersvolumes veranderen. Bouwprojecten komen en gaan. Het openbaar vervoer ontwikkelt zich. Menselijk gedrag verandert in de loop der tijd. Een hotspot die in het ene jaar wordt vastgesteld, kan het volgende jaar verdwenen zijn. Om risico op lange termijn beter te begrijpen, hebben we voor elk jaar een Getis-Ord Gi*-hotspotanalyse uitgevoerd en de resultaten vervolgens in de tijd vergeleken.
De uitdaging is dat hotspotpolygonen niet van jaar tot jaar identiek zijn. De grenzen verschuiven naarmate de onderliggende omstandigheden veranderen. Om dit op te lossen, hebben we een workflow voor ruimtelijke uitlijning ontwikkeld:
- Jaarlijkse hotspotanalyse uitvoeren
- Centroiden van hotspotbins berekenen
- Een gemeenschappelijk ruimtelijk referentiekader gebruiken
- Hotspotlocaties door de jaren heen koppelen
- Een tijdsprofiel voor elke locatie opstellen
- Persistentiescores voor hotspots berekenen
- De resultaten normaliseren tot een risico-index
Zo werden meerdere onafhankelijke analyses samengevoegd tot één begrijpelijk risicobeeld.
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("Duitsland")
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):
# navigatie van kaarten synchroniseren
#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"])
"""
# VBox'en maken voor elke kaart en elk label
box1 = VBox([Label(left_label), left_map], layout=Layout(width='50%'))
box2 = VBox([Label(right_label), right_map], layout=Layout(width='50%'))
# De VBox'en naast elkaar plaatsen met een HBox
hbox = HBox([box1, box2])
# De HBox weergeven
display(hbox)
side_by_side(left_map, "2019", right_map, "2025")
left_map.sync_navigation(right_map)
Van ongevalsgegevens naar een risicolaag
De resulterende laag gaf geen ongevalsaantallen weer. Ze liet iets zien dat misschien nog waardevoller is: aanwijzingen voor aanhoudend risico.
Locaties die herhaaldelijk als statistisch significante hotspots naar voren kwamen, kregen hogere persistentiescores. Locaties die slechts af en toe hotspotgedrag vertoonden, kregen lagere scores. Dit onderscheid is belangrijk. Eén ernstig ongeval kan de aandacht trekken, maar terugkerende ruimtelijke patronen leggen vaak dieperliggende kenmerken van het vervoerssysteem bloot. Aanhoudend risico kan wijzen op beperkingen in de infrastructuur, patronen in verkeersgedrag, mobiliteitsknooppunten of andere onderliggende factoren die nader onderzoek verdienen.
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()
Wat we hebben geleerd
Een van de interessantste observaties was dat sommige locaties met het hoogste risico niet noodzakelijk de drukste verkeerslocaties waren. Het risico kwam juist vaak voort uit de wisselwerking tussen meerdere factoren. In aanverwant werk rond de Frankfurt Urban Digital Twin zagen we dat locaties die operationeel relevant zijn vaak naar voren kwamen op plekken waar verschillende indicatoren elkaar versterkten. Historische ongevalspatronen, verkeerssimulaties, de context van de infrastructuur en mobiliteitsgedrag leverden samen een rijker beeld op dan één afzonderlijke dataset ooit zou kunnen bieden.
Dit benadrukt een van de sterke punten van ruimtelijke data science: Locatie biedt context. Ruimtelijke relaties brengen vaak patronen aan het licht die onzichtbaar blijven wanneer datasets afzonderlijk worden geanalyseerd.
Waarom dit belangrijk is
Veel organisaties staan voor vergelijkbare uitdagingen. Of het nu gaat om verkeersveiligheid, nutsvoorzieningen, milieumonitoring, volksgezondheid of assetmanagement: besluitvormers moeten vaak tijdelijke afwijkingen onderscheiden van aanhoudende patronen. Ruimtelijke data science helpt vragen te beantwoorden zoals:
- Op welke locaties is het risico consequent verhoogd?
- Welke patronen blijven in de loop der tijd stabiel?
- Welke gebieden verdienen nader onderzoek?
- Waar moeten beperkte middelen prioriteit krijgen?
Deze vragen worden steeds belangrijker nu organisaties de overstap willen maken van beschrijvende analyses naar besluitvorming op basis van feiten.
Ruimtelijke data science als fundament
Voor ons werd de risicolaag meer dan alleen een analytisch resultaat. Ze vormde het fundament voor de volgende fasen van de Frankfurt-showcase. De workflow volgde een eenvoudige opbouw:
- Ruimtelijke data science brengt aanhoudend risico in kaart.
- Agentische AI met ruimtelijke verankering gebruikt die aanwijzingen om uitlegbare aanbevelingen te genereren.
- Betrouwbare GeoAI voegt governance en menselijk toezicht toe voordat er actie wordt ondernomen.
Deze opbouw weerspiegelt een belangrijk principe: AI vervangt bewijs niet. AI wordt nuttiger wanneer ze kan redeneren op basis van betrouwbare aanwijzingen die met ruimtelijke analyses zijn verkregen.
Tot slot
Een van de kernboodschappen van de sessie was eenvoudig:
We brengen niet in kaart waar ongevallen plaatsvonden. We brengen in kaart waar het risico aanhoudt.
Aanhoudende ruimtelijke patronen leveren de aanwijzingen die nodig zijn voor uitlegbare aanbevelingen, betrouwbare AI-systemen en uiteindelijk betere beslissingen. Wanneer organisaties aan de slag gaan met ruimtelijke data science, GeoAI en agentische AI, ligt de uitdaging vaak niet in het verzamelen van meer gegevens. De uitdaging is om de patronen te identificeren die ertoe doen. En vaak zijn die patronen ruimtelijk van aard.
Verkeersveiligheidsnotebook @Github