Reporting mit R The R Bootcamp |
adapted from airbnb.com
In diesem Practical machst du deine ersten Schritte mit R Markdown.
Am Ende des Practicals wirst du wissen wie man:
Öffne dein TheRBootcamp
R Projekt. Es sollte die Ordner 1_Data
, 2_Assets
, und 3_Markdown
enthalten.
Öffne ein neues RMarkdown Skript und wähle das Template “HTML” aus (siehe screenshot unten).
Trage als Titel Bericht Berlin 2018/2019
ein.
Speichere das neue Markdown Skript unter dem Namen markdown_practical.Rmd
im 3_Markdown
Ordner ab.
Lösche alles unterhalb des setup
Code chunks.
Lade die Pakete tidyverse
und lubridate
im setup
chunk.
# Lade Pakete
library(tidyverse)
library(lubridate)
airbnb
Datensatz mit read_csv()
ebenfalls im setup
chunk mit dem Code unten.# Lade airbnb Datensatz
airbnb <- read_csv("../1_Data/airbnb.csv")
2018
und 2019
aus den Daten auszuwählen und ein neues Objekt mit Namen airbnb_1819
zu erstellen.# Wähle Jahre 2018 und 2019 aus
airbnb_1819 <- airbnb %>%
filter(Erstellungsdatum > "2018-01-01",
Erstellungsdatum < "2019-12-31")
setup
chunk, setze eine Überschrift auf drittem level (###
) mit Titel Präambel
.### Präambel
Dieser Bericht analysiert Veränderungen in den Neueinstellungen und den Preisen von AirBnB Objekten in Berlin, Deutschland. Er wurde zum Zwecke der Übung auf Basis öffentlich verfügbarer Daten erstellt und repräsentiert einzig die Position der Autoren. Es besteht keine Beziehung zu AirBnB.
Knitte
das Dokument. Sieht alles in Ordnung aus?###
) mit Titel Neueinstellungen
und darunter eine Überschrift auf vierter Ebene (####
) mit dem Titel Entwicklung
.### Präambel
Seit 02.01.2018 wurden in Berlin 5007 Airbnb Wohnungen eingestellt. Von diesen Wohnungn weisen aktuell 73% Verfügbarkeiten von durchschnittlich 47.5 Tagen für die nächsten 3 Monate auf.
Einstellungen von AirBnB Wohnungen haben im letzten Jahr stark zugenommen. Im Jahr 2019 wurden insgesamt 3274 neue Wohnungen eingestellt wohingegend im Jahr 2018 nur 1733 Wohnungen eingestellt wurden. Dies entspricht einem Zuwachs von 89%.
r min(airbnb_1819$Erstellungsdatum)
strftime()
Funktion. Versuche mit dem folgenden inline Code das Datum in das richtige Format zu bringen.r strftime(min(airbnb_1819$Erstellungsdatum), "%d.%m.%Y")
Als nächstes ersetze die Anzahl der Wohnungen durch nrow(airbnb_1819)
. Nicht das r
am Anfang vergessen.
Ersetze nun Prozentsatz der Wohnungen durch round(mean(airbnb_1819$Verfügbarkeit_90Tage > 0) * 100)
und die durchschnittliche Verfügbarkeit durch round(mean(airbnb_1819$Verfügbarkeit_90Tage[airbnb_1819$Verfügbarkeit_90Tage>0]),1)
. Jetzt sollten alle Zahlen des ersten Absatz durch Code ersetzt worden sein. Überprüfe ob alles stimmt.
Im nächsten Absatz ersetze die ersten beiden Zahlen durch n_2019 <- sum(year(airbnb_1819$Erstellungsdatum) == 2019); n_2019
und n_2018 <- sum(year(airbnb_1819$Erstellungsdatum) == 2018); n_2018
. In diesen beiden Fällen siehst du, dass auch Zuweisungen in inline Code möglich sind.
Ersetze nun den wert des Zuwachses am Ende des Absatzes durch (round(n_2019/n_2018, 2) - 1)*100
, was, wie du siehst, auf die beiden zuvor im inline Code definierten Objekte zurückgreift. Knitte das Dokument und überprüfe, ob nun alle Zahlen einwandfrei wiedergegeben werden.
Zuletzt verwende ** um den gesamten zweiten Absatz fett zu setzen. Setze hierfür einmal die zwei Asteriske vor das erste und nach dem letzten Wort des Absatzes. Nun alles wie im Zieldokument?
{r}
und anschliessend nocheinmal drei Ticks in einer Zeile darunter. Wie in der Abbildung unten sollte sich der Hintergrund automatisch grau einfärben.
# Plotte Häufigkeiten
ggplot(airbnb_1819 %>%
group_by(Jahr = year(Erstellungsdatum),
Monat_tmp = month(Erstellungsdatum)) %>%
summarize(
Monat = as_factor(paste(first(Jahr), first(Monat_tmp), sep = '-')),
Wohnungen = n()),
aes(x = Monat, y = Wohnungen, fill = Jahr)) +
geom_bar(stat = 'identity', position = 'dodge') +
theme(legend.position = 'none',
axis.text.x = element_text(angle = 45, hjust = 1))
r
, echo = FALSE
. Danach knitte das Dokument nocheinmal.
Das Dokument sollte nun den Code in dem Chunk nicht mehr zeigen. Mache nun dieses Setting rückgängig, d.h., lösche echo = FALSE
, es gibt nämlich einen zweiten Weg diesen und alle zukünftigen Code Chunks zu verstecken. Knitte das Dokument nachdem du das echo = FALSE
entfernt hast.
Gehe nun zum Setup-Chunk ganz am Anfang es Dokuments (unter dem YAML head). Dort siehst du folgende Code Zeile knitr::opts_chunk$set(echo = TRUE)
, die aktuell impliziert, dass alle Code Chunks per default angezeigt werden. Setze nun hier echo = FALSE
und knitte das Dokument. Der Code Chunk sollte nun wieder versteckt sein. Behalte diese Einstellung auch für die weiteren Sessions bei.
Ergänze nun zusätzlich in den allgemeinen Chunk-Optionen message = FALSE
und warning = FALSE
, was vollständig verhindert, dass Messages oder Warnings im Bericht auftauchen. Die finalen Settings sollten nun so aussehen.
knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)
Setze unten im Script eine weitere Überschrift auf vierter Ebene (####
) mit dem Titel Stadtteile
.
Unter die Überschrift setze den folgenden Text.
Neueinstellungen fallen nach wie vor sehr unterschiedlich in den Bezirke aus. Die meisten Neueinstellungen im Jahr 2019 gab es in Friedrichshain-Kreuzberg, die wenigsten in Marzahn - Hellersdorf.
Die grössten Veränderungen gab es in Marzahn - Hellersdorf und Treptow - Köpenick. In Marzahn - Hellersdorf schrumpften die Neueinstellungen um -13.3%, in Treptow - Köpenick wuchsen die Neueinstellungen um 137.8%.
stadtteile
speichert.# Berechne Häufigkeiten über die Bezirke
stadtteile <- airbnb_1819 %>%
group_by(Stadtteil,
Jahr = year(Erstellungsdatum)) %>%
summarize(Wohnungen = n()) %>%
ungroup() %>%
arrange(desc(Jahr), Wohnungen) %>%
mutate(Stadtteil = as_factor(Stadtteil))
Erstze nun die die zwei im ersten Paragraph erwähnten Stadtteile durch stadtteile %>% filter(Jahr == 2019) %>% pull(Stadtteil) %>% last()
und stadtteile %>% filter(Jahr == 2019) %>% pull(Stadtteil) %>% first()
. Knitte das Dokument und schaue, ob die richtigen Namen eingesetzt wurden.
Kreiere einen neuen Chunk zwischen den beiden Absatz mit dem folgenden Code, welcher einige Objekte erstellt, die die inline Ergänzungen im darauf folgenden Absatz erleichtern werden.
# Veränderung über die Stadtteile
veränderung = stadtteile %>%
group_by(Stadtteil) %>%
summarize(veränderung = (100 * (Wohnungen[Jahr == 2019]/Wohnungen[Jahr == 2018] - 1)) %>% round(1))
# Geringsten Veränderung
min_veränderung = veränderung %>%
slice(which.min(veränderung)) %>%
pull(veränderung)
# Stadteil mit der geringsten Veränderung
min_stadtteil = veränderung %>%
slice(which.min(veränderung)) %>%
pull(Stadtteil)
# Grösste Veränderung
max_veränderung = veränderung %>%
slice(which.max(veränderung)) %>%
pull(veränderung)
# Stadteil mit der grössten Veränderung
max_stadtteil = veränderung %>%
slice(which.max(veränderung)) %>%
pull(Stadtteil)
Ersetze die ersten beiden Stadtteil-Nennungen in beiden Sätzen durch min_stadtteil
und max_stadtteil
und knitte das Dokument. Passt alles?
Ersetze nun schrumpften
und wuchsen
durch ifelse(min_veränderung > 0, "wuchsen", "schrumpften")
und ifelse(max_veränderung > 0, "wuchsen", "schrumpften")
. Die beiden Codestücke können dann selbst entscheiden, ob die Veränderung eine positive oder negative ist und das jeweils richtige Wort einsetzen.
Abschliessend ersetze die beiden numerischen Werte durch min_veränderung
und max_veränderung
. Knitte das Dokument und überprüfe, ob alles in Ordnung ist.
# Plotte Häufigkeieten der Stadtteile
ggplot(stadtteile,
aes(y = Stadtteil, x = Wohnungen, group = Jahr, fill = Jahr)) +
geom_bar(stat = 'identity', position = 'dodge') +
theme(legend.position = 'none') + labs(y='')
Der airbnb.csv Datensatz enthält Zahlen zu 9868 Berliner Airbnbs
Variable | Beschreibung |
---|---|
Preis | Preis pro Nacht |
Erstellungsdatum | Eröffnungsdatum des Airbnbs |
Unterkunftsart | Appartement, Loft, House, etc. |
Schlafplätze | Anzahl Schlafplätze |
Schlafzimmer | Anzahl Schlafzimmer |
Badezimmer | Anzahl Badezimmer |
Reinigungsgebühr | Reinigungsgebühr |
Verfügbarkeit_90Tage | |
Viertel | In welchem Viertel befindet sich das Airbnb |
Stadtteil | In welchem Stadtteil befindet sich das Airbnb |
Breitengrad | Breitengrad |
Längengrad | Längengrad |
Host_id | Host id |
Host_seit | Erfahrung des Hosts |
Host_antwortzeit | Host Antwortzeit |
Host_antwortrate | Host Antwortrate |
Host_superhost | Superhost Ja/Nein |
Host_anzahl | Anzahl Gäste |
Rating_gesamt | Gesamtrating |
Rating_genauigkeit | Genauigkeitsrating |
Rating_sauberkeit | Sauberkeitsrating |
Rating_checkin | Checkinrating |
Rating_kommunikation | Kommunikationsrating |
Rating_lage | Lagerating |
Rating_wertigkeit | Wertigkeitsrating |
Küche | Küche vorhanden TRUE/FALSE |
Wifi | WLAN vorhanden TRUE/FALSE |
TV | TV vorhanden TRUE/FALSE |
Kaffeemaschine | Kaffeemaschine vorhanden TRUE/FALSE |
Geschirrspüler | Geschirrspüler vorhanden TRUE/FALSE |
Terrasse_Balkon | Terrasse/Balkon vorhanden TRUE/FALSE |
Badewanne | Badewanne vorhanden TRUE/FALSE |
Check_in_24h | 24h Check-In vorhanden TRUE/FALSE |
Paket | Installation |
---|---|
tidyverse |
install.packages("tidyverse") |
lubridate |
install.packages("lubridate") |
Funktion | Paket | Beschreibung |
---|---|---|
strftime |
lubridate |
Formartierung von Daten |