Kapitel 7 Stichproben und Variabilität

  • Begriffe Stichprobenverteilung und Standardfehler erklären
  • Zufall bei wiederholter Stichprobenerhebung erkennen
  • Stichprobenverteilung darstellen
  • Einfluss der Stichprobengröße auf Stichprobenverteilung benennen

Mit diesem Kapitel steigen wir in die schließende Statistik ein. Wir beginnen damit, wie man in der Statistik zu Daten kommt (Stichprobenerhebung) und welche Rolle der Zufall dabei spielt. Dabei konzentrieren wir uns auf die Erhebung von einfachen zufälligen Stichproben (Zufallsstichproben), nicht auf das Designen von komplizierten Erhebungen. Das ist eine Kunst für sich und geht über die Ziele dieses Kurses hinaus.

7.1 Stichproben

Wir nutzen wieder die selbst erstellten Daten aus der Aufgabe B.1. Die 12000 Studierenden sind unsere Grundgesamtheit. Da wir die Daten selbst erstellt haben, wissen wir alles über sie. Das ist ein großer Vorteil von Computerexperimenten 😄. Damit alle dieselben Daten erstellen, ist die Zeile set.seed(123) notwendig. Sie sorgt dafür, dass der Generator für Zufallszahlen in einen zufälligen, aber reproduzierbaren Zustand versetzt wird. Die Zahl in den Klammern ist nicht wichtig. Wichtig ist, dass alle dieselbe benutzen.

Für bessere Nachvollziehbarkeit, nummerieren wir unsere Studierenden diesmal durch.

set.seed(123)

student_id <- 1:12000
  
anreise <- c(runif(n = 12000 * 0.8, min = 5, max = 40),
             runif(n = 12000 * 0.2, min = 60, max = 120))

geschlecht <- sample(c('m', 'w'), size = 12000, replace = TRUE)

wohnort <- sapply(anreise, function(x) {
  if(x < 30) 'stadt'
  else 'land'
})

verkehrsmittel <- sapply(anreise, function(x) {
  if(x <= 10) 'zu_fuss'
  else if(x > 10 & x <= 15) sample(c('zu_fuss', 'fahrrad'), size = 1)
  else if(x > 15 & x <= 45) sample(c('bus', 'fahrrad', 'auto'), size = 1)
  else sample(c('bus', 'auto'), size = 1)
})

zeit_bib <- 5 * 60 - 0.7 * anreise + rnorm(length(anreise), 0, 20)

grundgesamtheit <- tibble(student_id, geschlecht, wohnort, verkehrsmittel, anreise, zeit_bib)

grundgesamtheit
## # A tibble: 12,000 × 6
##    student_id geschlecht wohnort verkehrsmittel anreise zeit_bib
##         <int> <chr>      <chr>   <chr>            <dbl>    <dbl>
##  1          1 w          stadt   bus              15.1      294.
##  2          2 w          land    fahrrad          32.6      254.
##  3          3 w          stadt   fahrrad          19.3      231.
##  4          4 m          land    auto             35.9      245.
##  5          5 m          land    bus              37.9      234.
##  6          6 w          stadt   zu_fuss           6.59     303.
##  7          7 w          stadt   bus              23.5      284.
##  8          8 m          land    auto             36.2      274.
##  9          9 m          stadt   fahrrad          24.3      299.
## 10         10 w          stadt   bus              21.0      282.
## # … with 11,990 more rows

Wir wollen nun 50 Studierende befragen. Durch die zufällige Auswahl an Befragten erzeugen wir eine zufällige Stichprobe. Übersetzt in unser Computerexperiment bedeutet es, dass wir zufällig 50 Zeilen aus dem Datensatz grundgesamtheit ziehen, und zwar so, dass sich diese Zeilen nicht wiederholen (d.h. niemand mehrfach befragt wird). Dazu nutzen wir die Funktion rep_sample_n(), die wiederholt (rep) n Zeilen zieht (sample), und zwar mit der Einstellung replace = FALSE, also ohne Zurücklegen. Wir befragen nur einmal, daher reps = 1.

Damit alle wieder dieselben Daten bekommen, setzen wir vorher den seed (Zustand des Zufallszahlengenerators). Die Variable befragung_size gibt die Stichprobengröße an.

set.seed(345)

befragung_size <- 50

befragung <- rep_sample_n(grundgesamtheit, size = befragung_size, replace = FALSE, reps = 1)

befragung
## # A tibble: 50 × 7
## # Groups:   replicate [1]
##    replicate student_id geschlecht wohnort verkehrsmittel anreise zeit_bib
##        <int>      <int> <chr>      <chr>   <chr>            <dbl>    <dbl>
##  1         1       1623 m          stadt   zu_fuss           7.06     299.
##  2         1       9171 m          stadt   fahrrad          11.3      278.
##  3         1      10207 w          land    bus             107.       199.
##  4         1       3506 w          stadt   bus              25.0      326.
##  5         1       8892 w          stadt   bus              28.1      259.
##  6         1       5460 m          stadt   bus              23.6      299.
##  7         1       6120 w          stadt   bus              20.0      268.
##  8         1        865 w          stadt   fahrrad          26.6      290.
##  9         1      11586 m          land    bus             114.       207.
## 10         1       8153 w          stadt   zu_fuss           8.06     297.
## # … with 40 more rows

Die Variable replicate zeigt immer 1. Das bedeutet, dass wir die Befragung einmal wiederholt (repliziert) haben und alle Datenpunkte zu dieser Wiederholung gehören.

Wir wollen nun wissen, wie viele Studierende unter den Befragten in der Stadt oder auf dem Land wohnen.

befragung %>% 
  group_by(wohnort) %>% 
  count()
## # A tibble: 2 × 2
## # Groups:   wohnort [2]
##   wohnort     n
##   <chr>   <int>
## 1 land       21
## 2 stadt      29

Das Ganze möchten wir als Anteile ausdrücken. Die Funktion n() kann innerhalb der Funktion summarise() zum Auszählen genutzt werden. Wir teilen durch die Stichprobengröße.

befragung %>% 
  group_by(wohnort) %>% 
  summarise(prop = n()/befragung_size)
## # A tibble: 2 × 2
##   wohnort  prop
##   <chr>   <dbl>
## 1 land     0.42
## 2 stadt    0.58

Es wohnen also 42% auf dem Land und 58% in der Stadt.

Was passiert, wenn wir die Befragung mehrfach wiederholen, sagen wir 33 Mal? In der Realität ist dieses Szenario sehr unwahrscheinlich, aber in einem Computerexperiment einfach zu implementieren. Es hilft uns ein Gefühl für die Variabilität, die durch das zufällige Auswählen der Studierenden bei der Befragung entsteht, zu entwickeln.

Wir setzten erneut den seed, damit alle dieselben Ergebnisse bekommen.

set.seed(234)

befragung_reps <- rep_sample_n(grundgesamtheit, size = befragung_size, replace = FALSE, reps = 33)

befragung_reps
## # A tibble: 1,650 × 7
## # Groups:   replicate [33]
##    replicate student_id geschlecht wohnort verkehrsmittel anreise zeit_bib
##        <int>      <int> <chr>      <chr>   <chr>            <dbl>    <dbl>
##  1         1       2079 m          land    auto              38.8     262.
##  2         1       1314 m          stadt   fahrrad           13.3     301.
##  3         1       1710 m          stadt   auto              26.5     272.
##  4         1       4386 w          stadt   bus               23.9     269.
##  5         1       9490 m          land    auto              34.2     262.
##  6         1      11757 w          land    bus              102.      227.
##  7         1      11649 w          land    bus              111.      202.
##  8         1       2244 m          land    bus               38.9     256.
##  9         1       3652 w          stadt   fahrrad           10.3     254.
## 10         1       3127 m          stadt   fahrrad           29.6     271.
## # … with 1,640 more rows

Jetzt wird uns angezeigt, dass es in dem Datensatz befragung_reps 33 replicates (Wiederholgungen) gibt. Diese sind einfach nacheinander in befragung_reps angeordnet (blättern Sie durch den Datensatz). Dementsprechend hat der Datensatz 50 \(\times\) 33 = 1650 Zeilen.

Wie sieht es jetzt mit den Anteilen von Stadt- und Landbewohnern aus? Wir müssen nun zusätzlich zum wohnort auch noch nach replicate gruppieren.

wohnort_props <- befragung_reps %>% 
  group_by(replicate, wohnort) %>% 
  summarise(prop = n()/befragung_size)

wohnort_props
## # A tibble: 66 × 3
## # Groups:   replicate [33]
##    replicate wohnort  prop
##        <int> <chr>   <dbl>
##  1         1 land     0.42
##  2         1 stadt    0.58
##  3         2 land     0.36
##  4         2 stadt    0.64
##  5         3 land     0.4 
##  6         3 stadt    0.6 
##  7         4 land     0.38
##  8         4 stadt    0.62
##  9         5 land     0.4 
## 10         5 stadt    0.6 
## # … with 56 more rows

Erwartungsgemäß bringt jede Wiederholung der Befragung, die wir ja als zufälliges Herausgreifen der Studierenden ohne Mehrfachbefragung programmiert haben, etwas andere Ergebnisse. Sehen Sie sich die student_id in den replicates an, es werde unterschiedliche Studierende befragt! In einem Histogramm sieht das Ganze so aus:

ggplot(data = wohnort_props, aes(x = prop)) + 
  geom_histogram(binwidth = 0.05, boundary = 0.4, col = 'white') +
  facet_wrap(~ wohnort) +
  labs(x = 'Anteile beim Wohnort', title = 'Verteilung der Wohnorte', y = 'Häufigkeit')

Die häufigsten Anteile sind um die 40% für Land und um die 60% für Stadt. Wir können es sogar etwas genauer ablesen, da wir binwidth = 0.05 gewähnt haben, also Schritte von 5%. Es sind 35–40% für Land und 55–60% für Stadt.

7.2 Anzahl der Wiederholungen und Variabilität

Was passiert, wenn wir unsere Umfrage 1000 Mal wiederholen? Wir können den ganzen Code wiederverwenden und müssen nur die reps entsprechend verändern. Wir erstellen dafür eine zusätzliche Variable befragung_num. Beim Histogramm sollten wir die binwidth etwas heruntersetzten, da wir jetzt sehr viel mehr Daten haben und diese detaillierter anzeigen lassen können. Zusätzlich wird die x-Achse “frei” gegeben, i.e. die Skalierung wird jetzt auf jeder Achse separat bestimmt scales = 'free_x' in facet_wrap(), um die Verteilungen besser zu sehen.

set.seed(345)

befragung_num <- 1000

befragung_reps <- rep_sample_n(grundgesamtheit, size = befragung_size, replace = FALSE, reps = befragung_num)

wohnort_props <- befragung_reps %>% 
  group_by(replicate, wohnort) %>% 
  summarise(prop = n()/befragung_size)


ggplot(data = wohnort_props, aes(x = prop)) + 
  geom_histogram(binwidth = 0.02, boundary = 0.4, col = 'white') +
  facet_wrap(~ wohnort, scales = 'free_x') +
  labs(x = 'Anteile beim Wohnort', title = 'Verteilung der Wohnorte', y = 'Häufigkeit')

Die häufigsten Anteile beim Land liegen bei 40–42% und bei der Stadt bei 58–60%.

Die Histogramme geben nun gut die Verteilung der Anteile der Stadt- und Landbewohner wieder. Solche Verteilungen nennt man Stichprobenverteilungen. Sie zeigen die Verteilung einer statistischen Kenngröße (Statistik), in unserem Fall Anteil, die aus zufälligen Stichproben ausgerechnet wurde. Die Stichprobenverteilung beantwortet die Frage: Wenn ich eine zufällige Menge (Stichprobengröße) an Daten (Zufallsstichprobe) aus der Grundgesamtheit herausgreife und eine Kenngröße (z.B. Anteil) berechne, welchen Wert werde ich im Mittel erhalten und wie stark wird der Wert schwanken.

7.3 Stichprobengröße

Was passiert, wenn wir die Größe der Stichproben variieren? Das würde Befragungen mit unterschiedlicher Anzahl von Teilnehmern entsprechen. Wir vergleichen 25, 50 und 100 Befragte und wiederholen jeweils 1000 Mal, um erneut Stichprobenverteilungen plotten zu können. Das ist eine repetitive Aufgabe und ich werde dafür eine Funktion definieren. Wie man das macht, wird in einer späteren Stunde erklärt.

calculate_props <- function(grund_data = grundgesamtheit, befragung_size, befragung_reps = 1000) {
  
  befragung <- rep_sample_n(grund_data, size = befragung_size, replace = FALSE, reps = befragung_reps)

wohnort_props <- befragung %>% 
  group_by(replicate, wohnort) %>% 
  summarise(prop = n()/befragung_size)

wohnort_props
}

Nun wenden wir diese selbst definierte Funktion an und führen die Befragungen durch.

set.seed(123)

# Stichprobengröße 25
wohnort_props_25 <- calculate_props(grund_data = grundgesamtheit, befragung_size = 25, befragung_reps = 1000)
  
# Stichprobengröße 50
wohnort_props_50 <- calculate_props(grund_data = grundgesamtheit, befragung_size = 50, befragung_reps = 1000)

# Stichprobengröße 100
wohnort_props_100 <- calculate_props(grund_data = grundgesamtheit, befragung_size = 100, befragung_reps = 1000)

Wir stellen die drei Stichprobenverteilungen dar. Die Einstellung für binwidth ist jeweils eine andere.

ggplot(data = wohnort_props_25, aes(x = prop)) + 
  geom_histogram(binwidth = 0.04, boundary = 0.4, col = 'white') +
  facet_wrap(~ wohnort, scales = 'free_x') +
  labs(x = 'Anteile beim Wohnort', title = 'Verteilung der Wohnorte, Stichprobengröße = 25', y = 'Häufigkeit')
ggplot(data = wohnort_props_50, aes(x = prop)) + 
  geom_histogram(binwidth = 0.02, boundary = 0.4, col = 'white') +
  facet_wrap(~ wohnort, scales = 'free_x') +
  labs(x = 'Anteile beim Wohnort', title = 'Verteilung der Wohnorte, Stichprobengröße = 50', y = 'Häufigkeit')
ggplot(data = wohnort_props_100, aes(x = prop)) + 
  geom_histogram(binwidth = 0.02, boundary = 0.4, col = 'white') +
  facet_wrap(~ wohnort, scales = 'free_x') +
  labs(x = 'Anteile beim Wohnort', title = 'Verteilung der Wohnorte, Stichprobengröße = 100', y = 'Häufigkeit')

Wie kann man diese Stichprobenverteilungen charakterisieren? Es sind in erster Linie Daten und wie bei jedem Datensatz kann man auch hier einen Mittelwert und eine Standardabweichung angeben. Die Standardabweichung der Stichprobenverteilung heißt Standardfehler und fasst den Einfluss der Variabilität (zufälliges Herausgreifen der Studierenden) zusammen.

wohnort_props_25 %>% 
  group_by(wohnort) %>% 
  summarise(prop_sd = sd(prop))
## # A tibble: 2 × 2
##   wohnort prop_sd
##   <chr>     <dbl>
## 1 land      0.102
## 2 stadt     0.102
wohnort_props_50 %>% 
  group_by(wohnort) %>% 
  summarise(prop_sd = sd(prop))
## # A tibble: 2 × 2
##   wohnort prop_sd
##   <chr>     <dbl>
## 1 land     0.0679
## 2 stadt    0.0679
wohnort_props_100 %>% 
  group_by(wohnort) %>% 
  summarise(prop_sd = sd(prop))
## # A tibble: 2 × 2
##   wohnort prop_sd
##   <chr>     <dbl>
## 1 land     0.0458
## 2 stadt    0.0458

Sie sehen, dass mit steigender Stichprobengröße der Standardfehler sinkt. Das ist intuitiv verständlich, denn je mehr Studierende wir (pro Wiederholung!) befragen, desto repräsentativer ist die Stichprobe.

Da dieses Kapitel so wichtig ist, gibt es ausnahmsweise vorformulierte Take-Home-Messages 😄:

  • Eine zufällige Stichprobe ist (meistens\(^*\)) der Königsweg, um repräsentative Informationen über die Grundgesamtheit zu bekommen.
  • Die Verteilung einer statistischen Kenngröße, die aus Zufallsstichproben ausgerechnet wurde, heißt Stichprobenverteilung. Um diese Verteilung zu bekommen, muss man wiederholt Stichproben erheben. Je mehr Stichproben man erhebt, desto genauer kann man die Stichprobenverteilung beschreiben.
  • Die Standardabweichung der Kenngröße, die durch die Stichprobenverteilung dargestellt wird, heißt Standardfehler.
  • Der Zufall macht sich durch eine Streuung (erfasst durch den Standardfehler) in der Stichprobenverteilung bemerkbar. Je größer die einzelnen Stichproben, desto kleiner der Standardfehler.

\(^*\): Manchmal ist die interessierte Größe in unterschiedlichen Untergruppen der Grundgesamtheit unterschiedlich verteilt. Z.B. könnten bestimmte Haltungen in der Bevölkerung gegenüber irgendwelchen Sachverhalten von Alter oder Bildungsstand oder Wohnort (Stadt vs. Land) abhängen. Dann sollte man sich überlegen, ob man statt einer zufälligen Stichprobe lieber eine geschichtete Zufallsstichprobe zieht, d.h. innerhalb dieser Kategorien zufällig beprobt.

7.4 Lesestoff

Kapitel 7 in Ismay and Kim (2021)

7.5 Aufgaben

7.5.1 Wahrer Wert in der Grundgesamtheit

Berechnen Sie die Anteile von Studierenden in der Grundgesamtheit, die in der Stadt bzw. auf dem Land leben. Wie gut waren die Schätzungen im Vergleich zum wahren Wert in der Grundgesamtheit?

7.5.2 Lohnt eine Station zum Ausleihen von Fahrrädern?

In unserem fiktiven Beispiel der Uni Werdeschlau geht es eigentlich darum, ob sich eine Station zum Parken und Reparieren (also eine Servicestation) von Fahrrädern lohnen würde. Daher ist die Frage interessant, wie viele Studierende mit dem Fahrrad zur Uni kommen. Wiederholen Sie die obige Analyse und ermitteln Sie statt der Anteile von Stadt- und Landbewohnern nun die Anteile der unterschiedlichen Verkehrsmittel. Die selbst definierte Funktion müssen Sie durch die folgende ersetzen.

calculate_props_verkehr <- function(grund_data = grundgesamtheit, befragung_size, befragung_reps = 1000) {
  
  befragung <- rep_sample_n(grund_data, size = befragung_size, replace = FALSE, reps = befragung_reps)

verkehrsmittel_props <- befragung %>% 
  group_by(replicate, verkehrsmittel) %>% 
  summarise(prop = n()/befragung_size)

verkehrsmittel_props
}

In der Lösung zu dieser Aufgabe erhalten Sie auch weitere Tipps zur Darstellung von Histogrammen und Dichtefunktionen 😎.

7.6 Ihre Arbeit einreichen

  • Speichern Sie Ihr Notebook ab.
  • Laden Sie Ihre .Rmd Datei in ILIAS hoch. Beachten Sie die Frist!
  • Sie erhalten die Musterlösung nach dem Hochladen.