Wahrscheinlichkeitsbegriffe
Zeit: ca. 10 min
Warum Wahrscheinlichkeit?
Jeden Tag triffst du Entscheidungen unter Unsicherheit. Kommt dein Zug heute pünktlich an? Lohnt es sich, am Bahnsteig zu warten, oder gehst du lieber zu Fuß? Da wir die Zukunft (leider) nicht mit Gewissheit vorhersehen können, möchten wir stattdessen die Unsicherheit in unserer vorhersage greifbar machen. Genau hier setzt die Statistik an. Sie hilft uns dabei, aus vergangenen Beobachtungen auf zukünftige Ereignisse zu schließen.
Bevor wir jedoch Daten analysieren, müssen wir klären, worauf genau sich die Wahrscheinlichkeit bezieht. In der Wissenschaft existieren dazu zwei grundlegend verschiedene Ansichten.
Zwei Welten der Wahrscheinlichkeit
Der frequentistische Ansatz Hier wird Wahrscheinlichkeit als der Grenzwert relativer Häufigkeiten bei unendlich vielen Wiederholungen definiert. Wenn die Deutsche Bahn angibt, ein Zug sei zu 80 % pünktlich, bedeutet das im klassischen Sinne Folgendes: Würde exakt dieser Zug unter exakt denselben Bedingungen unendlich oft fahren, wäre er in 80 % der Fälle pünktlich. Über deine heutige, einmalige Fahrt um 14 Uhr lässt sich damit streng genommen keine Wahrscheinlichkeitsaussage treffen.
Der bayesianische Ansatz Hier ist Wahrscheinlichkeit ein Maß für den Grad der persönlichen Überzeugung, basierend auf dem aktuellen Informationsstand. Im bayesianischen Sinne lautet die Aussage: Basierend auf meinen bisherigen Erfahrungen mit dieser Strecke und dem aktuellen Wetter bin ich mir zu 80 % sicher, dass mein heutiger Zug pünktlich ankommt. Hier lässt sich also eine direkte Aussage über die Unsicherheit bezüglich eines einmaligen Ereignisses treffen, was sowohl im Alltag als auch in der Wissenschaft oft intuitiver und nützlicher ist.
Warum ist diese Unterscheidung wichtig? Klassische frequentistische Metriken wie p-Werte oder Konfidenzintervalle sind oft unintuitiv. Ein 95-%-Konfidenzintervall bedeutet nicht, dass der wahre Wert mit 95 % Wahrscheinlichkeit in diesem Intervall liegt. Es beschreibt lediglich die langfristige Erfolgsquote des Verfahrens: Würde man das Experiment unendlich oft wiederholen, würden 95 % der so berechneten Intervalle den fixen, wahren Wert einschließen. Die bayesianische Statistik erlaubt hingegen direkte und leicht verständliche Wahrscheinlichkeitsaussagen über unsichere Ereignisse in der realen Welt.
Beispiel SmartRail: Pünktlichkeit auf der Pilotstrecke
Die Deutsche Bahn testet SmartRail auf der Pilotstrecke München–Stuttgart. Das System steuert Signale und Weichen in Echtzeit und soll die Pünktlichkeit deutlich verbessern. Die wahre Pünktlichkeitsquote unter SmartRail liegt bei 85 %, als Analyst kennen wir diesen Wert jedoch nicht. Wir sehen nur Stichproben einzelner Fahrten..
In einer ersten Stichprobe beobachten wir 10 SmartRail-Fahrten. Davon sind 7 pünktlich. Die beobachtete Quote beträgt also: 7 von 10 Fahrten waren pünktlich — das entspricht 70 %. In einer zweiten Stichprobe sind 9 von 10 Fahrten pünktlich. Die beobachtete Quote beträgt nun: 9 von 10 Fahrten waren pünktlich — das entspricht 90 %.
Das Beispiel zeigt: Bei kleinen Datenmengen kann die beobachtete Quote stark schwanken. Eine reine Punktschätzung beschreibt zwar die jeweilige Stichprobe, sagt aber allein noch wenig darüber aus, wie unsicher wir über die wahre Pünktlichkeitsquote sind. Hier unterscheiden sich die beiden Sichtweisen auf Wahrscheinlichkeit:
Frequentistisch betrachtet ist die wahre Pünktlichkeitsquote ein fester, aber unbekannter Wert. Die Unsicherheit liegt in den Stichproben: Würden wir den Test viele Male wiederholen, erhielten wir unterschiedliche beobachtete Quoten. Diese Stichprobenunsicherheit lässt sich zum Beispiel mit einem Konfidenzintervall ausdrücken.
Bayesianisch betrachtet wird unser Wissen über die unbekannte Pünktlichkeitsquote durch eine Wahrscheinlichkeitsverteilung beschrieben. Wir starten mit einer breiten Vorannahme und aktualisieren diese mit jeder beobachteten Fahrt. Nach 10 Fahrten erhalten wir daher nicht nur einen einzelnen Schätzwert, sondern eine Posterior-Verteilung. Diese Verteilung zeigt direkt, welche Werte für die wahre SmartRail-Pünktlichkeit nach den beobachteten Daten plausibel sind — und wie groß die verbleibende Unsicherheit ist.
Deine Aufgabe
Die Applikation simuliert die Überwachung von SmartRail auf der Pilotstrecke.
- Beobachten: Klicke wiederholt auf den Button. Jeder Klick beobachtet neue SmartRail-Fahrten und fügt sie den bisherigen hinzu (mit dem Schieberegler stellst du ein, wie viele Fahrten pro Klick dazukommen). Die frequentistische Sicht (links) zeigt den aktuellen Anteil pünktlicher Fahrten über alle bisher beobachteten Fahrten. Bei wenigen Fahrten schwankt dieser Wert nach jedem Klick deutlich.
- Verstehen: Die bayesianische Sicht (rechts) zeigt eine Kurve. Diese Kurve repräsentiert deinen Grad der Überzeugung über SmartRails wahre Pünktlichkeitsquote. Sie beginnt breit (hohe Unsicherheit) und wird mit jeder beobachteten Fahrt schmaler (höhere Gewissheit).
- Auswerten: Sammle durch wiederholtes Klicken viele Fahrten (oder erhöhe die Fahrten pro Klick). Bei sehr vielen Beobachtungen liefern beide Ansätze ein ähnliches Ergebnis: Der Balken links und der Hochpunkt der Kurve rechts nähern sich beide dem wahren Wert. Der Weg dorthin und die Interpretation der Unsicherheit unterscheiden sich jedoch fundamental. Mit „Zurücksetzen” startest du von vorne.
⏳ 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: 600
from shiny import App, render, ui, reactive
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
app_ui = ui.page_fluid(
ui.card(
ui.card_header("SmartRail: Pünktlichkeit auf der Pilotstrecke"),
ui.layout_columns(
ui.div(
ui.h5("Steuerung"),
ui.input_slider("step", "Fahrten pro Klick", 1, 50, 1, step=1),
ui.input_action_button("sim_btn", "Fahrten beobachten", class_="btn-primary"),
ui.input_action_button("reset_btn", "Zurücksetzen", class_="btn-outline-secondary"),
ui.hr(),
ui.p("Jeder Klick beobachtet neue SmartRail-Fahrten und fügt sie den bisherigen hinzu."),
ui.p("Die wahre, dir unbekannte Pünktlichkeitsquote unter SmartRail liegt bei 85 %."),
),
ui.output_plot("prob_plot"),
col_widths=(3, 9)
)
)
)
def server(input, output, session):
data = reactive.Value(np.array([], dtype=int))
@reactive.Effect
@reactive.event(input.sim_btn)
def add_trains():
new = np.random.binomial(1, 0.85, input.step())
data.set(np.concatenate([data.get(), new]))
@reactive.Effect
@reactive.event(input.reset_btn)
def reset_trains():
data.set(np.array([], dtype=int))
@render.plot
def prob_plot():
trains = data.get()
n = len(trains)
on_time = int(np.sum(trains))
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), layout="constrained")
# Frequentistisch: aktueller Anteil pünktlicher Fahrten
if n > 0:
freq_est = on_time / n
ax1.bar(["Aktuelle Quote"], [freq_est], color="#3498db")
ax1.set_title(f"Frequentistisch\n{on_time} von {n} Fahrten pünktlich ({freq_est:.2f})")
else:
ax1.text(0.5, 0.5, "Noch keine\nFahrten beobachtet",
ha="center", va="center", color="#7f8c8d", transform=ax1.transAxes)
ax1.set_title("Frequentistisch\n0 von 0 Fahrten")
ax1.axhline(0.85, color="#e74c3c", linestyle="dotted", label="Wahrer Wert")
ax1.set_ylim(0, 1)
ax1.legend()
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
# Bayesianisch: Posterior bei flachem Prior Beta(1, 1)
x = np.linspace(0, 1, 200)
alpha_post = 1 + on_time
beta_post = 1 + (n - on_time)
y = beta.pdf(x, alpha_post, beta_post)
ax2.plot(x, y, color="#2ecc71", linewidth=2)
ax2.fill_between(x, 0, y, color="#2ecc71", alpha=0.3)
ax2.axvline(0.85, color="#e74c3c", linestyle="dotted")
kurve = "Prior (noch keine Daten)" if n == 0 else f"Posterior nach {n} Fahrten"
ax2.set_title(f"Bayesianisch\n{kurve}")
ax2.set_xlabel("Mögliche Pünktlichkeitsquote SmartRail")
ax2.set_xlim(0, 1)
ax2.set_ylim(bottom=0)
ax2.set_yticks([])
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
return fig
app = App(app_ui, server)