| 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
Die gesuchte Wahrscheinlichkeit beträgt
0.841 - 0.159 = 0.683 = 68.3%y(+1) = 0.841 ● 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%
d.h. 99.7% aller zu erwartenden Zufallswerte liegen nicht weiter als 3
Standard-Abweichungen σ vom Mittelpunkt entfernt.
∫[-2σ..z..+2σ] = 95.4% ∫[-3σ..z..+3σ] = 99.7% |
|
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, _
Dim y As Double
Optional mean As Double = 0, Optional stdev As Double = 1) _ As Double
y = (x - mean) / stdev
End Function
my_normdist = sqpi1 * Exp(-y * y / 2) |
Integral der Normalverteilung (kumulative Wahrscheinlichkeit) |
|
Integral der Standard NormalverteilungDas 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, _
my_int_normdist_0 = (1 + my_erf(x / Sqr(2), itmax)) / 2
Optional itmax As Integer = -1) _ As Double |
Integral der allgemeinen Normalverteilungfü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, _
Dim y As Double
Optional mean As Double = 0, Optional stdev As Double = 1, _ Optional itmax As Integer = -1) _ As Double
y = (x - mean) / stdev / Sqr(2)
End Function
my_int_normdist = (1 + my_erf(y, itmax)) / 2 |
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) _
Dim doloop As BooleanAs Double 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
End If
x = -x ' Initialize variables
n = 0sgn_n = -1 sum = 0 doloop = True ' Iteration loop:
While doloop
vsum = sum
Wendsgn_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
my_erf = sgn_x * sqpi2 * sum |
Hilfs-FunktionenAlle 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 IntegerDim f As Double
f = 1
End Function
For i = 1 To number f = f * i
Nextmy_fakt = f |
AlternativenEs 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
End Function
sumx = 0 For Each c In bereich.Cells
sumx = sumx + c.Value
Nextn = n + 1 my_miwe = sumx / CDbl(n) |
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
End Function
sumx = 0 sumxq = 0 For Each c In bereich.Cells
x = c.Value
Nextsumx = sumx + x sumxq = sumxq + x * x n = n + 1 my_stdev = Sqr((sumxq - sumx * sumx / n) / (n - 1)) |