jupyter notebook Tutorial:

Grundlagen der Stochastik

                                      Günter Quast, April 2020

Kurzanleitung zu Jupyter Notebooks

Diese Datei vom Typ .ipynb enthält ein Tutorial als jupyter notebook. jupyter bietet eine Browser-Schnittstelle mit einer (einfachen) Entwicklungsumgebung für python-Code und erklärende Texte im intuitiven markdown-Format. Die Eingabe von Formeln im LaTeX-Format wird ebenfalls unterstützt.

Eine Zusammenstellung der wichtigsten Befehle zur Verwendung von jupyter als Arbeitsumgebung findet sich im Notebook JupyterCheatsheet.ipynb. Die kurzen Abschnitte geben einen Überblick über das Notwendigste, um mit dem Tutorial arbeiten zu können.

In jupyter werden Code und Text in jeweils einzelne Zellen eingegeben. Aktive Zellen werden durch einen blauen Balken am Rand angezeigt. Sie können sich in zwei Zuständen befinden: im Edit-Modus ist das Eingabefeld weiß, im Command-Modus ist es ausgegraut. Durch Klicken in den Randbereich wird der Command-Modus gewählt, ein Klick in das Textfeld einer Code-Zelle schaltet in den Edit-Modus. Die Taste esc kann ebenfalls verwendet werden, um den Edit-Modus zu verlassen.

Eingabe von a im Command-Modus erzeugt eine neue leere Zelle oberhalb der aktiven Zelle, b eine unterhalb. Eingabe von dd löscht die betreffende Zelle.

Zellen können entweder den Typ Markdown oder Code haben. Die Eingabe von m im Command-Modus setzt den Typ Markdown, Eingabe von y wählt den Typ Code.

Prozessiert - also Text gesetzt oder Code ausgeführt - wird der Zelleninhalt durch Eingabe von shift+return, oder auch alt+return wenn zusätzliche eine neue, leere Zelle erzeugt werden soll.

Die hier genannten Einstellungen sowie das Einfügen, Löschen oder Ausführen von Zellen können auch über das Pull-Down-Menü am oberen Rand ausgeführt werden.


Bei diesem Tutorial handelt es sich um einen Ansatz nach dem Prinzip "learning by doing". Es werden einfache Beispiele in der Sprache Python verwendet, um konkrete Anwendungen zu zeigen, die auch später in eigenen Arbeiten verwendet werden können. Grundkenntnisse in python sind hilfreich, werden in aber nicht zwingend benötigt. Es gibt andere Tutorials, die Python-Grundkenntnisse vermitteln oder den Umgang mit den Paketen numpy und matplotlib zur Visualisierung und Auswertung von Daten vertiefen.


Physik und Statistik


Grundlage der Physik sind quantitative Beobachtungen von Naturphänomenen, ausgedrückt als Messgrößen mit einem Zahlenwert und einer Maßeinheit. Beobachtungen sind aber immer zufälligen Einflüssen unterworfen, die sich nicht vermeiden lassen und als Messunsicherheiten bezeichnet werden. In Sinne der Statistik sind die Messunsicherheiten Zufallsgrößen, und jede Messung entspricht der "Ziehung" einer Zufallsvariablen aus einer Grundgesamtheit mit vorgegebener Verteilungsdichte.

In der Physik spielt der Zufall und damit die korrekte Behandlung von Wahrscheinlichkeiten eine sehr wichtige Rolle. Physik als "theoriegeleitete Erfahrungswissenschaft" beruht auf der Interpretation von Messergebnissen. Weil Messergebnisse Zufallsgrößen sind, müssen Methoden aus der Statistik angewandt werden, um zu überprüfen, ob eine theoretische Überlegung nach Konfrontation mit experimentellen Daten verworfen werden muss. Es handelt sich also bei der Interpretation eines Messergebnisses um einen statistischen Test. Damit dieser Test durchgeführt werden kann, muss die Verteilungsdichte der Messergebnisse bekannt sein. So werden Aussagen darüber möglich, welche Modelle zur Beschreibung von Naturphänomenen mit Messergebnissen verträglich sind.

Moderne Messverfahren liefern zudem eine Fülle an Daten, und statistische Methoden zur Visualisierung und Auswertung der Daten sind aufwändig. Daher sind Computer und entsprechende Berechnungsmethoden für zeitgemäße Datenauswertung unverzichtbare Werkzeuge.

Dieses Tutorial in Form eines jupyter notebooks fasst die Grundlagen der Statistik zusammen und führt an Hand konkreter Beispiele und Aufgaben in der Skript-Sprache pyhon in die Methoden und die Anwendung der benötigten rechnerbasierten Werkzeuge ein, wie sie auch aktuell zur Datenauswertung in der Wissenschaft verwendet werden.

Inhalt:

1. Aus der Schule bekannt
2. Zufall und Wahrscheinlichkeitsverteilungen in der Physik
2.1 Rolle des Zufalls bei physikalischen Messungen
2.2 Häufigkeit und Wahrscheinlichkeit
3. Diskrete und kontinuierliche Verteilungen
3.1 Verteilungsfunktion und Quantile
3.2 Darstellung von empirischen Daten
4. Grundlegende Verteilungen
4.2 Die Gleichverteilung
4.2 Die Exponentialverteilung
4.3 Die Binomialverteilung
4.4 Die Poisson-Verteilung
4.5 Die Gaußverteilung
4.6 $\chi^2$- und weitere Verteilungen
5. Zweidimensionale Verteilungen
5.1 Darstellung zweidimensionaler Verteilungen
5.2 Kovarianz und Korrelation
5.2Die Gaußverteilung in mehreren Dimensionen
5.2.1 Die Kontur-Darstellung



1. Aus der Schule bekannt ^

Grundlagen der Stochastik - von dem altgriechischen Wort "στοχαστικὴ" für "Mutmaßungskunst" - ist ein Teilgebiet der Mathematik und umfasst die Gebiete Wahrscheinlichkeitstheorie und Statistik. Einige Grundbegriffe wurden schon im Mathematikunterricht an der Schule behandelt.

Wegen der großen Relevanz statistischer Behandlungsweisen in vielen Bereichen der Gesellschaft zieht sich die Thematik in allen Bundesländern durch die Bildungspläne aller Klassenstufen. Eine Fülle an Stichpunkten, formuliert als "Kompetenzen", finden sich in aktuellen Bildungsplänen, z. B. Bildungsplan Mathematik, Baden-Württemberg, 2016 unter der Leitidee "Daten und Zufall":

5./6. Klasse

7./8. Klasse

9./10. Klasse

Oberstufe

Dieses hands-on Tutorial fasst die für die Physik wesentlichen Inhalte zusammen und stellt einfache Werkzeuge zur Visualisierung von Daten und zur Berechnung von statistischen Größen zusammen, die insbesondere im Zusammenhang mit der Auswertung von Messdaten in der Physik relevant sind.


2. Zufall und Wahrscheinlichkeitsverteilungen (in der Physik) ^


Nach dem eingangs Gesagten beruht der Erkenntnisgewinn in der Physik auf statistischen Aussagen, die auf Messungen an speziell auf die Beantwortung gegebener Fragestellungen ausgelegten Experimenten basieren.

Im Jargon der Physiker sagt man etwa: "Das erhaltene Messergebnis stimmt im Rahmen seiner Unsicherheit mit der Erwartung der Theorie nicht gut (oder auch gut) überein". In der Sprache der Statistik würde man genauer feststellen: Mit einem Konfidenzniveau von (z. B.) 5% wird die Hypothese, dass die Theorie die Daten beschreibt, verworfen.

An dieser Stelle ist festzuhalten, dass es prinzipiell unmöglich ist, die Richtigkeit einer Theorie durch Messungen "zu beweisen" - es könnte immer im Vergleich zur Messgenauigkeit kleine Abweichungen geben, die eine verbesserte oder gänzlich andere, bisher unbekannte Theorie besser beschreiben würde.

Auch die Beschreibung der Messunsicherheiten und ihrer Verteilungsdichte erfordert ein theoretisch motiviertes Modell. In der Praxis der modernen Forschung werden aufwändige Methoden verwendet, um alle Einflüsse auf Messgrößen möglichst genau zu modellieren und die Eigenschaften der unvermeidlichen zufälligen Einflüsse zu bestimmen. Messunsicherheiten folgen häufig einer Gaußverteilung um einen angenommenen wahren Wert mit einer Breite, die den durch die zufälligen Einflüsse verursachten Fluktuationen entspricht. Wenn einzelne Ereignisse - wie zum Beispiel bei radioaktiven Zerfällen - gezählt werden, folgen die Zählraten einer Poisson-Verteilung. Es gibt aber auch deutlich komplexere Beispiele, deren korrekte und auf maximalen Informationsgewinn ausgelegte Behandlung ein breites Repertoire an Methoden aus der Experimentalphysik erfordert. Historische Beispiel von experimentellen Kunstgriffen belegen, dass dazu neben der Anwendung modernster technischer Möglichkeiten auch sehr viel Kreativität nötig ist.

In den folgenden Abschnitten dieses Tutorials werden wir uns zunächst damit beschäftigen, wie man "künstliche" Messwerte mit Hilfe des Computers erzeugen kann. Mit diesen simulierten Daten werden wir dann Methoden zur Darstellung von Messergebnissen kennen lernen. Anschließend werden Grundlagen zu den Begriffen Häufigkeit, Wahrscheinlichkeit, Wahrscheinlichkeitsverteilung und Verteilungsdichte besprochen und einige grundlegende Verteilungen und ihre Anwendung in der Physik diskutiert.

Aufbauend auf diesem Grundlagen-Tutorial gibt es weitere Tutorials, die in die konkreten Methoden der Fehlerrechnung einführen (Fehlerrechnung.ipynb) oder eine vertiefte Einarbeitung in entsprechende Programmpakte (kafe2Tutorial.ipynb) ermöglichen.

2.1 Rolle des Zufalls bei physikalischen Messungen ^

Die Messung einer größe $m$ hat nach dem oben gesagten immer zwei Komponenten, den angenommen zu Grunde liegenden "wahren" Wert oder den quantenmechanischen Erwartungswert, $m^w$, zu der eine Zufallsgröße, $m^z$, addiert werden muss:

$m=m^w + m^z$

Es ist die Verteilungsdichte $f(m^z)$ dieser Zufallszahl, auf die es bei der Interpretation eines Messergebnisses ankommt.

Wenn sehr viele zufällige Störungen zusammen wirken - also viele Zufallsgrößen $m^z_i$ die Messung beeinflussen, $m^z=\sum_i m^z_i$, kommt es auf die Form der Einzelverteilungen nicht mehr an. Nach dem "zentralen Grenzwertsatz der Statistik" ist $f(m_z)$ dann die Gauß'sche Normalverteilung ${\cal N(x; \mu, \sigma})$ mit Mittelwert $\mu=0$ und einer Standard-Abweichung $\sigma$:

$f(m^z) \equiv {\cal N}(m^z; 0, \sigma) = \frac{1}{\sqrt{2\pi} \sigma} \exp{ \frac{{m^z}^2}{2{\sigma}^2}}$

Man verwendet in den Naturwissenschaften die folgende Schreibweise für mit Unsicherheiten behaftete Messwerte:

$m = m^w \pm \sigma$

Die Verteilungsdichte der Messwerte ist eine Normalverteilung um den wahren Wert:

$f(m) \equiv {\cal N}(m; m^w, \sigma) = \frac{1} {\sqrt{2\pi} \sigma^z} \exp{ \frac{(m \, - \, m^w)^2} {2\, \sigma^2} } \,$ Gleichung (2.1)

Da wir in diesem Kurs einen Computer benutzen, sind wir in der glücklichen Position, diese formale Kenntnisse mit Hilfe einfacher python-Skripen zu illustrieren.

Übungsbeispiel 1 zu 2.1 zur Erzeugung von (simulierten) Messwerten im Computer.

Das python-Paket numpy enthält Methoden zur Erzeugung von Zufallszahlen, die verschiedenen Verteilungsdichten folgen. Betrachten wir das folgendes einfache python-Skript, in dem zwei Funktionen definiert werden, von denen eine bei jedem Aufruf den gleichen (wahren) Wert $w$ und die andere eine bei jedem Aufruf andere Zufallszahl zurückgibt. Für die Erzeugung von standard-normalverteilten Zufallszahlen verwenden wir die Methode numpy.random.randn():

import numpy as np

def w(): return 10.
def z(): return np.random.randn()

for i in range(10):
  print ('w = %.3f       m = w + z = %.3f' %(w(), w()+z()) )

Geben Sie diesen Code in die Code-Zelle unten ein und führen Sie ihn aus.

Sie sehen, dass Sie für die simulierte Messgröße $m$ jedes mal einen anderen Wert erhalten, wie in einer echten Messung.

Die hier skizzierte Vorgehensweise entspricht der sogenannten Monte Carlo-Methode zur Simulation der erwarteten Ergebnisse von Experimenten. Die Grundlage zur Berechnung des wahren Werts $w$ sind in der Regel komplexe theoretische Rechnungen; die genaue Bestimmung der Verteilung von $z$ benötigt oft aufwändige Modellierungen des experimentellen Aufbaus.

Als nächstes wollen wir die Messwerte grafisch darstellen, also "visualisieren". Bei jeder Art von Messung ist die Visualisierung der den weiteren Untersuchungen zu Grunde liegenden Daten eine notwendige Voraussetzung zur Sicherung der Datenqualität und der Vermeidung von Fehlern (damit sind Fehler beim Experimentieren gemeint, die mit Sorgfalt und Umsicht behebbar sind).

Übungsbeispiel 2 zu 2.1 zur Darstellung von Messwerten

Wir erweitern den oben verwendeten Code um die Möglichkeit zur grafischen Darstellung. Dazu verwenden wir das Paket matplotlib.pyplot, das umfangreiche Möglichkeiten zur Visualisierung von Daten bereit stellt.

Zunächst importieren wir die benötigten python-Pakete und wählen Abkürzungen, um die Methoden bequemer aufrufen zu können:

import numpy as np 
import matplotlib.pyplot as plt

Damit jupyter die erzeugten Grafiken im Dokument einbetten kann, verwenden wir das "magische Kommando"

%matplotlib inline

Wir nutzen auch wieder die Funktionen von oben zur Erzeugung künstlicher Messdaten, die wir aber um die Möglichkeit erweitern, eine Anzal von $n$ Werten mit vorgegebenen wahren Wert mtrue bzw. Standardabweichung sigma zurück zu geben:

def w(n, mtrue): return mtrue * np.ones(n)
def z(n, sigma): return sigma * np.random.randn(n)

Zur grafischen Darstellung müssen eine Anzahl von $N$ Messwerten in einem eindimensionalen Feld gespeichert werden:

N=50
wm=10.
sigm=2.
m = w(N, wm) + z(N, sigm)

Nun fehlt noch die Anzeige der Daten. Wir wählen zwei Darstellungsformen, die Anzeige eines jeden Messwerts und eine Häufigkeitsverteilung der Messwerte.

Die einfache Anzeige der Daten als Punkte in einem Diagramm gelingt mit der Methode matplotlib.pyplot.plot(), mit der oben eingeführten Abkürzung also durch den Aufruf plt.plot(). Die Methode plot() erwartet als Argumente Felder mit den $x$- und $y$-Werten der zu zeichnenden Punkte und eine Formatangabe, für die wir 'o--' wählen, also mit einer gestrichelten Linie verbundene Punkte. Wir wollen jeden Messwert über dem Index der entsprechenden Messung auftragen und erzeugen dazu $x$-Werte $[1, \ldots, N]$, wobei $N$ der Länge des Feldes, $len(m)$ entspricht, in das wir eben die Werte eingetragen hatten. Hier der Code dazu:

# Darstellung als Datenpunkte
x = np.arange(len(m)+1
plt.plot( x, m, 'o--', color='b' ) 
plt.show()

Eine Häufigkeitsdarstellung der Messwerte, also die Anzahlen von Werten, die in verschiedenen Intervallen beobachtet wurden, kann man bequem mit der Methode matplotlib.pyplot.hist() erzeugen.

Die $N$ Werte $m_1, \ldots, m_N$ werden in $k$ Klassen eingeteilt, in diesem Fall Intervalle $1, \ldots, k$ mit Intervallgrenzen $M_0, \ldots, M_k$, und die Häufigkeit des Vorkommens von Werten in jedem der Intervalle wird aufgetragen. Die übliche Darstellung ist ein Balkendiagramm, bei dem die Höhe eines Balkens im Intervall $j$ die Häufigkeit $H_j$ einer Beobachtung in diesem Intervall angibt. .hist() benötigt entweder ein Feld mit $k$+1 Intervallgrenzen, kann aber auch die Intervallgrenzen aus der Anzahl $k$ der gewünschten Intervalle bestimmen, indem der Bereich zwischen dem Minimum und den Maximum aller Messwerte in Intervalle gleicher Länge aufgeteilt wird.

Der Code sieht so aus:

# Darstellung als Histogramm mit k Intervallen
k = 10
plt.hist(m, k, color='b') 
plt.show()

Fügen Sie die diskutierten Code-Fragmente in der Zelle unten zusammen und führen Sie sie aus.

Verändern Sie die Parameter im Codebeispiel oben - erhöhen Sie die Zahl der erzeugten Messwerte und verwenden Sie mehr Bins. Erkennen Sie die Gaußverteilung ?

2.2 Häufigkeit und Wahrscheinlichkeit ^

Für die Summe der oben eingeführten Häufigkeiten gilt:

$\displaystyle \sum_{j=1}^k H_j = N\,,$

Man betrachtet auch die relativen Häufigkeiten $h_j=\frac{H_j}{N}$, für die gilt:

$\displaystyle \,\Leftrightarrow\,\sum_{j=1}^k h_j = 1\,.$

Mit der Option density=True im Aufruf von plt.hist() werden relative Häufigkeiten aufgetragen. Für größere Zahlen von Werten $N$ und entsprechend vergrößerter Anzahl $k$ der Intervalle nähert sich die diskrete Verteilung im Histogramm der Verteilungsdichte der Messwerte immer mehr an.

Um dies zu verdeutlichen, dient folgendes Beispiel 3 zu 2.1:

Zusätzlich zur Häufigkeitsverteilung tragen wir noch Werte für die Gaußverteilung in die oben erzeugte Grafik ein. Die Berechnung von Werten der Gaußverteilung erledigt folgender Code:

# Gauss distribution
def fGauss(x,mu=0.,sigma=1.):
    return (np.exp(-(x-mu)**2/2./sigma**2)/np.sqrt(2.*np.pi)/sigma)

Wenn nach dem Erzeugen des Histogramms durch plt.hist() vor der Anzeige mittels plt.show() die Methode plt.plot()* aufgerufen wird, werden zwei Grafiken angezeigt. So lässt sich leicht das auf eine Fläche von Eins normierte Histogramm mit der Gaußverteilung vergleichen.

Der Code dazu sieht nun so aus:

N=500
wm=10.
sigm=2.
m = w(N, wm) + z(N, sigm)

# normierte Darstellung als Histogram mit k Intervallen
k = 10
plt.hist(m, k, color='b', density=True) 
x = np.linspace(5., 15., 200)
plt.plot(x, fGauss(x, wm, sigm)
plt.show()

Wenn Sie die Code-Zelle zu Beispiel 1 in diesem Kapitel schon ausgeführt haben, sind die Funktionen w() und z() schon definiert, sie müssen dann an dieser Stelle nicht noch einmal eingegeben werden; das gleiche gilt für den import der Pakte numpy und matplotlib.pyplot. (Erneute Eingabe würde aber auch nicht schaden.)

Stellen Sie in der Code-Zelle unten den Code zusammen und vergleichen Sie die Häufigkeitsverteilung mit der Gaußverteilung. Und keine Sorge, Computer sind schnell, Sie können auch große Zahlen für $N$ (z.B. 10000) und $k$ (z.B. 100) eingeben.

Im obigen Beispiel haben wir gesehen, dass sich für große Anzahlen von Messungen die Häufigkeitsverteilung der Verteilungsdichte annähert.

Die Wahrscheinlichkeit $P_j$ einer Beobachtung im Intervall $j$, also $P_j = P( {\small m\in[M_j, M_j+1]})$, ist also gegeben durch die relative Häufigkeit bei unendlich großer Anzahl an Beobachtungen $N$:

$P_j = \displaystyle \lim_{N\to\infty} \frac{H_j}{N} = \lim_{N\to\infty} h_j$.

Dieser Zusammenhang wird oft auch als "Gesetz der großen Zahl" bezeichnet.

Anmerkung: Es ist an dieser Stelle festzuhalten, dass es sich beim Limes hier nicht um einen Grenzwertübergang im Sinne der Analysis handelt - es gibt keinen Wert von $N$, ab dem die Abweichung der Häufigkeit von der Wahrscheinlichkeit auf jeden Fall kleiner als eine vorgegebene Schranke $\epsilon$ wäre - man nennt die hier postulierte Konvergenz auch "stochastische Konvergenz".


2.2.1 Formale Definition der Wahrscheinlichkeit: Kolmogorov-Axiome

In der Praxis ist die obige Definition der Wahrscheinlichkeit über die Häufigkeit ausreichend. In der mathematischen Wahrscheinlichkeitstheorie bilden seit den 30er Jahren des 20. Jahrhunderts die "Kolomogrov-Axiome" die Grundlage. Sie seien hier kurz genannt:

Seien $e_i$ sich gegenseitig ausschließende (Elementar-)Ereignisse und $P(e_i)$ die Wahrscheinlichkeit des Eintretens des Ereignisses $e_i$.
Für $P(e_i)$ gilt:

  1. $\, P(e_i) \geq 0$ für alle $i$
  2. $\, \sum P(e_i) = 1$
  3. $\, P(e_i \,{\rm oder}\, e_j) = P(e_i) + P(e_j)$

Aus diesen Axiomen lassen sich wichtige Eigenschaften der Wahrscheinlichkeit herleiten. Seien $A$ und $B$ zwei Zufallsereignisse, die sich gegenseitig ausschließen, und $\bar{A}$ das zum Eintreffen von $A$ komplementäre Ereignis (also alle Ergebnisse, bei denen A nicht eintritt).

Es gilt: $$\begin{array}{l} P(A) \in [0,1], \, P(\bar{A})= 1-P(A)\\ P(A ~{\rm oder}~ \bar {A}) = 1 \\ P(A ~{\rm und}~ \bar {A}) = 0 \\ P(A ~{\rm oder}~ B) = P(A) + P(B) - P(A ~{\rm und}~ B) \\ P(A ~{\rm und}~ B) = P(A) \cdot P(B|A) = P(B)\cdot P(A|B) \\ P(A ~{\rm und}~ B) = 0 \\ \end{array}$$

Die Schreibweise $P(A|B)$, die sogenannte "bedingte Wahrscheinlichkeit", gibt die Wahrscheinlichkeit des Eintreffens von $A$ an, wenn $B$ bereits eingetroffen ist. Wenn $A$ und B unabhängige Ereignisse sind, aus dem Eintreffen von $B$ also keine Rückschlüsse auf $A$ möglich sind, ist $P(A|B) = P(A)$.

Die Kolmogorov-Axiome sagen übrigens nichts darüber aus, wie Wahrscheinlichkeiten berechnet werden bzw. was sie genau sind. Die Häufigkeitsdefinition der Wahrscheinlichkeit ist verträglich mit den Kolmogorov-Axiomen. Dies gilt ebenso für eine andere Denkschule der Statistik, die Bayes'sche Statistik, bei der der "Grad der Sicherheit" als (subjektives) Maß für die Wahrscheinlichkeit verwendet wird und bei der der drittletzte der oben angegebenen Zusammenhänge und bedingte Wahrscheinlichkeiten eine tragende Rolle einnehmen.

Gegenstand der als klassisch bezeichneten, auf der Häufigkeitsdefinition beruhenden Statistik ist die Verträglichkeit der Daten mit der Modellannahme, $P(D|M)$. In der Bayes'schen Statistik ist es möglich, unter Verwendung von Vorwissen, $I$, die viel interessantere Frage zu beantworten, was die Wahrscheinlichkeit für die Gültigkeit des Modells unter Berücksichtigung der beobachteten Daten und des Vorwissens $D,I$ ist. In diesen Größen aufgeschrieben lautet das Bayes'sche Theorem:

$P(M|D,I) = \frac {P(D|M,I) \cdot P(M|I)} {P(D|I)}$

Beide Sichtweisen führen häufig zu gleichen Ergebnissen, obwohl sich im Detail eine andere Bedeutung bei der Durchführung statistischer Schlüsse ergibt. Bedeutsam in der Bayes'schen Statistik ist die Möglichkeit (und auch Notwendigkeit!), Vorwissen über die zu bestimmende Wahrscheinlichkeit zu verwenden. Wenn man dafür eine flache Verteilung, also konstante Wahrscheinlichkeit annimmt, ergeben sich zu klassischen Statistik äquivalente Ergebnisse.

Wir werden uns im Folgenden auf den aus der Häufigkeitsdefinition beruhenden Wahrscheinlichkeitsbegriff beschränken.


3. Diskrete und kontinuierliche Verteilungen ^


Nach diesen anschaulichen Beispielen sollen nun die Eigenschaften von Zufallsvariablen etwas systematischer behandelt werden.

Eine Zufallsvariable oder Zufallsgröße $x$ ist ein reelle Variable aus einem Wahrscheinlichkeitsraum $S$, deren Wert zufällig bestimmte Werte annehmen kann.

Wenn nur diskrete Werte $x_i, {\small i\in {\cal N}}$ möglich sind, sind die Wahrscheinlichkeiten für das Auftreten des Wertes $x_i$ durch eine diskrete Verteilung $P_i = P(x_i)$ gegeben.

Wenn kontinuierliche Werte möglich sind, wird die Wahrscheinlichkeit für das Auftreten eines Wertes im $x \in[x, x+dx]$ durch eine Verteilungsdichte $f(x)$ angeben, also $P(x \in[x, x+dx]) = f(x)\,dx$.

Verteilungen bzw. Verteilungsdichten sind auf Eins normiert:

$\displaystyle \sum_{x_i\in S} P(x_i) \,=\,1\,$ bzw. $\displaystyle \int_S f(x)\,dx \,=\,1$.

Man definiert die kumulative Verteilung bzw. die sogenannte Verteilungsfunktion als

$ F(x_0) \, = \, \displaystyle \sum_{x_i < x_0} P(x_i) \, $ bzw.

$ F(x_0) \, = \, \displaystyle \int_{-\infty}^{x_0} f(x)\,dx \, $.

Anm.: Die englischen Bezeichnungen sind "Probability Mass Function (PMF) für die diskrete Verteilung, "Probability Density Function (PDF)" für die Wahrscheinlichkeitsdichte und "Cumulative Distribution Function (CDF)" für die (kumulative) Verteilungsfunktion. Die Abkürzungen werden wir später benötigen, um auf die entsprechenden Methoden im Paket scipy.stats zuzugreifen.

Zur Charakterisierung von Zufallsgrößen verwendet man statistische Kenngrößen. Für eine Reihe von Zufallszahlen definiert man den Mittelwert als

$\bar{x} = \displaystyle \frac{1}{n}\sum_{i=1}^n x_i$.

Diese aus einer endlichen Anzahl von Stichproben aus einer Verteilung berechnete Größe dient als Schätzwert für den sog. Erwartungswert $E[x] \, \equiv \, \left< x \right>$ der Verteilung, der als Lokalisierungsparameter die Lage des Zentralwerts einer Wahrscheinlichkeitsdichte festlegt.

Allgemein gelten einfache Rechenregeln für Erwartungswerte, die aus der Linearität der Definition folgen. Im folgenden seien $a$, $b$ Konstanten und $x$, $x_1$ und $x_2$ Zufallsgrößen. Es gilt:

$\left< a \right> = a$, d. h. auch $\left< \left< x \right>\right> = \left< x \right>$

$\left< ax \right> = a \left< x \right>$

$\left< x_1 + x_2 \right> = \left< x_1 \right> + \left< x_2 \right>$

und damit auch $\left< a x_1 + b x_2 \right> = a \left< x_1 \right> + b \left< x_2 \right>$

Die Varianz, definiert als Erwartungswert des quadratischen Abstands der Zufallsgrößen vom Erwartungswert, dient als Maß für den Bereich, den eine Verteilung abdeckt:

$ \displaystyle V[x] := \left< \left(x - \left< x\right>\right)^2 \right>$;

mit Verwendung der Rechenregeln für Mittelwerte lässt sich das in einen häufig praktischeren, äquivalenten Ausdruck umformen

$ \displaystyle V[x] =\left< x^2 \right> - \left< x\right>^2$.

Die Standardabweichung einer Verteilung ist definiert als die Wurzel aus der Varianz:

$ \displaystyle \sigma[x] =\sqrt{V[x]}\,$.

Die Formeln zur Berechnung dieser statistischen Kenngrößen für eine Stichprobe, eine diskrete Verteilung und eine kontinuierliche Verteilung sind in der folgenden Tabelle zusammengefasst:

$$\begin{array}{c|ccc} ~ & {\rm Stichprobe} \, x_i, {\small i=1,...,N} & {\rm diskrete \,Verteilung} \, P_i & {\rm Verteilungsdichte} \,f(x) \\ \hline % ---------------------------------------------------------------------------- E[x] = \left< x \right> \, := \mu & \frac{1}{N}\sum_{i=1}^N x_i & \sum_{i=1}^N x_i P_i & \int_{-\infty}^\infty xf(x)\,dx \\ V[x] = \left<x^2 \right> - \left< x\right>^2 & \frac{1}{(N \color{blue}{ - 1} )}\sum_{i=1}^N {x_i}^2 -\mu^2 & \sum_{i=1}^N {x_i}^2 p(x_i) -\mu^2 & \int_{-\infty}^\infty x ^2f(x)\, dx - \mu^2 \\ \end{array}$$

$\color{blue}{Anmerkung}$: In der Formel für die Varianz einer Stichprobe wird der Faktor $N-1$ statt N verwendet; dabei handelt es sich um die sog. "Besselkorrektur", die eine unverzerrte Schätzung der Varianz aus einer Stichprobe ergibt, deren Mittelwert aus der gleichen Stichprobe bestimmt wurde.

Um weitere Eigenschaften von Verteilungen wie die Asymmetrie oder die Abweichung von der Gaußverteilung zu beschreiben, definiert man die Größen "Schiefe" und "Wölbung", die von den Erwartungswerten der dritten und vierten Potenz der Zufallsgröße abhängen:

Schiefe: $\, \displaystyle \gamma_1 = {\rm E}\left[ (x - \mu)^3 \right] / \, \sigma^3$

Wölbung: $\, \displaystyle \gamma_2 = {\rm E}\left[ (x - \mu)^4 \right] / \, \sigma^4 -3\,$.

Für die Gaußverteilung verschwinden Schiefe und Wölbung.

Allgemein bezeichnet man den Erwartungswert einer Potenz $n$ einer Zufallsgröße, $\left< x^n \right>$ als das n-te Moment der Verteilung. Durch Angabe aller Momente ist eine Verteilung vollständig charakterisiert.

Berechnung der Kenngrößen mit python

Die python-Pakete numpy und scipy.stats bieten Funkionen, um Mittelwert und Standardabweichung oder auch Schiefe und Wölbung (Kurtosis) zu berechnen:

x=np.random.rand(50)
mu_x = x.mean()
sig_x = x.std()
import scipy.stats
skew_x = scipy.stats.skew(x)
kurtosis_x = scipy.stats.kurtosis(x)
print('mu=', mu_x, ' sig=', sig_x, ' skew=', skew_x, ' kurt=', kurtosis_x)

Zur Berechnung von Mittelwert und Standardabweichung einer Häufigkeitsverteilung bietet das Paket PhyPraKit eine Implementierung:

from PhyPraKit import histstat
bconts, bedges = np.histogram(x, bins=10)
mean, sigma, sigma_mean = histstat(bconts, bedges, pr= True)x=np.random.rand(50)

3.1 Verteilungsfunktion und Quantile ^


Die oben eingeführte Verteilungsfunktion (kumulative Verteilung) ist nützlich zur Berechnung weiterer wichtiger Kenngrößen, der sogenannten Quantile einer Verteilung. Ein $p$-Quantil entspricht dem Wert $x_p$ einer Zufallsgröße $x$, für den gilt $P(x \leq x_p) = p$. Der Median einer Verteilung ist das 50%-Quantil. Die Wahrscheinlichkeit, einen Wert $x < \mu - \sigma$ einer gaußverteilten Größe $x$ zu beobachten, ist 15.9%; die Wahrscheinlichkeit für $x > \mu + \sigma$ ist 84.1%; die Wahrscheinlichkeit für $ \mu - \sigma < x < \mu + \sigma$ ist 68.3%. Um die Signifikanz einer von den Norm abweichenden Kenngröße zu quantifizieren, verwendet man gerne 90%- oder 95%-Quantile - dies soll ausdrücken, dass z.B. 95% aller Gleichaltrigen größer als ein bestimmtest Kind sind und man daher möglicherweise von einer Wachstumsstörung ausgehen sollte.

Quantile lassen sich auch für eine empirische Stichprobe berechnen. Sie werden gerne verwendet, um in grafischen Darstellungen einen schnellen Überblick über eine Verteilung zu bekommen.

Als Übung zu 3.1 greifen wir wieder auf die Gaußverteilung aus 2.2 zurück und bestimmen die Quantile der Standard-Normalverteilung, also einer Gaußverteilung mit $\mu=0$ uns $\sigma=1$. Wir nutzen dazu eine einfache numerische Methode.

Hier die dazu notwendigen Codefragmente:

%matplotlib inline 

import numpy as np
import matplotlib.pyplot as plt

# Gauss distribution
def fGauss(x,mu=0.,sigma=1.):
    return (np.exp(-(x-mu)**2/2./sigma**2)/np.sqrt(2.*np.pi)/sigma)

Nun wird ein Feld $g$ mit den Werten der Gaußverteilung an 501 Stützstellen gefüllt:

xmin = -4
xmax = 4
n_bins = 500
x = np.linspace(xmin, xmax, n_bins+1) # end-point include !
g = fGauss(x, 0., 1.)

Die kumulative Verteilung erhalten wir durch Aufsummieren der Wahrscheinlichkeiten $g(x_i)\,dx$, wobei $dx$ die Intervallbreite ist.

# calculate interval width
dx = (xmax-xmin)/n_bins

Das Aufaddieren erledigt folgender Code:

G = np.zeros(len(x))
c = 0.
i=0
for _g in g:
  c += _g * dx
  G[i]= c
  i += 1

Anm.: wenn man ein wenig recherchiert, findet man heraus, dass das Paket numpy schon eine Funktion dafür mitbringt, numpy.cumsum(), die man stattdessen auch verwenden kann:

# alternativ:
G = np.cumsum(g) * dx

Dann wird die Verteilungsfunktion zusammen mit der Verteilungsdichte grafisch dargestellt:

plt.plot(x, g)
plt.plot(x, G)
plt.show()

Aufgabe: Bestimmen Sie mit Hilfe der Verteilungsfunktion $G$ die Wahrscheinlichkeit für den Bereich $[-\sigma, \sigma]$ und die $x$-Werte des 90%- und des 95%-Quantils.
Hilfe: Zur Umrechnung eines $x$-Wertes in den am nächsten liegenden Index der Felder $g$ oder $G$ hilft folgende Funktion:

def idx(x):
   return int( (x - xmin)/dx - 0.5 )

3.2 Darstellung von empirischen Daten ^


Für empirische Daten, von denen man annimmt, dass sie gaußverteilt sind, hat sich eine einfach Art der Darstellung eingebürgert. Der Datenwert wird als Punkt dargestellt, und die Standardabweichung als sogenannter "Fehlerbalken".

Eine etwas aussagekräftigere Darstellung erhält man, wenn man Quantile der Häufigkeitsverteilung anzeigt. Üblicherweise wählt man den Median als Linie, einen Kasten, der jeweils ein "Quartil" rechts und links vom Median anzeigt - in diesem Bereich um den Median liegen also 50% der Datenwerte, und sogenannte "Whiskers", die in der Voreinstellung jeweils das 1.5-fache des Abstands zwischen den Rändern des ersten und dritten Quartils anzeigen. Datenpunkte, die jenseits liegen, werden als einzelne Punkte angezeigt.

Zur Illustration zeigt der Code unten Darstellung als Datenpunkt mit Fehlerbalken und eine Boxplot-Darstellung mit überlagerter Häufigkeitsverteilung. Die übliche Darstellungsweise ist allerdings eine vertikale Ausrichtung, wie in der zweiten Grafik gezeigt.


4. Grundlegende Verteilungen ^


Es gibt eine große Anzahl an Verteilungen, die in der Physik eine wichtige Bedeutung haben. Einige davon werden hier steckbriefartig vorgestellt. In Lehrbüchern oder auch auf https:wikipedia.org/ finden sich bei Bedarf sehr viel detailliertere Darstellungen.

4.1 Die Gleichverteilung ^


Historisch wichtig waren Zufallsereignisse, die alle die gleiche Eintreffwahrscheinlchkeit haben - sie führten zum Konzept des "Laplace-Experiments" und sind Grundlage der Häufigkeitsdefinition der Wahrscheinlichkeit. Beim Würfelspiel oder Roulette kennen wir die Gleichverteilung als diskrete Verteilung: $\displaystyle P(x_i)= \frac{1}{N} \,{\rm für}\, \small i=1, \ldots, N\,$, wobei $N$ der Anzahl der möglichen Ergebnisse entspricht.

Die Gleichverteilung gibt es auch als kontinuierliche Verteilung: $$\begin{array}{c} u(x;a,b)&=& \left\{ \begin{array}{l} \frac{1}{b-a} \,{\rm für}\, {\small a \le x \le b} \\ 0 ~~~~~~{\rm sonst} \\ \end{array} \right. \\ E[x] &=& \frac {a+b}{2} \\ V[x] &=& \frac{(b-a)^2}{12} \end{array}$$ Die Gleichverteilung ist die Grundlage für die Erzeugung von Pseudo-Zufallszahlen im Computer. Aus einer gleichverteilten Zufallszahl $r \in[0,1]$ lassen sich nämlich durch eine Variablentransformation $r\to x(r)$ anders verteilte Zufallszahlen gewinnen.

In python können gleichverteilte Zufallszahlen mit Hilfe der Funktion numpy.random.rand() erzeugt werden.

4.2 Die Exponentialverteilung ^


Die Exponentialverteilung tritt in der Physik sehr häufig auf: als Verteilung der Energien in der Thermodynamik, als "Wartezeit" zwischen zufälligen Ereignissen mit gleicher Eintreffwahrscheinlichkeit zu jedem Zeitpunkt oder als Verteilung der Lebensdauern von Kernen, Elementarteilchen oder quantenmechanischen Zuständen.

$$\begin{array}{l} f_{exp}(x; \mu) = \frac{1}{\mu} \exp{-\frac{x}{\mu}} \\ E[x] = \mu \\ V[x] = \mu^{2} \\ \end{array}$$

Exponentiell verteilte Zufallszahlen $e$ erhält man aus gleichverteilten Zufallszahlen $r$ über die Transformation $e = -\log{(r)}$:

r = np.random.rand(1000)
e=-np.log(r)
plt.hist(e, 30)
plt.show()

4.3 Die Binomialverteilung ^


Die Binomialverteilung ist eine der wichtigsten diskreten Verteilungen und kommt immer dann zur Anwendung, wenn ein Zufallsprozess zwei mögliche Ergebnisse hat und man sich dafür interessiert, mit welcher Wahrscheinlichkeit eine gewisse Anzahl günstiger Fällt eintritt. Ein typisches Beispiel ist der Münzwurf, bei dem man sich fragt, wie häufig bei einer vorgegebenen Anzahl Würfen das Ergebnis "Zahl" vorkommt. In der Physik ist ein wichtiges Beispiel die Ansprechwahrscheinlichkeit eines Sensors.

Die Binomialverteilung hat zwei freie Parameter, die Eintreffwahrscheinlichkeit $p$ und die Zahl der Versuche, $n$. Die Zahl $k$ der günstigen Ausgänge ist die Zufallsgröße:

$$\begin{array}{l} P(k;p,n)= \left( \begin{array}{c} n \\ k \end{array}\right) p^k(1-p)^{n-k}~, k=1,\ldots, n \\ \end{array}\,.$$

Dabei ist $$\left( \begin{array}{c} n \\ k \end{array} \right) = \frac{n!}{k! (n-k)!}$$ der kombinatorische Faktor, der die Anzahl an Mo#öglichkeiten angibt, $k$ aus $N$ Elementen ohne Berücksichtigung der Reihenfolge auszuwählen ("Binomialkoeffizient").

Erwartungswert und Varianz der Binomialverteilung sind $$ \mathrm{E} [k]=n\,p \\ \mathrm{V} [k]=n\,p\,(1-p) $$

Für kleine $n$ ist die Binomialverteilung sehr asymmetrisch und nähert sich für große Werte von $n$ der Gaußverteilung an. Am besten sieht man das durch Ausprobieren. Hier etwas Code dazu:

import scipy.special as sp

#Binomial distribution
def fBinomial(x,n,p):
  k=np.around(x)
  return sp.binom(n,k) * p**k * (1.-p)**(n-k)

k = np.linspace(0, 50, 200)
N = [5, 10, 20, 30, 50, 70]
p = 0.5
for _N in N:
 plt.plot(k, fBinomial(k, _N, p))
plt.show()

4.4 Die Poisson-Verteilung ^


Wenn man die Zahl der Versuche sehr groß wählt, dafür aber die Erfolgswahrscheinlichkeit immer kleiner wird, d.h. den Grenzfall $n\to\infty, \, p\to 0$ und dabei das Produkt $n\, p = \mu$ festhält, ergibt sich aus der Binomialverteilung die Poisson-Verteilung:

$$ P(k;\mu)= \frac {\mu^k} {k!} {\mathrm e}^{-\mu} \\ \rm{E}[k]=\mu \\ \rm{V}[k]=\mu $$

Sie beschreibt die Anzahl von Zufallsprozessen in einem festen zeitlichen Intervall oder räumlichen Gebiet bei fester Eintreffwahrscheinlichkeit in jedem infinitesimal kleinen Teilintervall. Vorausgesetzt wird dabei, dass die Ereignisse unabhängig voneinander sind.

Beispiele aus dem Alltag sind etwa die Anzahl der Gäste in einem Restaurant zwischen 20:00 und 21:00 Uhr, die Anzahl von versendeten SMS pro Nutzer und Tag oder das Eintreffen von Unfällen oder Naturkatastrophen in einem gegeben Zeitraum. In der Physik ist die Poisson-Verteilung relevant für alle Arten von Zählraten, z.B. die Anzahl radioaktiver Zerfälle eines Kerns, oder auch die Zahl der Einträge in einem Histogramm mit vielen Bins. Übrigens: die Zeit $\Delta T$ zwischen zwei Poisson-Ereignissen mit mittlerer Rate $f$, die sogenannte Wartezeit, folgt einer Exponentialverteilung $f(\Delta T; f) = f\,\exp{(–\Delta t\,f)}$.

Die Varianz der Poission-Verteilung wird verwendet, um den "statistischen Fehler" auf eine Anzahl von Beobachtungen zu bestimmen; verwendet man die Anzahl tatsächlicher Beobachtungen $n$ als Schätzwert für den Erwartungswert $\mu$, so ergibt sich für die Unsicherheit $\Delta n = \sqrt{n}$.

Die Summe von zwei Poisson-verteilten Zufallszahlen $k_1$ und $k_2$ mit Erwartungswerten $\mu_1$ und $\mu_2$ ist selbst wieder Poisson-verteilt, $f(k_1 + k_2) = P(k_1 + k_2; \mu_1 + \mu_2)$. Dies wir aus den zu Grunde gelegten Überlegungen deutlich: wenn man das Beobachtungsintervall in zwei Intervalle unterteilt, erwartet man in jedem Teilintervall entsprechend weniger Ereignisse; die Summe der Beobachtungen aus den beiden Teilintervallen muss dabei die gleiche sein wie im ursprünglichen Intervall.

Wieder ist es nützlich, die Poissonverteilung für verschiedene Werte von $\mu$ anzuschauen. Zur Berechnung der Fakultät $k!$ wird die $\Gamma$-Funktion aus dem Paket scipy.special verwendet.

import scipy.special as sp

# Poisson distribution
def fPoisson(x, mu):
  k=np.around(x)
  return (mu**k)/np.exp(mu)/sp.gamma(k+1.)

k = np.linspace(0, 50, 200)
mu = [3, 5, 10, 20, 30]
for _mu in mu:
 plt.plot(k, fPoisson(k, _mu))
plt.show()

Als zweite Übung zur Poisson-Verteilung soll der Zusammenhang de Poisson-Verteilung und der Binomial-Verteilung grafisch dargestellt werden.

Sie können das mit folgendem Code-Beispiel anschauen:

import scipy.special as sp 

def fPoisson(x, mu): # Poisson distribution
  k=np.around(x)
  return (mu**k)/np.exp(mu)/sp.gamma(k+1.)

def fBinomial(x,n,p): # Binomial distribution
  k=np.around(x)
  return sp.binom(n,k) *p**k *(1.-p)**(n-k)

#--------------------------------------------------------------
# plot basic distributions
mu = 50.
sig = np.sqrt(mu)

x = np.linspace(20., 80., 200)

plt.plot(x, fPoisson(x, mu), 'b-')     
p = 0.01
n = mu/p
plt.plot(x, fBinomial(x, n, p), 'g-')

#  ( … )  # produce nice text
plt.show()

Spielen Sie ein wenig mit den Parametern $\mu$ und $p$, um einen Eindruck von der jeweiligen Übereinstimmung zu erhalten.

4.5 Die Gaußverteilung ^


Die Gauß- oder auch (Gauß'sche) Normal-Verteilung ist die Grenzverteilung, gegen die viele andere Verteilungen bei großer Anzahl von Zufallsereignissen konvergieren. Mittelwerte aus hinreichend vielen Zufallszahlen sind unter recht schwachen Voraussetzungen Gauß-verteilt - das ist die Aussage des "zentralen Grenzwertsatzes der Statistik". Da Messungen typischerweise von einer großen Anzahl von Störungen beeinflusst werden, die sich alle aufaddieren, ist die Annahme gaußverteilter Unsicherheiten sehr häufig gerechtfertigt.

Gaußverteilungen werden sehr häufig vorausgesetzt, z.B. bei Anwendung von Quantilen der Gaußverteilung in Medizin, den empirischen Geisteswissenschaften oder bei der Qualitätskontrolle und bei Messunsicherheiten in den Ingenieur- und Naturwissenschaften. Außerdem ist die Gaußverteilung fundamental in vielen Naturgesetzen, z.B. die Maxwell'sche Geschwindigkeitsverteilung oder die Orts- bzw. Impulsunschärfe in den Quantenphysik. In vielen statistischen Verfahren werden implizit gaußverteilte Größen vorausgesetzt, z. B. normalverteilte Klausurnoten (!?).

Wahrscheinlichkeitsdichte und Kenngrößen der Normalverteilung sind: $$ N(x; \mu, \sigma) = \frac {1}{\sqrt{2\pi} \sigma} {\rm exp} \left( - \frac{(x-\mu)^2}{2\sigma^2} \right) \\ {\rm E}[x] \,=\, \mu \\ {\rm V}[x] \,=\, \sigma^2 \\ $$ Quantile der Gaußverteilung: $$\begin{array}{lcr} \mathrm{P} (|x-\mu|<1\cdot\sigma) &=& 68.26\% \\ \mathrm{P} (|x-\mu|<2\cdot\sigma) &=& 95.45\% \\ \mathrm{P} (|x-\mu|<3\cdot\sigma) &=& 99.73\% \\ \end{array}$$

Die Summe von zwei (unkorrelierten) Gauß-verteilten Zufallszahlen $g_1$ und $g_2$ mit Mittelwerten $\mu_1$ und $\mu_2$ mit Standardabweichungen $\sigma_1$ und $\sigma_2$ ist ebenfalls Gauß-verteilt; es gilt $f(g_1 + g_2)\,=\,N(g_1 + g_2; \,\mu_1+\mu_2\,,\sqrt{{\sigma_1}^2+{\sigma_2}^2})$.

Für große Anzahlen an Versuchen nähert sich die Poisson-Verteilung der Gaußverteilung an. Als Standardabweichung der Gaußverteilung wird dabei $\sigma = \sqrt{\mu}$ gewählt. Sie können das mit folgendem Code-Beispiel anschauen, in dem die einfachen Implementierungen der Poisson- und Gauß-Verteilungen von oben durch Funktionen aus dem Paket scipy.stats ersetzt wurden. scipy stellt eine sehr große Anzahl an diskreten und kontinuierlichen Verteilungen mit einem einheitlichen und funktionsreichen, damit aber auch komplizierten Interface bereit.

from scipy.stats import norm, poisson, binom

def fGauss(x, mu=0., sigma=1.):  # Gauss distribution with scipy.stats
  return norm.pdf( (x-mu)/sigma) / sigma

def fPoisson(x, mu): # Poisson distribution
  k=np.around(x)
  return(poisson.pmf(x, mu)

def fBinomial(x, n, p): # Binomial distribution
  k=np.around(x)
  return binom.pmf(x, n, p)

#--------------------------------------------------------------
# plot distributions
mu = 10.
sig = np.sqrt(mu)

x = np.linspace(0., 50., 200)
plt.plot(x, fGauss(x, mu, sig), 'r-') 
plt.plot(x, fPoisson(x, mu), 'b-')     

#  ( … )  # produce nice text 
plt.show()

Variieren Sie den Parameter $\mu$, um einen Eindruck der jeweiligen Übereinstimmung zu erhalten.

4.5.1 Der zentrale Grenzwertsatz der Statistik

Die Summe von $n$ (nahezu) beliebig verteilter Zufallszahlen folgt im Grenzfall großer Werte von $n$ einer Normalverteilung:

$ \displaystyle x \,= \, \lim_{n\to\infty} \sum_{i=1}^n $ ist für $x_i$ aus einer Verteilung mit Erwartungswert $\mu_i$ und Varianz ${\sigma_i}^2$,
die die Lyapunov-Bedingung der Endlichkeit der Summe $\displaystyle {\rm E}\left[ \sum_{i=1}^n |x_i - \mu_i| ^3 \right]$ erfüllen,
eine Gauß-verteilte Größe mit Erwartungswert $\displaystyle \mu\,=\,\sum_{i=1}^n\mu_i$ und Varianz $\displaystyle \sigma^2 \,=\, \sum_{i=1}^n{\sigma_i}^2$

Die Konvergenz der Summe vieler Zufallsgrößen gegen die Normalverteilung zeigt folgende Simulation, bei der eine Anzahl $n$ gleichverteilter Zufallszahlen aufsummiert und dann die Häufigkeitsverteilung einer großen Anzahl von $k$ Stichproben dargestellt wird. Das Ergebnis wird mit der entsprechenden Normalverteilung verglichen.

from scipy.stats import norm

# Anzahl der Stichproben 
k = 5000

n = 1  # ausprobieren: 2, 3, 5, 7, 10, 20  

# k Summen von je n Zufallszahlen erzeugen
x = np.zeros(k)
for i in range(k):
  x[i] = np.random.rand(n).sum()

# Häufigkeitsverteilung darstellen
plt.hist(x, density=True, bins = 100)
# Gaußverteilung zum Vergleich einzeichnen
mu = 0.5 * n
sig = np.sqrt(n/12.)
xp = np.linspace(0., n, 101)
plt.plot(xp, norm.pdf( (xp-mu)/sig ) /sig )
plt.show()

4.6 $\chi^2$ und weitere Verteilungen ^

Aus der Normalverteilung lassen sich weitere Verteilungen ableiten. Dazu gehört auch die Verteilung der Summe der Quadrate von $n$ standard-normal verteilten Zufallszahlen, ${z_i}^2$. Warum ist das überhaupt interessant?

Zur Beantwortung merken wir an, dass die Größe $z_i= (x_i - \mu)/\sigma$ für eine gaußverteilte Zufallsgröße $x$ mit Erwartungswert $\mu$ und Standardabweichung $\sigma$ ein Maß für den auf die Unsicherheit normierten Abstand einer Messung vom Mittelwert darstellt; daher ist diese Größe standard-normalverteilt.

Von Carl Friedrich Gauß stammt der Vorschlag, die quadrierte Summe $s = \sum {z_i}^2$ dieser Abstände als Abstandsmaß einer Anzahl von Messpunkten von einer Vorhersage anzunehmen. Damit spielt die Verteilung von $s$ eine wichtige Rolle, um die Übereinstimmung von Modellen mit empirischen Daten zu bewerten.

Man nennt sie "$\chi^2$-Verteilung" mit $n$ Freiheitsgraden. Die Wahrscheinlichkeitsdichte ist $$ \chi^2(s; n) = \frac{1}{2^{n/2}\Gamma(n/2)} s^{n/2-1}\exp(-s/2) \,.$$

Ihr Erwartungswert ist $\rm{E}[s] \,=\, n$; das ist offensichtlich, da jeder Summand ${z_i}^2$ im Mittel Eins zur Summe beiträgt. Aus diesem Grund gibt man statt dem Wert von $s$ häufig den Wert von $\chi^2$ pro Freiheitsgrad an, $s/n$, dessen Erwartungswert Eins ist.

Die Varianz der $\chi^2$-Verteilung ist $\rm{V}[s]\,=\, 2n$; für große Werte von $n$ nähert sich die $\chi^2$-Verteilung der Normalverteilung an.

Direkt aus der Definition ergibt sich, dass die Summe von zwei $\chi^2$-verteilten Zufallsgrößen mit Freiheitsgraden $n$ bzw. $m$ ebenfalls $\chi^2$-verteilt ist, $f(s_1, s_2) = {\chi^2}(s_1+s_2; \, n+m)\,.$

Wie schon gesagt, wird die $\chi^2$-Verteilung und insbesondere ihre kumulative Verteilungsdichte genutzt, um die Übereinstimmung von Modellen mit Messdaten zu quantifizieren ($\chi^2$-Test).

Eine Implementierung der $\chi^2$-Wahrscheinlichkeitsdichte findet sich in scipy.stats.chi2.

Aufgabe: stellen Sie die Dichte (pdf) und die kumulative Verteilungsfunktion (cdf) der $\chi^2$-Verteilung für 1, - 6 Freiheitsgrade dar.

Eine weitere häufig in der Physik anzutreffen ist die Cauchy- oder Breit-Wigner-Verteilung; Sie kennen die Form der Kurve aus Resonanzphänomenen. Hier die PDF: $$ f(x) \,=\, \frac{1}{\pi} \frac{1}{1+x^2} \,\,{\rm bzw.} \\ f(x; \Gamma, x_0) \,=\, \frac{\Gamma / 2}{\pi} \frac{ 1}{(\Gamma/2)^2 + (x-x_0)^2} \,.$$

Der Erwartungswert ist ${\rm E}[x] = x_0\,$. Als Besonderheit ist anzumerken, dass die Varianz nicht existiert.

Als Fourier-Transformierte der Exponentialfunktion bestimmt die Breit-Wigner-Verteilung die Energieunschärfe von Teilchen oder Zuständen mit endlicher Lebensdauer. In der Atomphysik ist sie als Lorentz-Kurve bekannt und beschreibt die "natürliche Linienbreite" eines atomaren Übergangs.


5. Zweidimensionale Verteilungen ^


Das Konzept der Wahrscheinlichkeitsdichte ist auf mehrere Dimensionen erweiterbar. Die "multivariate Gaußverteilung" zur gleichzeitigen Beschreibung mehrerer, nicht notwendigerweise unabhängiger Zufallsgrößen ist dafür ein wichtiges Beispiel.

In der statistischen Mechanik und in der Quantenphysik werden Wahrscheinlichkeitsdichten von Orts- und Impulsvektoren betrachtet, oder gar Dichteverteilungen im extrem hochdimensionalen Phasenraum eines Vielteilchensystems.

Wir betrachten zunächst zwei Zufallsgrößen $x$ und $y$ und deren zweidimensionale Wahrscheinlichkeitsdichte $f(x,y)$. Die Normierbarkeit verlangt

$\displaystyle \int_{-\infty}^\infty \int_{-\infty}^\infty f(x, y)\, {\rm d}x \, {\rm d}y = 1$

$f(x_0, y_0)\,dx\,dy$ ist die Wahrscheinlichkeit, $x$ in $[x_0, x_0+dx]$ und gleichzeitig $y$ in $[y_0, y_0+dy]$ zu beobachten.

Wenn nur die Wahrscheinlichkeitsdichte von $x$ für beliebige Werte von $y$ interessiert, wird die $y$-Abhängigkeit herausintegriert und man erhält die sogenannte "Randverteilung" $f_x(x)$, die anschaulich die Projektion der zweidimensionalen Dichteverteilung auf die x-Achse darstellt:
$f_x(x) \,=\, \displaystyle \int_{-\infty}^\infty f(x, y)\, \rm{d}y\,$.

Ganz analog ergibt sich die Randverteilung für die Dichteverteilung in $y$:
$f_y(y) \,=\, \displaystyle \int_{-\infty}^\infty f(x, y)\, \rm{d}x\,$.

Wenn $x$ und $y$ unabhängige Zufallsgrößen sind, gilt

$f(x,y) = f_x(x) \, f_y(y)\,$.

Die kumulative Verteilungsfunktion für $x$, $F_x(x)$ ist

$F_x(x) \,=\, \displaystyle \int_{-\infty}^{x} f_x(x')\, {\rm d}x' \,=\, \int_{-\infty}^{x} \int_{-\infty}^\infty f(x', y')\, \rm{d}x' \, \rm{d}y' \,$, und analog für $y$.


5.1 Darstellung zweidimensionaler Verteilungen [^(#Inhalt)

Zur Veranschaulichung einer zweidimensionalen Verteilung sehen wir uns ein einfaches Beispiel und die typische Darstellungsform an, bei der für jedes Wertepaar $(x,y)$ ein Punkt in ein sogenanntes "Streudiagramm" eingetragen wird.

x = np.random.randn(1000)
y = 2 * np.random.randn(1000)
plt.plot(x,y, '.')
plt.show()

Üblich ist auch eine Darstellung als Häufigkeit. Denkbar und auch bisweilen genutzt wird die Höhe einer Säule in einer 3d-Darstellung, analog zur Höhe eines Balkens im eindimensionalen Fall. Allerdings sind solche perspektivischen Darstellungen nur schwer quantitativ ablesbar. Deshalb nutzt man meist eine Farbcodierung zur Darstellung der Häufigkeit. Günstig ist die Wahl einer Farbpalette, die nicht verschiedene Farben, sondern die Sättigung einer einzelnen Farbe als Maß für die Dichte nutzt. An Stelle der im folgenden Code-Beispiel vorgeschlagenen Wahl cmap='Blues' können Sie zur Veranschaulichung des Problems auch einmal cmap='rainbow' versuchen.

plt.hist2d(x, y, bins=40, cmap= 'Blues')
plt.colorbar()
plt.show()

5.2 Kovarianz und Korrelation ^

Oft sind die beiden betrachteten Zufallsgrößen nicht unabhängig voneinander. Ganz im Gegenteil ist es häufig so, dass mehrdimensionale Darstellungen gerade dazu genutzt werden, um gezielt nach solchen Abhängigkeiten oder "Korrelationen" von Zufallsgrößen zu suchen.

Wir untersuchen also zwei Variablen, die nicht unabhängig voneinander sind und mischen dazu die beiden Zufallsvariablen von oben, um zwei neue, korrelierte Zufallsgrößen $u = x + y$ und $v = x - y$ zu erhalten. Wir betrachten die sich ergebende zweidimensionale Häufigkeitsverteilung:

u = x + y
v = y - x
plt.hist2d(u, v, bins=25, cmap= 'Blues')
plt.colorbar()
plt.show()

Wie zu erwarten, ist die Verteilung nun gegenüber der ursprünglichen Variante gedreht. Diese Beobachtung gilt ganz allgemein: für unabhängige Variable ist die Punktewolke bzw. Häufigkeitsverteilung kugelförmig (bzw. durch Streckung oder Stauchung einer Achse in Kugelform überführbar), für korrelierte Variable ist sie elliptisch mit einer Hauptachse, die gegenüber den Koordinatenachsen gedreht ist.

Eine Abhängigkeit der beiden ursprünglichen Variablen $x$ und $y$ hätte man auch durch Hinzufügen einer weiteren, beiden Zufallsgrößen gemeinsame Zufallskomponente $c$ erzeugen können, $u' = x + c$ und $v' = y + c$. Auch in diesem Fall ergibt sich - je nach der Größe des Werts von $c$, eine gedrehte Verteilung (am besten einfach ausprobieren ...).

Formal lässt sich die Abhängigkeit von zwei Variablen durch die Verallgemeinerung der Varianz auf mehrere Dimensionen fassen. Die Varianz von $x$ ergibt sich wie im eindimensionalen Fall durch Berechnung des entsprechenden Erwartungwerts bzgl. der zweidimensionalen Verteilung:

$V[x] \,=:\, \mathrm{V_{xx}} = \left< \, (x - \left< x \right>)^2 \right> \,=\, \left< x^2 \right> - \left< x \right>^2$

und genau so für $y$:
$V[y] \,=:\, \mathrm{V_{yy}} = \left< \, (y - \left< y \right>)^2 \right> \,=\, \left< y^2 \right> - \left< y \right>^2$

Ganz analog lässt sich aber auch ein gemischter Term angeben,

$\mathrm{V_{xy}}(x, y) = \left< \, (x - \left<x \right>) \, (y - \left<y\right>) \, \right> = \left< x y \right> - \left< x \right>\left< y \right>$

$V_{xy}$ nennt man die Kovarianz von $x$ und $y$, ${\rm cov}(x,y)$. Da für unabhängige Variable der Erwartungswert von $x\,y$ gleich dem Produkt der Erwartungwerte ist, verschwindet die Kovarianz für unabhängige Variable und ist damit ein Maß für den Zusammenhang zwischen zwei Variablen.

Die Matrix

$V \,= \, \left( \begin{array}{ll} V_{xx} & V_{xy} \\ V_{xy} & V_{yy} \\ \end{array} \right)$ nennt man die Kovarianzmatrix.

Durch Einführung des Korrelationskoeffizienten

$\rho = \displaystyle \frac{{\rm cov}(x,y)} {\sigma_x \sigma_y}\, , \,-1 \le \rho \le 1 $
kann man die Kovarianzmatrix auch schreiben als

$V\,=\, \left( \begin{array}{ll} \sigma_x^2 & \rho\, \sigma_x \sigma_y \\ \rho \, \sigma_x \sigma_y & \sigma_y^2 \\ \end{array} \right)\, .$

Die Matrix
$C\,=\, \left( \begin{array}{ll}

   1. & \rho \\
   \rho & 1. \\
   \end{array}

\right)$ nennt man die Korrelationsmatrix.

Das bisher eingeführte Konzept für zwei Variable lässt sich auf viele Zufallsgrößen $\vec{x}\,:= (\,x_1, \ldots , x_n)$ erweitern. Die Kovarianzmatrix ist dann eine symmetrische $n \times n$ - Matrix:

${\bf V} \,=\, \displaystyle (\rm{V}_{ij}) = \left( \mathrm{cov}(x_i, x_j) \right).$

In Vektor-Schreibweise mit dem Variablen-Vektor $\vec{x}$ lässt sich die Kovarianzmatrix kompakt schreiben als:

${\bf V} = \bigl< \bigl( \vec{x} - \left< \vec{x} \right> \bigr) \, \bigl(\vec{x} - \left< \vec{x} \right> \bigr)^T \bigr> = \left< \vec{x}\vec{x}^T\right> \, - \, \left< \vec{x}\right> \left<\vec{x}\right>^T $


5.3 Die Gaußverteilung in mehreren Dimensionen ^


Nach obigen Vorüberlegungen können wir nun die Wahscheinlichkeitsdichte der Gaußverteilung in mehreren Dimensionen diskutieren. Sie hat die Form:

$ N(\vec{x}; \, \vec{\mu}, V) \,=\, \frac{1} {\sqrt{(2 \pi)^n \, |V|}} \exp \left[ -\frac{1}{2} (\vec{x} - \vec{\mu})^T V^{-1} (\vec{x} - \vec{\mu}) \right]$

$V$ ist dabei die Kovarianzmatrix, $|V|$ ihre Determinante und $V^{-1}$ die inverse der Kovarianzmatrix.

Für den zweidimensionalen Fall und geschrieben mit Hilfe des Korrelationskoeffizienten $\rho$ sieht die Darstellung wie folgt aus:
$ \displaystyle N(x_1,x_2\,;\,\mu_1,\mu_2,\sigma_1,\sigma_2,\rho) \,=\, \frac{1}{2\pi\sigma_1\sigma_2\sqrt{1-\rho^2}} \cdot \exp{ \left( - \frac {1} {2(1-\rho^2)} \left[ u_1^2 + u_2^2-2\rho u_1 u_2) \right] \right) } $
${\rm mit~} u_i=\frac{x_i-\mu_i}{\sigma_i}\,$ .

Als python-Code geschrieben sieht das etwa so aus:

# 2D-Gaussian normal distribution
def gauss2d(x, y, mx=0, my=0., sx=1., sy=1., rho=0.5):
  '''
    caluclate values of 2d Gaussian distribution

    Args:  
      float of numpy array of float x:  x value(s)
      float of numpy array of float y:  y value(s)
      float mx: mean x
      float my: mean y
      float sx: sigma x
      float sy: sigma y
      floar rho: correlation coefficient

    Returns: 
      float(s) 
  '''
  u1 = (x-mx)/sx
  u2 = (y-my)/sy
  a = 2.*np.pi*sx*sy*np.sqrt(1-rho**2)
  return np.exp(-(u1**2 + u2**2 -2*rho*u1*u2)/(2.*(1-rho**2)) ) / a

Wir definierten nun noch eine Hilfsfunktion get_3Dfunction_data(), die ein Gitter von (x,y)-Punkten erzeugt und die zugehörigen Werte der $z$-Koordinate durch indirekten Aufruf der eben definierten Funktion erzeugt. Dies bildet die Basis für dreidimensionale Darstellungen:

# ---helper function ---------------------------------------
def get_3Dfunction_data(xmin=1.,xmax=1.,ymin=-1.,ymax=1., 
                        func=gauss2d, fkwargs={}, delta=0.1):
  '''
    get function values on 2D-grid

    Args: 
      float xmin: minimum x-range
      float xmax: maximum x-range
      float ymin: minimum y-range
      float ymys: maximum y-range
      funtion func: funtion f(x,y **kwargs)
      dict fkwargs: prameters to pass to function
      delta: resolution of grid

    Returns: 
      tuple X, Y, Z
  '''    
  x = np.arange(xmin, xmax, delta)
  y = np.arange(ymin, ymax, delta)
  X, Y = np.meshgrid(x, y)
  Z = func(X, Y, **fkwargs)
  return X, Y, Z

Eine dreidimensionale Darstellung einer Funktion erzeugt der folgende Code; das Bild ist sehr bunt - wen das stört, möge im Code cmap=cm.rainbow durch cmpap=cm.Oranges oder cmap=cm.Blues ersetzen.

Hier der Beispielcode zur dreidimensionalen Darstellung von Funktionen:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np, matplotlib.pyplot as plt
from matplotlib import cm

# --- main part of program ---

# define parameters of 2-dimensional Gaussian distibution
mu_x = 0   
mu_y = 0
sig_x = 1.
sig_y = 1.
rho = 0.1
# argument dictionary for indirect call
kwargs = {'mx': mu_x, 'my':mu_y, 'sx':sig_x, 'sy':sig_y, 'rho':rho}

# get the 3d data
f = gauss2d
X, Y, Z = get_3Dfunction_data(xmin=-4., xmax=4., ymin=-4., ymax=4.,
           func = f, fkwargs=kwargs, delta=0.1)
minz = np.amin(Z) 
maxz = np.amax(Z)

# create a figure ...
fig = plt.figure(figsize=(10., 7.5))
ax = fig.add_subplot(projection = '3d')

# ... and plot the surface.
surf = ax.plot_surface(X, Y, Z, cmap=cm.rainbow,
                       linewidth=0, antialiased=False)
# set range for z axis.
ax.set_zlim(minz, maxz)

# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=10)

plt.show()

5.3.1 Die Kontur-Darstellung ^

Wie Sie sicher bemerkt haben, ist diese Form der Darstellung unter Umständen ganz nett, aber quantitativ kaum auszuwerten. Deshalb gibt man einer zweidimensionalen Darstellung den Vorzug, die Höhenlinien - in diesem Zusammenhang Konturen genannt - verwendet. So kann man Symbole und Linien verwenden, um Maximum oder Erwartungswert und Konturen für eine, zwei oder auch mehrere Standardabweichungen einzuzeichnen.

matplotlib bietet als Unterstützung die Methoden pyplot.contour() für Linien und pyplot.contourf() für gefüllte Flächen an. Die Anwendung illustriert das folgende Code-Beispiel anhand der gleichen Gauß-Funktion, die wir schon oben verwendet haben. Auch die Hilfsfunktion get_3Dfunction_data() aus dem vorigen Beispiel wird hier wieder gebraucht.

Zur Bestimmung der Konturen werden noch die Funktionswerte benötigt, für deren Werte Konturen bestimmt werden sollen; dazu wählen wir die Funktionswerte an den Stellen $x_k = \mu_x + k\,\sigma_x$, und $y=\mu_y$.

Hier der Code, dessen erster Teil zum bereits oben verwendeten identisch ist:

# define parameters of 2-dimensional Gaussian distribution
mu_x = 0.  
mu_y = 0.
sig_x = 1.
sig_y = 1.
rho = 0.5
# argument dictionary for indirect call
kwargs = {'mx': mu_x, 'my':mu_y, 'sx':sig_x, 'sy':sig_y, 'rho':rho}

# get the 3d data
f = gauss2d
X, Y, Z = get_3Dfunction_data(xmin=-4., xmax=4., ymin=-4., ymax=4.,
           func = f, fkwargs=kwargs, delta=0.1)

# get levels for contours (n-sigma)
x_k = mu_x + np.arange(4., 0., -1) * sig_x  # levels must be in increasing order !!!
zlevel = f(x_k, mu_y,  **kwargs)

# define a figure ...
fig_cont = plt.figure(figsize=(7.5, 6.))
# ... and plot contours
cp = plt.contour(X, Y, Z, levels = zlevel, cmap=cm.rainbow)
# add title and labels
plt.plot(0., 0., '+')
plt.title('Konturen der Gaußverteilung')
plt.xlabel('x')
plt.ylabel('y')

# add a nice legend using a color bar
cbar = fig_cont.colorbar(cp)
cbar.ax.set_yticklabels(['4','3','2','1'])

plt.show()

Machen Sie sich ein wenig mit dem Code vertraut und probieren Sie ihn in der folgenden Zelle aus.

Unser Vorstellungsvermögen sowie die Möglichkeiten der Darstellung sind auf maximal drei Dimensionen begrenzt. Daher schaut man sich Projektionen der hochdimensionalen Verteilung auf alle möglichen Paare $(x_i, x_j)$ der Variablen an. Die eben gezeigte Darstellungsform ist daher auch für die Visualisierung von Verteilungen vieler Zufallsgrößen $x_i, \ldots, x_n$ sehr nützlich.

Die Konturen sind bei Gaußverteilungen immer Ellipsen, bei denen die Richtungen der Hauptachse durch den Korrelationskoeffizienten des betrachteten Variablenpaares festgelegt ist.
Zur Erklärung: die Konturen entsprechen Schnitten mit Ebenen parallel zur den Achsen ($i, j$) bei festen Werten des Exponenten in der Gaußverteilung. Der Ausdruck im Exponenten stellt die Gleichung eines $n$-dimensionalen Paraboloids dar.

Die Ausrichtung der Hauptachsen lässt sich durch den Winkel $\alpha$ zur Achse $i$ ausdrücken: $\displaystyle \tan \,2\alpha \,=\, 2\rho_{ij}\frac { \sigma_i \sigma_j }{ \sigma_i^2 - \sigma_j^2 }\, .$
Ein Winkel von 45° entspricht einem Korrelationskoeffizienten von 1. Die Werte von $\sigma_i$ und $\sigma_j$ liest man aus den Extremwerten der $1\,\sigma$-Kontur auf der entsprechenden Achse ab.

Über die grafisch Betrachtung hinaus ist es hilfreich, Konturellipsen zur Kovarianzmatrix in Beziehung zu setzen. Die Richtungen der Hauptachsen entsprechen den Richtungen der Eigenvektoren $\vec{E_1}, \vec{E_2}$ der Kovarianzmatrix. Wenn man die Einheitsvektoren $\vec{e_i}$ in Richtung der Eigenvektoren verwendet, erhält man die Schreibweise $\vec{E_i} = E_i \,\vec{e_i}$. Die Enden der Halbachsen der Kovarianz-Ellipsen, die der sogenannten $1\,\sigma$-Kontur entsprechen, sind gegeben durch die Vektoren $\sqrt{E_i} \, \vec{e_i}$; die Enden der Halbachsen für $n\,\sigma$-Konturen erhält man durch Skalierung, $n \, \sqrt{E_i} \, \vec{e_i}$.

Zur Erinnerung: oben (in Kap. 5.2) hatten wir korrelierte Zufallzahlen als Linearkombination von unkorrelierten Zufallszahlen erzeugt. Die Diagonalisierung der Kovarianzmatrix, also die Bestimmung der Eigenvektoren, ist die Umkehrung dieser Vorgehensweise: sie liefert die Linearkombinationen der korrelierten Größen, die unkorreliert sind. Weil die Kovarianzmatrix eine symmetrische Matrix ist, ist dies immer möglich.

Die im eben betrachteten Beispiel erzeugten Konturen entsprechen für unkorrelierte Zufallsgrößen mit Eigenvektor-Richtungen $\vec{e}_1=(1.,0.)$ und $\vec{e}_2=(0.,1.)$ den $n\,\sigma$-Konturen. Für korrelierte Zufallsgrößen, also bei nicht verschwindendem Korrelationskoeffizienten, wird die Bestimmung der $n\,\sigma$-Konturen etwas aufwändiger. Das wollen wir im folgenden noch kurz darstellen.

Darstellung von Wahrscheinlichkeits-Konturen

An Stelle der oben diskutieren $n-\sigma$-Konturen werden üblicherweise Konturen für feste kumulative Wahrscheinlichkeiten angegeben, sogenannte "Wahrscheinlichkeits-Konturen".

Zum Beispiel erhält man durch Ausführen einer Integration der Gaußverteilung über den Bereich der $1\,\sigma$-Kontur die Wahrscheinlichkeit der Beobachtung eines Ereignisses innerhalb der Ellipse zu 39.3%.

Das lässt sich leicht nachvollziehen, wenn man berücksichtigt, das die Gaußverteilung in zwei Dimensionen in Polarkoordinaten $(r,\, \varphi)$ mit $(r, \varphi)$ mit $r^2 = x_i^2+x_j^2$ analytisch integrierbar ist. Da sich beliebige Gauß-verteilte Größen $x_i$ durch Transformation der Variablen mittels $u_i = (x_i - \mu_i)/\sigma_i\,$ auf eine Standard-Normalverteilung, (mit $\mu_i=0,$, $\sigma_i=1$) zurück führen lassen, betrachten wir der Einfachheit halber die Standard-Normalverteilung in zwei Dimensionen. Die Wahrscheinlichkeit $p$ einer Beobachtung innerhalb des Abstands $r$ vom Erwartungswert (0., 0.) ergibt sich durch Integration zu

$p=1-{\rm exp}(-r^2/2)\,$ und durch Umkehrung der Beziehung erhält man

$r(p)= \sqrt{-2 \, {\rm ln}(1-p)}$.

Mit Hilfe dieses Zusammenhangs lassen sich nun die entsprechenden Werte für die Niveaulinien zu vorgegebenen Werten der Wahrscheinlichkeit bestimmen. Für verschwindenden Korrelationskoeffizienten kann man z.B. den Punkt $(x = \mu_x + r(p)\,\sigma_x, \, y=\mu_y)$ als Punkt auf der Kontur wählen. Der Wert der Gaußverteilung an diesem Punkt wird als Niveau der Konturline an die Funktion contour() übergeben, die dann die vollständige Linie bestimmt.

Im allgemeinen Fall mit einem von Null verschiedenen Korrelationskoeffizienten muss die Kovarianzmatrix einbezogen werden. Wie wir oben schon diskutiert hatten, erhält man die Halbachesn der Kovarianz-Ellipsen duch Diagonalisieren der Kovarianzmatrix, d.h aus deren Eigenvektoren. Als Referenzpunkt für die Konturdarstellung wählt man z.B. den Endpunkt der ersten Halbachse - dies entspricht dann einem Punkt der $1\,\sigma$-Kontur. Wenn man die Koordinaten dieses Wertes mit dem aus der Standard-Normalverteilung gewonnenen Wert $r(p)$ skaliert, erhält man einen Punkt auf der dieser Wahrscheinlichkeit $p$ entsprechenden Konturlinie. Die gesamte Linie wird wie im Fall eben mit Hilfe der Funktion contour() bestimmt.

Glücklicherweise enthält das Paket mumpy alle notwendigen Hilfsmittel, um die Berechnungen übersichtlich zu erledigen: die Funktion numpy.linalg.eig() liefert Beträge und Richtungen der Eigenvektoren einer Matrix.

Der Teil des Codes aus dem obigen Beispiel, der für die Bestimmung der Niveaus für die Konturdarstellung sorgt, muss zur Darstellung von Wahrscheinlichkeits-Konturen durch folgende Zeilen ersetzt werden:

# get levels for contours (probablity)
p_k = np.array([0.95, 0.865, 0.683, 0.5, 0.393]) # Wahrscheinlichkeiten 
s_k = np.sqrt(-2 * np.log(1 - p_k)) 

# need eigenvalues of Covariance Matrix
#    construct covariance matrix
V = np.array(
       [[sig_x*sig_x, rho*sig_x*sig_y],
       [rho*sig_x*sig_y, sig_y*sig_y]])
# determine eigen-vectors
E, evec = np.linalg.eig(V)
# take one point on contour to calculate zlevel
#   we use the scaled first eigenvector of the Covariance Matrix
x_k = s_k * np.sqrt(E[0]) * evec[0][0]
y_k = s_k * np.sqrt(E[0]) * evec[1][0]
zlevel = f(x_k, y_k,  mx= mu_x, my=mu_y, sx=sig_x, sy=sig_y, rho=rho)

Natürlich sollte noch für korrekte Beschriftung gesorgt und die Benennung der Konturlinien angepasst werden:

cbar.ax.set_yticklabels(
    ['95.0%', '86.5%=2$\sigma$', '68.3%' ,'50.0%', '39.3%=1$\sigma$'])

Kopieren Sie den Code aus der vorigen Code-Zelle und nehmen Sie die beschriebenen Änderungen vor.

Diese Art der Darstellung mit Hilfe von Wahrscheinlichkeitskonturen wir auch häufig zur Visualisierung empirischer Daten verwendet, indem man die empirischen Varianzen und Kovarianzen bestimmt und dann die Konturlinien der entsprechenden Gaußverteilung zusammen mit den Datenpunkten in ein Streudiagramm einträgt. Zur Illustration verwenden wir zufällige Datenpunkte, die mit der folgenden Funktion erzeugt werden können:

# function to generate 2-dimensional random Gaussian numbers
def rangauss2d(n, mx=0, my=0., sx=1., sy=1., rho=0.5):
  '''
    Gaussian distributed numbers in two dimensions  

    Args:  
      int n: number of random points  
      float mx: mean x
      float my: mean y
      float sx: sigma x
      float sy: sigma y
      floar rho: correlation coefficient

    Returns:  
      tuple of float arrays 
  '''
  u1 = np.random.randn(n)
  u2 = np.random.randn(n)
  x = mx + sx * u1
  y = my + sy * (rho*u1 + np.sqrt(1-rho*rho) * u2)
  return x, y

Die erzeugten zufälligen Punkte können nun als Streudiagramm in die Grafik von oben eingetragen werden:

# overlay random data
x,y = rangauss2d(1000, 0., 0., 1., 1., 0.5)
plt.plot(x, y, 'y.', alpha = 0.2)

Der Parameter alpha = 0.2 sorgt dafür, dass die Punkte durchsichtig dargestellt werden und die Konturlinien darunter sichtbar bleiben.



Mit diesem - zugegebenermaßen etwas anspruchsvollen - Ausflug in die Welt der multivariaten Datenauswertung sind wir am Ende dieses "learning-by-doing"-Tutoriums angekommen.

Hoffentlich ist es gelungen, die Grundlagen der Statistik zu veranschaulichen und einen Ausblick zur Anwendung in der Physik zu geben. Die vorgestellten Code-Beispiele zur grafischen Darstellung sind zur freien Anwendung in Ihren eigenen Arbeiten gedacht und Sie können sie sicher nutzbringend einsetzen.


Als logische Fortsetzung zu diesem Tutorial sollten Sie das Notebook Fehlerrechnung.ipynb bearbeiten, in dem Grundlagen, Methoden und konkrete Beispiele zur Behandlung von Messunsicherheiten in den Praktika zur Physik behandelt werden.


Es gibt noch sehr viele weitere Verteilungen, die in der Physik eine große Rolle spielen und die Ihnen im Verlauf des Studiums begegnen werden. Das Thema Statistik und Wahrscheinlichkeitsverteilungen ist also mit diesen einführenden Betrachtungen bei weitem noch nicht erschöpft und bleibt weiterhin herausfordernd und spannend ...