diff --git a/Auswertung-OpenBikeSensor.Rmd b/Auswertung-OpenBikeSensor.Rmd new file mode 100644 index 0000000..29e01cd --- /dev/null +++ b/Auswertung-OpenBikeSensor.Rmd @@ -0,0 +1,294 @@ +--- +title: "Auswertung OpenBikeSensor" +author: "Walter Hupfeld, ADFC Hamm" +date: "`r Sys.Date()`" +output: word_document +--- + +```{r setup, include=FALSE} +knitr::opts_chunk$set(echo = FALSE, warning=FALSE) +library(xtable) +library(knitr) +``` + +```{r} +data <- read.csv2("obs/data-1726399614864.csv",sep=",") +df=data.frame(data) +df$distance_overtaker <- as.numeric(df$distance_overtaker) +df <- subset(df,df$distance_overtaker>0.30) + +# Differnzierung nach außerorts und innerorts +overtaker <- df$distance_overtaker +overtaker_urban <- df$distance_overtaker[df$zone=="urban"] +overtaker_rural <- df$distance_overtaker[df$zone=="rural"] + +summe <- length(overtaker) +mean <- round(mean(overtaker,na.rm=TRUE),2) + + +summe_urban <- length(overtaker_urban) +mean_urban <- round(mean(overtaker_urban,na.rm=TRUE),2) +under_urban <- length(overtaker_urban[overtaker_urban<1.5]) + +summe_rural <- length(overtaker_rural) +mean_rural <- round(mean(overtaker_rural,na.rm=TRUE),2) +under_rural <- length(overtaker_rural[overtaker_rural<2]) + +werte <- seq(0, 3, by = 0.1) +farben15 <- ifelse(werte < 1.5, "darkred", "darkgreen") +farben20 <- ifelse(werte < 2, "darkred", "darkgreen") +``` + +Ausgewertet wurden insgesamt `r summe` Überholvorgänge mit einem Mittelwert von `r mean`. Innerhalb geschlossener Ortschaften wurden `r summe_urban` Überholvorgänge erfasst (Mittelwert `r mean_urban`). Außerhalb geschlossener Ortschaften waren es `r summe_rural` bei einem Mittelwert von `r mean_rural`. + +Der Datenexport erfolgte direkt aus der Datenbank des OBS-Portals [obs.adfc-hamm.de](https://obs.adfc-hamm.de) mit folgendem SQL-Statement: + +``` +select o.id,o.way_id,o.distance_overtaker,distance_stationary, + o.direction_reversed,o.speed,o.time,r.name,r.zone +from overtaking_event o, road r +where o.way_id=r.way_id; +``` + +### Übersichtstabelle + +| Bereich | Gesamt | Mittelwert | Unterschreitungen | Anteil | +|---------------|---------------|:-------------:|:-------------:|:-------------:| +| Gesamt | `r summe` | `r mean` | | | +| Innerorts | `r summe_urban` | `r mean_urban` | `r under_urban` | `r round(under_urban/summe_urban*100,0)` % | +| Außerorts | `r summe_rural` | `r mean_rural` | `r under_rural` | `r round(under_rural/summe_rural*100,0)` % | + +### Verteilung der Überholvorgänge innerhalb geschlossener Ortschaften + +```{r} +hist(overtaker_urban, breaks = werte, + col = farben15, border = "grey", + main = "Verteilung der Überholvorgänge innerorts", + xlab = "Überholabstand in m", ylab = "Anzahl") +``` + +### Verteilung der Überholvorgänge außerhalb geschlossener Ortschaften + +```{r} +hist(overtaker_rural, breaks = werte, + col = farben20, border = "grey", + main = "Verteilung der Überholvorgänge außerorts", + xlab = "Überholabstand in m", ylab = "Anzahl") +``` + +### Verteilung insgesamt + +```{r} +hist15 <- hist(overtaker_urban, breaks = werte, plot=FALSE) +hist20 <- hist(overtaker_rural, breaks = werte, plot=FALSE) +counts <- rbind(hist15$counts, hist20$counts) + +barplot(counts, beside = TRUE, col = c("violet", "blue"), + legend.text = c("Abstände innerorts", "Abstände außerorts"), + args.legend = list(x = "topright"), + main = "Überholabstände von Fahrrädern", + xlab = "Abstand in m", ylab = "Anzahl", names.arg = hist15$mids) +``` + + + +## Ausgewählte Straßen + +### Lange Straße +Die Lange Straße ist Bestandteil der geplanten Radhauptroute nach Herringen. Zwischen +Wilhelmstraße und Radbodstraße gilt hier Tempo 30, ab Radbodstraße bis Bonifatiusweg Tempo 50. + +```{r Strasse} +strasse <- "Lange Strasse" +df_strasse = subset(df,df$name=="Lange Straße") +distance_street <- as.numeric(df_strasse$distance_overtaker,na.rm=TRUE) +speed_street <- as.numeric(df_strasse$speed,na.rm=TRUE) +speed_street <- speed_street * 3.6 + +# Histogramm +hist(distance_street, breaks = werte, + col = farben15, border = "grey", + main = "Verteilung der Überholvorgänge außerorts", + xlab = "Überholabstand in m", ylab = "Anzahl") + +# Erstelle ein Streudiagramm +plot(speed_street, distance_street, + xlab = "Geschwindigkeit (km/h)", + ylab = "Abstand (m)", + main = "Punktwolke: Geschwindigkeit vs. Abstand", + pch = 19, # Punkteform (z.B. 19 = gefüllte Kreise) + col = "blue") # Farbe der Punkte +``` + +### Römerstraße + +```{r Strasse2} +strasse <- "Römerstraße" +df_strasse = subset(df,df$name==strasse) +distance_street <- as.numeric(df_strasse$distance_overtaker,na.rm=TRUE) +speed_street <- as.numeric(df_strasse$speed,na.rm=TRUE) +speed_street <- speed_street * 3.6 + +# Histogramm +hist(distance_street, breaks = werte, + col = farben15, border = "grey", + main = "Verteilung der Überholvorgänge außerorts", + xlab = "Überholabstand in m", ylab = "Anzahl") + +# Erstelle ein Streudiagramm +plot(speed_street, distance_street, + xlab = "Geschwindigkeit (km/h)", + ylab = "Abstand (m)", + main = "Punktwolke: Geschwindigkeit vs. Abstand", + pch = 19, # Punkteform (z.B. 19 = gefüllte Kreise) + col = "blue") # Farbe der Punkte +``` + + + +## Gesamtübersicht einzelner Straßen + + +In den folgenden Tabellen werden ausschließlich Straßen mit mehr als 20 Überholvorgängen dargestellt. Es wird differenziert nach Straßen innerorts und außerhalb geschlossener Ortschaften. + +### Straßen innerorts + +```{r tabelle_urban} +df_urban <- subset(df,df$zone =="urban" & df$name != "NULL" & df$name != "Gewerbepark") + +anzahl <- aggregate(distance_overtaker ~ name, data = df_urban, FUN = function(x) length(na.omit(x))) +names(anzahl)[2] <- "Anzahl" + +# Mittelwert pro Straßenname berechnen +mittelwert <- aggregate(distance_overtaker ~ name, data = df_urban, FUN = function(x) round(mean(na.omit(x)),2)) +names(mittelwert)[2] <- "Mittelwert" + +# Anteil der Überholvorgänge unter 1,5 m +anzahl_eng <- aggregate(distance_overtaker ~ name, data = df_urban, + FUN = function(x) sum(x < 1.5)) +names(anzahl_eng)[2] <- "Anzahl < 1.5m" + +anteil_eng <- aggregate(distance_overtaker ~ name, data = df_urban, + FUN = function(x) paste(round(sum(x < 1.5) / length(x)*100,0)," %")) +names(anteil_eng)[2] <- "Anteil < 1.5m" + + +# Tabellen zusammenführen +str_tabelle_local <- merge(anzahl, mittelwert, by = "name") +str_tabelle_local <- merge(str_tabelle_local,anzahl_eng, by= "name") +str_tabelle_local <- merge(str_tabelle_local,anteil_eng, by= "name") + +str_tabelle_local_20 <- str_tabelle_local[str_tabelle_local$Anzahl>20,] + +# Ergebnis speichern +names(str_tabelle_local_20)[1] <- "Name" +knitr::kable(str_tabelle_local_20, row.names=FALSE, align = c('l', 'r', 'r', 'r','r')) + +``` + +### Boxplots für einzelne Straßen + +```{r boxplots_urban} + +strassen20 <- str_tabelle_local_20$Name #Straßen mit mehr als 10 Messwerten +strassen20 <- strassen20[strassen20!="NULL"] +strassen <- strassen20 + +# Anzahl der Straßen pro Grafik festlegen +strassen_pro_plot <- 4 + +# Boxplots in Gruppen zu je 5 Straßen erstellen +for (i in seq(1, length(strassen), by = strassen_pro_plot)) { + + # Straßen für den aktuellen Plot auswählen + aktuelle_strassen <- strassen[i:min(i + strassen_pro_plot - 1, length(strassen))] + + # Daten filtern, die zu den ausgewählten Straßen gehören + df_subset <- df[df$name %in% aktuelle_strassen, ] + + + boxplot(distance_overtaker ~ name, + data = df_subset, + col = "lightblue", + main = paste("Überholabstände"), + xlab = "Straßennamen", + ylab = "Abstand", + cex.lab=1, + cex.axis = 0.8) +} +``` + +### Straßen außerhalb geschlossener Ortschaften + +```{r tabelle_rural} +df_rural <- subset(df,df$zone =="rural") + +anzahl <- aggregate(distance_overtaker ~ name, data = df_rural, FUN = function(x) length(na.omit(x))) +names(anzahl)[2] <- "Anzahl" + +# Mittelwert pro Straßenname berechnen +mittelwert <- aggregate(distance_overtaker ~ name, data = df_rural, FUN = function(x) round(mean(na.omit(x)),2)) +names(mittelwert)[2] <- "Mittelwert" + +# Anteil der Überholvorgänge unter 2 m +anzahl_eng <- aggregate(distance_overtaker ~ name, data = df_rural, + FUN = function(x) sum(x < 2)) +names(anzahl_eng)[2] <- "Anzahl < 2m" + +anteil_eng <- aggregate(distance_overtaker ~ name, data = df_rural, + FUN = function(x) paste(round(sum(x < 2) / length(x)*100,0)," %")) +names(anteil_eng)[2] <- "Anteil < 2m" + + +# Beide Tabellen zusammenführen +str_tabelle <- merge(anzahl, mittelwert, by = "name") +str_tabelle <- merge(str_tabelle,anzahl_eng, by= "name") +str_tabelle <- merge(str_tabelle,anteil_eng, by= "name") + +str_tabelle_20 <- str_tabelle[str_tabelle$Anzahl>20,] + +# Ergebnis speichern +names(str_tabelle_20)[1] <- "Name" +knitr::kable(str_tabelle_20, row.names=FALSE,align = c('l', 'r', 'r', 'r','r')) +``` + +### Boxplots für einzelne Straßen + +```{r boxplots} + +strassen20 <- str_tabelle_20$Name #Straßen mit mehr als 20 Messwerten +strassen20 <- strassen20[strassen20!="NULL"] +strassen <- strassen20 + +# Anzahl der Straßen pro Grafik festlegen +strassen_pro_plot <- 5 + +# Boxplots in Gruppen zu je 5 Straßen erstellen +for (i in seq(1, length(strassen), by = strassen_pro_plot)) { + + # Straßen für den aktuellen Plot auswählen + aktuelle_strassen <- strassen[i:min(i + strassen_pro_plot - 1, length(strassen))] + + # Daten filtern, die zu den ausgewählten Straßen gehören + df_subset <- df[df$name %in% aktuelle_strassen, ] + + boxplot(distance_overtaker ~ name, + data = df_subset, + col = "lightblue", + main = paste("Überholabstände"), + xlab = "Straßennamen", + ylab = "Abstand", + cex.lab=1, + cex.axis = 1) +} +``` + +## Alle Straßen +Die folgende Tabelle zeigt alle Straßen innerorts mit mehr als 5 Messungen. + +```{r table_all} +str_tabelle_local <- str_tabelle_local[str_tabelle_local$Anzahl>5,] +str_tabelle_local <- str_tabelle_local[rev(order(str_tabelle_local$'Anteil < 1.5m')), ] +names(str_tabelle_20)[1] <- "Straße" +knitr::kable(str_tabelle_local, row.names=FALSE, align = c('l', 'r', 'r', 'r','r')) +``` diff --git a/Auswertung-OpenBikeSensor.html b/Auswertung-OpenBikeSensor.html new file mode 100644 index 0000000..66d3f2c --- /dev/null +++ b/Auswertung-OpenBikeSensor.html @@ -0,0 +1,1106 @@ + + + + +
+ + + + + + + + + + +Ausgewertet wurden insgesamt 3790 Überholvorgänge mit einem +Mittelwert von 1.67. Innerhalb geschlossener Ortschaften wurden 2253 +Überholvorgänge erfasst (Mittelwert 1.53). Außerhalb geschlossener +Ortschaften waren es 1537 bei einem Mittelwert von 1.86.
+Der Datenexport erfolgte direkt aus der Datenbank des OBS-Portals obs.adfc-hamm.de mit folgendem +SQL-Statement:
+select o.id,o.way_id,o.distance_overtaker,distance_stationary,
+ o.direction_reversed,o.speed,o.time,r.name,r.zone
+from overtaking_event o, road r
+where o.way_id=r.way_id;
+Bereich | +Gesamt | +Mittelwert | +Unterschreitungen | +Anteil | +
---|---|---|---|---|
Gesamt | +3790 | +1.67 | ++ | + |
Innerorts | +2253 | +1.53 | +1062 | +47 % | +
Außerorts | +1537 | +1.86 | +1015 | +66 % | +
Die Lange Straße ist Bestandteil der geplanten Radhauptroute nach +Herringen. Zwischen Wilhelmstraße und Radbodstraße gilt hier Tempo 30, +ab Radbodstraße bis Bonifatiusweg Tempo 50.
+ +In den folgenden Tabellen werden ausschließlich Straßen mit mehr als +20 Überholvorgängen dargestellt. Es wird differenziert nach Straßen +innerorts und außerhalb geschlossener Ortschaften.
+Name | +Anzahl | +Mittelwert | +Anzahl < 1.5m | +Anteil < 1.5m | +
---|---|---|---|---|
Ahornallee | +183 | +1.86 | +30 | +16 % | +
An der Lohschule | +90 | +1.47 | +45 | +50 % | +
Banningstraße | +113 | +1.61 | +43 | +38 % | +
Birkenallee | +27 | +2.08 | +0 | +0 % | +
Caldenhofer Weg | +22 | +1.77 | +3 | +14 % | +
Dortmunder Straße | +25 | +1.62 | +7 | +28 % | +
Geranienstraße | +22 | +1.74 | +4 | +18 % | +
Grönebergstraße | +43 | +1.49 | +22 | +51 % | +
Kleine Werlstraße | +27 | +1.58 | +11 | +41 % | +
Lange Straße | +54 | +1.48 | +35 | +65 % | +
Marker Allee | +80 | +1.39 | +56 | +70 % | +
Marker Dorfstraße | +27 | +1.39 | +16 | +59 % | +
Nordenstiftsweg | +28 | +1.52 | +13 | +46 % | +
Oberonstraße | +98 | +1.65 | +36 | +37 % | +
Östingstraße | +55 | +1.70 | +21 | +38 % | +
Osttünner Weg | +110 | +1.15 | +88 | +80 % | +
Rathenaustraße | +423 | +1.57 | +182 | +43 % | +
Rhynerberg | +21 | +1.36 | +13 | +62 % | +
Robert-Koch-Straße | +27 | +1.52 | +11 | +41 % | +
Römerstraße | +29 | +1.27 | +17 | +59 % | +
Soester Straße | +156 | +1.54 | +69 | +44 % | +
Werler Straße | +34 | +1.63 | +13 | +38 % | +
Name | +Anzahl | +Mittelwert | +Anzahl < 2m | +Anteil < 2m | +
---|---|---|---|---|
Ahornallee | +386 | +1.86 | +265 | +69 % | +
An der Lohschule | +73 | +1.81 | +49 | +67 % | +
Birkenallee | +418 | +1.85 | +289 | +69 % | +
Kamener Straße | +614 | +1.90 | +376 | +61 % | +
Die folgende Tabelle zeigt alle Straßen innerorts mit mehr als 5 +Messungen.
+name | +Anzahl | +Mittelwert | +Anzahl < 1.5m | +Anteil < 1.5m | +
---|---|---|---|---|
Heessener Straße | +9 | +1.29 | +8 | +89 % | +
Alleestraße | +7 | +1.18 | +6 | +86 % | +
Südfeldweg | +6 | +1.32 | +5 | +83 % | +
Osttünner Weg | +110 | +1.15 | +88 | +80 % | +
Am Hämmschen | +14 | +1.11 | +11 | +79 % | +
Am Hagenkamp | +14 | +1.44 | +11 | +79 % | +
Schwarzer Weg | +8 | +1.44 | +6 | +75 % | +
Brehmstraße | +8 | +1.12 | +6 | +75 % | +
Ostenwall | +7 | +1.29 | +5 | +71 % | +
Marker Allee | +80 | +1.39 | +56 | +70 % | +
Lohauserholzstraße | +10 | +1.41 | +7 | +70 % | +
Eichstedtstraße | +10 | +1.35 | +7 | +70 % | +
Heßlerstraße | +6 | +1.42 | +4 | +67 % | +
Lange Straße | +54 | +1.48 | +35 | +65 % | +
Rhynerberg | +21 | +1.36 | +13 | +62 % | +
Eschenallee | +8 | +1.34 | +5 | +62 % | +
Reginenstraße | +20 | +1.42 | +12 | +60 % | +
Römerstraße | +29 | +1.27 | +17 | +59 % | +
Marker Dorfstraße | +27 | +1.39 | +16 | +59 % | +
Alte Salzstraße | +7 | +1.46 | +4 | +57 % | +
Dambergstraße | +13 | +1.54 | +7 | +54 % | +
Grönebergstraße | +43 | +1.49 | +22 | +51 % | +
Ostendorfstraße | +18 | +1.67 | +9 | +50 % | +
Gallberger Weg | +8 | +1.44 | +4 | +50 % | +
An der Lohschule | +90 | +1.47 | +45 | +50 % | +
Nordenstiftsweg | +28 | +1.52 | +13 | +46 % | +
Soester Straße | +156 | +1.54 | +69 | +44 % | +
Rathenaustraße | +423 | +1.57 | +182 | +43 % | +
Josef-Wiefels-Straße | +7 | +1.55 | +3 | +43 % | +
Bismarckstraße | +14 | +1.46 | +6 | +43 % | +
Robert-Koch-Straße | +27 | +1.52 | +11 | +41 % | +
Kleine Werlstraße | +27 | +1.58 | +11 | +41 % | +
Werler Straße | +34 | +1.63 | +13 | +38 % | +
Von-Thünen-Straße | +8 | +1.60 | +3 | +38 % | +
Östingstraße | +55 | +1.70 | +21 | +38 % | +
Banningstraße | +113 | +1.61 | +43 | +38 % | +
Oberonstraße | +98 | +1.65 | +36 | +37 % | +
Goethestraße | +20 | +1.69 | +6 | +30 % | +
Fangstraße | +7 | +1.62 | +2 | +29 % | +
Amtsstraße | +7 | +1.66 | +2 | +29 % | +
Dortmunder Straße | +25 | +1.62 | +7 | +28 % | +
Berkenstraße | +18 | +1.55 | +5 | +28 % | +
Theodor-Heuss-Platz | +11 | +1.78 | +3 | +27 % | +
Unterer Heideweg | +13 | +1.55 | +3 | +23 % | +
Geranienstraße | +22 | +1.74 | +4 | +18 % | +
Ahornallee | +183 | +1.86 | +30 | +16 % | +
Weetfelder Straße | +7 | +1.69 | +1 | +14 % | +
Caldenhofer Weg | +22 | +1.77 | +3 | +14 % | +
Im Süderholt | +8 | +1.69 | +1 | +12 % | +
Friedrichstraße | +9 | +0.96 | +9 | +100 % | +
Birkenallee | +27 | +2.08 | +0 | +0 % | +
An der Windmühle | +7 | +2.02 | +0 | +0 % | +