Die Likelihood
Zeit: 10 min
Theorie: Die Passgenauigkeit von Daten und Hypothese
In der Statistik (aber auch im echten Leben) werten wir reale Beobachtungen aus. Die Likelihood, ausgedrückt als \(P(D|\theta)\), bewertet, wie gut gesammelte Daten \(D\) zu einer bestimmten theoretischen Annahme \(\theta\) passen. Sie beantwortet die Frage: Wie wahrscheinlich ist es, exakt die vorliegenden Daten \(D\) zu beobachten, falls die spezifische Hypothese \(\theta\) wahr wäre?
In der klassischen Statistik ist die Maximum Likelihood Methode das zentrale Werkzeug. Man sucht exakt den Parameter \(\theta\), der die beobachteten Daten \(D\) am wahrscheinlichsten macht. In der bayesianischen Statistik nutzen wir die Likelihood als entscheidenden Filter. Dieser bestimmt, mit welchen theoretischen Vorannahmen die gesammelten Daten am ehesten vereinbar sind.
Beispiel SmartRail: Testfahrten auswerten
Du führst fünf Testfahrten mit SmartRail auf der Pilotstrecke durch und misst, um wie viele Minuten sich die Verspätung im Vergleich zum alten System reduziert. Die gemessenen Reduktionen in Minuten lauten: 3, 7, 5, 9 und 6.
Diese fixierten Werte sind deine Daten \(D\). Sie verändern sich nicht mehr.
Wir testen nun verschiedene Hypothesen über die tatsächliche durchschnittliche Verspätungsreduktion durch SmartRail. Diese angenommene durchschnittliche Reduktion ist dein Parameter \(\theta\).
Nehmen wir an, SmartRail hat überhaupt keinen Effekt (\(\theta = 0\)). Wie wahrscheinlich ist es dann, in der Realität Reduktionen von 5 oder 9 Minuten zu beobachten (\(D\)), wenn das System gar nichts bewirkt? Extrem unwahrscheinlich. Die Likelihood \(P(D|\theta)\) unter der Hypothese \(\theta = 0\) ist praktisch null.
Verschieben wir die Hypothese auf eine durchschnittliche Reduktion von 6 Minuten (\(\theta = 6\)). Plötzlich passen die realen Datenpunkte \(D\) wesentlich besser zu unserer Annahme. Der Likelihood Wert \(P(D|\theta)\) schießt in die Höhe.
Deine Aufgabe
In der Applikation siehst du die fixierten SmartRail-Messwerte \(D\) als rote Markierungen auf der horizontalen Achse.
- Beobachten: Bewege den Schieberegler für deine Hypothese \(\theta\) (die blaue Kurve). Die Kurve zeigt, wo die Datenpunkte liegen müssten, wenn deine Hypothese stimmt.
- Analysieren: Setze die Hypothese \(\theta\) auf 1 Minute. Die Wahrscheinlichkeit, die roten Datenpunkte unter dieser blauen Glocke zu finden, ist eher gering. Der Likelihood Wert im unteren Diagramm fällt ab.
- Maximieren: Finde den Maximum Likelihood Schätzer manuell. Bewege den Regler so lange, bis die blaue Kurve die roten Punkte perfekt abdeckt und der Balken im unteren Diagramm seine maximale Höhe erreicht.
⏳ 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
from scipy.stats import norm
data_points = np.array([3, 7, 5, 9, 6])
app_ui = ui.page_fluid(
ui.card(
ui.card_header("SmartRail: Wie gut passt deine Hypothese zu den Messwerten?"),
ui.layout_columns(
ui.div(
ui.h5("Hypothese Theta testen"),
ui.input_slider("hypo_mean", "Wahre durchschnittliche Reduktion", 0, 15, 1, step=0.5),
ui.hr(),
ui.p("Bewege den Regler. Finde das Theta, das die roten SmartRail-Messwerte D am wahrscheinlichsten macht."),
),
ui.output_plot("likelihood_plot"),
col_widths=(4, 8)
)
)
)
def server(input, output, session):
@render.plot
def likelihood_plot():
mu_hypo = input.hypo_mean()
sigma_fixed = 4.0
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [2, 1]}, layout="constrained")
x_vals = np.linspace(-5, 18, 200)
y_vals = norm.pdf(x_vals, mu_hypo, sigma_fixed)
ax1.plot(x_vals, y_vals, color='#2980b9', linewidth=2, label=f"Hypothese Theta = {mu_hypo}")
ax1.fill_between(x_vals, 0, y_vals, color='#3498db', alpha=0.2)
ax1.scatter(data_points, np.zeros_like(data_points), color='#c0392b', s=100, zorder=5, label="Daten D")
for dp in data_points:
likelihood_of_dp = norm.pdf(dp, mu_hypo, sigma_fixed)
ax1.vlines(dp, 0, likelihood_of_dp, color='#e74c3c', linestyle='dotted', linewidth=1.5)
ax1.set_title("SmartRail-Messwerte D unter deiner Hypothese Theta")
ax1.set_xlim(-5, 18)
ax1.set_ylim(-0.005, 0.15)
ax1.set_yticks([])
ax1.set_ylabel("Wahrscheinlichkeitsdichte")
ax1.set_xlabel("Verspätungsreduktion (Minuten)")
ax1.legend(loc="upper right")
ax1.spines['top'].set_visible(False)
ax1.spines['right'].set_visible(False)
possible_mus = np.linspace(0, 15, 100)
max_likelihood = np.max([np.prod(norm.pdf(data_points, m, sigma_fixed)) for m in possible_mus])
current_likelihood = np.prod(norm.pdf(data_points, mu_hypo, sigma_fixed))
current_likelihood_norm = current_likelihood / max_likelihood
ax2.bar([0], [current_likelihood_norm], width=0.5, color='#2c3e50')
ax2.text(0, current_likelihood_norm + 0.04, f"{current_likelihood_norm:.2f}", ha='center', va='bottom', fontweight='bold')
ax2.set_title(f"Gesamte Likelihood P(D|Theta) für deine Hypothese Theta = {mu_hypo}")
ax2.set_ylabel("Likelihood Wert")
ax2.set_xlim(-1, 1)
ax2.set_ylim(0, 1.15)
ax2.set_xticks([])
ax2.spines['top'].set_visible(False)
ax2.spines['right'].set_visible(False)
return fig
app = App(app_ui, server)