Aus Linux-Magazin 07/2015

Bei statistischen Überlegungen führt die Intuition zuweilen in die Irre

© Sergey Hmelevskih, 123RF.com

Selbst gestandenen Wissenschaftlern unterlaufen zuweilen Fehler beim Interpretieren von Statistiken. Mathematische Experimente können helfen, sich dagegen zu wappnen, und kleine Simulationen in Perl unterstützen den Lernprozess anschaulich

Drückt man einem Mensch-ärgere-dich-nicht-Spieler einen neuen Würfel in die Hand, mit dem er bei den ersten drei Würfen jeweils eine Eins erzielt, wird er vielleicht stutzig und die Seitenflächen kontrollieren (Abbildung 2). Dabei verlässt er sich auf sein Gefühl – doch wann könnte man wissenschaftlich nachweisen, dass mit einem Würfel etwas nicht stimmt? Nach fünf Würfen, die alle Einsen zeigen? Nach zehn?

Abbildung 2: Diese in Las Vegas erworbenen Würfel liefern nur gewinnträchtige Zahlenkombinationen.

Abbildung 2: Diese in Las Vegas erworbenen Würfel liefern nur gewinnträchtige Zahlenkombinationen.

Jedes Würfelexperiment ist ein Spiel mit Wahrscheinlichkeiten. Was dabei genau herauskommt, ist ein Produkt des Zufalls. Relevant ist dabei nicht der genaue Ausgang eines bestimmten Wurfs, sondern die Tendenz. Ein unglücklicher Brettspieler könnte auch mit einem regulären Würfel durchaus dreimal hintereinander eine Eins werfen. Solche Zufälle kommen zwar selten vor, aber es gibt sie, und deswegen wäre anzuraten, nicht schon aus derart wenigen Durchläufen Folgerungen über den Würfel abzuleiten.

Ein Wert namens “p”

Der Wissenschaftler definiert für das Experiment eine so genannte Nullhypothese (zum Beispiel: “Der Würfel ist fair” oder “Das Medikament zeigt keine Wirkung”), die aufgrund des Testergebnisses später entweder bestätigt oder verworfen wird. Den Irrtum, eine richtige Nullhypothese zu verwerfen, nennt der Statistiker einen “Fehler erster Art”. Experimente legen vorab fest, mit welcher maximalen Wahrscheinlichkeit sie das Auftreten dieses Fehlers gerade noch akzeptieren, dieser Wert nennt sich Signifikanzniveau des Experiments.

Der so genannte p-Wert (Abbildung 1, [2]) ist ein Wahrscheinlichkeitswert zwischen 0 und 1, der sich während des Experiments berechnen lässt und der angibt, wie wahrscheinlich es ist, das gefundene oder ein noch extremeres Ergebnis zu erhalten. Je kleiner der p-Wert, desto signifikanter war der Test, und die Nullhypothese ist mit hoher Wahrscheinlichkeit falsch.

Abbildung 1: Der p-Wert gibt die Wahrscheinlichkeit an, mit der das Experiment noch "extremere" Werte als die gefundenen zeigt.

Abbildung 1: Der p-Wert gibt die Wahrscheinlichkeit an, mit der das Experiment noch “extremere” Werte als die gefundenen zeigt.

Zeigt eine 20-mal geworfene Münze zum Beispiel 14-mal Kopf (10-mal wäre zu erwarten), liegt der p-Wert mit 0,115 laut [2] noch gut über dem in wissenschaftlichen Kreisen üblichen Schwellenwert von 5 Prozent (0,05). Das Experiment kann die Nullhypothese (“Der Würfel ist fair”) also guten Gewissens akzeptieren und hat mit maximal 5 Prozent Irrtumswahrscheinlichkeit belegt, dass die Münze erwartungsgemäß fällt. Wäre bei 20 Würfen nicht nur 14-, sondern gleich 15-mal Kopf vorgekommen, wäre der p-Wert mit 0,041 unter die 5-Prozent-Marke abgesackt und die Nullhypothese sowie die Qualität der Münze wären damit auf einmal fragwürdig erschienen.

Irren ist menschlich

Das Perl-Skript in Listing 1 wirft eine faire Münze mit den Seiten H (für Heads, Kopf) und T (für Tails, die Zahl-Seite) insgesamt 1000-mal und addiert dann, wie oft der Kopf oben lag. Daraus erechnet die Funktion »p_value()« ab Zeile 23 dann den p-Wert. Die Ausgabe des Skripts hilft bei der Entscheidung, ob die Münze regulär fiel oder eine Anomalie vorliegt:

Listing 1

coin-toss

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Math::BigFloat;
04
05 my @sides  = qw( H T );
06 my $rounds = 1000;
07 my $tails  = 0;
08
09 for ( 1 .. $rounds ) {
10   my $side = $sides[ rand scalar @sides ];
11
12   if( $side eq "T" ) {
13     $tails++;
14   }
15 }
16
17 printf "Rounds:  $rounds\n";
18 printf "Tails:   $tails\n";
19 printf "p-value: Prozentf\n",
20   p_value( $tails, $rounds/2, $rounds );
21
22 ###########################################
23 sub p_value {
24 ###########################################
25   my( $tails, $expect, $rounds ) = @_;
26
27   my @vals = ( $tails < $expect ?
28                ( 1 .. $tails ) :
29                ( $tails .. $rounds ) );
30
31   my $sum = Math::BigFloat->new( 0 );
32
33   for my $val ( @vals ) {
34     my $nok =
35       Math::BigFloat->new( $rounds );
36     $nok->bnok( $val );
37     $sum->badd( $nok );
38   }
39
40   my $total = Math::BigFloat->new( 2 );
41   $total->bpow( $rounds );
42
43   return 2 *
44     $sum->bdiv( $total )->numify();
45 }
$ ./coin-toss
Rounds:  1000
Tails:   507
p-value: 0.182979

Bei 1000 Würfen kam also 507-mal Kopf, der p-Wert beträgt 0,18 und liegt solide über dem Schwellenwert von 5 Prozent. Damit lässt sich die Nullhypothese guten Gewissens akzeptieren.

Das Skript wählt aus dem Array »@sides« in jeder der 1000 Runden zufällig eines der beiden Symbole »H« oder »T« aus und legt damit fest, ob die Münze Kopf oder Zahl zeigt. Im letzteren Fall erhöht sie den Zähler »$tails« in Zeile 13 um 1 für die spätere Auswertung.

Suche nach Extremen

Wie berechnet sich der p-Wert? Kommt im Experiment bei zehn Würfen 7-mal Kopf, wäre ein noch extremeres Ergebnis zweifellos, wenn 8-, 9- oder gar 10-mal Kopf gekommen wäre. Da die Münze symmetrisch ist und auch 8-, 9- oder 10-mal Zahl “extremer” wäre, bezieht der p-Wert diese ebenfalls mit ein. Die Wahrscheinlichkeit, dass sich bei einem binominalverteilten Experiment mit einem n-maligen Münzwurf k-mal Kopf oder Zahl zeigt, berechnet sich aus dem Binominalkoeffizienten (nk) dividiert durch die Gesamtzahl der Kombinationen, also 2n.

Die Funktion »p_value()« ab Zeile 23 nutzt zur Berechnung des Binominalkoeffizienten sowie der anschließenden Division das CPAN-Modul Math::BigFloat, denn bei den erforderlichen Schritten ergeben sich bei längeren Experimenten Zahlenwerte, die die Floating-Point-Kapazität der meisten Rechner weit übersteigen. Math::BigFloat dagegen rechnet beliebig genau, auch wenn Werte mit vielen Tausend Stellen entstehen.

Den Binominalkoeffizienten (nk) ermittelt die Methode »bnok()« in Zeile 36, während Zeile 37 das Teilergebnis mit »badd()« kumuliert. Liegt das Ergebnis unter dem Erwartungswert (also zum Beispiel 10 bei 20 Würfen), sucht der Algorithmus extremere Werte links davon (also aufsteigend von 1, 2 … bis zu dem im Experiment gesehenen Wert). Liegt der Experimentwert hingegen auf der rechten Seite der Glockenkurve, zählt er von diesem Wert bis zum Maximalwert hoch. In beiden Fällen multipliziert Zeile 43 wegen der Symmetrie des Experiments (Kopf oder Zahl sind austauschbar) noch mit »2« .

Schiefe Münze fällt auf

Um zu simulieren, was mit einer ungleichmäßigen (verformten, verbogenen) Münze passieren würde, die etwas häufiger Zahl als Kopf zeigt, fügen Experimentierfreudige in Zeile 5 von Listing 1 noch einige weitere Münzenseiten ein:

my @sides  = qw( H H H T T T T );

Von sieben Würfen zeigt die Münze dann im Schnitt 3-mal Kopf »H« und 4-mal Zahl »T« , das Skript rechnet entsprechend (mit zufälligen Abweichungen) etwa als p-Wert aus:

$ Rounds: 1000
Tails:    565
p-value:  0.0351

Der p-Wert liegt bei etwa 0,04 Prozent, also weit unter der vorgegebenen 5-Prozent-Grenze für den Signifikanzwert. Er bringt die Nullhypothese, dass die Münze mit gleicher Wahrscheinlichkeit auf beide Seiten fällt, gehörig ins Wanken.

Aufpassen bei Diagnose

Experimente, die neue Medikamente oder Behandlungsprozeduren auf ihre Wirksamkeit testen, definieren die Nullhypothese als “Das Mittel ist wirkungslos”, setzen den Signifikanzwert auf etwa 5 Prozent und schlagen dann Alarm, wenn der p-Wert im Experiment darunter absackt, also plötzlich gute Gründe für die Annahme vorliegen, dass die Nullhypothese falsch ist. Das geprüfte Wundermittel zeigt in diesem Fall mit guter Wahrscheinlichkeit tatsächliche Behandlungserfolge.

Allerdings ist es laut [3] gang und gäbe, dass Studien diesen Signifikanzwert abschließend falsch bewerten und der Patient sich falsche Hoffnungen macht oder grundlos in Panik verfällt. Diese so genannten Basisratenfehler oder auch Prävalenzfehler [4] kommen in Verbindung mit bedingten Wahrscheinlichkeiten vor und bestehen darin, dass missachtet wird, dass ein bestimmtes Ereignis schon von sich aus (a priori) eine bestimmte Wahrscheinlichkeit hat, die in die Rechnung einfließen müsste.

Folgendes Experiment aus [3] zeigt die für viele erstaunliche Abweichung zwischen landläufiger Meinung und exakter Wissenschaft: Eine Mammografie stellt bei Patientinnen mit Brustkrebs mit 90-prozentiger Wahrscheinlichkeit die richtige Diagnose. Allerdings stellt der Test bei etwa 7 Prozent gesunder Patientinnen ebenfalls die Diagnose Brustkrebs, sodass bei einem positiven Befund weitere Diagnoseverfahren zur Klärung nötig sind. Nun die Frage: Ist dieser Test geeignet, um die Bevölkerung effektiv auf Brustkrebs zu testen? Falls die Mammografie Brustkrebs erkennt, wie hoch ist dann die Wahrscheinlichkeit, dass eine zufällig ausgewählte Frau tatsächlich Brustkrebs hat?

Die meisten Leute würden kurz überlegen, dann im Kopf die 7 Prozent Fehlerrate von 100 Prozent abziehen und bei etwa 93 Prozent landen. Aber das ist grundfalsch. Was ist das richtige Ergebnis? 70 Prozent vielleicht? 50 Prozent gar? Die verblüffende Wahrheit: Die Wahrscheinlichkeit, dass eine Mammografie bei einer zufällig ausgewählten Frau richtig auf Brustkrebs erkennt, liegt bei nur etwa 9 Prozent.

Verblüffende Statistik

Wer im Experiment in Gedanken eben bei einer zu hohen Testgenauigkeit angelangt war, der hat vermutlich den typischen Prävalenzfehler begangen und vergessen in die Berechnung mit einzubeziehen, dass im Durchschnitt der Bevölkerung nur etwa 0,8 Prozent der Frauen Brustkrebs haben.

Von 1000 Frauen haben also 992 Frauen keinen Brustkrebs, für die liefert die Mammografie in 7 Prozent der Fälle die falsche Diagnose, also bekommen 70 getestete Frauen ein inkorrektes Ergebnis. Von den acht Frauen mit Brustkrebs diagnostiziert der Test die Erkrankung bei sieben korrekt. Ergebnis: Von 77 Brustkrebsbefunden durch die Mammografie sind nur 7 korrekt, also etwa 9 Prozent. Bei dieser geringen Trefferrate ist davon abzuraten, flächendeckend zu testen, es sollten nur bestimmte Risikogruppen einbezogen werden, bei denen ein schlechter Test immer noch besser ist als gar keiner.

Skript infiziert

Listing 2 simuliert das Experiment in Perl. In einem Array mit 1000 Frauen, deren Gesundheitszustand zunächst in Zeile 12 mit »0« auf “ohne Befund” gesetzt wird, bringt die Funktion »infect()« ab Zeile 50 zufällig verteilt 8 Einsen ein, simuliert also die 0,8 Prozent von Frauen mit Brustkrebs in der allgemeinen Bevölkerung. Dazu mischt Zeile 55 mit der Funktion »shuffle()« aus dem CPAN-Modul Algorithm::Shuffle nach dem Fisher-Yates-Verfahren einen Array mit Indexnummern des Patientenarray und zieht dann insgesamt acht heraus. An diesen Stellen modifiziert die Funktion das Array.

Listing 2

base-rate

01 #!/usr/bin/perl -w
02 use strict;
03 use Data::Dumper;
04 use Algorithm::Numerical::Shuffle
05   qw( shuffle );
06
07 my $nof_patients  = 1000;
08 my $nof_infects   = 8;
09 my $tested_pos    = 0;
10 my $tested_corr   = 0;
11
12 my @patients = ( 0 ) x $nof_patients;
13
14 infect( \@patients, $nof_infects );
15
16 while( $tested_pos != 100000 ) {
17
18   my $patient =
19     $patients[ rand $nof_patients ];
20   my $result = examine( $patient );
21
22   next if !$result;
23
24   $tested_pos++;
25
26     # diagnosis correct?
27   $tested_corr++ if $patient;
28 }
29
30 printf "Test score: Prozent3.2fProzentProzent\n",
31   $tested_corr / $tested_pos * 100.0;
32
33 ###########################################
34 sub examine {
35 ###########################################
36   my( $patient ) = @_;
37
38   my $rand = int rand 100;
39
40   if( $patient ) {
41       # 90Prozent detection rate
42     return $rand < 90 ? 1 : 0;
43   } else {
44       # 7Prozent false positive
45     return $rand < 7 ? 1 : 0;
46   }
47 }
48
49 ###########################################
50 sub infect {
51 ###########################################
52   my( $patients, $howmany ) = @_;
53
54   my @rand_indices =
55     shuffle ( 0 .. $#$patients );
56   while( $howmany-- ) {
57     $patients[ shift @rand_indices ] = 1;
58   }
59 }

Das Experiment läuft über die While-Schleife in Zeile 16 so lange, bis die Mammografie 100000 positive Befunde ausgespuckt hat, jeweils eingeleitet durch die Funktion »examine()« ab Zeile 34 mit dem (zu Testzwecken) vorab bekannten Gesundheitszustand der Patientin. Die Diagnose berücksichtigt Fehler erster (10 Prozent) und zweiter Art (7 Prozent) und gibt bei positivem Befund einen wahren, bei negativem Befund einen nicht-wahren Wert ans Hauptprogramm zurück. Das Ergebnis kann der Perl-Enthusiast nach dem Aufruf des Skripts erfahren:

$ ./base-rate
Test score: 9.26Prozent

Das Perl-Skript bestätigt also die vorherige Überlegung zur Zuverlässigkeit des Tests bei einer Personengruppe, in der der Anteil an wahren positiven Befunden klein ist. Statt nur flüchtig auf Zahlen zu schauen, wäre es auch hier besser, eine zweite Meinung einzuholen.

Online PLUS

Im Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/Ausgaben/2015/07/plus

Infos

  1. Listings zu diesem Artikel: ftp://www.linux-magazin.de/pub/listings/magazin/2015/07/Perl
  2. p-Wert: http://de.wikipedia.org/wiki/P-Wert
  3. Alex Reinhart “Statistics Done Wrong: The Woefully Complete Guide”: No Starch Press, 2015
  4. Prävalenzfehler (“Base Rate Fallacy”): http://de.wikipedia.org/wiki/Prävalenzvalenzfehler

Der Autor

Michael Schilli arbeitet als Software-Engineer in der San Francisco Bay Area in Kalifornien. In seiner seit 1997 laufenden Kolumne forscht er jeden Monat nach praktischen Anwendungen der Skriptsprache Perl. Unter mailto:mschilli@perlmeister.com beantwortet er gerne Fragen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben