R-Bibliotheken laden

library(tidyverse)
library(ggmap)
library(scales)
library(gganimate)  # für Animation
library(gifski)     # für Animation
library(ggthemes)   # noch mehr fancy "themes"

Willkommen bei OpenData.HRO!

“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:

Daten einlesen

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")

Daten anschauen

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

Struktur der Datentabellen

Die Tabelle standorte hat 6 Spalten:

Die Tabelle daten hat 3 Spalten:

Sind alle 11 Standorte enthalten?

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 , das für DOUBLE steht. Das ist eine Gleitkommazahl. Wenn man diese Spalte in einen Faktor umwandelt, kann man sich die Faktorstufen anzeigen lassen.

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"

Karte der Standorte

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")

Daten der Langen Str.

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

Zeitreihendiagramm der Langen Str.

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")

Animation erstellen

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")

Coden ist englisch

Hier eine kleine Vokabelliste: