Zunächst müssen mehre Bibliotheken geladen werden. Insbesondere benötigen wir
# Daten
library(gapminder)
# Datenüberblick
library(skimr)
# Datenaufbereitung - und visualisierung
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3 v purrr 0.3.4
## v tibble 3.0.4 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
Tidyverse ist tatsächlich eine ganze Suite von Bibliotheken. Wir nutzen im Folgenden dplyr (Datenaufbereitung) und ggplot2 (Datenvisualisierung). Beim Laden der Bibliotheken gibt es Warnmeldungen, die uns anzeigen, dass manche Befehle auch von anderen Bibliotheken (die automatisch mit R geladen werden) genutzt werden. Die Reihenfolge, in der Bibliotheken geladen werden, ist wichtig. Befehle aus später geladenen Bibliotheken “maskieren” gleichnamige Befehle aus anderen Bibliotheken, ausser wir rufen sie mit Angabe des Namens der Bibliothek auf, die wir gerade nutzen wollen. Wenn wir etwa den Befehl filter() aus der Bibliothek stats nutzen wollen, anstelle des gleichamigen Befehls aus der Bibliothek dplyr, dann müssten wir ihn als stats::filter() aufrufen.
Um uns einen Überblick über die Daten zu verschaffen, lassen wir uns zunächst mit glimpse() die Struktur des Datensatzes anzeigen.
glimpse(gapminder)
## Rows: 1,704
## Columns: 6
## $ country <fct> Afghanistan, Afghanistan, Afghanistan, Afghanistan, Afgha...
## $ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asi...
## $ year <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 199...
## $ lifeExp <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 4...
## $ pop <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372,...
## $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.113...
Der Datensatz besteht aus 1704 Beobachtungen und 6 Variablen. Die Variablen haben unterschiedliche Datentypen:
glimpse() zeigt auch schon einige Beipiele an. Wenn wir mehr Beispiele sehen wollen, dann können wir uns die ersten Zeilen mit head() anzeigen lassen.
head(gapminder)
## # A tibble: 6 x 6
## country continent year lifeExp pop gdpPercap
## <fct> <fct> <int> <dbl> <int> <dbl>
## 1 Afghanistan Asia 1952 28.8 8425333 779.
## 2 Afghanistan Asia 1957 30.3 9240934 821.
## 3 Afghanistan Asia 1962 32.0 10267083 853.
## 4 Afghanistan Asia 1967 34.0 11537966 836.
## 5 Afghanistan Asia 1972 36.1 13079460 740.
## 6 Afghanistan Asia 1977 38.4 14880372 786.
Die Daten bilden mehrere Zeitreihen. Für jedes Land gibt es für mehrere Jahre Daten zur Lebenswertung, Bevölkerung und Wirtschaftsleistung. Wie viele unterschiedliche Länder sind im Datensatz enthalten? Die Antwort gibt n_distinct(). Mit dem Dollarsymbol verweisen wir auf eine bestimmte Spalte in einem bestimmten Datensatz (Datensatz$Spalte), auf die wir den Befehl anwenden wollen (hier also die Spalte country im Datensatz gapminder).
n_distinct(gapminder$country)
## [1] 142
Welchen Zeitraum deckt der Datensatz ab? Wir können uns den niedrigsten (min()) und höchsten (max()) Wert für die Variable year ausgeben lassen.
min(gapminder$year)
## [1] 1952
max(gapminder$year)
## [1] 2007
Insgesamt sind in dem Datensatz Informationen für die Jahre von 1952 bis 2007 enthalten.
Einen guten Üerblick über den kompletten Datensatz verschafft uns skim(). Neben der Anzahl der Beobachtungen und Variablen liefert sie auch einen Überblick darüber, ob es fehlende Variablen im Datensatz gibt. Außerdem gibt es Informationen zu den einzelnen Variablen. Für kategorische Variablen zeigt die Übersicht die Anzahl der unterschiedlichen Ausprägungen an und die Anzahl für die häufigsten Kategorien. Bei numerischen Variablen stellt sie die Verteilung der einzelnen Variablen mit Hilfe der Fünf-Punkte-Zusammenfassung und einem Histogramm dar.
skim(gapminder)
Name | gapminder |
Number of rows | 1704 |
Number of columns | 6 |
_______________________ | |
Column type frequency: | |
factor | 2 |
numeric | 4 |
________________________ | |
Group variables | None |
Variable type: factor
skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
---|---|---|---|---|---|
country | 0 | 1 | FALSE | 142 | Afg: 12, Alb: 12, Alg: 12, Ang: 12 |
continent | 0 | 1 | FALSE | 5 | Afr: 624, Asi: 396, Eur: 360, Ame: 300 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
year | 0 | 1 | 1979.50 | 17.27 | 1952.00 | 1965.75 | 1979.50 | 1993.25 | 2007.0 | ▇▅▅▅▇ |
lifeExp | 0 | 1 | 59.47 | 12.92 | 23.60 | 48.20 | 60.71 | 70.85 | 82.6 | ▁▆▇▇▇ |
pop | 0 | 1 | 29601212.32 | 106157896.74 | 60011.00 | 2793664.00 | 7023595.50 | 19585221.75 | 1318683096.0 | ▇▁▁▁▁ |
gdpPercap | 0 | 1 | 7215.33 | 9857.45 | 241.17 | 1202.06 | 3531.85 | 9325.46 | 113523.1 | ▇▁▁▁▁ |
Wir sehen etwa, dass es 0 unterschiedliche Kontinente (continents) gibt. Die geringste Lebenserwartung (lifeExp) für ein Land (über alle Jahre hinweg) beträgt 23.599. Die durchschnittliche (arithmetisches Mittel) Lebenserwartung (lifeExp) in dem gesamten Datensatz liegt bei 59.4744394. Der Median beträgt 60.7125. Das Jahr (year), für die die Angaben gelten, ist im Datensatz als numerische Variable enthalten. Von dem Histogramm können wir ablesen, dass es etwa gleich viele Beobachtungen (also Länder) pro Erhebungsrahr gibt.
Für wie viele Jahre gibt es pro Land Daten? Sind dies tatsächlich immer gleich viele? Eine Zeile in dem Datensatz besteht aus Daten für ein Land und ein bestimmtes Jahr. Um die Frage zu beantworten, könnten wir die Anzahl der Beobachtungen (Länder) pro Jahr mit count() zählen. Der erste Parameter ist der Datensatz (hier also gapminder), der zweite die Variable, über die wir gruppieren wollen (hier: year).
## # A tibble: 12 x 2
## year n
## <int> <int>
## 1 1952 142
## 2 1957 142
## 3 1962 142
## 4 1967 142
## 5 1972 142
## 6 1977 142
## 7 1982 142
## 8 1987 142
## 9 1992 142
## 10 1997 142
## 11 2002 142
## 12 2007 142
Im Hintergrund führt count() zwei Schritte aus. Es aggregiert die Daten auf die Ebene von Jahren (statt Länder-Jahren) und zählt die Anzahl der Beobachtungen in diesem aggregierten Datensatz.
In der Datenanalyse, sind häufig mehrere Schritte notwendig, um zu einem Ergebnis zu kommen. Ein Beispiel wäre
Befehlsketten (pipes) fügen mehrere Befehle zusammen. Im tidyverse gibt es hierfür den Befehl “%>%”. Eine simple Befehlskette wäre etwa der Aufruf eines Datensatzes und das anschließende Zählen der Häufigkeit einer bestimmten Ausprägung.
gapminder %>%
count(year)
## # A tibble: 12 x 2
## year n
## <int> <int>
## 1 1952 142
## 2 1957 142
## 3 1962 142
## 4 1967 142
## 5 1972 142
## 6 1977 142
## 7 1982 142
## 8 1987 142
## 9 1992 142
## 10 1997 142
## 11 2002 142
## 12 2007 142
Das Ergebnis ist identisch mit dem Befehl count(gapminder, year) weiter oben. Ein häufiges Muster in Befehlsketten ist die Aggregierung mit Hilfe von group_by() und der Festlegung der zu berechnenden Kennzahlen mittels summarize().
gapminder %>%
group_by(continent) %>%
summarize(number_of_countries = n_distinct(country),
life_expectancy_min = min(lifeExp),
life_expectancy_mean = mean(lifeExp),
life_expectancy_max = max(lifeExp)
)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 5 x 5
## continent number_of_countr~ life_expectancy~ life_expectancy~ life_expectancy~
## <fct> <int> <dbl> <dbl> <dbl>
## 1 Africa 52 23.6 48.9 76.4
## 2 Americas 25 37.6 64.7 80.7
## 3 Asia 33 28.8 60.1 82.6
## 4 Europe 30 43.6 71.9 81.8
## 5 Oceania 2 69.1 74.3 81.2