Von der Stichprobe zur Population
Zeit: 15 min
Theorie: Die Suche nach der absoluten Wahrheit
In der empirischen Forschung messen wir fast nie die gesamte Population. Wir ziehen eine Stichprobe. Das Ziel ist es, von dieser kleinen, messbaren Gruppe auf die absolute Wahrheit in der Grundgesamtheit zu schließen.
Zwei Faktoren bestimmen maßgeblich, ob diese Schätzung gelingt: Die Repräsentativität und die Stichprobengröße. Eine systematisch verzerrte Stichprobe liefert immer falsche Ergebnisse, egal wie groß sie ist. Doch selbst bei absolut perfekter Repräsentativität schwankt das gemessene Ergebnis durch reinen Zufall. Erst mit zunehmender Stichprobengröße schrumpft dieser unvermeidbare Zufallsfehler. Die Schätzung konvergiert gegen die wahre Populationswahrheit.
Beispiel SmartRail: Die trügerische Stichprobe
Die Deutsche Bahn will wissen, wie stark SmartRail die durchschnittliche Verspätung im gesamten ICE-Fernverkehr reduziert. Der wahre, noch unbekannte Effekt über alle Strecken und Tageszeiten hinweg liegt bei durchschnittlich 2.5 Minuten Verspätungsreduktion pro Fahrt.
Wertet das Projektteam nur 20 zufällig ausgewählte Fahrten aus, ist das Ergebnis recht ungenau. Das heißt, eine andere zufällig gezogene Stichprobe mit 20 Fahrten könnte ein deutlich anderes Ergebnis liefern. Eine Stichprobe zeigt vielleicht 0.8 Minuten Verbesserung im Durchschnitt, eine andere 4.2 Minuten. Die Schätzung springt wild umher und zeigt, dass eine so kleine Studie für eine verlässliche Bewertung des Systems wenig brauchbar ist. Wertet das Team hingegen 500 oder 1000 Fahrten aus, greift das Gesetz der großen Zahlen. Die gemessene Verspätungsreduktion pendelt sich sehr eng um den echten Durchschnitt von 2.5 Minuten ein. wilden Schwankungen nehmen deutlich ab.
Deine Aufgabe
Die Applikation simuliert 100 unabhängige , wiederholt durchgeführte Studien gleichzeitig. Jede Studie zieht eine zufällige Stichprobe von ICE-Fahrten und berechnet die durchschnittliche Verspätungsreduktion durch SmartRail. Der wahre Effekt über das gesamte Netz ist als feste rote Linie bei 2.5 Minuten markiert.
- Beobachten: Belasse den Regler bei einer kleinen Stichprobengröße von 20 ausgewerteten Fahrten pro Studie. Das graue Histogramm zeigt dir die Ergebnisse aller 100 Studien (Die Verteilung der 100 Mittelwerte). Die gemessenen Werte streuen extrem breit über die horizontale Achse.
- Datenmasse erhöhen: Schiebe den Regler schrittweise auf 500 oder mehr ausgewertete Fahrten pro Studie hoch.
- Konvergenz begreifen: Die Verteilung der Ergebnisse konzentriert sich nun auf einen viel kleineren Wertebereich. Die Unsicherheit nimmt deutlich ab. Du triffst die wahre rote Linie nun mit fast jeder einzelnen möglichen Studie sehr präzise.
⏳ Die Anwendung wird geladen, dies kann bis zu 30 Sekunden dauern.
#| '!! shinylive warning !!': |
#| shinylive does not work in self-contained HTML documents.
#| Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 650
from shiny import App, render, ui
import numpy as np
import matplotlib.pyplot as plt
app_ui = ui.page_fluid(
ui.card(
ui.card_header("SmartRail: Schätzung der wahren Verspätungsreduktion"),
ui.layout_columns(
ui.div(
ui.h5("Stichproben Parameter"),
ui.input_slider("n_sample", "Ausgewertete ICE-Fahrten pro Stichprobe", 10, 1000, 20, step=10),
ui.hr(),
ui.p("Wir simulieren 100 parallele Studien. Die wahre Verspätungsreduktion durch SmartRail über das gesamte ICE-Netz liegt bei durchschnittlich 2.5 Minuten pro Fahrt."),
),
ui.output_plot("sample_plot"),
col_widths=(4, 8)
)
)
)
def server(input, output, session):
@render.plot
def sample_plot():
n = input.n_sample()
true_effect = 2.5
sd = 5.0
n_evaluations = 100
np.random.seed(42)
# 100 Studien simulieren, jede misst n Fahrten
samples = [np.random.normal(true_effect, sd, n) for _ in range(n_evaluations)]
measured_means = [np.mean(s) for s in samples]
fig, ax = plt.subplots(figsize=(10, 6))
ax.hist(measured_means, bins=15, color='#7f8c8d', alpha=0.8, edgecolor='white')
ax.axvline(true_effect, color='#e74c3c', linestyle='solid', linewidth=3, label='Wahre Verspätungsreduktion (2.5 Min)')
ax.set_title(f"Ergebnisse von 100 Studien (je {n} ICE-Fahrten)")
ax.set_xlabel("Gemessene Verspätungsreduktion in Minuten")
ax.set_ylabel("Anzahl der Studien")
ax.set_xlim(-3, 8)
ax.legend(loc="upper right")
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
return fig
app = App(app_ui, server)