________________________________________________________________________________
Inhalt....: Animation der Binomialverteilung, Approximation durch die Gaußfunktion
Mathematik: Statistik, Stochastik
MuPAD.....: 3.1.1
Datum.....: 2005-11-12
Autoren...: Christian Koch <christian@koch-bensheim.de>
Funktionen: binomial, Bars2d, VisibleFromTo, binomialPF, map
________________________________________________________________________________
Animation der Binomialverteilung
Die Binomialverteilung wird in allen Bundesländern als "Prototyp" im Rahmen des
Stochastikunterrichts intensiv behandelt. In diesem Arbeitsblatt soll die mehr oder
weniger gute Approximation durch die Gaußfunktion visualisiert werden. Dabei wird
auch deutlich, wie sich die Binomialverteilung bei wachsendem Stichprobenumfang
n auf den Erwartungswert zusammenzieht.
Zum "Aufwärmen" verwenden wir erst einmal die von MuPAD zu Verfügung gestellte Funktion
zum Berechnen der Binomialkoeffizienten, um die Veränderung der Binomialverteilung
mit dem Stichprobenumfang n oder der Einzelwahrscheinlichkeit p zu visualisieren.
B:=(n,p,k)->binomial(n,k)*p^k*(1-p)^(n-k);
plot(plot::Bars2d([B(10,0.5,k)$k=0..10])):
![]()

Der naheliegende Ansatz, daraus eine Animation zu machen, scheitert leider:
plot(plot::Bars2d([B(n,0.5,k)$k=0..n],n=10..20)):
Error: unbound identifier(s) 'k' found [plot::Bars2d::new]
Vermutlich hat MuPAD dabei Probleme mit der Weitergabe des Animationsparamenters.
Man kann natürlich alle Verteilungen übereinander zeichnen.
Wenn man dabei noch die Farben verändert, ensteht sogar ein hübsches Bildchen:
plot(plot::Bars2d([B(n,0.5,k)$k=0..n],Color=[n/20,0,1-n/20])$n=5..20):
Das ist aber nicht das, was wir wollen.
Daher erzeugen wir die Histogramme zuächst als Grafikobjekte in einem Feld und machen sie
dann nur für bestimmte Zeiten sichtbar. Um die Grenzen der Animation leichter verändern zu
können, werden dafür Variablen definiert.
n_u:= 2:
n_o:= 50:
p_histo:= plot::Bars2d([B(n,0.5,k) $ k=0..n], Color=[n/n_o,0,1-n/n_o]) $ n=n_u..n_o:
((p_histo[k])::VisibleFromTo:= (k-1)..k) $ k = 1..(n_o-n_u+1):
plot(p_histo):
Jetzt variierien wir p und lassen n fest:
schritte:=20:
n := 20:
p_histo_p:= plot::Bars2d([B(n,s/schritte,k)$k=0..n],Color = [s/schritte,0,1-s/schritte])$s=1..schritte-1:
((p_histo_p[k])::VisibleFromTo:= (k-1)..k) $ k = 1..schritte-1:
plot(p_histo_p):
Die Gaußfunktion soll für n*p*q< 9 die Binomialverteilung gut annähern:
gauss:= (mu, sigma, x)-> 1/(sqrt(2*PI)*sigma)*exp(-1/2*((x-mu)/sigma)^2);
p_gauss_p:=plot::Function2d(gauss(n*s/schritte, sqrt(n*s/schritte*(1-s/schritte)),k),k=-2..n+2,
LineColor = [0, 1, 0], LineWidth=0.7)$s=1..schritte-1:
((p_gauss_p[k])::VisibleFromTo:= (k-1)..k) $ k = 1..schritte-1:
plot(p_histo_p, p_gauss_p, Axes=Origin):
Schauen wir uns die Animation bei verändertem n noch ebenfalls mit dieser Nächerung an:
n_u:= 2:
n_o:=50:
p := 0.4:
p_histo:=plot::Bars2d([B(n,p,k)$k=0..n],Color = [n/n_o,0,1-n/n_o])$n=n_u..n_o:
((p_histo[k])::VisibleFromTo:= (k-1)..k) $ k = 1..(n_o-n_u+1):
p_gauss:=plot::Function2d(gauss(n*p, sqrt(n*p*(1-p)),k),k=-2..n+2,
LineColor = [0, 1, 0], LineWidth=0.7)$n=n_u..n_o:
((p_gauss[k])::VisibleFromTo:= (k-1)..k) $ k = 1..(n_o-n_u+1):
plot(p_histo, p_gauss, ViewingBoxXRange=-2..37):
Es sieht so aus, als ob die Verteilung bei wachsendem n niedriger und breiter würde.
Das liegt zum einen daran, dass bei kleinerem n sich die Wahrscheinlichkeiten auf weniger
Fächer verteilen und daher diese Fächer dann "voller" sind. Zum anderen liegt es daran,
dass in dieser Darstellung die Obergrenze nicht automatisch dem Stichprobenumfang n
gemäß angepasst wird.
Man muss also die Graphen so strecken, dass sie alle auf der gleiche Breite gezeichnet
werden. Das entspricht einer Streckung in Richtung der ersten Achse. Damit die Fläche
gleich bleibt, muss man dann in Richtung der zweiten Achse mit demselben Faktor stauchen.
Leider stößt man an dieser Stelle bei MuPAD an zwei Grenzen:
Der Abstand der Balkenmittelpunkte bei Bars2D ist immer 1.
Animationen werden immer zunächst komplett berechnet und dann gezeichnet,
so dass der gezeichnete Ausschnitt in der Animation gleich bleibt.
Daher basteln wir uns zunächst einen einfachen Ersatz für Bars2d mit
unten offenen Rechtecken (Stufen) und verwenden dann das Listplot-Objekt:
stufe:= (x,y)->[[x-0.5,0],[x-0.5,y],[x+0.5,y],[x+0.5,0]]:
Damit erzeugen wir uns die Punkte zum Zeichnen einer Verteilung und verwenden
dabei auch die von MuPAD mitgebrachte Verteilungsfunktion binomialPF
bin_original := (n, p)->op(stufe(k,stats::binomialPF(n,p)(k)))$k=0..n:
n_u:=2: n_o:=20: p := 0.4:
plotfeld_original := plot::Listplot([bin_original(n,p)],Axes=Origin,LineWidth=0.6, PointsVisible=FALSE,
LineColor= [n/n_o,0,1-n/n_o])$n=n_u..n_o:
((plotfeld_original[k])::VisibleFromTo:= (k-1)..k) $ k = 1..(n_o-n_u+1):
plot(plotfeld_original):
Diese Objekte können wir jetzt leichter manipulieren und definieren uns dafür
Operatoren zum Verschieben und Streckstauchen:
verschiebung:= (vek, x0)->[vek[1]+x0,vek[2]];
streckstauchung:= (vek, faktor)->[vek[1]*faktor,vek[2]/faktor];
n_u:=2: n_o:=20: p := 0.4:
Jetzt verschieben und streckstauchen wir die Histogramme so, dass sie alle denselben
vertikalen Bereich von 0 bis 100 haben:
bin_verschoben:= (n, p)->map(bin_original(n,p), verschiebung,0.5);
bin_normiert:= (n, p)->map(bin_verschoben(n,p), streckstauchung, 100/(n+1));
Jetzt verschieben und streckstauchen wir die Histogramme so, dass sie alle denselben
vertikalen Bereich von 0 bis 100 haben:
p:=0.5: n_u:=2: n_o:=100:
plotfeld_normiert := plot::Listplot([bin_normiert(n,p)],LineWidth=0.6, PointsVisible=FALSE,
LineColor= [n/n_o,0,1-n/n_o])$n=n_u..n_o:
((plotfeld_normiert[k])::VisibleFromTo:= (k-1)..k) $ k = 1..(n_o-n_u+1):
plot(plotfeld_normiert,YAxisVisible=FALSE, Axes=Origin):
Mit diesem Werkzeug sollte man jetzt etwas spielen, p verändern,
die "Konzentration" auf den Erwartungswert erkunden.
Der Zusammenhang zum Gesetz der großen Zahl sowie die Wurzel(n)-Regel
können thematisiert werden.
________________________________________________________________________________
Aufgaben:
1. Untersuchen Sie systematisch die Abweichungen zwischen der Binomialfunktion und der Gaußfunktion.
Welcher Fehler wird bei der Faustregelgrenze n*p*q = 9 maximal produziert?
2. Falls n*p*q kleiner als 9 ist, sollte man vielleicht eher die Poissonverteilung als Näherung für die
Binomialverteilung nehmen:

Binomialverteilung nehmen. Untersuchen Sie diese Approximation. Ist n*p*q = 9 eine sinnvolle obere
Grenze für die Anwendbarkeit dieser Näherungsfunktion?
3. Verschieben Sie die Binomialverteilung so, dass der Erwartungswert im Ursprung liegt
Streckstauchen Sie dann so, dass die Standardabweichung 1 ist und schauen Sie sich die
'Verteilungen als Animation (in Abhängigkeit von n oder p) an.
_______________________________________________________________________________
Anmerkungen:
1. Natürlich kann man das Arbeitsblatt auch nur zur Demonstration einsetzen, ohne die Befehle im Einzelnen
anzusprechen.
2. Weitere Anregungen finden Sie im Web unter schule.mupad.de/material.
_______________________________________________________________________________