Die Abgabefrist dieser Hausaufgabe ist 2023-12-18 13:00!
Vergessen Sie nicht Ihre Übung abzugeben (Assignment Tab / Submit Button). Einfaches Speichern reicht nicht! Sie können beliebig oft abgeben, die letzte Abgabe vor der Deadline wird gewertet.
1# execute this for default imports
2import math
3import random as rd
4import numpy as np
5import pandas as pd
6from matplotlib import pyplot as plt
7from scipy import stats
[40 Point(s)]
In dieser Aufgabe wollen wir uns mit den unterschiedlichen Konfidenzintervallen aus der Vorlesung beschäftigen.
Hierzu ist der Datensatz abalone.txt über Seeohren (eine Muschelart, engl. Abalone) mit verschiedenen Merkmalen einer Seeohrenpopulation (https://archive.ics.uci.edu/ml/datasets/Abalone) gegeben.
Wir betrachten im Folgenden das Merkmal Length. (Dieses ist im Datensatz in mm/200 angegeben, um die Werte für ein Neuronales Netz zu normieren. Behalten Sie die Skalierung bei.)
Laden Sie die Daten wie folgt in ein Pandas Dataframe mit Namen seeohren.
1import pandas as pd
2
3seeohren = pd.read_csv('WuS_Hausaufgabe_5_files/data/abalone.txt')
4seeohren
[2 Point(s)]
Implementieren Sie zunächst die Funktion stichprobe, die aus einer float Liste eine Stichprobe der angegebenen Größe zieht (mit Wiederholungen) und diese zurückgibt.
1import random
2
3
4def stichprobe(daten: [float], n: int) -> [float]:
5 """
6 Ziehe eine Stichprobe
7
8 Arguments:
9 daten -- Liste mit Fließkommazahlen
10 n -- Anzahl der Werte in der Stichprobe
11 Returns:
12 werte -- Eine Liste mit den gezogenen Werten
13 """
14 return [daten[random.randint(0,len(daten)-1)] for _ in range(n)]
15
16stichprobe([3.14, 2.72, 1.41, 42.], 10)
test_07_Sch_tzen_KonfInt_Seeohren_A0
Score: 2.0 / 2.0 (Top)
1# This test case is hidden #
[6 Point(s)]
Implementieren Sie nun die Funktion konfidenzintervall_t, welche für eine gegebene normalverteilte Stichprobe (daten) und ein gegebenes Konfidenzniveau (konfidenz) das Konfidenzintervall für den Erwartungswert der zugrundeliegenden Verteilung mittels der T-Verteilung schätzt.
1from scipy import stats
2
3def konfidenzintervall_t(daten: [float], konfidenz: float) -> (float, float):
4 """
5 Berechnet das beidseitige Konfidenzintervall anhand der T Verteilung
6
7 Arguments:
8 daten -- Gegebene Stichprobe
9 konfidenz -- Konfidenzniveau
10 Returns:
11 (c_u, c-o) -- Konfidenzintervall (untere Grenze, obere Grenze)
12 """
13 x_quer = np.mean(daten)
14 n = len(daten)
15 alpha = 1-konfidenz
16 s = np.std(daten, ddof=1)
17
18 c = stats.t(df=n-1).ppf(1-alpha/2)
19 c_u = x_quer - c*s/n**.5
20 c_o = x_quer + c*s/n**.5
21
22 return c_u, c_o
23konfidenzintervall_t([1,2,3,4,5,2,3,4], .9)
test_07_Sch_tzen_KonfInt_Seeohren_B0
Score: 6.0 / 6.0 (Top)
1# This test case is hidden #
[6 Point(s)]
Implementieren Sie nun die Funktion konfidenzintervall_norm, welche für eine gegebene normalverteilte Stichprobe (daten), bekannte Standardabweichung (std) und ein gegebenes Konfidenzniveau (konfidenz) das Konfidenzintervall für den Erwartungswert der zugrundeliegenden Verteilung mittels der Normalverteilung schätzt.
1from scipy import stats
2
3def konfidenzintervall_norm(daten: [float], std: float, konfidenz: float) -> (float, float):
4 """
5 Berechnet das beidseitige Konfidenzintervall mit der Normalverteilung
6
7 Arguments:
8 daten -- Gegebene Stichprobe
9 std -- Standardabweichung der Grundgesamtheit
10 konfidenz -- Konfidenzniveau
11 Returns:
12 (c_u, c-o) -- Konfidenzintervall (untere Grenze, obere Grenze)
13 """
14 x_quer = np.mean(daten)
15 n = len(daten)
16
17 c = stats.norm.ppf((konfidenz+1)/2)
18 c_u = x_quer - c * std / n**.5
19 c_o = x_quer + c * std / n**.5
20
21 return c_u, c_o
22
23konfidenzintervall_norm([1,2,3,4,5,2,3,4], 1.2, .9)
test_07_Sch_tzen_KonfInt_Seeohren_C0
Score: 6.0 / 6.0 (Top)
1# This test case is hidden #
[8 Point(s)]
Ziehen Sie 1000 Stichproben der Größe 20 mit Zurücklegen, um den Erwartungswert der Länge der Seeohren zu schätzen.
Berechnen Sie dazu für jede Stichprobe das 90% Konfidenzintervall (zweiseitig), einmal mittels der T-Verteilung und einmal mittels der Normalverteilung mithilfe ihrer Funktionen. Verwenden Sie in letzterem Fall die Standardabweichung der Grundgesamtheit zur Berechnung.
Berechnen Sie das Konfidenzintervall außerdem noch einmal falsch anhand der Normalverteilung, wobei Sie die Stichprobenstandardabweichung der Stichprobe als std Parameter verwenden.
Berechnen Sie dann den relativen Anteil der Stichproben bei denen der echte Erwartungswert (nehmen Sie hierfür den Mittelwert der Grundgesamtheit an) im berechneten Konfidenzintervall um die Mittelwerte Ihrer Stichproben liegt.
Speichern Sie Ihre Lösung in den Variablen anteil_t_20, anteil_norm_20, sowie anteil_norm_falsch_20.
1true_mean = seeohren.Length.mean()
2true_std = np.std(seeohren.Length)
3size = 20
4repeats = 1000
5konfidenz = 0.9
6
7stichproben = [stichprobe(list(seeohren.Length), size) for _ in range(repeats)]
8konfidenzintervalle_t_20 = [konfidenzintervall_t(sp, konfidenz) for sp in stichproben]
9konfidenzintervalle_norm_20 = [konfidenzintervall_norm(sp,true_std, konfidenz) for sp in stichproben]
10konfidenzintervalle_norm_falsch_20 = [konfidenzintervall_norm(sp,np.std(sp), konfidenz) for sp in stichproben]
11
12anteil_t_20 = sum([c_u < true_mean < c_o for c_u, c_o in konfidenzintervalle_t_20])/repeats
13anteil_norm_20 = sum([c_u < true_mean < c_o for c_u, c_o in konfidenzintervalle_norm_20])/repeats
14anteil_norm_falsch_20 = sum([c_u < true_mean < c_o for c_u, c_o in konfidenzintervalle_norm_falsch_20])/repeats
15
16anteil_t_20, anteil_norm_20, anteil_norm_falsch_20
test_07_Sch_tzen_KonfInt_Seeohren_D0
Score: 8.0 / 8.0 (Top)
1# This test case is hidden #
[4 Point(s)]
Vervollständigen Sie nun die Funktion experiment, welche das Experiment aus d)
für die übergebene Anzahl an Wiederholungen und Stichprobengröße durchführt
und die relativen Anteile im t, norm und norm_falsch Konfidenzintervall widergibt.
1konfidenz = 0.90
2def experiment(wiederholungen: int, stichprobengroesse: int):
3 """
4 Berechnet den relativen Anteil der Stichproben bei denen der Erwartungswert im Konfidenzintervall liegt
5
6 Arguments:
7 wiederholungen -- Anzahl der Ziehungen der Stichprobe
8 stichprobengroesse -- Groesse der gezogenen Stichproben
9 Returns:
10 anteil_t -- Anteil der Stichproben deren Mittelwert im berechneten Konfidenzintervall liegt
11 anteil_norm -- Anteil der Stichproben deren Mittelwert im berechneten Konfidenzintervall liegt
12 anteil_norm_falsch -- Anteil der Stichproben deren Mittelwert im berechneten Konfidenzintervall liegt
13 """
14 stichproben = [stichprobe(list(seeohren.Length), stichprobengroesse) for _ in range(wiederholungen)]
15
16 anteil_t = sum([c_u < true_mean < c_o
17 for c_u, c_o in [konfidenzintervall_t(sp, konfidenz)
18 for sp in stichproben]])/wiederholungen
19
20 anteil_norm = sum([c_u < true_mean < c_o
21 for c_u, c_o in [konfidenzintervall_norm(sp,true_std, konfidenz)
22 for sp in stichproben]])/wiederholungen
23
24 anteil_norm_falsch = sum([c_u < true_mean < c_o
25 for c_u, c_o in [konfidenzintervall_norm(sp,np.std(sp), konfidenz)
26 for sp in stichproben]])/wiederholungen
27
28 return anteil_t, anteil_norm, anteil_norm_falsch
29
30experiment(1000, 20)
test_07_Sch_tzen_KonfInt_Seeohren_E0
Score: 4.0 / 4.0 (Top)
1# This test case is hidden #
[2 Point(s)]
Wiederholen Sie das Experiment für eine Stichprobengröße von 10.
Speichern Sie Ihre Lösung in den Variablen anteil_t_10, sowie anteil_norm_10.
1anteil_t_10, anteil_norm_10, anteil_norm_falsch_10 = experiment(1000, 10)
2
3anteil_t_10, anteil_norm_10, anteil_norm_falsch_10
test_07_Sch_tzen_KonfInt_Seeohren_F0
Score: 2.0 / 2.0 (Top)
1# This test case is hidden #
[4 Point(s)]
Wiederholen Sie das obige Experiment jeweils für eine Stichprobengröße von 3, 4, 5, 7, 10, 15, 20, 30, 40, 50.
Speichern Sie die Werte jeweils als entsprechende Liste in den Variablen anteil_t, anteil_norm, sowie anteil_norm_falsch.
1sizes = [3, 4, 5, 7, 10, 15, 20, 30, 40, 50]
2ergebnisse = [experiment(1000, size) for size in sizes]
3anteil_t = [ergebniss[0] for ergebniss in ergebnisse]
4anteil_norm = [ergebniss[1] for ergebniss in ergebnisse]
5anteil_norm_falsch = [ergebniss[2] for ergebniss in ergebnisse]
6
7
8anteil_norm_falsch, anteil_norm, anteil_t, ergebnisse
test_07_Sch_tzen_KonfInt_Seeohren_G0
Score: 3.0 / 4.0 (Top)
1# This test case is hidden #
[6 Point(s)]
Erstellen Sie ein Diagramm, welches die Resultate aus g) mittels drei line-plots miteinander vergleicht. Die x-Achse bezeichnet die Stichprobengrößen und die y-Achse den Anteil der Mittelwerte im Konfidenzintervall pro Verteilung.
1fig, ax = plt.subplots()
2
3ax.plot(sizes, anteil_norm, linestyle='-', label='Normalverteilung')
4#ax.plot(sizes, anteil_norm_falsch, linestyle='-', label='Normalverteilung Falsch')
5ax.plot(sizes, anteil_t, linestyle='-', label='T Verteilung')
6ax.legend()
7plt.grid() # Gitterlinien
8plt.xlabel('Stichprobengröße') # Achsenbeschriftung
9plt.ylabel('Anteil der Mittelwerte im Konfidenzintervall') # Achsenbeschriftung
10plt.title('''
11Anteil der Mittelwerte im Konfidenzintervall bei verschiedenen Stichprobengrößenund Verteilungen
12bei 1000 wiederholungen pro Stichprobengröße''') # Titel
13plt.show()
[2 Point(s)]
[30 Point(s)]
Der Fisher-Test ist ein Signifikanztest auf Unabhängigkeit in Kontingenztafeln.
Implementieren Sie den zweiseitigen Fisher-Test. Benutzen Sie hierfür nicht die Funktion stats.fisher_exact!
[15 Point(s)]
Implementieren Sie hierfür zunächst die Funktion p_tab(...), welche als Parameter a und eine vierfeldertafel als Liste von Listen erhält. Die Funktion soll die zugehörige Wahrscheinlichkeit für berechnen.
1import math
2from scipy import stats
3
4def p_tab(a, vierfeldertafel):
5 b = vierfeldertafel[0][1]
6 c = vierfeldertafel[1][0]
7 d = vierfeldertafel[1][1]
8
9 n = a+b+c+d
10
11 return (math.comb(a+b,a) * math.comb(c+d,c)) / math.comb(n,a+c)
12
13vierfeldertafel = [[4, 1],
14 [2, 2]]
15p_tab(vierfeldertafel[0][0], vierfeldertafel)
[15 Point(s)]
Implementieren Sie nun die Funktion fisher_exakt. Diese erhält eine Vierfeldertafel und berechnet den zugehörigen p-Wert, um zu entscheiden. Es soll sich hier also um den beidseitigen Test handeln!
1def fisher_exakt(vierfeldertafel) -> float:
2 '''
3 Führe den zweiseitigen Fisher-Test für eine Vierfeldertafel aus
4
5 Arguments:
6 vierfeldertafel -- Die Vierfeldertafel
7 Returns:
8 p_Wert -- Der p-Wert
9 '''
10 a = vierfeldertafel[0][0]
11 b = vierfeldertafel[0][1]
12 c = vierfeldertafel[1][0]
13 d = vierfeldertafel[1][1]
14
15 return 1 - stats.hypergeom.cdf(a-1, M=a+b+c+d, n=a+b, N=a+c)
16
17vierfeldertafel = [[4, 1],
18 [2, 2]]
19
20fisher_exakt(vierfeldertafel)
[30 Point(s)]
Die Fragen sind Multiple-Choice-Fragen, es können also auch mehrere Antworten korrekt sein. Punkte gibt es nur, wenn alle korrekten und keine falsche Antwort ausgewählt wurde.
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]
[2 Point(s)]