{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Computergestützte Datenauswertung\n",
"**Institut für Experimentelle Teilchenphysik (ETP)**
\n",
"**Institut für Theorie der Kondensierten Materie (TKM)**
\n",
"Prof. Dr. Torben Ferber (ETP)
\n",
"Dr. Nils Faltermann (ETP), Dr. Andreas Poenicke (TKM), Alexander Heidelbach (ETP)
\n",
"[Ilias Seite zum Kurs](https://ilias.studium.kit.edu/ilias.php?ref_id=2067677&cmd=frameset&cmdClass=ilrepositorygui&cmdNode=x0&baseClass=ilrepositorygui)
\n",
"Sommersemester 2023 – Blatt 03
\n",
"Abgabe: Montag, 05.06.2023 ($A$) & Montag, 12.06.2023 ($B$)\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Auf dem dritten Übungsblatt beschäftigen Sie sich mit den Grundlagen der statistischen Datenauswertung.\n",
"In der [ersten Aufgabe](#Aufgabe1) setzen Sie sich mit einfachen statistischen Größen auseinander durch selbstständiges Implementieren der Ausdrücke aus der Vorlesung.\n",
"Die [zweite Aufgabe](#Aufgabe2) behandelt erneut Zufallsexperimente mit Würfeln, vertieft jedoch die Durchführung und Darstellung solcher Experimente.\n",
"Im [letzten Teil](#Aufgabe3) des Übungsblattes bekommen Sie die Möglichkeit, den zentralen Grenzwertsatz noch mal selbst in grafischer Weise zu vertiefen. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 1: Berechnung statistischer Größen \n",
"---\n",
"\n",
"In dieser Aufgabe implementieren Sie die Berechnung einiger der statistischen Größen aus der Vorlesung. \n",
"Ziel dieser Übung ist es, die statistischen Größen *Mittelwert*, *Varianz* und *Standardabweichung* zu verinnerlichen und verschiede Berechnungsweisen, die Sie in der Vorlesung kennengelernt haben, zu wiederholen.\n",
"\n",
"In diesem Verzeichnis liegt Ihnen die Datei `numbers.txt` vor.\n",
"Diese Datei beinhaltet ganze Zufallszahlen im Bereich 0 bis 9.\n",
"Auf dem letzten Aufgabenblatt lernten Sie bereits die Bibliothek *NumPy* kennen und in der Vorlesung wurde Ihnen teilweise gezeigt, wie sie mithilfe der Bibliothek die statistischen Größen *Mittelwert* ([`numpy.mean`](https://numpy.org/doc/stable/reference/generated/numpy.mean.html)), *Varianz* ([`numpy.var`](https://numpy.org/doc/stable/reference/generated/numpy.var.html)), *Standardabweichung* ([`numpy.std`](https://numpy.org/doc/stable/reference/generated/numpy.std.html)) und die *Stichprobenvarianz* berechnen können.\n",
"Die folgende Jupyter-Zellen zeigt Ihnen, wie Sie die Daten in `numbers.txt` einlesen können und wie Sie mithilfe von *NumPy* die statistischen Größen berechnen lassen können.\n",
"\n",
"**Anmerkung:**
\n",
"In vielen Fällen ist die Stichprobenvarianz der beste Schätzwert für die Varianz einer Stichprobe, da diese erwartungstreu ist.\n",
"Eine einfache Herleitung für den Korrekturfaktor in der Stichprobenvarianz finden Sie auf [Wikipedia](https://de.wikipedia.org/wiki/Stichprobenvarianz_(Schätzfunktion)#Erwartungstreue)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"# Einlesen der Daten aus der Datei\n",
"numbers = np.loadtxt('numbers.txt', dtype=int)\n",
"N = len(numbers)\n",
"print(N, \" Nummern gelesen in: \\n\", numbers)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# NumPy Funktionen\n",
"print(\"Statistische Größen mit NumPy:\")\n",
"print(\"Mittelwert: \", np.mean(numbers))\n",
"print(\"Varianz: \", np.var(numbers))\n",
"print(\"Standardabweichung: \", np.std(numbers))\n",
"print(\"Erwartungstreue Varianz\", np.var(numbers, ddof=1))\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Berechnen Sie die vier Größen mithilfe der statistischen Definitionen, die Sie in der Vorlesung für Stichproben kennengelernt haben.\n",
"Vergleichen Sie Ihr Ergebnis mit den Werten, die Sie mithilfe von *NumPy* bereits erhalten haben.\n",
"\n",
"**Hinweis:**
\n",
"Es bietet sich an, die einzelnen Berechnungen in Funktionen zu implementieren, die Sie wiederverwenden können."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Eigene Funktionen\n",
"\n",
"#def mean(values):\n",
" # Hier Ihren Code einfügen\n",
"\n",
"#def variance(values):\n",
" # Hier Ihren Code einfügen\n",
"\n",
"#def sigma(values):\n",
" # Hier Ihren Code einfügen\n",
"\n",
"#def unbiased_variance(values):\n",
" # Hier Ihren Code einfügen\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Statstische Definition für Stichproben\n",
"#print(\"Statistische Größen mit eigener Defenition:\")\n",
"#print(\"Mittelwert: \", mean(numbers))\n",
"#print(\"Varianz: \", variance(numbers))\n",
"#print(\"Standardabweichung: \", sigma(numbers))\n",
"#print(\"Erwartungstreue Varianz\", unbiased_variance(numbers))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bestimmen Sie nun die Häufigkeit der einzelnen Zahlen in der Datei `numbers.txt`, d. h. füllen Sie einen `numpy.array` mit der jeweiligen Häufigkeit, mit der die Zahlen 0 bis 9 vorkommen. \n",
"Das `numpy.array` enthält dann statt der ursprünglichen Datenmenge nur noch 10 Zahlen, die eine erheblich komprimiertere Version der ursprünglichen Daten darstellt.\n",
"In manchen Fällen der Datenauswertung werden Sie auf genau diesen Fall treffen, dass Ihnen nur die Häufigkeiten von Ereignissen in einem sogenannten *Binning* bekannt sind."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Bestimmung der Häufigkeit\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Berechnen Sie anschließend den Mittelwert und die Varianz der Daten direkt aus der Häufigkeitsverteilung, wie Sie es bereits in der Vorlesung hergeleitet haben.\n",
"Vergleichen Sie mit den Ergebnissen, die Sie bisher erhalten haben."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Eigene Funktionen aus Häufigkeit\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 2: Würfelspiel \n",
"---\n",
"In dieser Aufgabe führen Sie erneut Zufallsexperimente mit Würfeln aus.\n",
"Im Folgenden spielen Sie jedoch nicht nur mit einem Würfel, sondern werfen jedes Mal $n$ Würfel gleichzeitig und betrachten die resultierende Augensumme.\n",
"Ziel dieser Aufgabe ist es, das Durchführen und grafische Darstellen von Zufallsexperimenten zu vertiefen.\n",
"\n",
"Sie können folgende Funktion für die Simulation eines Würfelergebnisses mit 3 Würfeln verwenden.\n",
"Sie erhalten beim Ausführen der `wuerfeln(n)` Funktion die 3 gewürfelten Augenzahlen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"rng = np.random.default_rng(42)\n",
"\n",
"def wuerfeln():\n",
" # Wurf von 3 Würfeln\n",
" return rng.integers(low=1, high=7, size=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Zunächst spielen Sie mit 3 Würfeln.\n",
"Summieren Sie für jeden Wurf mit 3 Würfeln die Augensumme $S$ der Würfel.\n",
"Führen Sie 1000 solcher Spiele durch und stellen Sie die Häufigkeitsverteilung der Augensumme $S$ grafisch dar.\n",
"\n",
"**Hinweis:**
\n",
"Verwenden Sie gerne die [`matplotlib.pyplot.hist`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html) Funktion zur Darstellung der Häufigkeit der verschiedenen Augensummen.\n",
"Eine sehr einfach Verwendung der Funktion ist, `plt.hist(a, b)` in der `a` das Array ist, welches all die Aufgensummen enthält, und `b` das Binning vorgibt. \n",
"Geben Sie beispielsweise eine Integerzahl für `b` ein, so werden `b` Bins zur Darstellung verwendet.\n",
"Überlegen Sie sich, wie viele Bins sie für alle möglichen Augensummen Ergebnisse mit 3 Würfeln benötigen würden.\n",
"*Anmerkung*: Sie können auch eine vollständige Liste oder `numpy.array` als `b` übergeben, indem Sie die jeweiligen Bingrenzen in den Arrays selbst bestimmen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Durchführen des Zufallsexperiments:\n",
"# 3 Würfel, 1000 Mal geworfen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Grafische Darstellung des Ergebnisses\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Verallgemeinern Sie Ihren Code oder die oben angegebene Funktion so, dass Sie auch mit einer beliebigen Zahl von $n$ Würfeln gleichzeitig $N$ Spiele spielen können.\n",
"Berechnen Sie nun anstelle der Augensumme die mittlere Augensumme $\\bar{s}=S/n$ und geben Sie für alle $N$ Spiele die mittlere Augensumme $\\bar{s}$ in der neuen Funktion aus.\n",
"Stellen Sie anschließend die Häufigkeitsverteilung der mittleren Augenzahl für $n=10$, $n=50$ und $n=100$ für jeweils $N=1000$ Spiele dar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Ggfls. neue Funktion zum Wüfeln definieren\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Anzahl an Spielen\n",
"N = 1000\n",
"\n",
"# Durchführung des Zufallexperiments und grafische Darstellung\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wiederholen Sie nun die Zufallsexperimente mit $n=5$ und $n=100$ Würfel für $N=10000$ Spiele. \n",
"Bestimmen Sie für beide Durchläufe jeweils die Standardabweichung und den Mittelwert und zeichnen Sie eine Normalverteilung mit den ausgerechneten Werten mit in das Histogramm.\n",
"Was beobachten Sie für die jeweilige Würfelanzahl?\n",
"\n",
"**Hinweise:**
\n",
"1. Die Normalverteilung ist in der folgenden Zelle gegeben. Wenn Sie die Verteilung mit dem Histogramm zusammen darstellen wollen, müssen Sie entweder das Histogramm normieren (fügen Sie Folgendes hinzu zur Darstellung vom Histogramm: `plt.hist(..., density=True)`) oder die Darstellung der Normalverteilung.\n",
"2. Wiederholen Sie die Zufallsexperimente gerne einige Mal durch mehrfaches Ausführen der Zelle, um den Unterschied zu beobachten."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Funktion für die Normalverteilung\n",
"def Gauss(x, mu=0., sigma=1.):\n",
" return np.exp(-(x - mu)**2 / 2 / sigma**2) / np.sqrt(2*np.pi) / sigma"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Anzahl an Spielen\n",
"N = 10000\n",
"\n",
"# Durchführung des Zufallexperiments und grafische Darstellung\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"# Aufgabe 3: Zentraler Grenzwertsatz \n",
"---\n",
"\n",
"Der zentrale Grenzwertsatz ist in der statistischen Datenauswertung von wesentlicher Bedeutung und Bestandteil vieler Näherungen im frequentistischen Ansatz. \n",
"In dieser Aufgabe sollen Sie selbst qualitativ anhand von zwei Beispielen die Konvergenz der Summe von $n$ unabhängigen Zufallszahlen beobachten.\n",
"\n",
"Zur Wiederholung aus der Vorlesung: **Zentraler Grenzwertsatz**
\n",
"Im Grenzfall großer $n$ ist die (normierte) Summe von $n$ unabhängigen Zufallszahlen eine Zufallszahl, die einer Gaußverteilung folgt.\n",
"$$\n",
"z_n=\\frac{\\sum_{i=1}^n(x_i-\\mu_i)}{\\sqrt{\\sum_{i=1}^n\\sigma_i^2}}=\\frac{y_n-E[y_n]}{\\sqrt{V[y_n]}}\n",
"$$\n",
"\n",
"konvergiert für $n\\to\\infty$ gegen eine Standardnormalverteilung."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Arbeitsanweisung:**
\n",
"Betrachten Sie die Summe $y_n$ von $n$ **gleichverteilten** Zufallszahlen $x_i$ im Intervall [0,1], $y_n=\\sum_{i=1}^{n}x_i$.\n",
"Berechnen Sie für $n=2,10, 100, 1000$ jeweils 100000 Werte von $z_n$.\n",
"Histogrammieren Sie die 100000 $z_n$ Werte und zeichnen Sie jeweils die Standardnormalverteilung (Normalverteilung mit $\\mu=0$ und $\\sigma=1$) mit in das Diagramm.\n",
"Achten Sie auf eine ausreichende Anzahl an Bins, damit der Vergleich aussagekräftig ist.\n",
"\n",
"**Hinweis:**
\n",
"Für die Summe von $n$ gleichverteilten Zufallszahlen erhalten Sie $E[y_n]=n/2$ und $V[y_n]=n/12$."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Funktion für die Normalverteilung\n",
"def Gauss(x, mu=0., sigma=1.):\n",
" return np.exp(-(x - mu)**2 / 2 / sigma**2) / np.sqrt(2*np.pi) / sigma"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Durchführung und Darstellung des Zufallexperiments\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Wiederholen Sie nun die Zufallsexperimente mit einer Summe von exponentiell verteilten Zufallszahlen $y_=\\sum_{i=1}^{n} \\lambda \\exp(-\\lambda x_i)$ für den Fall $\\lambda = 1$.\n",
"Erhalten Sie das gleiche Ergebnis wie davor oder gibt es Unterschiede?\n",
"\n",
"**Anmerkung:**
\n",
"Berechnen Sie diesmal $E[y_n]$ und $V[y_n]$ selbst."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Durchführung und Darstellung des Zufallexperiments\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}