Lektion 3 – Deskriptive Statistik

Nachdem in Lektion 2 besprochen wurde, wie in R Daten aufbereitet werden können, geht es in dieser Lektion darum, die Daten deskriptiv anzuschauen. In einem ersten Schritt schauen wir uns verschiedene deskriptive Statiken an, anschliessend verschiedene Verteilungen und am Ende, wie wir die Daten graphisch darstellen können.

Deskriptive Statistiken

Im folgendem Video erkläre ich dir, wie du verschieden beschreibende Statistiken wie Modus, Median, Durchschnitt, Varianz, Schiefe und Wölbung berechnen kannst. Unter dem Video sind die wichtigsten Punkte zusammengefasst.

Welche Statistiken berechnet werden können, hängt von der Skala der Variable ab. Es gibt folgende Skalen:

  • nominal skaliert: es gibt keine Ordnung (Beispiel: Partei)
  • ordinal skaliert: es gibt eine Ordnung ohne klare Abstände (Beispiel: sehr oft, oft, ab und zu, selten, nie)
  • Intervall skaliert: die Abstände sind definiert, der Nullpunkt ist aber zufällig und dadurch nicht absolut; es können Differenzen berechnet werden, aber keine Brüche. (Beispiel: Temperatur in °C)
  • Ratio skaliert: der Nullpunkt ist absolut, die Einheit aber zufällig/veränderbar (Beispiel: Temperatur in Kelvin, Alter in Jahren)
  • absolut skaliert: der Nullpunkt ist absolut und die Einheit ebenso (Beispiel: Anzahl Kinder)

Der Modus ist der häufigste Wert einer Variable. Er kann für alle Skalen berechnet werden. Den Parameter na.rm setzen wir auf TRUE, um die NAs im Datensatz zu ignorieren. Andernfalls würden wir NA erhalten.

df_selects = schlegel::selects2015
glm.predict:::Mode(df_selects$vote_choice, na.rm = TRUE)

Der Median ist der Wert, welche bei einer geordneten Variable genau in der Mitte liegt. Die Variable muss also mindestens ordinal skaliert sein. In R muss die Variable numerisch sein.

median(df_selects$age, na.rm = TRUE)

Der Durschnitt (auch Mittelwert genannt) ist der Wert, wenn alle Werte gleichmässig auf alle Individuen verteilt wären. Um in berechnen zu können, muss die Variable mindestens Intervall skaliert sein.

mean(df_selects$age, na.rm = TRUE)

Die Quantile teilen eine geordnete Variable in n gleichgrosse Stücke auf. Sie können ab ordinal skalierten Variablen berechnet werden. In R muss die Variable numerisch sein. Die bekanntesten Quantile sind Quartile und Quintile. Quartile sind der Standard in R.

# quartile (50% = median)
quantile(df_selects$age, na.rm = TRUE, type = 6)
# quintile
quantile(df_selects$age, na.rm = TRUE, type = 6, 
         probs = c(0, 0.2, 0.4, 0.6, 0.8, 1)

Neben den deskriptiven Statiken, welche einen Punkt beschreiben, gibt es auch solche, welche die Streuung der Punkte beschreiben. Zum einen die Varianz und die Standardabweichung (welche der Wurzel der Varianz entspricht). Sie kann für Variablen berechnet werden, welche mindestens Intervall skaliert sind.

var(df_selects$age, na.rm = TRUE)
sd(df_selects$age, na.rm = TRUE)

Ist die Variable mindestens ordinal skaliert, kann der Interquartilsabstand berechnet werden. Er ist der Unterschied zwischen dem 1. (25%) und dem 3. (75%) Quartil. In R muss die Variable numerisch sein.

IQR(df_selects$age, na.rm = TRUE)

Für nominal skalierte Variable kann einzig das Variationsratio berechnet werden. Es beschreibt der Anteil der Werte, welche nicht dem Modus entsprechen. Dazu müssen wir in R eine eigene Funktion schreiben.

variation.ratio = function(x, na.rm=FALSE){
  if(na.rm){
    x = na.omit(x)
  }
  1 - sum(x==glm.predict:::Mode(x,na.rm)) / length(x)
}
variation.ratio(df_selects$vote_choice, na.rm = TRUE)

Des weiteren gibt es für Variable, welche mindesten Intervall skaliert sind, Schiefe und Wölbung. Die Schiefe beschreibt, ob mehr Werte unter oder über dem Durschnitt liegen, während die Wölbung die Steilheit der Verteilung beschreibt. Für die Berechnung brauchen wir das Package moments.

library(moments)
skewness(df_selects$age, na.rm = TRUE)
kurtosis(df_selects$age, na.rm = TRUE)
kurtosis(df_selects$age, na.rm = TRUE) - 3 # Excess

Verteilungen

Nachdem wir die deskriptiven Statistiken angeschaut haben, widmen wir uns als nächstes den wichtigsten Verteilungen. Das folgende Video erklärt Schritt für Schritt die wichtigsten Verteilungen und die vorhanden Funktionen in R, um mit den Verteilungen arbeiten zu können. Unter dem Video folgt wiederum eine Zusammenfassung der wichtigsten Punkte.

Jede Verteilung in R hat vier grundlegende Funktionen. Der erste Buchstabe bestimmt die Art der Funktion, der Rest die Verteilung. r- steht dabei für «random» und gibt Zufallszahlen der Verteilung zurück. d- steht für «density» und gibt die Dichte der Verteilung am spezifizierten Punkt zurück. p- steht für «probability» und gibt die Wahrscheinlichkeit eines spezifischen Wertes oder kleiner zurück. Dieser Wert ist gleichzeitig die Dichte der kumulierten Verteilung. q- steht für «quantile» und gibt Quantile zurück. Sie ist die Umkehrfunktion von p-.

Die wohl wichtigste Verteilung in der Statistik ist die Normalverteilung (auch Gausssche Glockenkurve genannt). Sie ist bestimmt durch ihren Mittelwert und die Standardabweichung. Die Standardnormalverteilung hat einen Mittelwert von 0 und eine Standardabweichung von 1.

Normalverteilung
rnorm(3, mean = 2, sd = 0.5)
dnorm(c(-5, -1, 0, 1, 5))
pnorm(c(-5, -1, 0, 1, 5))
qnorm(c(0.158, 0.5, 0.842))

Bei tiefere Fallzahl (<30) wird die Student-t-Verteilung verwendet, welche der Normalverteilung ähnelt. Bei grosser Fallzahl unterscheiden sich die beiden Verteilungen nur marginal. Die Students t-Verteilung ist durch ihre Anzahl Freiheitsgrade bestimmt.

Student-t-Verteilung mit 3 Freiheitsgraden (schwarze Linie: Normalverteilung)
rt(3, df = 6)
dt(c(-5, -1, 0, 1, 5), df = 6)
pt(c(-5, -1, 0, 1, 5), df = 6)
qt(c(0.158, 0.5, 0.842), df = 6)

Des weiteren gibt es die gleichmässige (uniforme) Verteilung. Bei ihre hat jeder Wert die gleiche Dichte. Standardmässig geht sie von 0 bis 1.

Uniforme Verteilung
runif(3, max = 10)
dunif(c(0.1, 0.5, 0.7))
punif(c(0.1, 0.5, 0.7))
qt(c(0.158, 0.5, 0.842))

Eine weitere wichtige Verteilung ist die Chi2-Verteilung. Sie wird in der Statistik zum Testen von Hypothesen verwendet. Sie ist durch die Anzahl Freiheitsgrade bestimmt.

Chi2-Verteilung mit verschiedenen Freiheitsgraden
rchisq(3, df = 6)
dchisq(0, 1, 5), df = 6)
pchisq(0, 1, 5), df = 6)
qchisq(c(0.158, 0.5, 0.842), df = 6)

Neben den kontinuierlichen Verteilungen gibt es auch noch diskrete Verteilungen. Eine der wichtigsten ist die Binomialverteilung. Sie gibt die Wahrscheinlichkeit eines Events an. Wenn wir z.B. 50 Mal eine Münze werfen, wir gross ist die Wahrscheinlichkeit, dass die Münze 10 Kopf anzeigt, das sie 20 Mal Kopf anzeigt, 25 Mal? Wie sieht das ganze aus, wenn die Wahrscheinlichkeit für Kopf nur 20% ist, weil es eine unfaire Münze ist?

Binomialverteilung mit Wahrscheinlichkeit 1 von 0.5 und 0.2
rbinom(3, size = 50, prob = 0.5)
dbinom(c(10, 20, 25), size = 50, prob = 0.5)
pbinom(c(10, 20, 25), size = 50, prob = 0.5)
qbinom(c(0.1, 0.5, 0.7), size = 50, prob = 0.5)

Will man eine gleichmässige diskrete Ziehung kann die Funktion sample() verwendet werden.

sample(1:10, 3, replace = TRUE)

Grafiken erstellen

Beim deskriptiven Betrachten der Daten ist es häufig nützlich, die Variablen graphisch darzustellen. Das folgende Video gibt eine Einführung in ggplot2. Nach dem Video folgt wiederum eine Zusammenfassung.

Jede Grafik in ggplot2 beginnt mit der Funktion ggplot(), welche den Datensatz enthält. Anschliessend werden mit + Layers und Einstellungen hinzugefügt. Der Layer bestimmt, welche Art von graphischer Darstellung angezeigt wird. Ein Barplot kann bespielsweise mit dem Layer geom_bar() erstellt werden, ein Histogramm mit dem Layer geom_histogram() und eine Dichteplot mit dem Layer geom_density().

Jeder Layer hat zwingende und optionale Parameter, welche angegeben werden müssen. Diese können vom Datensatz abhängen, dann werden sie innerhalb der Funktion aes() angegeben. Hängen sie nicht vom Datensatz ab, sondern sind fix, werden sie ausserhalb von aes() angegeben. Ein Beispiel (age steht innerhalb von aes(), der Rest ausserhalb):

df_selects = schlegel::selects2015
library(tidyverse)
ggplot(df_selects) + 
  geom_histogram(aes(x = age), fill = "red", col = "black")

Wir können fill aber auch von einer Variable abhängig machen, dann steht es innerhalb von aes(). Das könnte dann beispielsweise so aussehen:

ggplot(df_selects) + 
  geom_histogram(aes(x = age, fill = gender), col = "black")

Um dem Plot ein schöneres Layout zu geben, kann ein Thema angewendet werden. Empfehlenswerte Themen sind theme_bw(), theme_minimal() und theme_classic(). Das Beispiel von vorher mit einem Thema:

ggplot(df_selects) + 
  geom_histogram(aes(x = age, fill = gender), col = "black") +
  theme_minimal()

Wollen wir die Farben anpassen, können wir das mit der Funktion scale_fill_manuel() tun. Unter values geben wir die neuen Farben an, unter name können wir den Legendentitel anpassen und unter labels die Namen der Kategorien. Wollen wir die Farben lassen und nur die Beschriftung anpassen lassen wir values weg und verwenden stattdessen scale_fill_discrete(). Ein Beispiel:

ggplot(df_selects) + 
  geom_histogram(aes(x = age, fill = gender), col = "white") +
  theme_minimal() +
  scale_fill_manual(values = c("orange", "black"),
                    name = "Geschlecht",
                    labels = c("Mann", "Frau"))

Mit xlab() können wir die Beschriftung der x-Achse ändern, mit ylab() die der y-Achse. Mit ggtitle() können wir einen Titel zur Grafik hinzufügen.

ggplot(df_selects) + 
  geom_histogram(aes(x = age, fill = gender), col = "white") +
  theme_minimal() +
  scale_fill_manual(values = c("orange", "black"),
                    name = "Geschlecht",
                    labels = c("Mann", "Frau")) +
  xlab("Alter") + ylab("Anzahl") + ggtitle("Demografie")

Mit facet_wrap() resp. facet_grid() können wir Small Multiples bilden.

ggplot(df_selects) + 
  geom_histogram(aes(x = age, fill = gender), col = "white") +
  theme_minimal() +
  scale_fill_manual(values = c("orange", "black"),
                    name = "Geschlecht",
                    labels = c("Mann", "Frau")) +
  xlab("Alter") + ylab("Anzahl") + ggtitle("Demografie") +
  facet_wrap(~canton)

Wenn wir die Beziehung zwischen zwei Variablen darstellen wollen, können wir beispielsweise einen Scatterplot (geom_point()) oder ein Liniendiagram (geom_line()) verwenden. Mit geom_smooth() kann eine Linie hinzugefügt werden, welche die Beziehung modelliert. Alle drei brauchen ein x und ein y. Ein Beispiel (hier wird aes() global definiert innerhalb von ggplot(), dann gilt es für alle Layers):

ggplot(df_selects, aes(x = age, y = lr_self)) + 
  geom_point(col = "orange") + 
  geom_smooth(method = "lm") + 
  theme_bw() + ylab("left right selft placement")