Reporting mit R The R Bootcamp |
from airbnb.ca
In diesem Practical wirst du nun die Grafiken in deinem Dokument gestalten und Bausteine, Text und Tabellen, einfügen.
Öffne dein TheRBootcamp
R Projekt. Es sollte die Ordner 1_Data
, 2_Assets
, und 3_Markdown
enthalten.
Lade die airbnb_level_one.Rmd
Datei, das fertige Produkt am Ende des ersten Markdown Practicals.
Zusätzlich lade die Pakete knitr
, kableExtra
sjPlot
im setup
chunk.
Ergänze eine Fussnote nach dem Texteil ‘verfügbarer Daten’ ^[Daten wurde heruntergeladen von [insideairbnb.com](http://insideairbnb.com/get-the-data.html)]
Knitte
das Dokument. Siehst du nun eine Fussnote am Ende des Dokuments?
Nun geht es darum die Darstellung der Grafiken zu verbessern und Bildunterschriften einzufügen. Setze zunächst das Seitenverhältnis der ersten Grafik auf .5 (fig.asp = .5
). Knitte das Dokument. Die Grafik sollte nun schmaler sein.
Füge fig.cap = cap
in den Optionen des Chunks der ersten Grafik ein. Dies wird dir ermöglichen gleich die Bildunterschrift im Chunk zu definieren.
Am Ende des Grafik Chunks ergänze nun cap = Abbildung 1. Neueinstellungen pro Monat.
. Knitte das Dokument. Du solltest nun eine Bildunterschrift sehen.
Weitere zur nächsten Grafik. Setze das Seitenverhältnis für die zweite Grafik auf .5.
Füge nun zunächst fig.cap = cap
in den Optionen des Chunks der zweiten Grafik ein und dann innerhalb des Chunks cap = Abbildung 2. Neueinstellungen pro Bezirk.
.
Knitte
das Dokument. Sieht alles in Ordnung aus?
Für einen neuen Abschnitt füge Preis
als Level 3 Header ein.
Setze darunter den folgenden Text.
Der durchschnittliche Preis der Neueinstellungen beträgt 80.8 €. Im Vergleich zum Vorjahr sind die Preise der Neueinstellungen um 1.7% gestiegen.
airbnb_1819
direkt im Text ein. Siehe unten.round(mean(airbnb_1819 %>% pull(Preis)),1)
m <- mean(airbnb_1819 %>% filter(year(Erstellungsdatum) == 2019) %>% pull(Preis))/ mean(airbnb_1819 %>% filter(year(Erstellungsdatum) == 2018) %>% pull(Preis)) ; round(m, 3) * 100 - 100
Knitte
das Dokument. Sieht alles in Ordnung aus?Erstelle eine neue Überschrift, Einfluss Ausstattung
, als Level 4 Header.
Berechne als ersten Schritt in einem eigenem Code Chunk wie sich die verschiedenen Ausstattungsmerkmale (Küche, Wifi, …) auf die durchschnittlichen Preise auswirken.
# Vektor mit Ausstattungsmerkmalen
ausstattung_var = c('Küche','Wifi','TV','Kaffeemaschine',
'Geschirrspüler','Terrasse_Balkon',
'Check_in_24h')
# Bestimme Preise als Funktion der Ausstattungsmerkmale
ausstattung <- airbnb_1819 %>%
select(all_of(ausstattung_var), Preis) %>%
pivot_longer(-Preis,
names_to = 'Ausstattung',
values_to = 'Ausstattung_vorhanden') %>%
group_by(Ausstattung) %>%
summarize(Nicht_vorhanden = mean(Preis[!Ausstattung_vorhanden]),
Vorhanden = mean(Preis[Ausstattung_vorhanden]),
Differenz = Vorhanden - Nicht_vorhanden,
Prozent_vorhanden = mean(Ausstattung_vorhanden) * 100) %>%
arrange(desc(Differenz))
Das Austattungsmerkmal mit dem grössten Unterschied im Preis ist Check_in_24h (72.9), das Austattungsmerkmal mit dem kleinsten Unterschied im Preis ist Küche (-88.9).
ausstattung %>% pull(Ausstattung) %>% first()
ausstattung %>% pull(Differenz) %>% first() %>% round(1)
ausstattung %>% pull(Ausstattung) %>% last()
ausstattung %>% pull(Differenz) %>% last() %>% round(1)
Der stark negative Effekt der Küche überrascht, er könnte jedoch durch die Art der Unterkunft moderiert werden, gegeben dass auch Hotels im Angebot enthalten sind.
Knitte
das Dokument. Sieht alles in Ordnung aus?ausstattung
. Verwende dafür die kable()
Funktion. Siehe unten.# Plotte Tabelle mit Austattungsmerkmalen
ausstattung %>% kable(format = 'html')
Beschränke die Anzahl Nachkommastellen mit digits = 2
auf zwei.
Füge eine Tabellenüberschrift mit caption = 'Tabelle 1. Austattung und Einfluss auf den Preis'
ein.
Passe die Namen der Spalten an, inklusive neuer Zeilenumbrüche mit <br>
: col.names = c('', 'Preis<br>Nicht-vorh.', 'Preis<br>vorh.','Differenz','Prozent<br>vorh.')
Knitte
das Dokument. Du wirst bemerken, dass die Spaltenbeschriftung nicht korrekt übersetzt wird. Verwende als weiteres Argument escape = FALSE
um dieses Problem zu korrigieren.
Lege die Ausrichtung der Zellen mit align = "lcccc"
fest. Jeder Buchstabe legt die Ausrichtung für eine Spalte fest. l
bedeutet left und c
center.
Nun vergrössere die Breite der Spalten in dem du column_spec()
hinter der kable()
Funktion verwendest.
airbnb_18_19 %>% kable(...) %>% column_spec(c(2,3,4,5), width = "1.2in")
kable()
Funktion folgenden Code ein und verbinde die beiden Teile mit einer Pipe %>%
.airbnb_1819 %>%
mutate_if(is.numeric, function(x) {
cell_spec(round(x,1), bold = T,
font_size = spec_font_size(x, begin=10, end=16))}) %>%
kable(...) %>% column_spec(...)
Knitte
das Dokument. Sieht alles in Ordnung aus?Erstelle eine neue Überschrift, Regressionsmodell
, als Level 4 Header
Verwende den Code unten um eine Regression in der Preis
durch verschiedenen Ausstattungsmerkmalen und den Status Hotel Ja/Nein vorhergesagt wird.
# Reduzierter Vektor mit Ausstattungsmerkmalen
ausstattung_var <- c('Küche','TV','Terrasse_Balkon','Check_in_24h')
# Bereit den Datensatz für die Regression vor
ausstattung <- airbnb_1819 %>%
mutate(Hotel = Unterkunftsart %in% c('Boutique hotel', 'Hotel')) %>%
select(Preis, Hotel, all_of(ausstattung_var))
# Rechne Regression des Preises auf Austattungsmerkmale und Hotel
ausstattung_mod <- ausstattung%>%
lm(formula = Preis ~ .)
# Bestimme Anteil Hotels in 2018 und 2019
hotel <- airbnb_1819 %>%
group_by(year(Erstellungsdatum)) %>%
summarize(Anteil = mean(Unterkunftsart %in% c('Boutique hotel', 'Hotel')))
Die Regression legt nahe, dass Küche, TV und Terrasse oder Balkon den grössten Einfluss auf den Preis in denletztene beiden Jahren hatten.
Der Einfluss der Küche ist gegenüber dem Unterschied in Tabelle 1 gesunken, jedoch nach wie vor signifikant.
Überraschenderweise ist der Effekt eines 24h Check-ins, welcher deskriptiv am grössten ausfiel, nicht signifikant. Dies ist ebenfalls auf den Zusammen zur Unterkunftsart zurückzuführen
Es besteht ein substantieller Unterschied im Preis zwischen Unterkunftsarten. Hotels haben eine um 437.3€ höheren Preis als Unterkünfte die keine Hotels sind.
Der Anteil von Hotels ist von 1.1% im Jahre 2018 auf 1.4% im Jahre 2019 gestiegen. Es liegt nahe, dass der Anstieg im Anteil der Hotels, den Anstieg der Objektpreise verursacht.
coefficients(ausstattung_mod)['HotelTRUE'] %>% round(1)
Hebe zum Abschluss den 2. (“Überraschenderweise …”) und 4. Absatz (“Der Anteil …”) fett hervor.
Knitte
das Dokument. Sieht alles in Ordnung aus?
tab_model()
Funktion an.# Tabelle mit Ergebnissen der Regression
tab_model(ausstattung_mod)
Ersetze die Namen der Koeffizienten in der Tabelle mit dem Argument pred.labels = c('Achsenabschnitt', names(ausstattung)[-1])
Füge einen neuen Tabellentitel mit dem Argument title = 'Table 2. Regression des Preises auf die Ausstattung.'
ein.
Knitte
das Dokument. Sieht alles in Ordnung aus?
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("tidyverse") |
knitr |
install.packages("knitr") |
sjPlot |
install.packages("sjPlot") |
kabelExtra |
install.packages("kableExtra") |
Funktion | Paket | Beschreibung |
---|---|---|
kable() |
knitr |
Tibble (Data frame) als Tabelle |
cell_spec() , column_spec |
kableExtra |
Formatiere Zellen und Spalten in kable -Tabelle |
tab_model() |
sjPlot |
Tabelle mit den Ergebnissen statistischer Modelle |
coefficients() |
stats |
Zeiege Koeffizienten einer Regression |
pivot_longer() |
tidyr |
Extrahieren eines Vektors |