Der Satz von Bayes ist ein grundlegendes Theorem in der Wahrscheinlichkeitsrechnung, das den Zusammenhang zwischen bedingten Wahrscheinlichkeiten beschreibt.
Der Satz von Bayes ist ein spannendes Werkzeug aus der Welt der Mathematik, das uns hilft, Wahrscheinlichkeiten zu verstehen und zu berechnen. Er wird in vielen Bereichen angewendet, von der Medizin über Künstliche Intelligenz bis hin zu Alltagssituationen. Aber was genau besagt dieser Satz, und warum ist er so nützlich?
Was ist der Satz von Bayes?
Der Satz von Bayes hilft uns, eine Wahrscheinlichkeit besser einzuschätzen, wenn wir neue Informationen erhalten. Stellen Sie sich vor, Sie wollen wissen, wie wahrscheinlich es ist, dass jemand eine bestimmte Krankheit hat, wenn ein Test positiv ausfällt. Es reicht nicht aus, nur zu wissen, wie zuverlässig der Test ist – Sie müssen auch wissen, wie oft die Krankheit in der Bevölkerung vorkommt.
Der Satz von Bayes gibt uns die Formel dafür:
Das sieht kompliziert aus, aber keine Sorge – wir gehen es Schritt für Schritt durch und erstellen auch ein Java-Beispiel dafür.
Ein einfaches Beispiel
Stellen Sie sich vor, in einer Stadt sind 1 % der Menschen krank (Prävalenz). Es gibt einen Test, der in 95 % der Fälle eine kranke Person korrekt erkennt (Sensitivität). Aber der Test ist nicht perfekt: Bei 5 % der gesunden Menschen zeigt er fälschlicherweise ein positives Ergebnis (Falsch-Positiv-Rate).
Wenn Sie nun positiv getestet werden, wollen Sie wissen: Wie wahrscheinlich bin ich tatsächlich krank? Da hilft der Satz von Bayes.
Wir müssen drei Dinge wissen:
1. Wie häufig ist die Krankheit? Das ist P(Krank) = 0,01 oder 1 %.
2. Wie zuverlässig ist der Test bei Kranken? P(Positiv∣Krank) = 0,95 oder 95 %.
3. Wie oft gibt es ein positives Ergebnis insgesamt? Das ist P(Positiv)
Der Satz von Bayes sagt uns:
Berechnung
Die Gesamtwahrscheinlichkeit für ein positives Testergebnis (P(Positiv)) setzt sich aus zwei Teilen zusammen:
Der Test erkennt eine kranke Person als positiv: P(Positiv∣Krank)⋅P(Krank)= 0,95⋅0,01 =0,0095
Der Test zeigt fälschlicherweise positiv bei einer gesunden Person: P(Positiv∣NichtKrank)⋅P(NichtKrank)=0,05⋅0,99=0,0495
Zusammen ergibt das:
P(Positiv)=0,0095+0,0495=0,059
Jetzt setzen wir alles in die Bayes-Formel ein:
P(Krank∣Positiv) = 0,95⋅0,010,059 ≈ 0,161
Das bedeutet: Wenn Sie positiv getestet wurden, liegt die Wahrscheinlichkeit, dass Sie tatsächlich krank sind, nur bei 16 %.
Was lernen wir daraus?
Das Ergebnis mag überraschend sein, vor allem weil der Test so zuverlässig klingt. Der Grund ist, dass die Krankheit insgesamt sehr selten ist. Selbst ein guter Test erzeugt bei vielen gesunden Menschen Falsch-Positive, wenn die Krankheit selten vorkommt.
Warum ist der Satz von Bayes wichtig?
Der Satz von Bayes hilft uns, besser mit Unsicherheiten umzugehen. In der Medizin zeigt er, dass Diagnosen immer im Zusammenhang mit der Häufigkeit einer Krankheit betrachtet werden müssen.
Auch in anderen Bereichen wird er genutzt:
Künstliche Intelligenz: Um Entscheidungen basierend auf Daten zu treffen.
Versicherungen: Um Risiken zu berechnen.
Kriminalistik: Um Wahrscheinlichkeiten für bestimmte Szenarien zu bewerten.
Der Satz von Bayes ist wie ein Werkzeug, das uns zeigt, wie wir unser Wissen durch neue Informationen aktualisieren können. Egal, ob es um Medizin, Statistik oder Alltagsfragen geht – mit diesem Satz verstehen wir Wahrscheinlichkeiten besser und können klügere Entscheidungen treffen.
Jetzt noch das versprochenen Java-Programm (im git repo), aus dem Beispiel, es kann auch leicht mit anderen Werten angepasst werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package de.wenzlaff.mathe; /** * Satz von Bayes. * * Aufruf: java StatzVonBayes 0.01 0.95 0.05 * * @author Thomas Wenzlaff * */ public class SatzVonBayes { /** * * @param args Parameter 1. Wahrscheinlichkeit, krank zu sein, 2. * Wahrscheinlichkeit, dass der Test bei Krankheit positiv ist 3. * Wahrscheinlichkeit, dass der Test fälschlicherweise positiv ist */ public static void main(String[] args) { if (args.length != 3) { System.out.println("Bitte geben Sie drei Parameter an, z.B. Aufruf: java StatzVonBayes 0.01 0.95 0.05"); System.out.println("1. Wahrscheinlichkeit, krank zu sein\n" + "2. Wahrscheinlichkeit, dass der Test bei Krankheit positiv ist\n" + "3. Wahrscheinlichkeit, dass der Test fälschlicherweise positiv ist"); return; } double prevalence = Double.parseDouble(args[0]); // 0.01; // Wahrscheinlichkeit, krank zu sein (1 %) double sensitivity = Double.parseDouble(args[1]); // 0.95; // Wahrscheinlichkeit, dass der Test bei Krankheit positiv ist double falsePositiveRate = Double.parseDouble(args[2]); // 0.05; // Wahrscheinlichkeit, dass der Test fälschlicherweise positiv ist double probabilityHealthy = 1 - prevalence; // Wahrscheinlichkeit, gesund zu sein double totalPositive = (sensitivity * prevalence) + (falsePositiveRate * probabilityHealthy); double probabilitySickGivenPositive = (sensitivity * prevalence) / totalPositive; double probabilitySickGivenPositivePercent = probabilitySickGivenPositive * 100; printResult(prevalence, sensitivity, falsePositiveRate, probabilitySickGivenPositivePercent); } private static void printResult(double prevalence, double sensitivity, double falsePositiveRate, double probabilitySickGivenPositivePercent) { System.out.printf("Wahrscheinlichkeit krank zu sein (prevalence): %.2f%%\n", prevalence); System.out.printf("Wahrscheinlichkeit, dass der Test bei Krankheit positiv ist (sensitivity): %.2f%%\n", sensitivity); System.out.printf("Wahrscheinlichkeit, dass der Test fälschlicherweise positiv ist (falsePositiveRate): %.2f%%\n", falsePositiveRate); System.out.printf("Ergebnis: Die Wahrscheinlichkeit, krank zu sein, wenn der Test positiv ist: %.2f%%\n", probabilitySickGivenPositivePercent); } } |
Hier das Baumdiagramm dazu, welches ich mit Python auf dem Mac generiert habe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#!/usr/bin/env python # Thomas Wenzlaff, kleinhirn.eu import matplotlib.pyplot as plt import networkx as nx # Erstelle den Baum als gerichteten Graphen G = nx.DiGraph() # Hinzufügen der Knoten G.add_node("Start") G.add_node("Krank (1%)") G.add_node("Gesund (99%)") G.add_node("Positiv (95%)") G.add_node("Negativ (5%)") G.add_node("Falsch Positiv (5%)") G.add_node("Richtig Negativ (95%)") # Hinzufügen der Verbindungen G.add_edge("Start", "Krank (1%)", weight=0.01) G.add_edge("Start", "Gesund (99%)", weight=0.99) G.add_edge("Krank (1%)", "Positiv (95%)", weight=0.95) G.add_edge("Krank (1%)", "Negativ (5%)", weight=0.05) G.add_edge("Gesund (99%)", "Falsch Positiv (5%)", weight=0.05) G.add_edge("Gesund (99%)", "Richtig Negativ (95%)", weight=0.95) # Position der Knoten im Baumdiagramm pos = { "Start": (0, 3), "Krank (1%)": (-1, 2), "Gesund (99%)": (1, 2), "Positiv (95%)": (-1.5, 1), "Negativ (5%)": (-0.5, 1), "Falsch Positiv (5%)": (0.5, 1), "Richtig Negativ (95%)": (1.5, 1), } # Erstellen der Graphen-Labels labels = { ("Start", "Krank (1%)"): "1%", ("Start", "Gesund (99%)"): "99%", ("Krank (1%)", "Positiv (95%)"): "95%", ("Krank (1%)", "Negativ (5%)"): "5%", ("Gesund (99%)", "Falsch Positiv (5%)"): "5%", ("Gesund (99%)", "Richtig Negativ (95%)"): "95%", } # die Labels mit Dezimalzahlen zusätzlich zu den Prozentwerten labels_decimal = { ("Start", "Krank (1%)"): "1% (0.01)", ("Start", "Gesund (99%)"): "99% (0.99)", ("Krank (1%)", "Positiv (95%)"): "95% (0.95)", ("Krank (1%)", "Negativ (5%)"): "5% (0.05)", ("Gesund (99%)", "Falsch Positiv (5%)"): "5% (0.05)", ("Gesund (99%)", "Richtig Negativ (95%)"): "95% (0.95)", } # Erstelle den Baum mit einer horizontalen Ausrichtung (links nach rechts) pos_horizontal = { "Start": (0, 0), "Krank (1%)": (1, 1), "Gesund (99%)": (1, -1), "Positiv (95%)": (2, 1.5), "Negativ (5%)": (2, 0.5), "Falsch Positiv (5%)": (2, -0.5), "Richtig Negativ (95%)": (2, -1.5), } # Zeichne den Graphen horizontal mit den neuen Labels plt.figure(figsize=(12, 6)) nx.draw(G, pos_horizontal, with_labels=True, node_size=3000, node_color="lightblue", font_size=10, font_weight="bold") nx.draw_networkx_edge_labels(G, pos_horizontal, edge_labels=labels_decimal, font_color="red") plt.title("Baumdiagramm für den Satz von Bayes") plt.show() |
Und die Vierfeldtafel um die Werte zu validieren:
mit diesem Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/usr/bin/env python # Thomas Wenzlaff, kleinhirn.eu import pandas as pd import matplotlib.pyplot as plt # Daten für die Vierfeldertafel data = { "": ["Positiver Test", "Negativer Test", "Summe"], "Krank (1%)": [0.0095, 0.0005, 0.01], "Gesund (99%)": [0.0495, 0.9405, 0.99], "Summe": [0.059, 0.941, 1.0] } # Erstelle die Tabelle table = pd.DataFrame(data) table.set_index("", inplace=True) # Erstellen und Anzeigen der Tabelle als Grafik fig, ax = plt.subplots(figsize=(8, 4)) ax.axis('tight') ax.axis('off') table_display = ax.table(cellText=table.values, colLabels=table.columns, rowLabels=table.index, loc='center', cellLoc='center') # Styling der Tabelle table_display.auto_set_font_size(False) table_display.set_fontsize(12) table_display.scale(1.2, 1.2) plt.title("Vierfeldertafel für den Satz von Bayes") plt.show() |
Alles mit der coolen matplotlib.