Normalverteilung

Algorithmen zu einigen Funktionen der Gauß-Normalverteilung

Die durch C.F. Gauß beschriebene Normalverteilung hat große praktische Bedeutung in Natur und Technik. Die meisten Meß- und Produktions-Fehler lassen sich u.a. damit genau oder wenigstens näherungsweise beschreiben. Die Berechnung der Wahrscheinlichkeit solcher Ereignisse erfolgt durch eine Familie von Funktionen. Einige davon bzw. ihre numerische Berechnung werden hier vorgestellt.
Algorithmen Ausgewählte IT-Rezepte, Iterationen
Gauß-Normalverteilung Eines der häufigsten und wichtigsten Verteilungs-Muster in Natur und Technik
Normalverteilung Berechnung der Wahrscheinlichkeit (x)
Integral der Normalverteilung Berechnung der summierten Wahrscheinlichkeit von -∞ bis x
Fehler-Funktion Berechnung der Fehler-Funktion (error function) erf   mit Iteration
Standardabweichung 'Mitlaufende' Berechnung von Mittelwert und Standardabweichung
Verwandte Themen Erzeugung normal-verteilter Zufalls-Daten

Gauß-Normalverteilung

Die Normalverteilung beschreibt die statistische Verteilung von Werten, die teilweise durch zufällige Ereignisse beeinflusst werden. Sie wurde von Carl Friedrich Gauß (1777-1855) entdeckt und beschrieben. Viele Vorgänge in Natur und Technik folgen den damit beschriebenen Gesetzmäßigkeiten.
Die Normalverteilung wird nach ihrem Entdecker auch Gauß-Verteilung genannt, die Verteilungskurve nach ihrer charakteristischen Form 'Glockenkurve'.
Diese Seite stellt einige ausgewählte Funktionen und Algorithmen vor, mit denen man die Normalverteilung berechnen kann.
Sie finden hier keine Angaben über die Bedeutung, Herleitung oder sinnvolle Anwendung.
Das Ziel ist die einfache Anwendung in der Informatik, es wird ausdrücklich kein wissenschaftlicher Anspruch gestellt.
Die Anwendung erfolgt auf eigenes Risiko.
Beispiel: Produktion
Die Länge eines massenhaft produzierten Werkstücks soll 200mm betragen. Bei genauer Nachmessung findet man die meisten Stichproben im Bereich 199-201mm, einen kleinen Anteil im Bereich 198-202mm, einige wenige Stücke sind noch etwas kürzer oder länger (Ausschuss).
Dieser typische Fall wird vermutlich mit einer Normalverteilung gut beschrieben. Das folgt allerdings nicht zwingend, sondern müsste durch Tests mit statistischen Methoden bewiesen werden.
Beispiel: Messung
Ein unbekanntes Werkstück wird von allen SchülerInnen einer Klasse je 3mal mit einem Maßstab vermessen. Bei Auswertung der Ergebnisse zeigt sich, dass die meisten Messwerte im Bereich 199-201mm liegen, einige im Bereich 198-202mm und evtl. sogar einige darunter oder darüber.
Das ist ein für die Normalverteilung typisches Ergebnis. Allerdings müsste man durch weitere Tests beweisen, dass diese Annahme zutrifft.

Wahrscheinlichkeits-Dichte (Glockenkurve)

Quelle: Wikipedia
Die X-Achse ist in Einheiten der Standard-Abweichung skaliert (engl. standard deviation, meist mit σ bezeichnet). Das Maximum der Kurve liegt im Mittelwert (engl. mean, meist mit μ bezeichnet). Die dargestellten Standard-Bedingungen lauten
μ=0;   σ=1
Die Y-Achse gibt die relative Wahrscheinlichkeit für das Auftreten eines Wertes an. Diese Achse kann man alternativ auch in % skalieren: Das Maximum der Kurve liegt bei
y[max] = 0.39894 = 39.9%

Hinweis: Die → SVG-Grafik (rechts) wurde Live von ihrem Browser aus → XML-Daten erzeugt. Sie wird von allen modernen Browsern angezeigt.
Interpretation: Die Wahrscheinlichkeit, dass ein Zufalls-Wert nahe am Mittelwert liegt, ist am höchsten. Sie nimmt mit der Entfernung vom Mittelwert ab. Die Abnahme wird jedoch immer flacher, und die Kurve erreicht erst in unendlicher Entfernung den Wert 0%
Das bedeutet: Es gibt stets eine - wenn auch winzige - Wahrscheinlichkeit, dass ein Zufalls-Wert weit ab vom Mittelwert liegt.

Die Wahrscheinlichkeit, dass ein Zufallswert in einem bestimmten Intervall liegt, z.B. -1σ...x...+1σ entspricht der Fläche unter der Glockenkurve. Zur Berechnung der Fläche braucht man die integrierte Form (nächster Absatz) der Glockenkurve.
Für beliebige Werte von Mittelwert μ und Standardabweichung σ ist die Kurve ähnlich: Sie hat die gleiche Form, lediglich die Skala der X-Achse ändert sich.
Bei einem anderen Mittelwert μ verschiebt sich die X-Achse nach rechts oder links.
Bei einer anderen Standardabweichung σ wird die Skala der X-Achse enger oder weiter.

Die relativ einfache ↓ Berechnung der Normalverteilungs-Funktion wird auf dieser Seite vorgestellt.

Integrale Wahrscheinlichkeit

Quelle: Wikipedia
Das rechts gezeigte Diagramm ergibt sich durch Integration der Gauß-Kurve, d.h. durch Berechnung der Fläche unter der Glockenkurve. Die Integral-Kurve gibt die Wahrscheinlichkeirt dafür an, dass ein Zufalls-Wert zwischen -∞ und dem jeweiligen x-Wert liegt.

Beispiel: Um die Wahrscheinlichkeit zu berechnen, dass ein Zufallswert nicht weiter als maximal 1 Standardabweichung vom Mittelwert μ=0 entfernt ist, d.h. dass der Wert im Intervall -1σ...x...+1σ liegt, bestimmt man die Funktionwerte an den Stellen
y(-1) = 0.159
y(+1) = 0.841
Die gesuchte Wahrscheinlichkeit beträgt 0.841 - 0.159 = 0.683 = 68.3%

Die ↓ Berechnung des Integrals der Normalverteilung erfolgt mit Hilfe der ↓ Fehler-Funktion die selbst mit Hilfe einer Reighen-Entwicklung zu berechnen ist.

Normalverteilung

Standard Normalverteilung

Quelle: Wikipedia
Normalverteilung für den Mittelwert (mean) μ=0 und die Standardabweichung (standard deviation) σ=1
Kalkulations-Programme (LibreOffice, OpenOffice, MS-Excel, ...):
Berechnung für ein Argument x in Zelle C1 mit der Formel
=1/WURZEL(2*PI())*EXP(-C1*C1/2)
oder mit Funktion
=NORMVERT(C1;0;1;FALSCH)
Die Verteilungs-Funktion jeder ↓ allgemeinen Normalverteilung mit beliebigen Werten von Mittelwert und Standardabweichung sind dieser Verteilung ähnlich: Man kann sie durch Skalierung (Multiplikation) und / oder Verschiebung (Addition) in die Standard Normalverteilung überführen. In der Praxis hat nur der Bereich nahe dem Mittelwert (hier μ=0 ) Bedeutung.
Mit Hilfe der ↓ integralen Normalverteilung kann man berechnen:
∫[-1σ..z..+1σ] = 68.3%
∫[-2σ..z..+2σ] = 95.4%
∫[-3σ..z..+3σ] = 99.7%
d.h. 99.7% aller zu erwartenden Zufallswerte liegen nicht weiter als 3 Standard-Abweichungen σ vom Mittelpunkt entfernt.
Basic:
Der Wert von 1/sqrt(2*pi) wird nicht berechnet, sondern in der Konstanten sqpi1 vorgegeben. Wenn die → Exponential-Funktion exp() nicht zur Verfügung steht, kann man sie mit einer Reihentwicklung selbst berechnen.
Anwendung der VBA-Funktion in einem Kalkulations-Programm:
=my_normdist_0(C1)

Beispiel: my_normdist_0(1) = 0.241970724519143 
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung der Standard Normalverteilung:
Const sqpi1 = 0.398942280401433

Function my_normdist_0(x As Double) As Double
my_normdist_0 = sqpi1 * Exp(-x * x / 2)
End Function

Allgemeine Normalverteilung

Quelle: Wikipedia
Normalverteilung für allgemeine (beliebige) Werte von Mittelwert μ und Standardabweichung σ
Kalkulations-Programme (LibreOffice, OpenOffice, MS-Excel, ...):
Berechnung für den Mittelwert μ in Zelle B1, die Standardabweichung σ in Zelle B2 und ein Argument x in Zelle C1 mit der Formel
=1/WURZEL(2*PI())*EXP(-((C1-$B$1)/$B$2)^2/2)
oder mit Funktion
=NORMVERT(C1;$B$1;$B$2;FALSCH)
Basic:
Die Konstante sqpi1 wird wie oben vorgegeben.
Die Angabe von Mittelwert und Standardabweichung ist optional. Wenn man sie weglässt, dann werden die Standardwerte μ=0; σ=1 verwendet.
Anwendung der VBA-Funktion in einem Kalkulations-Programm:
=my_normdist(C1;$B$1;$B$2)

Beispiel: my_normdist(8;10;2) = 0.241970724519143
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung der allgemeinen Normalverteilung:
Const sqpi1 = 0.398942280401433

Function my_normdist( _
x As Double, _
Optional mean As Double = 0, Optional stdev As Double = 1) _
As Double
Dim y As Double
y = (x - mean) / stdev
my_normdist = sqpi1 * Exp(-y * y / 2)
End Function

Integral der Normalverteilung (kumulative Wahrscheinlichkeit)

Integral der Standard Normalverteilung

Das Integral gibt die Wahrscheinlichkeit an, mit welcher ein Zufalls-Wert zwischen -∞ und x liegt bzw. <=x ist.
Quelle: Wikipedia
Die Berechnung ist nicht trivial, d.h. man kann sie nicht mit einer einfachen Formel ausführen. Man verwendet normalerweise die ↓ Fehler-Funktion erf(), die selbst mit Hilfe einer Reihenentwicklung berechnet wird.

Kalkulations-Programme (LibreOffice-Calc, OpenOffice-Calc, MS-Excel, ...):
Berechnung für ein Argument x in Zelle (C1) mit der Funktion
=NORMVERT(C1;0;1;WAHR)
Basic:
Die Funktion my_int_normdist_0() berechnet das Integral der Normalverteilung.
Das Argument itmax ist optional und begrenzt die Anzahl der zur Berechnung verwendeten Iterations-Schritte. Ohne Angabe wird bis zur maximal erreichbaren → Genauigkeit (ca. 15 Dezimalstellen) gerechnet.
Die Funktion my_erf() wird im Kapitel ↓ Fehler-Funktion dieser Seite vorgestellt.
Anwendung der VBA-Funktion in einem Kalkulations-Programm:
=my_int_normdist_0(C1)

Beispiel: my_int_normdist_0(1) = 0.841344740241004
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung des Integrals der Standard Normalverteilung:
Function my_int_normdist_0( _
x As Double, _
Optional itmax As Integer = -1) _
As Double
my_int_normdist_0 = (1 + my_erf(x / Sqr(2), itmax)) / 2
End Function

Integral der allgemeinen Normalverteilung

für beliebige Werte von Mittelwert μ und Standardabweichung σ
Kalkulations-Programme (LibreOffice-Calc, OpenOffice-Calc, MS-Excel, ...):
Berechnung für den Mittelwert μ in Zelle B1, die Standardabweichung σ in Zelle B2 und ein Argument x in Zelle C1 mit der Formel
=NORMVERT(C1;$B$1;$B$2;WAHR)
Basic:
Die Angabe von Mittelwert, Standardabweichung und maximaler Anzahl der Iterationen ist optional. Wenn man sie weglässt, dann werden die Standardwerte μ=0; σ =1 verwendet und es wird bis zur maximalen Genauigkeit gerechnet.
Anwendung der VBA-Funktion in einem Kalkulations-Programm:
=my_int_normdist(C1;$B$1;$B$2)

Beispiel: my_int_normdist(8;10;2) = 0.158655259758996 
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung des Integrals der allgemeinen Normalverteilung:
Function my_int_normdist( _
x As Double, _
Optional mean As Double = 0,
Optional stdev As Double = 1, _
Optional itmax As Integer = -1) _
As Double
Dim y As Double
y = (x - mean) / stdev / Sqr(2)
my_int_normdist = (1 + my_erf(y, itmax)) / 2
End Function

Fehler-Funktion (error-function)   erf

Fehler-Funktion

Quelle: Wikipedia
Diese Formel beschreibt die Fehler-Funktion als (nicht direkt berechenbares) Integral.
Numerische Berechnung der Fehler-Funktion mit einer Taylor-Reihe:

Quelle: Wikipedia
Der Iterations-Algorithmus erfordert Argumente 0>=z
Zur Berechnung negativer Argumente verwndet man die Beziehung:
erf(-z) = -erf(z)
Ähnliche / verwandte Funktionen kann man unschwer mit Hilfe von erf() berechnen, z.B.
Komplement der Fehlerfunktion:
erfc(z) = 1 - erf(z)
Der Algorithmus funktioniert für kleine -1...z...+1 ausgezeichnet und erreicht mit <=18 Schritten die maximale → Genauigkeit von ca. 15 Dezimalstellen.

Je weiter man sich von z=0 entfernt, umso mehr nimmt die Anzahl der Schritte und noch schneller die Rechenzeit zu.

Die praktisch nutzbare Grenze liegt bei ca. -4...z...+4 mit n<70 Iterations-Schritten.
Größere absolute Werte von z lassen sich theoretisch noch bis zu jener Grenze berechnen, welche gerade noch mit der verwendeten Fakultäts-Funktion n! berechnet werden. Im VBA-Programm wird eine Grenze von maximal n<=150 Schritten vorgegeben, die jedoch nur zu Demonstrations-Zwecken dient.

In der Praxis haben Rechnungen außerhalb der Grenze von 4 Standard-Abweichungen nur wenig Bedeutung, weil damit bereits 99.994% aller Zufalls-Werte erfasst werden. Wenn man sie dennoch braucht, verwendet man Näherungs-Formeln (hier nicht angeführt).
Basic:
Der Wert von 2/sqr(pi) wird nicht berechnet, sondern in der Konstanten sqpi2 vorgegeben.

Das Vorzeichen des Arguments x wird geprüft, bei Bedarf umgekehrt und in der Variablen sgn_x gespeichert.

Alle zur Berechnung verwendeten Variablen werden vor Beginn der Schleife initialisert = auf die passenden Anfangswerte gesetzt.

In der Schleife wird bei jedem Durchgang 1 Element der Iteration berechnet:
Zuerst wird das Ergebnis der letzten Rechnung in der Variablen vsum gespeichert.
Das Vorzeichen sgn_n wird vor jedem Element umgekehrt.
Der Exponent n_exp wird berechnet.
Zähler n_1 und Nenner n_2 werden getrennt berechnet und als Element zur laufenden Summe sum addiert.
Der Schleifen-Zähler n wird erhöht.

Nach der Berechnung erfolgen 2 mit ODER (Or) verknüpfte Tests:
Wenn entweder die maximale Anzahl nmax der Schritte erreicht wurde, oder sich das Ergebnis vsum=sum im letzten Schritt nicht mehr geändert hat, dann wird doloop=False gesetzt und die Schleife abgebrochen.

Nach dem Abbruch der Schleife wird das Vorzeichen sgn_x berücksichtigt und mit der Konstanten 2/sqr(pi) multipliziert.

Anwendung der Funktion in einem Kalkulations-Programm:
=my_erf(C1)

Beispiel:
my_erf(1) = 0.842700792949713
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung der Fehler-Funktion:
Const sqpi2 = 1.12837916709551

Function my_erf( _
ByVal x As Double, Optional ByVal nmax As Integer = -1) _
As Double
Dim doloop As Boolean
Dim sgn_x, sgn_n, n As Integer
Dim n_1, n_2, n_exp, sum, vsum As Double
' Limit number of iteration loops (Demo:150, Realistic:80)
If nmax < 0 Then nmax = 150
' Sign of argument x
If x >= 0 Then
sgn_x = 1
Else
sgn_x = -1
x = -x
End If
' Initialize variables
n = 0
sgn_n = -1
sum = 0
doloop = True
' Iteration loop:
While doloop
vsum = sum
sgn_n = sgn_n * -1
n_exp = 2 * n + 1
n_1 = sgn_n * x ^ n_exp
n_2 = my_fakt(n) * (2 * n + 1)
sum = sum + n_1 / n_2
n = n + 1
' Test: exit loop ?
If (vsum=sum Or n>nmax) Then doloop = False
Wend
my_erf = sgn_x * sqpi2 * sum
End Function

Hilfs-Funktionen

Alle verwendeten Hilfs-Funktionen lassen sich optional selbst programmieren, z.B. (rechts) die → Fakultät-Funktion n!

Die Berechnung von → Quadratwurzel sqrt() und → Exponential-Funktion exp() kann mit Hilfe von Reihenentwicklungen erfolgen.
Auf diese Weise ist es möglich, alle auf dieser Seite vorgestellten Funktionen lediglich mit Hilfe der 4 Grundrechnungs.-Arten (Addition, Subtraktion, Multiplikation, Division) auszuführen.

Praktische Anwendung: Überall, wo keine mathematischen / statistischen Funktionen verfügbar sind, z.B. in manchen Programmiersprachen oder in einfachen MikroProzessoren.

Hilfs-Funktion my_fakt() zur Berechnung der → Fakultät-Funktion n! in Basic (LibreOffice-Basic, Visual Basic, VBA). ():
Private Function my_fakt(ByVal number As Integer) As Double
' 0 >= number <=170
Dim i As Integer
Dim f As Double
f = 1
For i = 1 To number
f = f * i
Next
my_fakt = f
End Function

Alternativen

Es wurden einige Näherungen und Alternativen zum hier vorgestellten Algorithmus getestet.
Keine der z.B. in Wikipedia (de, en) angeführten Näherungen oder Alternativen erreicht in der Praxis eine höhere Genauigkeit oder einen größeren Werte-Bereich.

Die Ursache dürfte sein, dass in allen Fällen kleine Differenzen zwischen großen (und einander sehr ähnlichen) Werten zu berechnen sind. Dabei kommt man mit der üblichen Genauigkeit von Kalkulations-Programmen oder Double-Gleitkomma-Typen von Programmiersprachen rasch an die Grenze der Leistungsfähigkeit.
Gute MathematikerInnen können den Algorithmus evtl. etwas umstellen, oder man verwendet bei Bedarf Programmiersprachen mit Unterstützung beliebiger Genauigkeit. Diese Möglichkeit wird durch zusätzliche Module (→ Perl, → PHP, ...) geboten, jedoch auf Kosten einer langsamen Berechnung.

Mittelwert & Standardabweichung

Die Berechnung von Mittelwert und Standardabweichung einer Liste von Daten wird häufig ausgeführt. Die Interpretation der Ergebnisse ist zwar nur dann zulässig, wenn bestimmte statistische Bedingungen eingehalten werden, diese werden jedoch nur selten hinterfragt oder gar getestet. Hier wird auf Bedingungen und Details ausdrücklich nicht eingegangen, es werden lediglich Algorithmen zur praktischen Berechnung vorgestellt.

Mittelwert(e)

Es gibt zahlreiche Möglichkeiten, verschiedene Mittelwerte zu berechnen. Auf dieser Seite wird lediglich die Berechnung des arithmetischen Mittelwerts einer Liste von Daten vorgestellt.

Für die Basic-Funktion (rechts) wird angenommen, dass sich die Daten in einem beliebigen Bereich (z.B. Zeile, Spalte,...) eines Kalkulations-Blatts befinden, und dass die Adresse des Bereichs an die Funktion übergeben wird.

Anwendung für Daten im Bereich A5:A20
=my_miwe(A5:A20)
=MITTELWERT(A5:A20)

Details zur Berechnung verschiedener Mittelwerte: arithmetisch, geometrisch, harmonisch, quadratisch, ...

Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung des arithmetischen Mittelwerts:
Function my_miwe(bereich As Range) As Double
Dim n As Integer
Dim sumx As Double
Dim c As Range
n = 0
sumx = 0
For Each c In bereich.Cells
sumx = sumx + c.Value
n = n + 1
Next
my_miwe = sumx / CDbl(n)
End Function

Standardabweichung

Quelle: Wikipedia
Diese Formel verwendet die 'Summe der Abstandsquadrate' der einzelnen Daten vom Mittelwert Xquer
Nachteil: Man muss alle Daten 2mal hintereinander durchlaufen:
1. zur Berechnung des Mittelwerts und
2. zur Berechnung der Standardabweichung.

Dieser Algorithmus ist zur praktischen Rechnung besser geeignet:
Quelle: Wikipedia
Vorteil: Die Liste der Daten wird nur 1mal durchlaufen. In der Schleife wird sowohl die laufende Summe der Daten Σx[i] als auch ihrer Quadrate Σx[i]^2 berechnet.
Für die Basic-Funktion (rechts) wird angenommen, dass sich die Daten in einem beliebigen Bereich (z.B. Zeile, Spalte,...) eines Kalkulations-Blatts befinden, und dass die Adresse des Bereichs an die Funktion übergeben wird.

Anwendung für Daten im Bereich A5:A20
=my_stdev(A5:A20)
=STABW(A5:A20)

In den meisten praktischen Anwendungen braucht man sowohl Mittelwert als auch Standardabweichung. Die Berechnung kann in allen modernen Programmiersprachen in einer einzigen Funktion erfolgen, welche beide Werte zurückgibt. Basic ist eine Ausnahme, da man (zumindest an ein Kalkulations-Programm) nur ein einziges Ergebnis zurückgeben kann und daher beide Werte mit getrennten Funktionen berechnen muss.
Basic (LibreOffice-Basic, Visual Basic, VBA) Funktion zur Berechnung der Standardabweichumg:
Function my_stdev(bereich As Range) As Double
Dim n As Integer
Dim x, sumx, sumxq As Double
Dim c As Range
n = 0
sumx = 0
sumxq = 0
For Each c In bereich.Cells
x = c.Value
sumx = sumx + x
sumxq = sumxq + x * x
n = n + 1
Next
my_stdev = Sqr((sumxq - sumx * sumx / n) / (n - 1))
End Function