Die Standardabweichung ist eines einer Vielzahl von Streuungsmaßen. Mit Streuungsmaßen beschreiben wir, wie variabel Werte in einer Verteilung sind. Das einfachste Streuungsmaß ist der Range. Der Range ist der Abstand zwischen dem geringsten Wert einer Verteilung und dem höchsten Wert einer Verteilung. Wenn wir beispielsweise eine Stichprobe von 100 Menschen aus einer Population ziehen, deren IQ wir gemessen haben, dann ist der Range der Abstand zwischen dem geringsten und dem höchsten IQ-Wert dieser 100 Personen:

library(tidyverse)

set.seed(100)
population <- rnorm(100, mean = 100, sd = 20)

ggplot(NULL, aes(population)) +
  geom_histogram(fill = "blue", color = "white")

In R können wir einfach folgende Funktion eingeben, um den Range heraus zu finden:

range(population)
[1]  54.56149 151.63918

Der Range wäre in unserem Beispiel 151.6391854.56149=97.07769151.63918 - 54.56149 = 97.07769. Die Intelligenz dieser Stichprobe variiert also recht stark.

Es gibt neben dem Range allerdings noch viele andere Maße, Streuungen einer Verteilung zu beschreiben. Am bekanntesten sind die Varianz und die Standardabweichung.

Varianz

In einem anderem Post habe ich bereits erklärt, dass die Varianz nichts weiteres ist als die durchschnittliche Fläche der Quadrate, deren Seitenlängen der Abstand der einzelnen Punkte zum Mittelwert der Verteilung sind:

data <- tibble(subject = c(1:length(population)),
               iq      = population)

ggplot(data, aes(subject, iq)) +
  geom_point() +
  geom_hline(yintercept = mean(population)) +
  geom_rect(aes(xmin = subject, 
                xmax = subject + (abs(iq - mean(population))),   
                ymin = iq, 
                ymax = mean(population), 
                alpha = .1), 
            fill = "#9999ff",
            data = data) +
  xlab("Personen ID") +
  ylab("IQ") +
  # theme_bw() +
  coord_fixed() +
  guides(alpha = FALSE, fill = FALSE)

Hier siehst du für jeden Probanden in der Stichprobe einen Quadranten, deren Seiten der Abstand des einzelnen IQ-Punktes zum Mittelwert der Verteilung sind. Um die Varianz zu berechnen, müssen wir die durchschnittliche Größe dieser Quadranten bestimmen:

sd_iq <- sqrt(var(population))

ggplot() + 
  ylim(0, sd_iq + 2) + 
  xlim(0, sd_iq + 2) + 
  coord_fixed() +
  geom_rect(aes(xmin = 0, xmax = sd_iq, ymin = 0, ymax = sd_iq), 
            fill = "blue", alpha = 0.3)

Hier siehst du die Varianz grafisch. Ein Quadrant, mit einer Seitlänge von 20.4142120.41421. Der ganze Quadrant hat daher eine Fläche von 20.414212=416.739920.41421^2 = 416.7399. Etwas formeller können wir diese Idee auch mathematisch ausdrücken:

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

Diesen Quadranten können wir nun in unsere Grafik einbauen:

ggplot(data, aes(subject, iq)) +
  geom_point() +
  geom_rect(aes(xmin = subject, 
                xmax = subject + (abs(iq - mean(population))),   
                ymin = iq, 
                ymax = mean(population), 
                alpha = .1), 
            fill = "#9999ff",
            data = data) +
  xlab("Personen ID") +
  ylab("IQ") +
  geom_rect(aes(xmin = 50, xmax = 50 + sd_iq, 
                ymin = mean(population), 
                ymax = mean(population) + sd_iq), 
            fill = "tomato", alpha = 0.3) +
  guides(alpha = FALSE, fill = FALSE) +
  geom_hline(yintercept = mean(population)) +
  coord_fixed()

Dieser rote Quadrant ist die Varianz. Wo der Quadrant in dieser Grafik sitzt ist unerheblich, wir können aber aus der Visualisierung erkennen, was die Varianz grafisch ist.

Standardabweichung

Die Standardabweichung ist nichts Weiteres als die Wurzel dieses durchschnittlichen Quadrats.

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

Der einzige Unterschied der beiden Formeln besteht darin, dass wir die Wurzel aus diesem durchschnittlichen Quadranten ziehen. Der Grund, die Wurzel zu ziehen liegt darin, dass wir den Wert der Varianz nicht interpretieren können. Da wir die Abstände zum Mittelwert quadriert haben, verlieren wir die Einheit, in der die Daten vorliegen (hier: IQ-Punkte). Indem wir nun die Wurzel ziehen, erhalten wir diese Einheit zurück.

sqrt(var(population))
# oder
sd(population)
[1] 20.41421

Wir könnten auch sagen, dass der IQ-Wert durchschnittlich 20.41 IQ Punkte vom Mittelwert abweicht. Die Standardabweichung gibt uns dadurch ein Maß, anhand derer wir bestimmen können, wie variabel ein Verteilung ist. Je größer die Standardabweichung desto stärker streuen die einzelnen Punkte um den Mittelwert.

Die Standardabweichung ist die Seitlänge des Quadranten, dessen Fläche die Varianz ist.

ggplot(data, aes(subject, iq)) +
  geom_point() +
  geom_rect(aes(xmin = subject, 
                xmax = subject + (abs(iq - mean(population))),   
                ymin = iq, 
                ymax = mean(population), 
                alpha = .1), 
            fill = "#9999ff",
            data = data) +
  xlab("Personen ID") +
  ylab("IQ") +
  geom_rect(aes(xmin = 50, xmax = 50 + sd_iq, 
                ymin = mean(population), 
                ymax = mean(population) + sd_iq), 
            fill = "tomato", alpha = 0.3) +
  guides(alpha = FALSE, fill = FALSE) +
  geom_hline(yintercept = mean(population)) +
  coord_fixed() +
  geom_segment(aes(x = 50, y = mean(population), 
                   xend = 50, yend = mean(population) + sd_iq), 
               size = 1) +
  geom_point(aes(x = 50, y = mean(population) + sd_iq), size = 3)

Appendix

Hier findet ihr das Skript zum Video.

library(tidyverse)
library(gganimate)

# Die fiktive Population mit 20 Stichproben,
# welche sich in der Varianz unterscheiden
population <- 1:20 %>% 
  map_df(~ tibble(iq = rnorm(100, mean = 100, sd = .),
                  sd = rep(., 100),
                  id = seq(1:100)))


# Histogramme der 20 Stichproben
ggplot(population, aes(iq)) +
  geom_histogram() +
  facet_wrap(~ sd)


# Subsets der Stichproben
subset_1 <- population %>%
  filter(sd == 1)

subset_5 <- population %>%
  filter(sd == 5)

subset_10 <- population %>%
  filter(sd == 10)

subset_20 <- population %>% 
  filter(sd == 20)


plot_variance_histogram <- function(subset, quadrants = FALSE, 
                                    variance_true = FALSE, sd_true = FALSE, title) {
  histogram = ggplot(subset, aes(id, iq)) +
    geom_point() +
    xlab("Personen ID") +
    ylab("IQ") +
    coord_fixed() +
    ylim(40, 150) +
    xlim(0, 170) +
    guides(alpha = FALSE) +
    ggtitle(paste("SD = ", title))
  
    if (quadrants) {
      histogram = histogram + geom_rect(aes(xmin = id,
                    xmax = id + (abs(iq - mean(iq))),
                    ymin = iq,
                    ymax = mean(iq),
                    alpha = .05),
                fill = "#9999ff", data = subset)
    }
  
    if (variance_true) {
      histogram = histogram + 
        geom_rect(aes(xmin = 50, 
                    xmax = 50 + sd(iq), 
                    ymin = mean(iq), 
                    ymax = mean(iq) + sd(iq)), 
                fill = "tomato", alpha = 0.3, 
                data = subset)
    }
    
    if (sd_true) {
      histogram = histogram +
        geom_segment(aes(x = 50, y = mean(iq),
                       xend = 50, yend = mean(iq) + sd(iq)),
                   data = subset, color = "#47ff63") +
        geom_point(aes(x = 50, y = mean(iq) + sd(iq)))
    }

    histogram = histogram +
      geom_hline(yintercept = mean(subset$iq), data = subset)

      
    return(histogram)
}

# Scatterplots
plot_variance_histogram(subset_1, FALSE, FALSE, FALSE, "1")
plot_variance_histogram(subset_5, FALSE, FALSE, FALSE, "5")
plot_variance_histogram(subset_10, FALSE, FALSE, FALSE, "10")
plot_variance_histogram(subset_20, FALSE, FALSE, FALSE, "20")

# Visualisiere Quadranten 
plot_variance_histogram(subset_1, TRUE, FALSE, FALSE, "1")
plot_variance_histogram(subset_5, TRUE, FALSE, FALSE, "5")
plot_variance_histogram(subset_10, TRUE, FALSE, FALSE, "10")
plot_variance_histogram(subset_20, TRUE, FALSE, FALSE, "20")

# Animation der Varianz
ggplot(population, aes(id, iq)) +
  geom_point() +
  geom_rect(aes(xmin = id,
                xmax = id + (abs(iq - mean(iq))),
                ymin = iq,
                ymax = mean(iq),
                alpha = .1),
            fill = "#9999ff") +
  geom_hline(yintercept = 100) +
  transition_states(
    sd,
    transition_length = 1,
    state_length = 2
  ) +
  enter_fade() + 
  exit_fade() +
  ease_aes('sine-in-out') +
  xlab("Personen ID") +
  ylab("IQ") +
  coord_fixed() +
  guides(alpha = FALSE, fill = FALSE)

# Visualisiere Varianz 
plot_variance_histogram(subset_1, TRUE, TRUE, FALSE, "1")
plot_variance_histogram(subset_5, TRUE, TRUE, FALSE, "5")
plot_variance_histogram(subset_10, TRUE, TRUE, FALSE, "10")
plot_variance_histogram(subset_20, TRUE, TRUE, FALSE, "20")

# Visualisiere Standardabweichung 
plot_variance_histogram(subset_1, TRUE, TRUE, TRUE, "1")
plot_variance_histogram(subset_5, TRUE, TRUE, TRUE, "5")
plot_variance_histogram(subset_10, TRUE, TRUE, TRUE, "10")
plot_variance_histogram(subset_20, TRUE, TRUE, TRUE, "20")

# Standardabweichung ist nicht die absolute Abweichung vom Mittelpunkt
(abs(subset_20$iq - mean(subset_20$iq)) %>% sum) / (nrow(subset_20) - 1)
sd(subset_20$iq)