Jede menschliche Eigenschaft variiert. Menschen sind unterschiedlich groß, sie sind unterschiedlich intelligent und sie schlafen unterschiedlich lang. Wenn ich sage, dass Menschen im Durchschnitt 8 Stunden schlafen, weiß ich genauso gut, dass nicht alle Menschen 8 Stunden schlafen.

library(tidyverse)

set.seed(123)
sleep <- rnorm(1000, mean = 8, sd = 2)

ggplot(NULL, aes(x = sleep)) +
  geom_histogram(fill = "#9999ff", color = "black") +
  theme_bw() +
  xlab("Schlafdauer") +
  ylab("Anzahl")

Hier siehst du einen künstlich erstellten Datensatz von 1000 Menschen, die im Schnitt 8 Stunden schlafen. Wir können nicht nur sagen, dass Menschen im Durchschnitt 8 Stunden schlafen, wir können ebenso sagen, wie stark die Schlafdauer bei den Menschen variiert.

Varianz ist ein Maß für die Streuung von Punkten in einer Verteilung.

Schauen wir uns zunächst einen kleinen Datensatz von 5 Personen an, von denen wir wissen, wie lange sie schlafen:

set.seed(40)
five_people <- sample(sleep, 5)

ggplot(NULL, aes(c(1:5), five_people)) +
  geom_point() +
  xlab("Personen ID") +
  ylab("Schlafdauer") +
  theme_bw()

Im Schnitt schlafen diese fünf Personen 8.66 Stunden. Dieser Wert ist nichts anderes als der Mittelwert der Schlafdauer der fünf Personen (mean(five_people)):

ggplot(NULL, aes(c(1:5), five_people)) +
  geom_point() +
  geom_hline(yintercept = mean(five_people)) +
  xlab("Personen ID") +
  ylab("Schlafdauer") +
  theme_bw()

Als nächstes erstellen wir fünf Quadrate, die sich von den einzelnen Punkten zum Mittelwert erstrecken. Warum erkläre ich gleich:

five_people_dataframe <- tibble(x = c(1:5),
                                y = five_people)

ggplot(five_people_dataframe, aes(x, y)) +
  geom_point() +
  geom_hline(yintercept = mean(five_people)) +
  geom_rect(aes(xmin = x, 
                xmax = x + (abs(y - mean(five_people))),   
                ymin = y, 
                ymax = mean(five_people), 
                alpha = .1), 
            fill = "#9999ff",
            data = five_people_dataframe) +
  xlab("Personen ID") +
  ylab("Schlafdauer") +
  theme_bw() +
  coord_fixed() +
  guides(alpha = FALSE, fill = FALSE)

Varianz ist nun nichts anderes als die durchschnittliche Fläche dieser Quadrate. Oder in einer Formel ausgedrückt: Die Summe der Größe dieser Quadrate geteilt durch die Anzahl der Quadrate minus 1.

σ2=i=1n(xix)2n1\sigma^2 = \frac{\displaystyle\sum_{i=1}^{n}(x_i - \overline{x})^2}{n - 1}

Der Zähler der Formel besagt, dass wir die Quadrate zusammen rechnen. Der Nenner besagt, dass wir die Summe dieser Quadratsumme durch n - 1 teilen.

zaehler <- five_people %>% 
  map_dbl(~ ((. - mean(five_people))**2)) %>% 
  sum
nenner <- length(five_people) - 1
(zaehler / nenner)

# oder

var(five_people)

Beide Berechnungen (zaehler / nenner und var(five_people)) ergeben eine Varianz von 0.6516835.

Wir teilen durch n - 1, da wir die Varianz für eine Population schätzen möchten. Stell dir vor, du ziehst aus einer Population wie in unserem ersten Bild fünf Personen heraus. Wie wahrscheinlich ist es, dass du Personen heraus ziehst, die nur 4 oder gar 13 Stunden schlafen? Sehr unwahrscheinlich. Dadurch unterschätzen wir allerdings die Varianz, wenn wir eine Stichprobe ziehen. Indem wir n - 1 berechnen, machen wir die Varianz künstlich größer, da hierdurch der Nenner kleiner wird. Man nennt diese Korrektur auch Bessel’s Correction. Wenn wir nur fünf Personen aus der Population ziehen, wirkt sich diese Korrektur stark auf die Varianz aus, wenn wir allerdings viele Personen aus der Population ziehen, ändern sich die Varianz nur minimal (z.B., 500 Personen - 1). Und genau das brauchen wir, eine Korrektur der Varianz bei einer geringen Stichprobe. Schließlich ist es bei einer kleinen Stichprobe umso wahrscheinlicher, dass wir die Varianz unterschätzen.

Je größer die Varianz ist, desto stärker streuen die Punkte um den Mittelwert. Oder anders ausgedrückt, je größer die Varianz, desto größer ist die Fläche der Quadrate.