Bibliotheken laden

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.

Überblick über die Daten gewinnen

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)
Data summary
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.

Daten aggregieren

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.

Befehlsketten (pipes)

In der Datenanalyse, sind häufig mehrere Schritte notwendig, um zu einem Ergebnis zu kommen. Ein Beispiel wäre

  1. Datensatz filtern
  2. Eine neue Kennzahl berechnen
  3. Aggregierte Werte für die neue Kennzahl berechnen

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