Binomialverteilung - manipulierbare Darstellung


Die grafische Darstellung von Verteilungsfunktionen ist sehr hilfreich, wenn man diese Funktionen verstehen und anwenden will.
Worum es geht:

Die Binomialverteilung beschreibt den wahrscheinlichen Ausgang einer Folge von Versuchen, bei denen der elementare Einzelversuch nur zwei mögliche Ergebnisse hat (Beispiel Münzwurf). Wenn das erwünschte Ergebnis die Wahrscheinlichkeit p besitzt und n die Zahl der Versuche ist, gibt die Verteilungsfunktion an, mit welcher Wahrscheinlichkeit sich x Erfolge einstellen.
Für die normierte Wahrscheinlichkeit gilt die Dichtefunktion, auch Wahrscheinlichkeitsverteilung genannt), f(x) (unten schwarz dargestellt):

Binomialverteilung
für die kumulierten Wahrscheinlichkeitswerte gilt die Verteilungsfunktion F(x) (unten gelb angezeigt):
Binomial-Verteilungsfunktion
Letztere gibt die Wahrscheinlichkeit dafür an, daß höchstens x-mal Erfolg zu erwarten ist.

Die zwei Parameter p (Wahrscheinlichkeit) und n (Fallzahl) sollen natürlich wählbar sein. Das machen wir später. Zunächst kommt der Programmkern.

Sub Binom(p As Single, n As Integer)
Dim X As Single, fx As Single, FFx As Single, anz As String
'Diagramm vorbereiten
Picture1.Cls
Picture1.Scale (0, 1)-(n + 1, -0.05)
Picture1.DrawWidth = 1
For X = 0 To 5
Picture1.Line (0, X / 5)-(n + 1, X / 5)
Next
Picture1.CurrentY = 0
For X = 1 To n
Picture1.CurrentX = X - 0.01 * n
Picture1.Print X;
Next
'Ausdruck vorbereiten
anz = "Binomische Verteilung" & vbCrLf
anz = anz & "Treffer Wahrsch. TrefferVT" & vbCrLf
'Rechnen und Darstellen
FFx = 0
For X = 0 To n
fx = a_ü_b(n, X) * p ^ X * (1 - p) ^ (n - X)
FFx = FFx + fx
Picture1.Line (X, FFx)-(X + 0.3, 0), QBColor(14), BF
Picture1.Line (X, fx)-(X + 0.3, 0), QBColor(0), BF
anz = anz & X & vbTab & Format(fx, "00.00%") & vbTab & Format(FFx, "Standard") & vbCrLf
Next
Text1.Text = anz
End Sub
Function a_ü_b(ByVal a As Integer, ByVal b As Integer) As Single
Dim i As integer, erg As Single
If b = 0 Then
erg = 1
Else
erg = a / b
If b > 1 Then
Do
a = a - 1
b = b - 1
erg = erg * a / b
Loop Until b = 1
End If
End If
a_ü_b = erg
End Function

Wie sieht das Ganze aus? Gucken wir mal, zuerst das Diagramm; hier mit den Werten p = 0,25, n=20

Binomialverteilung

Dann die zugehörige Werteausgabe, die man braucht, wenn mit den Werten der Verteilungsfunktion gerechnet werden soll:

Binomialverteilung

Schließlich, damit es ein Programm wird, fehlt noch die mögliche Variation der beiden Parameter. Bequem ist es mit ScrollBars zu realisieren. So könnte es aussehen.

Einsteller

Hier wurde ein Steuerelementefeld genutzt, denn dies führt zu übersichtlicherem Programmcode und ermöglicht die unkomplizierte Erweiterung. Das Schreiben des Codes ist einfach, weil die Steuerelemente innerhalb dieser Auswertungsroutine alle gleich, nämlich HScroll1(Index) heißen.
Ihre jeweilige Bedeutung erkennt man am Caption, an der erfolgenden Zuweisung oder, wer's mag, an zusätzlichen Kommentaren.

Private Sub HScroll1_Change(Index As Integer)
If Not init Then
Select Case Index
Case 0
p = HScroll1(Index).Value / 100
Label2(Index).Caption = p
Case 1
n = HScroll1(Index).Value
Label2(Index).Caption = n
End Select
Binom p, n
End If
End Sub

Zwei Besonderheiten sind noch zu nennen.
1. Der Aufruf endet immer mit einem Aufruf der Rechen- und Malroutine Binom(). Damit ist sichergestellt, daß das gezeigte Bild der Verteilung unter allen Umständen "richtig ist", also zu den gewählten Parametern gehört. Ein zusätzlicher "Rechne"-Button erübrigt sich.
2. Eine " If Not init Then"-Sperre soll sicherstellen, daß die Scroller nicht während der Startphase, in der sie voreingestellt werden, tätig werden. Das führt zwar nicht unbedingt ins Verderben, zu undefinierten Startwerten aber allemal. Die Boolsche Variable " init" wird von der Form-Load-Prozedur gesteuert.

Wo ist die?
Sie wurde noch nicht gezeigt. Soll aber gleich folgen.
Es fehlen die globalen Deklarationen, alle Steuerelementeeigenschaften, die nicht im Eigenschaftenfenster gesetzt wurden. (Hinweis: Solche Eigenschaften, die man später, etwa bei einer Programmüberarbeitung evtl. ändern möchte, besser in Form_Load per Zuweisung festsetzen, weil man dann später sieht, was man getan hat.)

Alle Reste!
Option Explicit
Dim p As Single, n As Integer, init As Boolean

Private Sub Form_Load()
init = True
p = 0.4
HScroll1(0).Min = 1
HScroll1(0).Max = 100
HScroll1(0).Value = p * 100
Label2(0) = p
n = 10
HScroll1(1).Min = 1
HScroll1(1).Max = 100
HScroll1(1).Value = n
Label2(1) = n
init = False
End Sub

Private Sub Form_Activate()
Binom p, n
End Sub

Nachbemerkungen
1. Zu den "Resten": Wieso ein Form_Activate?
Das Programmfenster soll sich mit einem gültigen Diagramm öffnen. Man kann das erstmalige Rechnen/Malen aber nicht in Form_Load aufrufen, denn das Diagramm-Fenster erschiene dann leer. Malereien werden erst in der auf Form_Load folgenden Prozedur Form_Activate ausgeführt.
2. Wer jetzt eine andere Wahrscheinlichkeitsverteilung malen muß, vielleicht eine "hypergeometrische" (auch diskret, aber drei Parameter!), der muß wohl oder übel einen weiteren Scroller einbauen, genau eine Zeile des Programms - welche wohl? - und evtl. die Benennung der Prozedur " Binom" verändern.


Damit man einen Eindruck davon gewinnen kann, wie schön eine solche Manipulation von Verteilungsfunktionen funktionieren kann, wird hier ein Java-Applet geboten, das den beschriebenen Algorithmus nutzt. Daß die Steuerelemente und Farben etwas anders aussehen, sollte tolerierbar sein.
Anzeige
zum Anfang

© R. Hirte * 2003