library(tidyverse)
library(ggmap)
library(scales)
library(gganimate) # für Animation
library(gifski) # für Animation
library(ggthemes) # noch mehr fancy "themes"
“Die Hanse- und Universitätsstadt Rostock sammelt und pflegt eine Vielzahl von Daten. Diese Daten bergen enormes Potenzial für Innovationen, sofern sie als offene Daten für jedermann frei zugänglich gemacht werden..”
Die Seite findet Ihr hier: https://www.opendata-hro.de/
Stand heute (31.08.2021) gibt es auf der Seite 231 Datensätze. Für die erste Aufgabe werden wir uns die Daten der Radmonitore anschauen. Dieser Datensatz umfasst:
Mit folgendem code lesen wir die Daten ein. Die Daten sind als csv-Dateien gespeichert und wir mit read_csv()
eingelesen. csv steht für comma-separated-values und ist eines von vielen Dateiformaten.
standorte <- read_csv("radmonitore_standorte.csv")
daten <- read_csv("radmonitore_daten.csv")
Ihr könnt im Fenster Environment auch auf die Datensätze klicken. Oder man kann den Variablennamen hinschreiben. Dann werden von der großen Tabelle auch nur die ersten Zeilen angezeigt.
standorte
## # A tibble: 11 x 6
## latitude longitude uuid id bezeichnung website
## <dbl> <dbl> <chr> <dbl> <chr> <chr>
## 1 54.1 12.1 290d71fc-9a7f-11e5-948a-005056~ 1.00e8 Hundertmän~ https:~
## 2 54.1 12.2 290b9422-9a7f-11e5-9489-005056~ 1.00e8 Mühlendamm~ https:~
## 3 54.2 12.2 cc171afa-9150-11e7-99be-005056~ 1.00e8 Hinrichsha~ https:~
## 4 54.1 12.1 7b921cb8-8f93-4afe-aae1-8dc24c~ 1.00e8 Uni-Campus https:~
## 5 54.1 12.1 291079c4-9a7f-11e5-948c-005056~ 1.00e8 Lange Stra~ https:~
## 6 54.2 12.2 291473d0-9a7f-11e5-9490-005056~ 1.00e8 Graal-Müri~ https:~
## 7 54.2 12.2 1735a76e-9150-11e7-99bd-005056~ 1.00e8 Markgrafen~ https:~
## 8 54.2 12.1 2913fbe4-9a7f-11e5-948f-005056~ 1.00e8 Warnemünde~ https:~
## 9 54.1 12.1 29120528-9a7f-11e5-948d-005056~ 1.00e8 Hamburger ~ https:~
## 10 54.1 12.1 290ef568-9a7f-11e5-948b-005056~ 1.00e8 Am Strande~ https:~
## 11 54.1 12.1 29137f48-9a7f-11e5-948e-005056~ 1.00e8 Hamburger ~ https:~
daten
## # A tibble: 2,483,017 x 3
## standort_id zeitpunkt summe
## <dbl> <dttm> <dbl>
## 1 100005392 2013-10-31 23:00:00 0
## 2 100005392 2013-10-31 23:15:00 0
## 3 100005392 2013-10-31 23:30:00 1
## 4 100005392 2013-10-31 23:45:00 0
## 5 100005392 2013-11-01 00:00:00 0
## 6 100005392 2013-11-01 00:15:00 0
## 7 100005392 2013-11-01 00:30:00 1
## 8 100005392 2013-11-01 00:45:00 0
## 9 100005392 2013-11-01 01:00:00 0
## 10 100005392 2013-11-01 01:15:00 0
## # ... with 2,483,007 more rows
Die Tabelle standorte
hat 6 Spalten:
latitude
, longitude
, uuid
, id
, bezeichnung
, website
Die Tabelle daten
hat 3 Spalten:
standort_id
, zeitpunkt
, summe
zeitpunkt
wurde als Datentyp Uhrzeit erkannt und zwar als date plus time <dttm>
Wir nehmen ja wegen der Meta-Daten-Tabelle an, dass es Daten für 11 Stationen gibt. Ist das auch wirklich so?
Hier muss man das Datenformat der Spalte standort_id
zunächst umwandeln. Jetzt ist es ein sogenanntes
Eine einzelne Spalte einer Tabelle kann man mit dem Dollar-Zeichen “anfassen”: daten$standort_id
.
levels(as.factor(daten$standort_id))
## [1] "100005392" "100005393" "100005394" "100005395" "100011605" "100017341"
## [7] "100034887" "100037010" "100037011" "100037012" "100056900"
Es ist nicht so leicht, geografischen Karten zu erstellen. Hier ist eine schnelle Möglichkeit mit dem Paket ggmap
. Mit der Funktion get_stamenmap()
werden Kacheln von Open Street Map heruntergeladen.
min(standorte$longitude)
## [1] 12.05833
max(standorte$longitude)
## [1] 12.18213
min(standorte$latitude)
## [1] 54.07838
max(standorte$latitude)
## [1] 54.19106
karte <- get_stamenmap(c(left = min(standorte$longitude)-0.05,
bottom = min(standorte$latitude)-0.05,
right = max(standorte$longitude)+0.05,
top = max(standorte$latitude)+0.05),
source="stamen", maptype = "terrain")
ggmap(karte)+
geom_point(data = standorte,
aes(x = longitude, y = latitude),
color="orange", size = 2) +
labs(x = "Längengrad", y = "Breitengrad")
#ggsave("Karte-Radmonitore.png")
standorte
könnt Ihr ablesen, dass die Messstation an der Langen Str. die Stationsnummer 100005394 hat.lange_str <- daten %>%
filter(standort_id == 100005394) %>%
mutate(tag= as.Date(format(zeitpunkt,"%Y-%m-%d"))) %>%
group_by(tag) %>%
summarise(tagessumme=sum(summe))
head(lange_str)
## # A tibble: 6 x 2
## tag tagessumme
## <date> <dbl>
## 1 2012-12-31 2
## 2 2013-01-01 59
## 3 2013-01-02 395
## 4 2013-01-03 407
## 5 2013-01-04 314
## 6 2013-01-05 295
tail(lange_str)
## # A tibble: 6 x 2
## tag tagessumme
## <date> <dbl>
## 1 2021-08-24 1174
## 2 2021-08-25 923
## 3 2021-08-26 858
## 4 2021-08-27 898
## 5 2021-08-28 345
## 6 2021-08-29 216
Hier erstellen wir ein Diagramm der Zeitreihe mit einer Linie und Punkten.
ggplot(data = lange_str,
aes(x = tag, y = tagessumme, group = 1)) +
geom_line(colour = "cornflowerblue", size = 0.3) +
geom_point(colour = "orange", size = 1) +
scale_x_date(date_labels = "%Y", breaks = breaks_width("year")) +
labs(title = "Radverkehr in der Langen Str. in Rostock", x = "", y = "Tagessumme") +
theme_bw()
#ggsave("Lange-Str.png", width = 25, height = 10, units = "cm")
Hier erstellen wir eine Animation über Monate.
# Datentabelle erstellen
lange_str_anim <- daten %>%
filter(standort_id == 100005394) %>%
mutate(tag= as.Date(format(zeitpunkt,"%Y-%m-%d"))) %>%
group_by(tag) %>%
summarise(tagessumme=sum(summe)) %>%
mutate(wochentag = weekdays(tag)) %>%
mutate(wochentag = factor(wochentag, levels = c("Montag",
"Dienstag",
"Mittwoch",
"Donnerstag",
"Freitag",
"Samstag",
"Sonntag"))) %>%
mutate(monat = as.integer(format(tag,"%m")))
# Diagramm mit ggplot machen und in "dia" abspeichern
dia <- lange_str_anim %>%
ggplot(aes(x=wochentag, y=tagessumme, col = wochentag)) +
geom_boxplot() +
geom_jitter(width = 0.3, alpha = 0.5, size=2) +
theme_solarized() +
labs(x="",
y = "Tagessumme",
title = "Fahrradfaher:innen in der Langen Straße in Rostock, 2013-2021") +
scale_color_brewer(palette = "Set2", guide = "none") # keine Legende
# Animation über die Zeit "year"
dia.animation <- dia +
transition_time(monat) +
labs(subtitle = "Monat: {frame_time}")
#shadow_wake(wake_length = 0.05)
# fps-frames per second
animate(dia.animation, height = 500, width = 800, fps = 30, duration = 10,
end_pause = 60, res = 100)
# speichern als gif
#anim_save("radmonitor-animation.gif")
Hier eine kleine Vokabelliste: