“Die größte Gefahr im Straßenverkehr sind Autos, die schneller fahren, als ihr Fahrer denken kann.” (Robert E. Lembke)
Laut dem aktuellen Straßensicherheitsbericht der WHO aus dem Jahr 2018 sterben jährlich 1,35 Millionen Menschen auf den Straßen. In der Altersgruppe zwischen 5 und 29 Jahren sind damit Verkehrsunfälle die häufigste Todesursache (World Health Organisation, 2018). Dementsprechend sollte eine Reduzierung dieser Zahlen im Interesse aller sein. In Deutschland starben im Jahr 2019 3059 Personen infolge von Verkehrsunfällen (Statistisches Bundesamt, 2020). Zwar sinken die Zahlen in Deutschland seit dem Anfang der 1990er Jahre dank technischer Verbesserungen und verschärften Sicherheitsvorschriften stetig, trotzdem handelt es sich bei den meisten der 2019 bei Verkehrsunfällen Verstorbenen doch um vermeidbare Tode.
Die vorliegende Arbeit beschäftigt sich mit einem Datensatz des Amts für Statistik Berlin-Brandenburg, welcher alle Verkehrsunfälle mit Personenschaden im Land Berlin im Jahr 2019 umfasst. Zwar sind auch schon Daten für das Jahr 2020 verfügbar, diese sind jedoch aufgrund der außergewöhnlichen Lage, in der sich die Weltbevölkerung seit Beginn der COVID-19-Pandemie befindet, nicht als repräsentativ zu betrachten, da die Einschränkungen des öffentlichen Lebens auch starke Veränderungen im Straßenverkehr mit sich zogen (Landespolizeidirektion Stab 14 Verkehr, 2020b).
In Berlin wurden im Jahr 2019 147.306 Verkehrsunfälle verzeichnet (Landespolizeidirektion Stab 14 Verkehr, 2020a). Davon wurde in 14.959 Fällen ein Personenschaden festgestellt (Wittlich et al., 2020), 40 Personen starben (Hasselmann, 2020). In den meisten Fällen ließen sich diese Unfälle auf Fehler beim Abbiegen, das Nichtbeachten der Vorfahrt, eine nicht angemessen angepasste Geschwindigkeit, das falsche Verhalten von Fußgänger:innen oder Alkoholeinfluss zurückführen. Die meisten Unfälle (68,4%) werden von PKW verursacht. 60% der Unfalltoten waren Fußgänger:innen. Besonders gefährlich war es in Berlin für Radfahrer:innen an der Oberbaumbrücke, am Frankfurter Tor, an der Straßenecke Otto-Braun-Straße/Mollstraße in der Nähe des Alexanderplatzes und am Brandenburger Tor. (Landespolizeidirektion Stab 14 Verkehr, 2020a)
Der vorliegenden Arbeit ist zum Ziel gesetzt, verschiedene Fragen zu beantworten. Es soll ermittelt werden, ob und um wie viel gefährlicher Unfälle von Güterkraftfahrzeugen mit nicht geschützten Verkehrsteilnehmenden (Fußgänger:innen und Fahrradfahrer:innen) im Vergleich sind. Außerdem wird versucht, in den vorliegenden Daten Hotspots für verschiedene Verkehrsteilnehmer:innen zu identifizieren. Hierzu wird unter anderem eine interaktive Web-Applikation mit Hilfe des R-Packages Shiny erstellt und veröffentlicht.
Es wird damit begonnen, einen Überblick über bisherige relevante Forschung zu dieser Arbeit zu geben. Nachfolgend wird auf den gewählten Datensatz eingegangen, der deskriptiv analysiert wird. Daraufhin folgt eine deduktive Analyse der vorliegenden Daten, welche in der Erstellung einer interaktiven Karte von Berlin mündet. Nach einer Diskussion der gewonnenen Ergebnisse folgt ein abschließendes Fazit.
Aufgrund der oft schwerwiegenden Folgen von Verkehrsunfällen, wird dieses Gebiet seither international erforscht. Entsprechend zahlreich sind auch die Forschungsrichtungen, die sich mit diesem Thema beschäftigen. Während Mediziner:innen aller Art gesundheitliche Ursachen und Folgen von Verkehrsunfällen untersuchen (Evers & Auerbach, 2011; Häkkänen & Summala, 2001; Wilhelm et al., 2011), beschäftigen sich Geograph:innen und Verkehrswissenschaftler:innen mit der Verortung der Unfälle und der Analyse von Hotspots (T. Anderson, 2007; Bíl et al., 2019; Erdogan et al., 2015) und Maschinenbauer:innen und Informatiker:innen erproben Möglichkeiten der Prävention, z.B. mit Hilfe KI-unterstützter Fahrerassistenzsysteme (Fawcett et al., 2017; Gahr et al., 2018; Ryder et al., 2017).
Für diese Arbeit stehen die Ursachenforschung, die Prävention und die Hotspotdetektion im Fokus, wobei die Übergänge in andere Bereiche teilweise fließend sind, da die Erkennung von Unfallhotspots der Prävention weiterer Unfälle dient, wofür die Ursachen für diese Unfallhäufungen beseitigt werden müssen. Innerhalb dieses Gebiets kann unterschieden werden zwischen der Forschung bezüglich besonders gefährdeter Gruppen wie Fußgänger:innen, Radfahrer:innen, Kindern und Senior:innen (Fastenmeier, 2019; Lakes, 2017; Limbourg & Reiter, 2002; Stephan & Wilhelm, 2011) und bezüglich besonders gefährdender Gruppen wie LKW-Fahrer:innen und alkoholisierte/anderweitig beeinträchtigte Fahrer:innen (Evers & Auerbach, 2011; Häkkänen & Summala, 2001; Saß et al., 2016).
Ein großer Teil der in den letzten zehn Jahren veröffentlichten Forschung beschäftigt sich jedoch explizit mit der Erkennung von vorhandenen Unfallhotspots und den Möglichkeiten, durch dieses gewonnene Bewusstsein dort die Unfallzahlen zu senken. Auf diese Forschung wird im Folgenden ím Hinblick auf das Ziel der vorliegenden Arbeit genauer eingegangen.
Anderson , Yu et al. und Erdogan et al. untersuchen und vergleichen verschiedene Methoden der Identifikation von Unfallhotspots. Altbewährten Methoden werden neuere Ansätze der räumlichen Statistik gegenüber gestellt. Die Kernel Density Estimation Methode bringt im Vergleich durch den Einbezug von zusätzlichen Daten wie denen eines Geoinformationssystems die besten Ergebnisse hervor. (T. Anderson, 2007; T. K. Anderson, 2009; Erdogan et al., 2015; Yu et al., 2014)
Le et al. und Bíl et al. arbeiten ebenfalls mit Kernel Density Estimation. Sie stellen fest, dass sich die Lage der Hotspots im Laufe der Zeit verändern kann. Neue kommen beispielsweise durch Straßenarbeiten hinzu, Alte verschwinden, wenn z.B. Warnhinweise aufgestellt werden. Der Großteil der beständigen Hotspots sind in Kurven verortet. (Bíl et al., 2019; Le et al., 2020)
Auch Lu et al. beschäftigen sich mit der Identifikation von Unfallhotspots. In ihre logistische Regressionsanalyse beziehen sie zusätzlich äußere Einflussfaktoren wie Art der Straße, Straßen- und Sichtverhältnisse, Zustand des Fahrzeugs und der Fahrer:innen und Position der Fahrzeuge im Straßengeschehen mit ein. Das erarbeitete Modell lag in 86.67% der Fälle mit seiner Vorhersage richtig. Es wird angeregt, in folgenden Studien zusätzlich die Verkehrsstärke und das vorherrschende Wetter in die Analyse mit einzubeziehen. (Lu et al., 2015)
Gahr et al. sammelten Videomaterial und Fahrdaten von Fahrern in der Schweiz um auf dieser Basis Unfallhotspots zu erkennen und zu klassifizieren. So gewonnene Daten könnten in Fahrzeugsysteme aufgenommen werden, um die Autofahrer:innen vor vorausliegenden Gefahrengebieten zu warnen. Der Vorteil des verwendeten Crown Sourcing-Ansatzes besteht darin, dass Hotspots und Gefahrengebiete bei einer kontinuierlichen Datenerhebung sofort und nicht erst retrospektiv erkannt werden können und somit schneller Gegenmaßnahmen wie ein Warnhinweis im Fahrzeug selbst ergriffen werden können. (Gahr et al., 2018; Ryder et al., 2017)
Auch Fawcett et al. untersuchen Möglichkeiten der proaktiven Hotspotidentifikation. Das auf Bayes basierende Modell wird auf einen Datensatz der Stadt Halle angewandt. Mit hoher Genauigkeit können später entstehende Hotspots auf Basis der Daten der Vorjahre vorausgesagt werden, wobei die Voraussagen besser werden, je mehr Vorjahre in die Analyse mit einbezogen werden. (Fawcett et al., 2017)
Abschließend für dieses Gebiet hat Lakes Unfallhotspots in Berlin untersucht und dabei einen besonderen Fokus auf Fußgänger:innen und Radfahrer:innen gelegt. Es wird eine deutliche Konzentration auf den Innenstadtbereich erkennbar, wobei die Hotspots für Radfahrer:innen räumlich spezifischer und mit höheren Unfallzahlen vertreten sind als die Unfallorte von Fußgänger:innen. In den Frühjahrs- und Sommermonaten kommt es durch die häufigere Fahrradnutzung zu mehr Unfällen als in den Wintermonaten. Besonders gefährlich für Radfahrende ist der Kreisverkehr am Moritzplatz. Die häufigste Unfallursache bei Unfällen mit Fahrradbeteiligung sind Fehler beim Rechtsabbiegen. (Lakes, 2017)
Malczyk untersuchte für die Unfallforschung der Versicherer Unfälle zwischen schweren LKW und ungeschützten Verkehrsteilnehmer:innen, mit Fokus auf Häufigkeit, Umstände und Verletzungen. In den Datensatz wurden Unfälle mit LKW ab 11.900 kg zulässiger Gesamtmasse und Radfahrer:innen oder Fußgänger:innen einbezogen, bei denen der anfängliche Schadenswert auf mindestens 30.000€ geschätzt wurde, wobei davon ausgegangen wird, dass ein großer Teil dieser Summe jeweils auf den Personenschaden bezogen ist. Die meisten dieser Unfälle geschahen wochentags, innerorts, bei Tageslicht und trockener Fahrbahn. Besonders gefährdet sind Personen ab 55 Jahren. Die meisten Fußgänger:innen (23%) verunglückten beim Überqueren der Straße von rechts vor einem geradeaus fahrenden LKW, die meisten Fahrradfahrer:innen (56%) verunglückten bei einem Abbiegemanöver des LKW nach rechts. Er schließt mit Hinweisen für beide Seiten, wie Unfälle zwischen den Parteien vermieden werden können. (Malczyk, 2019)
Der Datensatz “Straßenverkehrsunfälle nach Unfallort in Berlin 2019” wurde vom Amt für Statistik Berlin-Brandenburg unter einer Creative Commons-Lizenz (CC BY 3.0 DE) herausgegeben und umfasst Daten zu 13.390 (von insgesamt 14.959 registrierten) Verkehrsunfällen mit Personenschaden (Amt für Statistik Berlin-Brandenburg, 2020b). Die übrigen 1569 Unfälle wurden aufgrund von fehlerhaften oder widersprüchlichen Angaben zum Unfallort nicht in den Datensatz aufgenommen (Wittlich et al., 2020).
# Laden der benötigten Bibliotheken
library(readr)
library(tidyverse)
library(ggplot2)
library(scales)
library(sf)
library(shiny)
library(leaflet)
library(emojifont)
# Laden des Datensatzes
unfall <- read_delim("https://box.hu-berlin.de/f/f40cf4fd947b49deb355/?dl=1",
";", escape_double = FALSE, locale = locale(encoding = "latin1"), trim_ws = TRUE)
View(unfall)
Der Datensatz (Amt für Statistik Berlin-Brandenburg, 2020a) umfasst 13390 Fälle, welche mit 24 Variablen beschrieben werden. In der begleitenden Datensatzbeschreibung (Amt für Statistik Berlin-Brandenburg, 2020b) werden die einzelnen Variablen kurz erklärt. Fünf der Variablen sind für die weitere Analyse nicht relevant, da sie entweder keine besondere Aussagekraft haben (UJAHR und LAND, da diese Variablen für alle Fälle denselben Wert haben, da nur ein (Bundes-)Land und ein Jahr betrachtet wird) oder sich mit anderen Variablen doppeln ( LOR (“Lebensweltlich orientierte Räume,” Dopplung mit STRASSE) und LINREFX/LINREFY (UTM-Koordinaten nach ETRS89, Dopplung mit XGCSWGS84/YGCSWGS84)). Die verbleibenden 19 Variablen werden im Folgenden vorgestellt.
OBJECTID: nominal, ID des jeweiligen Vorfalls
BEZIRK: nominal, Kennziffer des Bezirkes, 1 = Mitte, 2 = Friedrichshain-Kreuzberg, 3 = Pankow, 4 = Charlottenburg-Wilmersdorf, 5 = Spandau , 6 = Steglitz-Zehlendorf, 7 = Tempelhof-Schöneberg, 8 = Neukölln, 9 = Treptow-Köpenick, 10 = Marzahn-Hellersdorf , 11 = Lichtenberg, 12 = Reinickendorf
STRASSE: nominal, Name der Straße/des Straßenabschnittes auf der/dem der Unfall passierte
UMONAT: kardinal, Datum des Unfalls auf Monat genau
USTUNDE: kardinal, Uhrzeit des Unfalls auf Stunde genau
UWOCHENTAG: kardinal, Wochentag des Unfalls, 1 = Sonntag, 7 = Montag
UKATEGORIE: nominal, Schwere des Unfalls, 1 = Unfall mit Toten, 2 = Unfall mit Schwerverletzten, 3 = Unfall mit Leichtverletzten, jeweils die schwerste Folge ist ausschlaggebend
UART: nominal, Art des Unfalls, 1 = Zusammenstoß mit anfahrendem/anhaltendem/ruhendem Fahrzeug, 2 = Zusammenstoß mit vorausfahrendem/wartendem Fahrzeug, 3 = Zusammenstoß mit seitlich in gleicher Richtung fahrendem Fahrzeug, 4 = Zusammenstoß mit entgegenkommendem Fahrzeug, 5 = Zusammenstoß mit einbiegendem/ kreuzendem Fahrzeug, 6 = Zusammenstoß zwischen Fahrzeug und Fußgänger, 7 = Aufprall auf Fahrbahnhindernis, 8 = Abkommen von Fahrbahn nach rechts, 9 = Abkommen von Fahrbahn nach links, 0 = Unfall anderer Art
UTYP1: nominal, Typ des Unfalls, 1 = Fahrunfall, 2 = Abbiegeunfall, 3 = Einbiegen/Kreuzen-Unfall, 4 = Überschreiten-Unfall, 5 = Unfall durch ruhenden Verkehr, 6 = Unfall im Längsverkehr, 7 = sonstiger Unfall
ULICHTVERH: nominal, Lichtverhältnisse zur Zeit des Unfalls, 0 = Tageslicht, 1 = Dämmerung, 2 = Dunkelheit
IstRad: nominal, Fahrradbeteiligung, nur ja/nein, nicht wie viele
IstPkw: nominal, Personenkraftwagenbeteiligung, nur ja/nein, nicht wie viele
IstFuss: nominal, Fußgängerbeteiligung, nur ja/nein, nicht wie viele
IstKrad: nominal, Kraftradbeteiligung, nur ja/nein, nicht wie viele
IstGkfz: nominal, Güterkraftfahrzeugbeteiligung (Lastkraftwagen mit Normalaufbau und einem Gesamtgewicht über 3,5 t, ein Lastkraftwagen mit Tankauflage bzw. Spezialaufbau, eine Sattelzugmaschine oder eine andere Zugmaschine), nur ja/nein, nicht wie viele
IstSonstige: nominal, Beteiligung sonstiger Verkehrsteilnehmer (z.B. Bus, Straßenbahn), nur ja/nein, nicht wie viele
USTRZUSTAND: nominal, Zustand der Straße zum Unfallzeitpunkt, 0 = trocken, 1 = nass/feucht/schlüpfrig, 2 = winterglatt
XGCSWGS84 und YGCSWGS84: kardinal, Gauß-Krüger-Koordinaten. Anmerkung: Die Nutzung des Gauß-Krüger-Systems wurde zugunsten des international anwendbaren Referenzsystems WGS84 aufgegeben, wie auch die Datensatzbeschreibung des DSB Unfallatlas (Datensatzbeschreibung Unfallatlas, 2020), auf den der hier genutzte Datensatz zurückgeht, korrekterweise angibt. Demnach handelt es sich bei diesen Koordinaten um WGS84-Koordinaten im Dezimalgrad.
Die vorliegenden Daten wurden stark anonymisiert. Nähere Angaben zu Unfallbeteiligten (Alter, Geschlecht, genaue Anzahl, etc.) fehlen. Auch das Datum wurde auf Monat und Wochentag reduziert, sodass eine genaue Zuordnung nicht möglich ist. Daher sind Analysen in Bezug auf die genaueren Umstände der Unfälle nicht möglich. Die Hotspotanalyse bezieht sich dementsprechend nur auf die geografische Lage der verzeichneten Unfälle. Zwar sind einige zusätzliche Parameter bekannt, da die genauere Umgebungssituation jedoch nicht erfasst wurde, lässt sich die jeweilige Relevanz etwa der Sichtverhältnisse oder des Straßenzustandes nicht feststellen.
Da die Erstellung des Datensatzes auf standardisierten Polizeiberichten basiert, ist der Aufbereitungsaufwand verhältnismäßig gering. Lediglich beim Unfall mit der ID 201196 scheint es einen Einlesefehler gegeben zu haben bezüglich der Koordinaten, des Straßenzustands und der Frage nach den sonstigen Beteiligten, sodass entschieden wurde, die fehlerhaften Koordinaten zu entfernen.
# Entfernen nicht relevanter Variablen
unfall <- unfall %>%
select(-LOR, -LAND, -UJAHR, -LINREFX, -LINREFY)
# Entfernen eines nicht plausiblen Koordinatenpaares
unfall <- unfall %>%
mutate(`XGCSWGS84` = na_if(`XGCSWGS84`, 5254675821)) %>%
mutate(`YGCSWGS84`= na_if(`YGCSWGS84`, 1))
# Umformen der Koordinatenwerte in Kommazahlen
unfall$XGCSWGS84 <- gsub('^([0-9]{2})([0-9]+)$', '\\1.\\2', unfall$XGCSWGS84)
unfall$YGCSWGS84 <- gsub('^([0-9]{2})([0-9]+)$', '\\1.\\2', unfall$YGCSWGS84)
# Umformen der Koordinatenwerte in numerische Werte
unfall <- unfall %>%
mutate(XGCSWGS84 = as.numeric(XGCSWGS84)) %>%
mutate(YGCSWGS84 = as.numeric(YGCSWGS84))
Im Folgenden wird näher auf die im Datensatz aufgeführten Attribute eingegangen. In den meisten Fällen werden die Daten durch ein Säulendiagramm grafisch dargestellt. Da die meisten untersuchten Variablen, abgesehen von den zeitlichen, kategorisch sind und keine unterliegende logische Reihenfolge aufweisen, ist eine Untersuchung auf Normalverteilung o.ä. hinfällig.
Zunächst soll das Unfallaufkommen in Bezug auf verschiedene zeitliche Parameter (Monat, Wochentag, Uhrzeit) untersucht werden.
# Zusammenfassung der Variable UMONAT
unfall %>%
group_by(UMONAT) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## UMONAT AnzahlUnfaelle
## Min. : 1.00 Min. : 786.0
## 1st Qu.: 3.75 1st Qu.: 928.8
## Median : 6.50 Median :1139.5
## Mean : 6.50 Mean :1115.8
## 3rd Qu.: 9.25 3rd Qu.:1228.0
## Max. :12.00 Max. :1448.0
# Erstellen eines Histogramms
unfall %>%
ggplot(., aes(x = UMONAT)) +
scale_x_continuous(limits = c(0 , 13), breaks = seq(1, 12, by = 1), labels = c("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 1600), breaks = seq(0, 1600, by = 250)) +
geom_histogram(binwidth = 1, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Monat", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Über das Jahr hinweg schwanken die Unfallzahlen zwischen einem Minimum im Februar (786) und einem Maximum im Juni (1448), wobei der Durchschnitt bei 1115.8 Unfällen im Monat liegt. Die Sommer- und Herbstmonate (Mai bis Oktober) verzeichnen gegenüber den Winter- und Frühlingsmonaten eine größere Anzahl von Unfällen. Die Spitzen in Juni und August gehen einher mit Beginn und Ende der Ferienzeit und dem dadurch vermehrten Reiseverkehr. Die flache, nahezu symmetrische Glockenform spricht für eine Normalverteilung mit hoher Standardabweichung, der Einbruch im Juli spricht wiederum dagegen, da die Kurve somit bimodal ist.
# Zusammenfassung der Variable UWOCHENTAG
unfall %>%
group_by(UWOCHENTAG) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## UWOCHENTAG AnzahlUnfaelle
## Min. :1.0 Min. : 988
## 1st Qu.:2.5 1st Qu.:1804
## Median :4.0 Median :2131
## Mean :4.0 Mean :1913
## 3rd Qu.:5.5 3rd Qu.:2207
## Max. :7.0 Max. :2248
# Erstellen eines Histogramms
unfall %>%
ggplot(., aes(x = UWOCHENTAG)) +
scale_x_continuous(limits = c(0,8), breaks = seq(1,7, by = 1), labels = c("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag" , "Samstag"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 2500), breaks = seq(0, 2500, by = 500)) +
geom_histogram(binwidth = 1, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Wochentag", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Die Unfallzahlen an Werktagen unterscheiden sich kaum. Insgesamt gab es an jedem Werktag in 2019 über 2000 Unfälle, wobei der Dienstag mit 2248 Unfällen leicht vorne liegt. Im Vergleich dazu sind die Zahlen am Wochenende bedeutend niedriger. Schon an Samstagen ist ein deutlicher Abfall zu erkennen und an Sonntagen verunglückten nur weniger als die Hälfte (988) im Vergleich zu unter der Woche. Da die Zahlen unter der Woche nahezu identisch sind, am Wochenende jedoch deutlich niedriger liegen, wird hier nicht von einer Normalverteilung gesprochen.
# Zusammenfassung der Variable USTUNDE
unfall %>%
group_by(USTUNDE) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## USTUNDE AnzahlUnfaelle
## Min. : 0.00 Min. : 58.0
## 1st Qu.: 5.75 1st Qu.: 181.0
## Median :11.50 Median : 681.5
## Mean :11.50 Mean : 557.9
## 3rd Qu.:17.25 3rd Qu.: 813.5
## Max. :23.00 Max. :1158.0
# Erstellen eines Histogramms
unfall %>%
ggplot(., aes(x = USTUNDE)) +
scale_x_continuous(limits = c(-1 ,24), breaks = seq(0,23, by = 1), oob = oob_keep) +
scale_y_continuous(limits = c(0, 1200), breaks = seq(0, 1250, by = 250)) +
geom_histogram(binwidth = 1, color = "grey") +
geom_hline(aes(yintercept = 557.9)) +
geom_text(aes(0, 557.9, label = "Durchschnitt", vjust = - 1)) +
theme_minimal() +
labs(title = "Unfallverteilung nach Uhrzeit", x = "Uhrzeit", y = "Anzahl Unfälle")
Über den Tag verteilt liegt der niedrigste Wert um 4 Uhr morgens bei 58 Unfällen und der höchste Wert genau 12 Stunden später um 16 Uhr bei 1158 Unfällen. Ein rapider Anstieg ist zu 7 Uhr zum ersten Schub des Berufsverkehrs zu verzeichnen. Zum frühen Mittag entspannt sich die Lage wieder etwas um dann zu 16 Uhr in der Hauptverkehrszeit ihren Höhepunkt zu erreichen. Nach 17 Uhr folgt ein deutliches Absinken der Zahlen, welches sich bis 2 Uhr morgens fortsetzt und dort bis 4 Uhr nahezu stagniert. Auch diese Kurve ist eindeutig bimodal und stellt daher keine Normalverteilung dar.
Nun wird die Unfallverteilung in Hinblick auf die äußeren Parameter Straßenzustand und Lichtverhältnisse untersucht. Im Gegensatz zu den zeitlichen Parametern ist hier vor allem in der Analyse zu beachten, dass das Vorkommen der einzelnen Ausprägungen nicht gleichmäßig verteilt ist. So nimmt die Dämmerung nur einen kleinen Teil des Tages ein und das Vorkommen von Glätte auf Straßen ist auf die Wintermonate beschränkt.
# Zusammenfassung der Variable USTRZUSTAND
unfall %>%
group_by(USTRZUSTAND) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## USTRZUSTAND AnzahlUnfaelle
## Min. :0.0 Min. : 1
## 1st Qu.:0.5 1st Qu.: 34
## Median :1.0 Median : 1618
## Mean :1.0 Mean : 3348
## 3rd Qu.:1.5 3rd Qu.: 4931
## Max. :2.0 Max. :10154
## NA's :1
# Erstellen eines Barcharts
unfall %>%
drop_na() %>%
ggplot(., aes(x = USTRZUSTAND)) +
scale_x_continuous(limits = c(-1, 3), breaks = seq(0, 2, by = 1), labels = c("trocken", "nass / feucht / schlüpfrig", "winterglatt"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 11000), breaks = seq(0, 11000, by = 2000)) +
geom_bar(width = 0.5, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Straßenzustand", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Der Großteil der Unfälle in 2019 fanden auf trockenen Straßen statt (10154). 1618 passierten bei nasser, feuchter oder anderweitig schlüpfriger Fahrbahn und nur 34 sind der Winterglätte zuzuschreiben. Hierbei spielt natürlich mit herein, dass die Straßen die meiste Zeit trocken sind und nur verhältnismäßig selten nass oder überfroren.
# ZUsammenfassung der Variable ULICHTVERH
unfall %>%
group_by(ULICHTVERH) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## ULICHTVERH AnzahlUnfaelle
## Min. :0.0 Min. : 724
## 1st Qu.:0.5 1st Qu.:1766
## Median :1.0 Median :2808
## Mean :1.0 Mean :4463
## 3rd Qu.:1.5 3rd Qu.:6333
## Max. :2.0 Max. :9858
# Erstellen eines Barcharts
unfall %>%
ggplot(., aes(x = ULICHTVERH)) +
scale_x_continuous(limits = c(-1, 3), breaks = seq(0, 2, by = 1), labels = c("Tageslicht", "Dämmerung", "Dunkelheit"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 10000), breaks = seq(0, 10000, by = 2000)) +
geom_bar(width = 0.5, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Lichtverhältnissen", y = "Anzahl Unfälle") +
theme(axis.title.x=element_blank())
Die meisten Unfälle fanden tagsüber statt (9858). 2808 passierten bei Dunkelheit und 724 bei Dämmerlicht. Analog zu den Straßenverhältnissen, muss beachtet werden, dass Dämmerlicht nur während eines kleinen Teils des Tages vorherrschen kann.
Besonders interessant ist auch die Frage nach den beteiligten Verkehrsteilnehmern. Auch hier ist anzumerken, dass die Verkehrsteilnehmer nicht zu gleichen Anteilen im Straßenverkehr vertreten sind. Weiterhin wird nur die Beteiligung am Unfall angegeben, nicht aber die Zahl der Beteiligten oder gar der oder die Unfallverursachende.
# Errechnen der Anzahl der Unfälle an denen jeweils mindestens einer dieser Verkehrsteilnehmergruppem beteiligt war
unfallBeteiligte <- as.data.frame(c(count(filter(unfall, IstFuss == 1)), count(filter(unfall, IstRad == 1)), count(filter(unfall, IstPKW == 1)), count(filter(unfall, IstKrad == 1)), count(filter(unfall, IstGkfz == 1)), count(filter(unfall, IstSonstige == 1))))
# Erstellen eines Data Frames für die Erstellung eines Diagramms
unfallBeteiligte <- unfallBeteiligte %>%
t() %>%
cbind(c("Fußgänger:innen", "Radfahrer:innen", "PKWs", "Krafträder", "Güterkraftfahrzeuge", "Sonstige")) %>%
as.data.frame() %>%
transform(V1 = as.numeric(V1))
# Erstellen eines Barcharts
unfallBeteiligte %>%
ggplot(., aes(x = V2, y = V1)) +
theme_minimal() +
geom_col(color = "grey") +
scale_y_continuous(limits = c(0, 11000), breaks = seq(0, 10000, by = 2000)) +
labs(title = "Unfallverteilung nach Beteiligten", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Da der PKW auf den Straßen das prädominante Verkehrsmittel ist, sind auch an den meisten Unfällen PKWs beteiligt. An zweiter Stelle stehen die Radfahrer:innen, gefolgt von Fußgänger:innen und Krafträdern. Güterkraftfahrzeuge sind nur sehr selten an Unfällen beteiligt.
Die Schwere des Unfalls wird in die drei Kategorien Leichtverletzte, Schwerverletzte und Tote eingeteilt, wobei jeweils die schwerste Verletzung ausschlaggebend ist. Da jede Art Unfallbeteiligte eine eigene Variable ist, ist die Erstellung des Diagramms wie im Folgenden zu sehen, etwas aufwändiger.
# Errechnen der Gesamtzahl der Unfälle nach Verkehrsmittel und Unfallschwere
Fuss <- unfall %>%
select(IstFuss, UKATEGORIE) %>%
filter(IstFuss == 1) %>%
mutate(unfaelleInsgesamt = sum(IstFuss)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
Rad <- unfall %>%
select(IstRad, UKATEGORIE) %>%
filter(IstRad == 1) %>%
mutate(unfaelleInsgesamt = sum(IstRad)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
PKW <- unfall %>%
select(IstPKW, UKATEGORIE) %>%
filter(IstPKW == 1) %>%
mutate(unfaelleInsgesamt = sum(IstPKW)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
KRad <- unfall %>%
select(IstKrad, UKATEGORIE) %>%
filter(IstKrad == 1) %>%
mutate(unfaelleInsgesamt = sum(IstKrad)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
GKFZ <- unfall %>%
select(IstGkfz, UKATEGORIE) %>%
filter(IstGkfz == 1) %>%
mutate(unfaelleInsgesamt = sum(IstGkfz)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
Sonstige <- unfall %>%
select(IstSonstige, UKATEGORIE) %>%
filter(IstSonstige == 1) %>%
mutate(unfaelleInsgesamt = sum(IstSonstige)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
# Erstellen eines gemeinsamen Data Frames
Unfallschwere <- bind_rows(list(Fuss=Fuss, Rad=Rad, PKW=PKW, KRad=KRad, GKFZ=GKFZ, Sonstige=Sonstige), .id = 'Verkehrsmittel')
# Erstellen eines gemeinsamen Barcharts
Unfallschwere %>%
ggplot(., aes(x = UKATEGORIE , fill = Verkehrsmittel, y = Prozente)) +
theme_minimal() +
geom_bar(position = "dodge", stat = "identity") +
scale_y_continuous(limits = c(0,1), labels = percent) +
scale_x_continuous(limits = c(0,4), breaks = seq(1, 3, by =1), labels = c("Tote", "Schwerverletzte", "Leichtverletzte")) +
scale_fill_grey(name = "Verkehrsmittel", labels = c("Fußgänger", "Güterkraftfahrzeuge", "Krafträder", "PKWs", "Fahrräder", "Sonstige")) +
labs(title = "Unfallschwere nach Verkehrsteilnehmern") +
theme(axis.title.y=element_blank(), axis.title.x=element_blank())
Unabhängig von der Art der Unfallbeteiligten werden die meisten Opfer von Verkehrsunfällen mit Personenschaden nur leicht verletzt. Wie oben festgestellt, sind Güterkraftfahrzeuge verhältnismäßig selten an Unfällen mit Personenschaden beteiligt. Jedoch ist der Anteil der Beteiligungen an Unfällen mit tödlichem Ausgang im Vergleich zu den anderen Verkehrsteilnehmenden erhöht. Auch Fußgänger:innen sind verhaltnismäßig oft an schweren Unfällen (Todesfolge oder Schwerverletzte) beteiligt.
Die Unfallzahlen pro Berliner Bezirk werden nicht als Säulendiagramm, sondern als einfache Heatmap grafisch dargestellt. Die Grafik wird unter Zuhilfenahme einer Shapefile-Datei des Geoportals Berlin (Geoportal Berlin, 2017) erstellt.
# Zusammenfassung der Variable BEZ
unfall %>%
group_by(BEZ) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## BEZ AnzahlUnfaelle
## Min. : 1.00 Min. : 586.0
## 1st Qu.: 3.75 1st Qu.: 837.8
## Median : 6.50 Median : 913.0
## Mean : 6.50 Mean :1115.8
## 3rd Qu.: 9.25 3rd Qu.:1276.0
## Max. :12.00 Max. :2215.0
# Einlesen einer Shapefile-Karte der Bezirke von Berlin
download.file("https://box.hu-berlin.de/f/2142622630f44fd2a54d/?dl=1", destfile = "./bezirksgrenzen.shp.zip", mode = "wb")
unzip("./bezirksgrenzen.shp.zip")
shapes <- read_sf("bezirksgrenzen.shp")
view(shapes)
#Zusammenzählen der Unfälle pro Bezirk
bezUnfall <- unfall %>%
group_by(BEZ) %>%
summarize(AnzahlUnfaelle = n())
# Zuordnung der Klarnamen der Bezirke zu den jeweiligen Unfallzahlen
Bezirke <- c("Mitte", "Friedrichshain-Kreuzberg", "Pankow", "Charlottenburg-Wilmersdorf", "Spandau", "Steglitz-Zehlendorf", "Tempelhof-Schöneberg", "Neukölln", "Treptow-Köpenick", "Marzahn-Hellersdorf", "Lichtenberg", "Reinickendorf")
bezUnfall$Bezirke <- Bezirke
# Umsortieren der Tabelle "bezUnfall", sodass die Reihenfolge der Bezirke mit der in der Shapefile-Datei übereinstimmt
bezUnfall <- bezUnfall %>%
arrange(match(Bezirke, c("Reinickendorf", "Charlottenburg-Wilmersdorf", "Treptow-Köpenick", "Pankow", "Neukölln", "Lichtenberg", "Marzahn-Hellersdorf", "Spandau", "Steglitz-Zehlendorf", "Mitte", "Friedrichshain-Kreuzberg", "Tempelhof-Schöneberg"), desc(AnzahlUnfaelle), desc(BEZ)))
# Erstellen einer Heatmap der Unfallverteilung nach Bezirken
bezUnfall %>%
ggplot(., aes()) +
geom_sf(data = shapes, aes(fill = bezUnfall$AnzahlUnfaelle)) +
scale_fill_gradient(low = "white", high = "black", limits = c(0, 2500)) +
labs(title = "Karte der Unfallverteilung nach Bezirken", fill = "Anzahl der Unfälle")
Es ist eine klare Häufung der Unfälle im Stadtzentrum zu erkennen. Die meisten Unfälle geschahen im Bezirk Mitte (2215), gefolgt von Charlottenburg-Wilmersdorf (1727) und Friedrichshain-Kreuzberg (1381). Die niedrigste Unfallzahl kann Marzahn-Hellersdorf mit nur 586 Unfällen vorweisen.
Die ca. 9500 Straßen Berlins wurden zu etwa 440 Straßenbereichen zusammengefasst. Dies umgeht auch die mehrfache Vergabe von Straßennamen in verschiedenen Bezirken, die sonst womöglich zu Problemen geführt hätte.
# Zusammenfassung der Variable STRASSE
unfall %>%
group_by(STRASSE) %>%
summarize(AnzahlUnfalle = n()) %>%
summary(unfall$STRASSE)
## STRASSE AnzahlUnfalle
## Length:441 Min. : 1.00
## Class :character 1st Qu.: 12.00
## Mode :character Median : 24.00
## Mean : 30.36
## 3rd Qu.: 41.00
## Max. :177.00
# Erstellen einer absteigenden Liste der Straßen mit den meisten Unfällen
unfall %>%
group_by(STRASSE) %>%
summarize(AnzahlUnfaelle = n()) %>%
arrange(desc(AnzahlUnfaelle)) %>%
print(n = 10)
## # A tibble: 441 x 2
## STRASSE AnzahlUnfaelle
## <chr> <int>
## 1 Alexanderplatzviertel 177
## 2 Samariterviertel 124
## 3 Reinickendorfer Straße 115
## 4 Manteuffelstraße 110
## 5 Reuterkiez 110
## 6 Rüdigerstraße 110
## 7 Breitscheidplatz 109
## 8 Oranienburger Straße 108
## 9 Humboldthain Nordwest 107
## 10 Charitéviertel 106
## # ... with 431 more rows
Da im Datensatz 441 verschiedene Straßenabschnitte bzw. Kieze vorkommen und die Analyse der Unfallhotspots unter Zuhilfenahme der geografischen Daten (XGCSWGS84 und YGCSWGS84) im weiteren Verlauf dieser Arbeit in Form einer Web-Applikation vorgenommen werden soll, wird an dieser Stelle auf eine ausführliche grafische Darstellung verzichtet. Die Top 3 Unfallorte sind das Alexanderplatzviertel in Mitte, das Samariterviertel in Friedrichshain und die Reinickendorfer Straße im Wedding in Mitte. Die Straßenabschnitte mit den niedrigsten Werten sind im Datensatz nicht aufgeführt, da nur Abschnitte genannt werden, auf denen sich mindestens ein Unfall ereignet hat.
Die Kategorien Unfalltyp und Unfallart müssen an dieser Stelle genauer definiert werden, da sie auf den ersten Blick dasselbe beschreiben. Der Unfalltyp bezieht sich auf die dem Unfall unmittelbar vorausgehende Situation, wohingegen die Unfallart beschreibt auf welche Art das Unglück geschah.
# Zusammenfassung der Variable UTYP1
unfall %>%
group_by(UTYP1) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## UTYP1 AnzahlUnfaelle
## Min. :1.0 Min. : 956
## 1st Qu.:2.5 1st Qu.:1108
## Median :4.0 Median :1235
## Mean :4.0 Mean :1913
## 3rd Qu.:5.5 3rd Qu.:2866
## Max. :7.0 Max. :3253
# Erstellen eines Barcharts
unfall %>%
ggplot(., aes(x = UTYP1)) +
scale_x_continuous(limits = c(0, 8), breaks = seq(1, 7, by = 1), labels = c("Fahrunfall", "Abbiegeunfall", "Einbiegen/Kreuzen-Unfall", "Überschreiten-Unfall", "Unfall durch ruhenden Verkehr", "Unfall im Längsverkehr", "sonstiger Unfall"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 3300), breaks = seq(0, 3300, by = 500)) +
geom_bar(width = 1, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Typ", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Am häufigsten geschehen Unfälle beim Abbiegen, Einbiegen/Kreuzen und im Längsverkehr. Unfälle durch das Überqueren der Fahrbahn, durch ruhenden Verkehr oder im normalen Fahrgeschehen sind hingegen verhältnismäßig selten.
# Zusammenfassung der Variable UART
unfall %>%
group_by(UART) %>%
summarize(AnzahlUnfaelle = n()) %>%
summary(AnzahlUnfaelle)
## UART AnzahlUnfaelle
## Min. :0.00 Min. : 16.0
## 1st Qu.:2.25 1st Qu.: 127.0
## Median :4.50 Median : 909.5
## Mean :4.50 Mean :1339.0
## 3rd Qu.:6.75 3rd Qu.:1820.2
## Max. :9.00 Max. :5030.0
# Erstellen eines Barcharts
unfall %>%
ggplot(., aes(x = UART)) +
scale_x_continuous(limits = c(-1, 10), breaks = seq(0, 9, by = 1), labels = c("Unfall anderer Art", "Zusammenstoß mit anfahrendem/ \n anhaltendem/ruhendem Fahrzeug", "Zusammenstoß mit vorausfahrendem/ \n wartendem Fahrzeug", "Zusammenstoß mit seitlich in gleicher \n Richtung fahrendem Fahrzeug", "Zusammenstoß mit \n entgegenkommendem Fahrzeug", "Zusammenstoß mit einbiegendem/ \n kreuzendem Fahrzeug", "Zusammenstoß zwischen Fahrzeug \n und Fußgänger", "Aufprall auf Fahrbahnhindernis", "Abkommen von Fahrbahn \n nach rechts", "Abkommen von Fahrbahn \n nach links"), oob = oob_keep) +
scale_y_continuous(limits = c(0, 5100), breaks = seq(0, 5000, by = 1000)) +
geom_bar(width = 1, color = "grey") +
theme_minimal() +
labs(title = "Unfallverteilung nach Art", y = "Anzahl Unfälle") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1), axis.title.x=element_blank())
Die meisten Unfälle (5030) sind solche mit einbiegendem oder kreuzendem Fahrzeug. Schon an dritter Stelle stehen Zusammenstöße zwischen Fahrzeug und Fußgängern. Unfälle, die durch Fahrbahnhindernisse oder das Abkommen von der Fahrbahn entstehen sind hingegen sehr selten.
Die hier grafisch dargestellten Sachverhalte decken sich mit den Ergebnissen des Berichts der Landespolizeidirektion (Landespolizeidirektion Stab 14 Verkehr, 2020a).
Aufgrund des ungleichen Kräfteverhältnisses ist davon auszugehen, dass Unfälle von Güterkraftfahrzeugen mit wenig geschützten Verkehrsteilnehmenden wie Fußgänger:innen und Radfahrer:innen besonders häufig zu Schwerverletzten und Toten führen. Dies geht auch aus verschiedenen Untersuchungen bereits hervor (Malczyk, 2019; Verlag für Rechtsjournalismus, 2021).
Zunächst wird der Anteil der Unfälle mit Todesfolge insgesamt mit dem Anteil der Unfälle mit Todesfolge, an denen Güterkraftfahrzeuge und Fußgänger:innen und/oder Radfahrer:innen beteiligt waren, verglichen.
# Erstellen eines Datensatzes für Unfälle mit GKFZ-Beteiligung und Fußgänger:innen- und/oder Radfahrer:innen-Beteiligung
GKFZRadFuss <- unfall %>%
filter(IstGkfz == 1) %>%
filter((IstRad == 1 & IstFuss == 1) | (IstRad == 0 & IstFuss == 1) | (IstRad == 1 & IstFuss == 0)) %>%
mutate(unfaelleInsgesamt = sum(IstGkfz)) %>%
group_by(UKATEGORIE, unfaelleInsgesamt) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/(unfaelleInsgesamt))
## `summarise()` has grouped output by 'UKATEGORIE'. You can override using the `.groups` argument.
# Errechnen der jeweiligen prozentualen Anteile der Unfallkategorie
alle <- unfall %>%
filter(!(IstGkfz == 1 & IstRad == 1)) %>%
filter(!(IstGkfz == 1 & IstFuss == 1)) %>%
group_by(UKATEGORIE) %>%
summarize(AnzahlUnfaelle = n()) %>%
mutate(Prozente = (AnzahlUnfaelle)/13241)
# Erstellen eines gemeinsamen Datensatzes
vergleich <- bind_rows(list("restliche Unfälle" = alle, "GKFZ mit Rad-/ \n Fußgängerbeteiligung" = GKFZRadFuss), .id = 'Unfälle')
# Erstellen eines gemeinsamen Barcharts
vergleich %>%
ggplot(., aes(x = UKATEGORIE, y = Prozente, fill = Unfälle)) +
theme_minimal() +
scale_y_continuous(limits = c(0,1), labels = percent) +
scale_x_continuous(limits = c(0,4), breaks = seq(1, 3, by =1), labels = c("Tote", "Schwerverletzte", "Leichtverletzte")) +
scale_fill_grey() +
geom_bar(stat = "identity", position = "dodge", width = 0.5) +
labs(title = "Vergleich Anteile Unfälle insgesamt vs mit GKFZ") +
theme(axis.title.x=element_blank())
Wie im obigen Diagramm deutlich wird, sind die Anteile der GKFZ-Unfälle mit schweren Folgen erhöht. Somit kann folgende Hypothese aufgestellt werden:
H1: Unfälle mit GKFZ-Beteiligung insbesondere in Kombination mit Radfahrer:innen und/oder Fußgänger:innen haben aufgrund des ungleichen Kräfteverhältnisses zwischen den beteiligten Parteien besonders häufig schwerwiegende Folgen.
Die dazugehörige Nullhypothese lautet:
H0: Unfälle von GKFZ und Fußgänger:innen/Radfahrer:innen enden nicht signifikant öfter tödlich oder mit Schwerverletzten als andere.
Um diesen Unterschied auf statistische Signifikanz zu testen, wird Pearson’s Chi-Quadrat-Test durchgeführt. Es wird so getestet, ob ein Zusammenhang zwischen Fahrzeugbeteiligung und Unfallschwere existiert.
chisq.test(alle$AnzahlUnfaelle, GKFZRadFuss$AnzahlUnfaelle)
## Warning in chisq.test(alle$AnzahlUnfaelle, GKFZRadFuss$AnzahlUnfaelle): Chi-
## squared approximation may be incorrect
##
## Pearson's Chi-squared test
##
## data: alle$AnzahlUnfaelle and GKFZRadFuss$AnzahlUnfaelle
## X-squared = 6, df = 4, p-value = 0.1991
Aufgrund der teilweise sehr niedrigen Werte wird eine Warnung ausgegeben. Es wird daher alternativ der Exakte Test nach Fisher angewandt.
fisher.test(alle$AnzahlUnfaelle, GKFZRadFuss$AnzahlUnfaelle)
##
## Fisher's Exact Test for Count Data
##
## data: alle$AnzahlUnfaelle and GKFZRadFuss$AnzahlUnfaelle
## p-value = 1
## alternative hypothesis: two.sided
Da beim Chi-Quadrat-Test nur ein p-Wert von 0.1991 und beim Fisher-Test sogar ein p-Wert von 1 ausgegeben wird, kann die Nullhypothese nicht abgelehnt werden. Auf Grundlage der vorliegenden Daten muss davon ausgegangen werden, dass der Ausgang von Unfällen von Güterkraftfahrzeugen und Fahrradfahrer:innen oder Fußgänger:innen sich nicht signifikant von denen anderer Verkehrsteilnehmer:innen unterscheidet.
Zur Identifikation von Unfallhotspots für Fahrradfahrer:innen und Fußgänger:innen soll zunächst jeweils eine Dichtekarte erstellt werden.
# Dichtekarte Radfahrer:innen
unfall %>%
filter(IstRad == 1) %>%
ggplot(., aes(x=XGCSWGS84, y=YGCSWGS84)) +
stat_density_2d(aes(fill = ..level..), geom = "polygon") +
labs(fill="Anzahl Unfälle", title = "Dichtekarte der Unfälle mit Fahrradbeteiligung") +
theme(axis.title.x = element_blank(), axis.title.y = element_blank())
# Dichtekarte Fußgänger:innen
unfall %>%
filter(IstFuss == 1) %>%
ggplot(., aes(x=XGCSWGS84, y=YGCSWGS84)) +
stat_density_2d(aes(fill = ..level..), geom = "polygon") +
labs(fill="Anzahl Unfälle", title = "Dichtekarte der Unfälle mit Fußgänger:innenbeteiligung") +
theme(axis.title.x = element_blank(), axis.title.y = element_blank())
Analog zu Lakes’ Ergebnissen (Lakes, 2017), ist eine klarer Schwerpunkt zur Stadtmitte hin zu erkennen, welcher bei den Fußgänger:innen etwas weiter gefasst ist als bei den Radfahrer:innen mit insgesamt niedrigeren Dichten.
unfall %>%
filter(IstRad == 1) %>%
group_by(STRASSE) %>%
summarize(AnzahlUnfaelle = n()) %>%
arrange(desc(AnzahlUnfaelle)) %>%
print(n = 37)
## # A tibble: 418 x 2
## STRASSE AnzahlUnfaelle
## <chr> <int>
## 1 Alexanderplatzviertel 81
## 2 Oranienburger Straße 68
## 3 Samariterviertel 61
## 4 Charitéviertel 56
## 5 Lausitzer Platz 55
## 6 Reuterkiez 53
## 7 Unter den Linden Nord 50
## 8 Wilhelmstraße 50
## 9 Pankow Süd 49
## 10 Rüdigerstraße 49
## 11 Schloßstraße 48
## 12 Breitscheidplatz 46
## 13 Andreasviertel 45
## 14 Urbanstraße 43
## 15 Viktoriapark 43
## 16 Boxhagener Platz 42
## 17 Leipziger Straße 42
## 18 Humboldthain Nordwest 41
## 19 Oranienplatz 41
## 20 Mehringplatz 40
## 21 Pankow Zentrum 40
## 22 Nördlicher Landwehrkanal 39
## 23 Arnimplatz 38
## 24 Graefekiez 36
## 25 Adlershof West 35
## 26 Falkplatz 35
## 27 Invalidenstraße 34
## 28 Kaiser-Wilhelm-Platz 34
## 29 Traveplatz 34
## 30 Wriezener Bahnhof/Entwicklungsgebiet 34
## 31 Gesundbrunnen 33
## 32 Heine-Viertel West 33
## 33 Karl-Marx-Allee 33
## 34 Niederschönhausen 33
## 35 Dammvorstadt 32
## 36 Friedenau 32
## 37 Moritzplatz 32
## # ... with 381 more rows
unfall %>%
filter(IstFuss == 1) %>%
group_by(STRASSE) %>%
summarize(AnzahlUnfaelle = n()) %>%
arrange(desc(AnzahlUnfaelle)) %>%
print(n = 20)
## # A tibble: 372 x 2
## STRASSE AnzahlUnfaelle
## <chr> <int>
## 1 Alexanderplatzviertel 36
## 2 Rixdorf 27
## 3 Samariterviertel 25
## 4 Breitscheidplatz 24
## 5 Carl-Schurz-Straße 21
## 6 Nollendorfplatz 21
## 7 Rüdigerstraße 21
## 8 Mehringplatz 19
## 9 Neu-Tempelhof 17
## 10 Buckow Mitte 16
## 11 Charitéviertel 16
## 12 Dammvorstadt 16
## 13 Reinickendorfer Straße 16
## 14 Schloßstraße 16
## 15 Oranienburger Straße 15
## 16 Borkumer Straße 14
## 17 Greifswalder Straße 14
## 18 Wriezener Bahnhof/Entwicklungsgebiet 14
## 19 Droysenstraße 13
## 20 Gesundbrunnen 13
## # ... with 352 more rows
Der bei Lakes (Lakes, 2017) noch für Fahrräder als mit am gefährlichsten gehandelte Moritzplatz liegt nun in der Rangliste nur noch auf Platz 37. Diese erfreuliche Veränderung ist auf eine Ummarkierung des Moritzplatzes im Frühjahr 2015 zurückzuführen, die die Unfälle mit Fahrradbeteiligung innerhalb eines Jahres um 37% reduzieren konnte (Pressestelle, 2016). Die Einflüsse dieser Veränderung spielen nur in einen kleinen Teil des Datensatzes von Lakes mit herein, da dieser Daten von 2011 bis 2015 verwendete.
Das Alexanderplatzviertel ist weiterhin aufgrund seiner zentralen Lage und den hohen Verkehrszahlen sowohl bei Fußgänger:innen als auch bei Radfahrer:innen für die meisten Unfälle verantwortlich. Auch die Oranienburger Straße, die Rüdigerstraße, das Samariterviertel und das Charitéviertel gehören noch immer zu den Unfallhotspots.
Die grafische Darstellung einer solchen Menge Daten in statischer Form stößt schnell an Grenzen. Eine zoombare, mit weiteren Angaben angereicherte Alternative ist daher sinnvoll.
Auf Basis der bisher erlangten Erkenntnisse soll im Folgenden eine interaktive Web-Applikation mit dem R-Package Shiny erstellt werden. Sie soll eine Karte von Berlin zeigen, auf welcher alle Unfälle des Datensatzes mit ihren Koordinaten verortet wurden. Darüber hinaus soll der Nutzer in der Lage sein, die Unfälle nach der Unfallschwere, den Unfallbeteiligten, dem Monat und dem Wochentag zu filtern. Beim Anklicken eines spezifischen Markers soll zudem angezeigt werden, welche Arten von Verkehrsteilnehmern (neben den gegebenenfalls Ausgewählten) an dem Unfall beteiligt waren.
Hierfür muss zunächst der Datensatz noch etwas bearbeitet werden. Es wird eine Zeile ausgeschlossen, in der die Koordinaten fehlerhaft waren und deswegen entfernt wurden, da sich dieser Unfall demnach nicht auf der Karte verorten lässt. Nachfolgend werden alle Koordinaten in numerische Werte umgewandelt. Dann wird der Popup-text erstellt, indem, wenn die Art Verkehrsteilnehmer beteiligt war, der Name in einer neuen Spalte gespeichert wird und danach diese Spalten in die neue Spalte “Popup” zusammengeführt werden. Für eine online aufrufbare Version der Applikation [https://cmhinrichs.shinyapps.io/CrashMapBerlin2019/) wird die bearbeitete Version des Datensatzes extern gespeichert.
# Bereinigung der Koordinaten, Erstellen des Popup-Textes
unfall <- unfall %>%
drop_na() %>%
mutate(Fahrrad = case_when(IstRad == 1 ~ "Fahrrad")) %>%
mutate(Auto = case_when(IstPKW == 1 ~ "PKW")) %>%
mutate(Fußgänger = case_when(IstFuss == 1 ~ "Fußgänger")) %>%
mutate(KRad = case_when(IstKrad == 1 ~ "KRad")) %>%
mutate(GKFZ = case_when(IstGkfz == 1 ~ "GKFZ")) %>%
mutate(Sonstige = case_when(IstSonstige == 1 ~ "Sonstige")) %>%
unite(Popup, Fahrrad:Sonstige, sep=", ", na.rm = TRUE)
# Zuordnen einer Markerfarbe zur jeweiligen Unfallkategorie
unfall <- unfall %>%
mutate(color = case_when(UKATEGORIE == 1 ~ "red",
UKATEGORIE == 2 ~ "orange",
UKATEGORIE == 3 ~ "green"))
# Speichern eines für die Applikation angepassten Datensets, welches seperat geladen werden kann, damit die App außerhalb dieses Dokuments funktionieren kann
write_csv(unfall, file = "unfall2.csv")
In der Sidebar finden sich die Filtermöglichkeiten. Da jeweils die Option “Alle” vorhanden sein sollte um den Datensatz auch in seiner Gänze darstellen zu können, wurde sich gegen einen Slider-Input für Monate und Wochentage entschieden. Alle vier Auswahlbereiche werden daher durch Radiobuttons dargestellt, wobei sich jeweils nur eine option gleichzeitig auswählen lässt. Der Hauptbereich wird von der interativen Karte eingenommen, die die Daten gefiltert nach Input darstellt. Es kann herein- und hinausgezoomt werden. Wenn der Nutzer mit dem Cursor über einem einzelnen Marker verharrt, wird der Name des Straßenabschnitts angezeigt. Wird auf einen Marker geklickt, erscheint ein Popup, welches anzeigt, welche Arten von Verkehrsteilnehmern an dem jeweiligen Unfall beteiligt waren.
Eine Einfärbung der Marker je nach Schwere des Unfall war vorgesehen, konnte jedoch aufgrund von Komplikationen leider nicht zufriedenstellend implementiert werden. Die entsprechende Stelle im Code wurde auskommentiert und durch die für alle Kategorien geltende Farbe Rot ersetzt.
library(readr)
library(shiny)
library(tidyverse)
library(leaflet)
library(emojifont)
unfall2 <- read_csv("unfall2.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
## .default = col_double(),
## STRASSE = col_character(),
## Popup = col_character(),
## color = col_character()
## )
## i Use `spec()` for the full column specifications.
load.fontawesome()
# Shiny App
ui <- fluidPage(
titlePanel("Unfälle mit Personenschaden in Berlin 2019"),
sidebarLayout(fluid = TRUE,
# Sidebar: Input
sidebarPanel(
# Input: Unfallfolgen
radioButtons("ausgang", "Unfallfolgen:",
choiceNames = c("Alle",
"Leichtverletzte",
"Schwerverletzte",
"Tote"),
choiceValues = c(0, 1, 2, 3)
),
# Input: Beteiligte
radioButtons("beteiligte", "Unfallbeteiligte:",
choices = c("Alle",
"Fahrrad",
"Fußgänger",
"PKW",
"GKFZ",
"KRad",
"Sonstige"),
),
# Input: Monat
radioButtons("monat", "Monat:",
choiceNames = c("Alle",
"Januar",
"Februar",
"März",
"April",
"Mai",
"Juni",
"Juli",
"August",
"September",
"Oktober",
"November",
"Dezember"),
choiceValues = c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
),
# Input: Wochentag
radioButtons("wochentag", "Wochentag:",
choiceNames = c("Alle",
"Sonntag",
"Montag",
"Dienstag",
"Mittwoch",
"Donnerstag",
"Freitag",
"Samstag"),
choiceValues = c(0, 1, 2, 3, 4, 5, 6, 7)
),
width = 3
),
# Main Panel: Output
mainPanel(
# Output: Interaktive Karte
leafletOutput("mapPlot", height = 800),
width = 9
)
)
)
server <- function(input, output, session) {
# Erzeugen eines gefilterten Datensets
filteredData <- reactive({
# Input: Unfallausgang
if (input$ausgang == 0) {
unfall2
}
else if(input$ausgang == 1) {
unfall2 <- filter(unfall2, UKATEGORIE == 3)
}
else if(input$ausgang == 2) {
unfall2 <- filter(unfall2, UKATEGORIE == 2)
}
else if(input$ausgang == 3) {
unfall2 <- filter(unfall2, UKATEGORIE == 1)
}
# Input: Unfallbeteiligte
# Anzeigen aller Unfälle
if (input$beteiligte == 0) {
unfall2
}
# Anzeigen Unfällte ausgewählter Unfallbeteiligter
else if (input$beteiligte == "Fahrrad") {
unfall2 <- filter(unfall2, IstRad == 1)
}
else if (input$beteiligte == "Fußgänger") {
unfall2 <- filter(unfall2, IstFuss == 1)
}
else if (input$beteiligte == "PKW") {
unfall2 <- filter(unfall2, IstPKW == 1)
}
else if (input$beteiligte == "GKFZ") {
unfall2 <- filter(unfall2, IstGkfz == 1)
}
else if (input$beteiligte == "KRad") {
unfall2 <- filter(unfall2, IstKrad == 1)
}
else if (input$beteiligte == "Sonstige") {
unfall2 <- filter(unfall2, IstSonstige == 1)
}
# Input: Monat
# Anzeigen aller Unfälle
if (input$monat == 0){
unfall2
}
# Anzeigen Unfälle ausgewählter Monate
else {
unfall2 <- filter(unfall2, UMONAT %in% input$monat)
}
# Input: Wochentag
# Anzeigen aller Unfälle
if (input$wochentag == 0){
unfall2
}
# Anzeigen Unfälle ausgewählter Wochentage
else {
unfall2 <- filter(unfall2, UWOCHENTAG %in% input$wochentag)
}
})
# Erzeugen der Grundkarte, noch ohne Marker
output$mapPlot <- renderLeaflet({
leaflet() %>%
addTiles() %>%
setView(unfall2, lng=13.404954, lat=52.520007, zoom = 10)
})
# Erzeugen der Icons
Farbe <- awesomeIcons(
icon = "ambulance",
iconColor = "black",
markerColor = "red", # eigentlich: unfall$color, um die Marker passend des Unfallausgangs einzufärben
library = "fa"
)
# Erzeugen der Marker zur Karte auf Basis des gefilterten Datensets
observe({
unfall2 <- filteredData()
leafletProxy("mapPlot", data = filteredData()) %>%
clearMarkerClusters() %>%
addAwesomeMarkers(lng = unfall2$XGCSWGS84, lat = unfall2$YGCSWGS84, icon = Farbe, label = unfall2$STRASSE, popup = unfall2$Popup, clusterOptions = markerClusterOptions(maxClusterRadius = 60))
})
}
# Launch der Shiny App ----
shinyApp(ui, server)
Diese Arbeit hatte zum einen das Ziel, den Zusammenhang zwischen Güterkraftfahrzeugbeteiligung und Unfallschwere zu untersuchen und zum anderen, Unfallhotspots für Radfahrer:innen und Fußgänger:innen zu identifizieren.
Bei der Untersuchung der Unfallschwere konnte die Nullhypothese auf Basis der vorliegenden Daten nicht abgelehnt werden. Wie u.a. bei Malczyk (2019) deutlich wird, ist jedoch ein Zusammenhang zwischen Unfällen mit Güterkraftfahrzeugen und sogenannten ungeschützten Verkehrsteilnehmer:innen und schwereren Unfallfolgen allgemeinhin anerkannt. Eine erneute Analyse mit einem mehrere Jahre umfassenden Datensatz sollte jedoch in Betracht gezogen werden, da eine größere Datenmenge möglicherweise eine bessere Grundlage bietet.
Die Erkenntnisse aus der Auswertung der Fahrrad- und Fußgänger:innen-Unfall-Hotspots stehen im Einklang mit den Ergebnissen von Lakes (Lakes, 2017), welcher die Unfallhotspots in den Jahren 2011 bis 2015 ausgewertet hat. Als große positive Entwicklung kann hierbei die Neugestaltung der Verkehrsführung des Moritzplatzes hervorgehoben werden. Die generelle Verteilung von Unfällen mit Fahrradfahrer:innen- oder Fußgänger:innenbeteiligung ist jedoch weitesgehend identisch geblieben. Dies wird auch noch einmal deutlich in der Shiny-Webapplikation, die die einzelnen Unfallorte grafisch darstellt.
Es ist anzumerken, dass diese Arbeit einigen Limitationen unterliegt. Aufgrund der starken Anonymisierung der Daten konnten viele interessante Aspekte nicht untersucht werden. Das Fehlen eines vollständigen Datums verhinderte eine genauere zeitliche Analyse, fehlende Angaben zum Unfallverusachenden und fehlende demografische Angaben vereitelten eine Zielgruppenanalyse besonders gefährdeter oder gefährdender Verkehrsteilnehmer:innen. Da der Datensatz nur ein einzelnes Jahr umfasst, lassen sich auf dieser Basis keine Voraussagen treffen, da es nicht möglich ist, einen Trend festzustellen. Des Weiteren sind in diesem Datensatz nur Unfälle mit Personenschaden aufgenommen, sodass insbesondere bei einer etwaigen Relationsanalyse Verfälschungen durch den Nichteinbezug der personenschadensfreien Unfälle auftreten können.
Die Frage, ob Unfälle von Güterkraftfahrzeugen mit ungeschützten Verkehrsteilnehmenden im Vergleich mit anderen Unfällen schwerere Folgen haben, muss auf Basis der vorliegenden Daten mit Nein beantwortet werden. Die Untersuchung sollte jedoch mit einem umfangreicheren, detaillierteren Datensatz wiederholt werden.
Es konnten Hotspots und Ballungsräume für Unfälle mit Fußgänger:innen und Fahrradfahrer:innen ausgemacht werden, die sich mit bisherigen Untersuchungen decken. Es wird eine generelle Konzentration zum Stadtzentrum hin deutlich, die bei Fahrrädern deutlicher ausgeprägt ist als bei Fußgänger:innen. Die Shiny-Applikation kann genutzt werden, um sich als Verkehrsteilnehmer:in über potenzielle Gefahrenstellen zu informieren. Dazu bietet es sich an, die Datensätze weiterer Jahre mit einzupflegen, was auch Zukunftsprognosen erlauben würde.