Explorative Datenanalyse mit R The R Bootcamp |
adapted from trueloveproperty.co.uk
In diesem Practical wirst du das Transformieren, Gruppieren und Analysieren von Daten mit dplyr
üben.
Am Ende des Practicals wirst du wissen wie man:
Öffne dein TheRBootcamp
R project. Es sollte bereits die Ordner 1_Data
und 2_Code
enthalten.
Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Wrangling II Practical” als Kommentare an den Anfang des Skripts.
## NAME
## DATUM
## Wrangling II Practical
Speichere das neue Skript unter dem Namen wrangling_II_practical.R
im 2_Code
Ordner.
Lade das tidyverse
.
# Pakete laden
library(tidyverse)
In diesem Abschnitt arbeitest du zunächst mit dem bevoelkerung.csv
Datensatz. Er enthält die Einwohnerzahlen verschiedener Schweizer Städte von 1930 bis 2011. Im Datensätze
Tab findest du eine Auflistung und eine kurze Beschreibung der im Datensatz enthaltenen Variablen.
read_csv()
Funktion in R ein und speichere ihn unter dem Namen bevoelkerung
.bevoelkerung <- read_csv(file = "1_Data/bevoelkerung.csv")
Mache dich mit dem Datensatz vertraut in dem du die ersten paar Zeilen (print()
) und die Variablennamen (names()
) anschaust.
Im Moment sind die Daten so angeordnet, dass jedes Jahr eine einzelne Spalte hat, d.h. es liegt ein Wide Format vor; wir wollen sie aber im Long format. Verwende pivot_longer()
um das Format zu wechseln. Verwende "st_wbev_2011"
und "st_wbev_2001"
für das cols
Argument und "jahr" für
das names_to
Argument und speichere das Resultat als neues Objekt bevoelkerung_long
ab.
# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
pivot_longer(cols = c("XX", "XX"), names_to = "XX")
Printe den neu erstellten Datensatz. Alles wie erwartet?
Nun bringe nicht nur die Jahre 2001 und 2011, sondern alle im Datensatz vorhandenen Jahre ins Long-Format. Schaue dir zunächst nochmals die Namen der Spalten mit names()
an.
Jede Jahr-Variable hat die gleiche Struktur, nämlich st_wbev_XXX
. Das bedeutet, dass du die sehr hilfreiche starts_with()
Funktion zur Variablenauswahl verwenden kannst. Benutze pivot_longer()
und starts_with()
um alle Jahr-Variablen zu transformieren.
# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
pivot_longer(cols = starts_with("XX"), names_to = "XX")
Printe nochmals bevoelkerung_long
.
Die Einwohnerzahl ist im neuen Datensatz mi dem Standardwert value
benannt. Führe nun nochmal die pivot_longer
Funktion aus, verwende nun aber auch noch das values_to
Argument um die neue Spalte einwohner
zu nennen.
# Transofmation vom Wide ins Long Format
bevoelkerung_long <- bevoelkerung %>%
pivot_longer(cols = starts_with("XX"), names_to = "XX", values_to = "XX")
Schaue dir das Resultat an. Alles in Ordnung?
Verwende nun das names_prefix
Argument um die Präfixe der Jahreszahlen ("st_wbev_"
) automatisch zu entfernen. Der character
-String der für names_prefix
bereit gestellt wird, wird vom Beginn der Variablennamen entfernt.
bevoelkerung_long
im Long Format bekommen hättest und sie ins Wide Format umwandeln müsstest. Verwende die pivot_wider()
Funktion und weise den Argumenten names_from
und values_from
die Spalten jahr
und einwohner
zu. Speichere das Ergebnis als bevoelkerung_wide
ab.# Transofmation vom Long ins Wide Format
bevoelkerung_wide <- bevoelkerung_long %>%
pivot_wider(names_from = XX, values_from = XX)
Vergleiche bevoelkerung_wide
mit bevoelkerung
. War die Rücktransformation erfolgreich? Was fehlt?
Um die zuvor entfernten Präfixe wieder bei den Variablennamen hinzuzufügen, kannst du das names_prefix
argument in pivot_wider()
verwenden. Benutze names_prefix
um "st_wbev_"
als Präfix wieder hinzuzufügen.
Im Rest des Practicals arbeitst du mit dem kc_house.csv
Datensatz. Er enthält Verkaufspreise von Häusern in King County, Washington. Aufgelistet sind Häuser, welche zwischen Mai 2014 und Mai 2015 verkauft wurden. Nebst den Verkaufspreisen enthält der Datensatz Spezifikationen der Häuser, z.B. die Anzahl Zimmer eines Hauses.
read_csv()
Funktion in R ein und speichere ihn unter dem Namen kc_house
.kc_house <- read_csv(file = "1_Data/kc_house.csv")
Printe den Datensatz und verwende summary()
und names()
um einen Eindruck über dessen Struktur zu erhalten.
Da es sich um einen US Datensatz handelt, sind die Flächenangaben in Quadratfuss angegeben. Wir als “rest of the world” sind es natürlich eher gewohnt in Quadratmeter zu denken. Kreiere dazu drei neue Variablen qm_wohnraum
, qm_dachstock
und qm_keller
, welche die jeweilige Raumgrösse in Quadratmeter angeben. Ein Quadratfuss entspricht 0.093 Quadratmeter.
kc_house <- kc_house %>%
mutate(XX = XX * 0.093,
XX = XX * 0.093,
XX = XX * 0.093)
Kreiere wiederum mit mutate()
eine neue Spalte qm_total
, welche die Summe aus qm_wohnraum
, qm_dachstock
und qm_keller
darstellt.
Füge eine neue Variable villa
hinzu (mit mutate()
), welche den Wert "ja"
annimmt, wenn qm_total
grösser als 750 ist und “nein”, wenn qm_total
kleiner oder gleich 750 ist.
summarise
Unter Verwendung der base-R TIBBLE$VARIABLE
-Notation, berechne den Mittelwert über alle Hauspreise mit mean()
.
Berechne wieder den Mittelwert aber verwende diesmal mean()
innerhalb der summarise()
Funktion. Besteht ein Unterschied in den Resultaten dieser und der vorherigen Aufgabe?
kc_house %>%
summarise(
XX = mean(XX)
)
Wie hoch ist der höchste Verkaufspreis? Verwende die max()
Funktion.
Sortiere mittels der arrange()
und der desc()
Funktion den Datensatz nach preis
in absteigender Reihenfolge und printe das Resultat. Richtig sortiert?
Wie gross ist der Anteil an Häuser, welche für mehr als 1 Million USD verkauft wurden?
kc_house %>%
summarise(million_prozent = mean(XX > XX))
stoecke
) und Badezimmer (badezimmer
) von Villen (villa
). Verwende erst filter()
um Villen auszuwählen und danach summarise()
.group_by
und summarise
group_by()
, summarise()
und n()
um zu berechnen wie viele Villen und wie viele normale Häuser (nicht-Villen) im Datensatz vorhanden sind.kc_house %>%
group_by(XX) %>%
summarise(N = XX)
Ergänze nun einen Eintrag in summarise()
, der den mittlere Verkaufspreis von Villen und normalen Häusern (nicht-Villen) berechnet?
Berechne nun auch noch das Minimum (min()
) und Maximum (min()
).
Haben Häuser, welche später gebaut wurden, eine grössere Wohnfläche? Gruppiere zur Beantwortung dieser Frage die Daten nach baujahr
und berechne dann die mittlere Wohnfläche (qm_wohnraum
).
postleitzahl
) 98001, 98109, 98117 und 98199. Stelle ihm einen neuen Datensatz theodorus
zusammen, welcher nur die Häuser dieser Gegend enthält. Tipp: der %in%
Operator testet ob Elemente des Vektors auf der rechten Seite im Vektor auf der linken Seite enthalten sind.theodorus <- kc_house %>%
filter(XX %in% c(XX, XX, XX, XX))
Welche Postleitzahl hat den höchsten Anteil Häuser, welche am Ufer gebaut sind (ufer
)? Printe nur diese Zeile des Datensatzes.
Welches Haus hat das schlechteste Preis-Wohnraumgrösse Verhältnis? Printe nur diese Zeile des Datensatzes.
Welche 10 Postleitzahlen haben im Schnitt die höchsten Hauspreise? Printe nur diese 10 Zeilen.
Kreiere den folgenden Datensatz genau wie er unten steht.
baujahr | N | preis_mean | preis_max | qm_wohnraum_mean |
---|---|---|---|---|
1990 | 320 | 563966 | 3640900 | 234 |
1991 | 224 | 630441 | 5300000 | 244 |
1992 | 198 | 548169 | 2480000 | 223 |
1993 | 202 | 556612 | 3120000 | 226 |
1994 | 249 | 486834 | 2880500 | 209 |
1995 | 169 | 577771 | 3200000 | 224 |
1996 | 195 | 639534 | 3100000 | 240 |
1997 | 177 | 606058 | 3800000 | 234 |
1998 | 239 | 594159 | 1960000 | 241 |
# Wrangling II mit dplyr and tidyr ---------------------------
library(tidyverse) # Lade tidyverse für dplyr
# Lese den basel Datensatz ein
basel <- read_csv("1_Data/basel.txt")
# Keine Gruppierungsvariable
bas <- basel %>%
summarise(
alter_m = mean(alter, na.rm = TRUE),
einkommen_median = median(einkommen, na.rm = TRUE),
N = n()
)
bas
# Eine Gruppierungsvariable
bas_ges <- basel %>%
group_by(geschlecht) %>%
summarise(
alter_m = mean(alter, na.rm = TRUE),
einkommen_median = median(einkommen, na.rm = TRUE),
N = n()
)
bas_ges
# Zwei Gruppierungsvariablen
bas_ges_bil <- basel %>%
group_by(geschlecht, bildung) %>%
summarise(
alter_m = mean(alter, na.rm = TRUE),
einkommen_median = median(einkommen, na.rm = TRUE),
N = n()
)
bas_ges_bil
# Gruppiere nach Geschlecht und Bildung und berechne den Mittelwert aller
# Variablen des Typs numeric
basel %>%
group_by(geschlecht, bildung) %>%
summarise_if(is.numeric, mean, na.rm = TRUE)
File | Zeilen | Spalten | Beschreibung |
---|---|---|---|
kc_house.csv | 21613 | 11 | Verkaufspreise von Häusern in King County zwischen Mai 2014 und Mai 2015. |
bevoelkerung.csv | 161 | 10 | Einwohnerzahlen Schweizer Städte von 1930 bis 2011. |
Erste 5 Zeilen und 5 Spalten von kc_house.csv
preis | schlafzimmer | badezimmer | qf_wohnraum | qf_parzelle |
---|---|---|---|---|
221900 | 3 | 1.00 | 1180 | 5650 |
538000 | 3 | 2.25 | 2570 | 7242 |
180000 | 2 | 1.00 | 770 | 10000 |
604000 | 4 | 3.00 | 1960 | 5000 |
510000 | 3 | 2.00 | 1680 | 8080 |
Variable | Beschreibung |
---|---|
preis | Preis in USD |
schlafzimmer | Anzahl Schlafzimmer |
badezimmer | Anzahl Badezimmer |
qf_wohnraum | Wohnraumfläche in Quadratfuss |
qf_parzelle | Parzellengrösse in Quadratfuss |
stoecke | Anzahl Stöcke |
ufer | Ist das Haus am Ufer gebaut (1) oder nicht (0) |
qf_dachstock | Dachstockfläche in Quadratfuss |
qf_keller | Kellerfläche in Quadratfuss |
baujahr | Baujahr |
postleitzahl | Postleitzahl |
Erste 5 Zeilen und 5 Spalten von bevoelkerung.csv
Stadtname | st_wbev_2011 | st_wbev_2001 | proz_ver-2001–2011 | bevdichte |
---|---|---|---|---|
Basel | 164516 | 164665 | -0.1 | 69 |
Bern | 125681 | 122211 | 2.8 | 24 |
Genève | 188234 | 175697 | 7.1 | 119 |
Lausanne | 129383 | 115272 | 12.2 | 31 |
Winterthur | 103075 | 89484 | 15.2 | 15 |
Variable | Beschreibung |
---|---|
Stadtname | Name der Stadt |
st_wbev_2011 | Wohnbevölkerung im Jahr 2011 |
st_wbev_2001 | Wohnbevölkerung im Jahr 2001 |
proz_ver-2001–2011 | Veränderung der Einwohnerzahl in Prozent zwischen 2001 und 2011 |
bevdichte | Bevölkerungsdichte |
st_wbev_1930 | Wohnbevölkerung im Jahr 1930 |
st_wbev_1970 | Wohnbevölkerung im Jahr 1970 |
st_wbev_1980 | Wohnbevölkerung im Jahr 1980 |
st_wbev_1990 | Wohnbevölkerung im Jahr 1990 |
st_wbev_2000 | Wohnbevölkerung im Jahr 2000 |
Paket | Installation | Beschreibung |
---|---|---|
tidyverse |
install.packages("tidyverse") |
Ein Metapaket für Data Science, einschliesslich dplyr , ggplot2 und weitere Pakete |
Wrangling
Funktion | Paket | Beschreibung |
---|---|---|
rename() |
dplyr |
Umbenennen von Spalten |
select() |
dplyr |
Auswahl von Spalten basierend auf Name oder Index |
filter() |
dplyr |
Auswahl von Zeilen basieren auf einem logischen Ausdruck |
arrange() |
dplyr |
Sortiere Zeilen |
mutate() |
dplyr |
Hinzufügen von Spalten |
case_when() |
dplyr |
Recodieren von Spalten |
group_by(), summarise() |
dplyr |
Gruppierung von Daten zur Berechnung deskriptiver Statistiken |
pivot_longer() |
tidyr |
Transormation vom Wide ins Long Format |
pivot_wider() |
tidyr |
Transormation vom Long ins Wide Format |