2 Musterlösung Analyse von Verkehrsmengen
Verwendete Pakete laden
```{r}
#| include: false
library(ggplot2)
library(tidyverse)
library(lubridate)
library(readxl)
library(kableExtra)
library(sf)
library(osmdata)
library(giscoR)
```
2.1 Aufgabe 1
Deutschlandkarte:
```{r}
d_de <- gisco_get_nuts(country = "Germany", nuts_level = 0, resolution = 03)
```
Autobahnnetz:
```{r}
if (!file.exists("data/d_bab.RData")) {
q <- opq(bbox = getbb("Deutschland", featuretype = "country"), timeout = 600)
d_bab_raw <- (add_osm_feature(q, key = "highway", value = "motorway") |> osmdata_sf())$osm_lines
d_bab <- d_bab_raw |>
filter(st_contains(d_de, d_bab_raw, sparse = FALSE)[1,]) |>
drop_na(ref) |>
group_by(ref) |>
summarise() |>
st_simplify(dTolerance = 100)
save(d_bab, d_bab_raw, file = "data/bab.RData")
} else {
load(file = "data/d_bab.RData")
}
```
Für das wählbare Jahr wurden hier die Zählstellendaten von 2022 verwendet:
```{r}
#| warning: false
d_Jawe <- read_csv2("data/Jawe2022.csv", locale = locale(encoding = 'iso-8859-1'))
```
```{r}
d_JaweNA <- d_Jawe |>
filter(Str_Kl == "A") |>
drop_na(DTV_Kfz_MobisSo_Q) |>
arrange(DTV_Kfz_MobisSo_Q)
```
Alle Elemente zusammen plotten:
```{r}
ggplot() +
geom_sf(data = d_de, fill = NA, size = 0.5) +
geom_sf(data = d_bab, size = 0.35, show.legend = FALSE) +
geom_point(data = d_JaweNA, mapping = aes(x = Koor_WGS84_E, y = Koor_WGS84_N, color = DTV_Kfz_MobisSo_Q), size = 1.5, na.rm = FALSE) +
scale_color_distiller(palette = 8 , direction = 1) +
theme_void()
```
2.2 Aufgabe 2
2.2.1 a) Tagesganglinien
2.2.1.1 Tagesganglinie einer Zählstelle
Daten einlesen und verarbeiten
```{r}
#| warning: false
ZST5116 <- read_csv2("data/zst5116_2022.csv", locale = locale(encoding = 'iso-8859-1'))
```
```{r}
#| warning: false
ZST5116_DTV <- ZST5116 |>
group_by(Stunde, Wotag) |>
summarise(avg_KFZ_R1 = mean(KFZ_R1),avg_KFZ_R2 = mean(KFZ_R2))
ZST5116_DTV$Wochentag <- factor(ZST5116_DTV$Wotag,
levels = c(1,2,3,4,5,6,7),
labels = c("Mo","Di","Mi","Do","Fr","Sa","So"))
```
Plotten
```{r}
#| warning: false
ggplot(data = ZST5116_DTV, aes(x = Stunde, y = avg_KFZ_R1 ,group = Wochentag ,color = factor(Wochentag), shape = Wochentag)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Tagesganglinien Zählstelle 5116 Richtung 1",
x = "Stunde",
y = "Verkehrsaufkommen Richtung 1 in Kfz/h",
color = "Wochentag",
shape = "Wochentag") +
scale_color_viridis_d() +
theme_light()
```
2.2.2 b) Tagesganglinien “Mittlerer Werktag”
Exemplarische Beispiele einer Zählstelle
```{r}
#| warning: false
ZST5116$Wotag <- factor(ZST5116$Wotag,
levels = c(1,2,3,4,5,6,7),
labels = c("Mo","Di","Mi","Do","Fr","Sa","So"))
data_werktag <- ZST5116 |>
filter(Fahrtzw == "w", Wotag %in% c("Di", "Mi", "Do"))
data_werktag_mean <- data_werktag |>
group_by(Stunde) |>
summarise(avg_KFZ_R1 = mean(KFZ_R1),avg_KFZ_R2 = mean(KFZ_R2))
data_werktag_mean$Anteil = (data_werktag_mean$avg_KFZ_R1/sum(data_werktag_mean$avg_KFZ_R1)*100)
```
Plot für Verkehrsaufkommen:
```{r}
ggplot(data = data_werktag_mean, aes(x = Stunde, y = avg_KFZ_R1, group = 1)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Verkehrsaufkommen mittlerer Werktage Zählstelle 5116 R1",
x = "Stunde",
y = "KFZ_R1 in KFZ pro Stunde") +
theme_light()
```
Plot für Anteile:
```{r}
ggplot(data = data_werktag_mean, aes(x = Stunde, y = Anteil, group = 1)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Verkehrsaufkommen mittlerer Werktage Zählstelle 5116 R1",
x = "Stunde",
y = "Prozentualer Anteil") +
theme_light()
```
Mehrere Daten einlesen und verarbeiten
```{r}
#| warning: false
ZST5113 <- read_csv2("data/zst5113_2022.csv", locale = locale(encoding = 'iso-8859-1'))
ZST5116 <- read_csv2("data/zst5116_2022.csv", locale = locale(encoding = 'iso-8859-1'))
ZST5125 <- read_csv2("data/zst5125_2022.csv", locale = locale(encoding = 'iso-8859-1'))
ZST5128 <- read_csv2("data/zst5128_2022.csv", locale = locale(encoding = 'iso-8859-1'))
```
```{r}
all_data <- bind_rows(list(ZST5113,ZST5116,ZST5125,ZST5128), .id = "Zaehlstelle")
all_data$Zaehlstelle <- factor(all_data$Zaehlstelle, levels = c("1", "2", "3", "4"), labels = c("Bochum", "Wanne-Eickel", "Waltrop-Brambauer", "Wenden-Dahl"))
all_data$Wotag <- factor(all_data$Wotag,
levels = c(1,2,3,4,5,6,7),
labels = c("Mo","Di","Mi","Do","Fr","Sa","So"))
```
```{r}
#Werktag
data_werktag_all <- all_data |>
filter(Fahrtzw == "w", Wotag %in% c("Di", "Mi", "Do"))
data_werktag_mean_all <- data_werktag_all |>
group_by(Stunde, Zaehlstelle) |>
summarise(avg_KFZ_R1 = mean(KFZ_R1),avg_KFZ_R2 = mean(KFZ_R2))
#Samstag
data_samstag_all <- all_data |>
filter(Fahrtzw == "w", Wotag == "Sa")
data_samstag_mean_all <- data_samstag_all |>
group_by(Stunde, Zaehlstelle) |>
summarise(avg_KFZ_R1 = mean(KFZ_R1),avg_KFZ_R2 = mean(KFZ_R2))
#Sonntag
data_sonntag_all <- all_data |>
filter(Wotag == "So")
data_sonntag_mean_all <- data_sonntag_all |>
group_by(Stunde, Zaehlstelle) |>
summarise(avg_KFZ_R1 = mean(KFZ_R1),avg_KFZ_R2 = mean(KFZ_R2))
```
Plotten
Plot für Werktage:
```{r}
ggplot(data = data_werktag_mean_all, aes(x = Stunde, y = avg_KFZ_R1, group = Zaehlstelle, color = Zaehlstelle)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Verkehrsaufkommen mittlerer Werktage aller Zählstellen",
x = "Stunde",
y = "KFZ_R1",
color = "Wotag") +
scale_color_viridis_d() +
theme_light()
```
Plot für Samstage:
```{r}
ggplot(data = data_samstag_mean_all, aes(x = Stunde, y = avg_KFZ_R1, group = Zaehlstelle, color = Zaehlstelle)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Verkehrsaufkommen an Samstagen aller Zählstellen",
x = "Stunde",
y = "KFZ_R1",
color = "Wotag") +
scale_color_viridis_d() +
theme_light()
```
Plot für Sonntage:
```{r}
ggplot(data = data_sonntag_mean_all, aes(x = Stunde, y = avg_KFZ_R1, group = Zaehlstelle, color = Zaehlstelle)) +
geom_point(size = 2) +
geom_line(linewidth = 1) +
labs(title = "Verkehrsaufkommen an Sonntagen aller Zählstellen",
x = "Stunde",
y = "KFZ_R1",
color = "Wotag") +
scale_color_viridis_d() +
theme_light()
```
2.2.3 c) 50. Stunde
Stunde auswählen:
```{r}
ZST5116_50 <- ZST5116 |>
arrange(desc(KFZ_R1)) |>
slice(50) |>
select(Datum,Wotag,Stunde,KFZ_R1)
```
Als Tabelle:
```{r}
kable(ZST5116_50)
```
Geeignete Darstellungsform:
```{r}
# Erstellen des Streudiagramms für den stündlichen DTV Zählstelle 5116 Richtung 1
ZST5116_top <- ZST5116 |>
arrange(desc(KFZ_R1))
ZST5116_top$Nummer = 1:nrow(ZST5116_top)
```
```{r}
ggplot(data = ZST5116_top[1:80, ], aes(x = Nummer,y = KFZ_R1, fill = Nummer == 50, width = .65)) +
geom_bar(stat = "identity") +
labs(title = "Verkehrsaufkommen pro Stunde Zählstelle 5116 Richtung 1",
x = "Sortierte Topstunde",
y = "Verkehrsaufkommen in Kfz/h",
legend = "Wochentag") +
scale_fill_manual(values = c("grey", "red"), guide = "none") +
geom_label(
data = filter(ZST5116_top,Nummer == 50),
mapping = aes(label = KFZ_R1),
nudge_y = 200, size = 4.5, alpha = 0.5
) +
theme_light()
```
2.2.4 d) Schwerverkehr
Daten einlesen und filtern:
```{r}
#| warning: false
list_of_files <- list.files(path = "data_jw",
recursive = TRUE,
pattern = "\\.csv$",
full.names = TRUE)
df <- readr::read_csv2(list_of_files, id = "Jahr", locale = locale(encoding = 'iso-8859-1'))
df$Jahr <- str_remove_all(df$Jahr, "[data_jw/Jawe]")
df$Jahr <- str_remove_all(df$Jahr, "[.csv]")
df$Jahr <- as.numeric(df$Jahr)
df_NA <- df |>
filter(DTV_Kfz_MobisSo_Q != 'NA' & DTV_SV_MobisSo_Q != 'NA')
df_schwer <- df_NA |>
group_by(Jahr) |>
summarise(SV = sum(DTV_SV_MobisSo_Q),Alle = sum(DTV_Kfz_MobisSo_Q),Anteil = (SV/Alle)*100)
```
Plotten:
```{r}
ggplot(data = df_schwer, aes(x = Jahr, y = Anteil)) +
geom_bar(stat='identity', fill = "blue") +
labs(x = "Jahr", y = "Anteil am gesamten Verkehrsaufkommen") +
ggtitle("Anteil des Schwerverkehrs von 2003 bis 2018 in 1000") +
scale_x_continuous(breaks=seq(2003,2018,1)) +
theme_light()
```