Schätzgenauigkeit und tolerierbarer Fehler
Zeit: 15 min
Theorie: Planung der perfekten Studie
Wissenschaft fordert Präzision. Bevor Daten gesammelt werden, muss die Stichprobengröße geplant werden. Simulationen zeigen präzise auf, ab welcher Datenmenge der tolerierbare Fehler beim Schätzen von Populationsparametern mit hoher Wahrscheinlichkeit nicht überschritten wird. Dies bedient direkt die harte Anforderung aus der Praxis an verlässliche Studienergebnisse.
Der Schätzfehler schrumpft mit wachsender Stichprobengröße. Er verhält sich jedoch in vielen Fällen asymptotisch nach dem Wurzelgesetz. Um den Fehler zu halbieren, musst du die Stichprobengröße vervierfachen. Diese unerbittliche mathematische Realität zwingt Forscher zur präzisen Planung vor Beginn jeder Datenerhebung.
Beispiel SmartRail: Wie viele Fahrten braucht die Pilotphase?
Die Deutsche Bahn plant die Pilotphase für SmartRail. Bevor das System bundesweit ausgerollt wird, muss die durchschnittliche Verspätungsreduktion verlässlich gemessen werden.
Der Vorstand fordert eine Schätzgenauigkeit von plus/minus 1.5 Minuten. Dieser Wert ist der tolerierbare Fehler. Das Projektteam muss nun exakt berechnen, wie viele ICE-Fahrten in der Pilotphase aufgezeichnet werden müssen, um diese Fehlermarge (Margin of Error) statistisch nicht zu überschreiten. Werden zu wenige Fahrten gemessen, ist die Pilotphase zu unpräzise und damit kaum brauchbar. Werden zu viele gemessen, verzögert sich der Rollout unnötig und es entstehen vermeidbare Kosten.
Deine Aufgabe
Die Applikation zeigt dir die Präzisionskurve. Die horizontale Achse ist die Anzahl der aufgezeichneten ICE-Fahrten. Die vertikale Achse ist der zu erwartende maximale Schätzfehler in Minuten für die durchschnittliche Verspätungsreduktion.
- Beobachten: Die blaue Kurve fällt am Anfang steil ab. Jede zusätzliche Fahrt bringt deutlich mehr Erkenntnisgewinn.
- Asymptote begreifen: Im rechten Bereich flacht die Kurve massiv ab. Hunderte neue Fahrten verringern den Fehler dort kaum noch.
- Planung durchführen: Verändere den für dich akzeptablen, tolerierbaren Fehler. Das System berechnet dir den exakten Schnittpunkt. Du liest ab, wie viele ICE-Fahrten du für eine belastbare Pilotphase zwingend benötigst.
⏳ 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: Planung der Pilotphase"),
ui.layout_columns(
ui.div(
ui.h5("Pilotdesign festlegen"),
ui.input_slider("max_error", "Tolerierbarer Fehler in Minuten", 0.5, 5.0, 1.5, step=0.1),
ui.hr(),
ui.p("Die natürliche Schwankung der ICE-Verspätung liegt bei SD = 8 Minuten. Die Kurve zeigt den maximalen Schätzfehler bei gegebener Anzahl aufgezeichneter Fahrten."),
),
ui.output_plot("precision_plot"),
col_widths=(4, 8)
)
)
)
def server(input, output, session):
@render.plot
def precision_plot():
max_error = input.max_error()
sd = 8.0
n_vals = np.arange(10, 1001, 1)
# Maximaler Schätzfehler (Margin of Error) für 95 Prozent Konfidenz
error_vals = 1.96 * (sd / np.sqrt(n_vals))
# Finde benötigte Fahrtenanzahl
required_n_idx = np.where(error_vals <= max_error)[0]
if len(required_n_idx) > 0:
optimal_n = n_vals[required_n_idx[0]]
optimal_error = error_vals[required_n_idx[0]]
else:
optimal_n = 1000
optimal_error = error_vals[-1]
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(n_vals, error_vals, color='#2980b9', linewidth=3, label='Erwarteter Schätzfehler')
ax.axhline(max_error, color='#e74c3c', linestyle='dotted', linewidth=2, label=f'Tolerierbarer Fehler ({max_error} Min)')
if len(required_n_idx) > 0:
ax.axvline(optimal_n, color='#34495e', linestyle='solid', linewidth=2)
ax.scatter([optimal_n], [optimal_error], color='#c0392b', s=150, zorder=5)
ax.text(optimal_n + 20, optimal_error + 0.3, f'Benötigte Fahrten: {optimal_n}', color='#2c3e50', fontweight='bold', fontsize=12)
ax.fill_between(n_vals[required_n_idx[0]:], 0, error_vals[required_n_idx[0]:], color='#27ae60', alpha=0.2)
ax.set_title("Abnehmender Grenznutzen zusätzlicher Testfahrten", fontweight='bold')
ax.set_xlabel("Anzahl der ICE-Fahrten in der Pilotphase")
ax.set_ylabel("Maximaler Schätzfehler in Minuten")
ax.set_xlim(0, 1000)
ax.set_ylim(0, 6)
ax.legend(loc="upper right")
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
return fig
app = App(app_ui, server)