WuS_Hausaufgabe_2 (Score: 100.0 / 100.0)

  1. Written response (Score: 3.0 / 3.0)
  2. Comment
  3. Test cell (Score: 3.0 / 3.0)
  4. Test cell (Score: 4.0 / 4.0)
  5. Test cell (Score: 8.0 / 8.0)
  6. Coding free-response (Score: 5.0 / 5.0)
  7. Written response (Score: 2.0 / 2.0)
  8. Comment
  9. Test cell (Score: 10.0 / 10.0)
  10. Written response (Score: 2.0 / 2.0)
  11. Comment
  12. Written response (Score: 2.0 / 2.0)
  13. Comment
  14. Written response (Score: 3.0 / 3.0)
  15. Comment
  16. Written response (Score: 3.0 / 3.0)
  17. Comment
  18. Test cell (Score: 15.0 / 15.0)
  19. Test cell (Score: 5.0 / 5.0)
  20. Test cell (Score: 5.0 / 5.0)
  21. Test cell (Score: 4.0 / 4.0)
  22. Coding free-response (Score: 6.0 / 6.0)
  23. Comment
  24. Test cell (Score: 5.0 / 5.0)
  25. Test cell (Score: 10.0 / 10.0)
  26. Test cell (Score: 5.0 / 5.0)

Wahrscheinlichkeitstheorie und Statistik

WS 2023 / 2024

WuS Hausaufgabe 2

Abgabetermin

Die Abgabefrist dieser Hausaufgabe ist 2023-11-06 12:00 (Montag Mittag)!

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.

Viel Erfolg!

Hinweise zur Bearbeitung der Übung

Allgemeine Informationen:

  • Schreiben Sie Ihre Antwort an die Stelle YOUR CODE HERE.
  • Fügen Sie keine neuen Zellen hinzu oder löschen Zellen.
  • Benennen Sie keine der Dateien / Notebooks um.

Angabe von Ergebnissen

  • Runden Sie Ihre Ergebnisse nicht. Bei den Tests werden bis zu 6 Nachkommastellen geprüft.
  • Prozentzahlen werden immer als Zahl zwischen 0 und 1 angegeben. 30% wird somit als 0.3 angegeben.
  • Fließkommazahlen werden mit einem Dezimalpunkt angegeben, nicht mit einem Komma. 140.25.

Programmcode

  • Das Ergebnis einer Funktion muss mittels return zurückgegeben werden. Ein print Statement ist keine gültige Rückgabe.
  • Stellen Sie sicher, dass sich Ihr Code ausführen lässt. Code der nicht läuft kann nicht automatisch bewertet werden.
  • Bevor Sie abgeben: Klicken Sie im Menü auf Kernel > Restart & Run All (oder den Button in der Toolbar). Damit führen Sie das Notebook linear von oben nach unten aus. Alle Fehler die dann auftreten, treten auch beim Bewerten auf.
  • Entfernen Sie die raise NotImplementedError(), wenn Sie eine Aufgabe bearbeiten. Ansonsten wird beim Bewerten eine Exception ausgelöst, die uns sagt, dass Sie die Aufgabe nicht bearbeitet haben!
In [1]:
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

Task 1

[25 Point(s)]

Varianz vs Stichprobenvarianz

In dieser Aufgabe wollen wir uns die Unterschiede zwischen Varianz und Stichprobenvarianz experimentell veranschaulichen.

Task 1.1

[3 Point(s)]

Student's answer Score: 3.0 / 3.0 (Top)

Varianz vs Stichprobenvarianz a)

Hierzu wollen wir verschiedene Experimente mit einem normalen Würfel (W6) durchführen. Da die Wahrscheinlichkeitsverteilung eines fairen Würfels bekannt ist, können wir die erwartbare Varianz exakt berechnen.

0 false
~2.92 correct
~3.17 false
3.5 false
17.5 false
In [2]:
 1# Nutzen Sie diese Zelle gerne für Ihre Hilfsrechnungen
 2# Überlegen Sie z.B.
 3# - was die möglichen Ausgänge sind,
 4# - wie wahrscheinlich diese sind,
 5# - was dann der Mittelwert
 6# - und die Varianz ist.
 7ausgaenge = [1,2,3,4,5,6]
 8summe = 0
 9for x in ausgaenge:
10    summe += (x - np.mean(ausgaenge)) ** 2
11var = summe / len(ausgaenge)
12
13np.var([1,2,3,4,5,6], ddof=0), var
Out[2]:
(2.9166666666666665, 2.9166666666666665)

Task 1.2

[3 Point(s)]

Varianz vs Stichprobenvarianz b)

Würden Sie die Wahrscheinlichkeitsverteilung nicht kennen, müssten Sie die Varianz durch sammeln und analysieren von Beobachtungen schätzen. Dies sollen Sie im folgenden tun. Sie können die bereits für Sie implementierte Funktion get_data() aufrufen, um einen Datensatz mit 10 Werten zu erhalten.

Implementieren Sie die Funktion variances, welche die Varianz und die korrigierte Stichprobenvarianz eines Datensatzes X berechnet.

Wenn Sie variances() auf get_data() anwenden sollten Sie zwei Werte erhalten: eine Varianz und eine Stichprobenvarianz.

In [3]:
1def get_data():
2    return np.random.randint(low=1, high=7, size=10)
3
4get_data()
Out[3]:
array([1, 1, 2, 3, 2, 4, 3, 4, 3, 1])
In [4]:
Student's answer(Top)
 1def variances(X: [float]) -> (float, float):
 2    '''
 3    Calculates the variance and sample variance of X
 4    
 5    Arguments:
 6        X          -- x values of the data
 7    Returns:
 8        var        -- variance
 9        sample_var -- sample variance
10    '''
11    return np.var(X), np.var(X,ddof=1)
12
13wuerfe = get_data()
14varianz, stichprobenvarianz = variances(wuerfe)
15varianz, stichprobenvarianz
Out[4]:
(2.6100000000000003, 2.9000000000000004)
In [5]:
Grade cell: test_02_Deskriptive_Stat_Var_vs_Stichprobenvarianz_aufgeteilt_B0 Score: 3.0 / 3.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, grade_report
 3import numpy as np
 4
 5X = np.random.randint(low=0, high=20, size=100)
 6
 7varRef = np.var(X)
 8sample_varRef = np.var(X, ddof=1)
 9
10studv, studs = variances(X)
11
12
13def grade():
14    refs, stud = np.array((varRef, sample_varRef)), np.array((studv, studs))
15    if np.allclose(refs, stud, atol=1e-6):
16        return 1
17    
18    if np.allclose(refs[0], stud[0], atol=1e-6):
19        print("error in variance")
20        return .5
21    if np.allclose(refs[1], stud[1], atol=1e-6):
22        print("error in sample variance")
23        return .5
24    
25    print("both are wrong")
26    return 0
27
28grade_report(grade(), 3)
29### END HIDDEN TESTS
### BEGIN GRADE
3
### END GRADE

Task 1.3

[4 Point(s)]

Varianz vs Stichprobenvarianz c)

Nun wollen wir das Ziehen der 10 Datenpunkte und Berechnen der beiden Varianzen aus Teil b) häufiger wiederholen und mitteln.

Implementieren Sie dafür die Funktion means_of_variances(). In dieser soll n mal die Funktion get_data() aufgerufen werden, um neue Zufallszahlen zu erhalten und dann jeweils die beiden Varianzen davon zu berechnen. Anschließend soll die Funktion den Durchschnitt der n Varianzen und den Durchschnitt der n Stichprobenvarianzen berechnen.

Sie sollten nun erneut nur zwei Werte haben und zurückgeben: einen Durchschnitt der Varianzen und einen Durchschnitt der Stichprobenvarianzen.

In [6]:
Student's answer(Top)
 1def means_of_variances(n: int) -> (float, float):
 2    '''
 3    Calculates the averages of variance and sample variance.
 4    
 5    
 6    Arguments:
 7        n               -- number of repetitions of the experiment
 8    Returns:
 9        avg_var         -- average variance over the n experiments
10        avg_sample_var  -- average sample variance over the n experiments
11    '''
12    return np.mean([variances(get_data()) for _ in range(n)], 0)
13
14means_of_variances(1000)
Out[6]:
array([2.6299    , 2.92211111])
In [7]:
Grade cell: test_02_Deskriptive_Stat_Var_vs_Stichprobenvarianz_aufgeteilt_C0 Score: 4.0 / 4.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, grade_report
 3import numpy as np
 4
 5n= 1000
 6means = np.mean(np.array([variances(get_data()) for _ in range(n)]), axis=0)
 7
 8
 9stud_high_repetitions = means_of_variances(n)
10stud_low_repetitions = means_of_variances(1)
11
12
13def grade():
14    points = 1
15    if stud_low_repetitions[0] < 0 or stud_low_repetitions[0] > 6.25:
16        print("error in variance for low repetitions")
17        points -= 0.5
18    if stud_low_repetitions[1] < 0 or stud_low_repetitions[1] > 7:
19        print("error in sample variance for low repetitions")
20        points -= 0.5
21    
22    if stud_high_repetitions[0] < 2.4 or stud_high_repetitions[0] > 2.8:
23        print("error in variance for high repetitions")
24        points -= 0.5
25    if stud_high_repetitions[1] < 2.7 or stud_high_repetitions[1] > 3.1:
26        print("error in sample variance for high repetitions")
27        points -= 0.5
28    
29    # print("both are right")
30    return max(points, 0)
31
32grade_report(grade(), 4)
33### END HIDDEN TESTS
### BEGIN GRADE
4
### END GRADE

Task 1.4

[8 Point(s)]

Varianz vs Stichprobenvarianz d)

Beim mehrfachen Ausführen von Aufgabenteil c) stellen wir fest, dass die beiden Werte etwas schwanken. Wir möchten nun eine ganze Experimentreihe durchführen, in der wir Aufgabenteil c) m mal wiederholen, um diese nachfolgend zu visualisieren.

Implementieren Sie hierzu die Funktion multiple_means_of_variances(). Diese soll 2 Listen zurückgeben, die die Experimentreihe dokumentieren:

  • eine Liste von m Durchschnitten der n Varianzen
  • eine Liste von m Durchschnitten der n Stichprobenvarianzen

(Die Reihenfolge der Elemente in den Listen sollte natürlich entsprechend der Experimente geordnet sein, sodass die Indizes zueinander passen.)

In [8]:
Student's answer(Top)
 1def multiple_means_of_variances(m: int, n: int) -> ([float], [float]):
 2    '''
 3    Series of means of variances.
 4    
 5    Arguments:
 6        m    -- number of repetitions
 7        n    -- n for means_of_variances(n)
 8    Returns:
 9        smv  -- series of means of variances
10        sms  -- series of means of sample variances
11    '''   
12    return tuple(list(t) for t in zip(*[means_of_variances(n) for _ in range(m)])) ## smv, sms
13
14multiple_means_of_variances(3, 10)
Out[8]:
([2.421, 2.524, 2.77],
 [2.6900000000000004, 2.8044444444444445, 3.0777777777777784])
In [9]:
Grade cell: test_02_Deskriptive_Stat_Var_vs_Stichprobenvarianz_aufgeteilt_D0 Score: 8.0 / 8.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, grade_report
 3
 4stud_d_low , stud_s_d_low = multiple_means_of_variances(1000, 1)
 5stud_d_high , stud_s_d_high = multiple_means_of_variances(1000, 100)
 6
 7
 8def grade():
 9    points = 1
10    if np.min(stud_d_low) < 0 or np.max(stud_d_low) > 6.25:
11        print("error in variance for low n")
12        points -= 0.5
13    if np.min(stud_s_d_low) < 0 or np.max(stud_s_d_low) > 7:
14        print("error in sample variance for low n")
15        points -= 0.5
16    
17    if np.min(stud_d_high) < 2.2 or np.max(stud_d_high) > 3:
18        print("error in variance for high repetitions")
19        points -= 0.5
20    if np.min(stud_s_d_high) < 2.5 or np.max(stud_s_d_high) > 3.5:
21        print("error in sample variance for high repetitions")
22        points -= 0.5
23    
24    # print("both are right")
25    return max(points, 0)
26
27grade_report(grade(), 8)
28
29### END HIDDEN TESTS
### BEGIN GRADE
8
### END GRADE

Task 1.5

[5 Point(s)]

Varianz vs Stichprobenvarianz e)

Visualisieren Sie nun eine Serie von 100 unserer Experimente aus Aufgabenteil d) über je 1000 Durchschnitte von (korrigierten Stichproben)Varianzen.

Fassen Sie Ihre Ergebnisse in einem einzigen Plot als 3 Line-Plots zusammen: Plotten Sie

  • die Serie der 100 Durchschnitte der jeweils 1000 Varianzen,
  • die Serie der 100 Durchschnitte der jeweils 1000 korrigierten Stiprobenvarianzen
  • eine Linie in Höhe der der in Aufgabenteil a) berechneten erwarteten exakten Varianz

Hinweis: Achten Sie wie immer auf sinnvolle Beschriftungen und da Sie mehrere Dinge in einer Graphik plotten, auf eine Legende.

In [10]:
Student's answer Score: 5.0 / 5.0 (Top)
 1fig, ax = plt.subplots()
 2
 3data = multiple_means_of_variances(100,1000)
 4var_aus_a = np.var([1,2,3,4,5,6], ddof=0)
 5data_a = [var_aus_a for _ in data[0]]
 6ax.plot(data[0], linestyle='-', label='Varianz')
 7ax.plot(data[1], linestyle='-', label='Stichprobenvarianz')
 8ax.plot(data_a, linestyle=':', label='Varianz aus a)')
 9ax.legend()
10
11plt.grid()  # Gitterlinien
12plt.xlabel('Versuch n mit dem Durchschnitt aus 1000 Experimenten')  # Achsenbeschriftung
13plt.ylabel('(Stichproben-)varianz')  # Achsenbeschriftung
14plt.title('Getestete Varianz vs getestete Stichprobenvarianz ve berechnete Varianz')  # Titel
15
16plt.show()

Task 1.6

[2 Point(s)]

Student's answer Score: 2.0 / 2.0 (Top)

Varianz vs. Stichprobenvarianz f)

Welche Berechnungen sind die bessere Schätzungen für die echte Varianz?

Die Varianzen. false
Die Stichprobenvarianzen. correct

Task 2

[20 Point(s)]

Transformationen

In dieser Aufgabe geht es darum, Transformationen auf Daten anzuwenden und die Effekte dieser zu untersuchen.

In dieser Aufgabe sind nur lineare Transformationen ax+b relevant. Wie bei einer Geraden staucht oder streckt a die Daten, während b eine Verschiebung darstellt. Welche Auswirkungen diese Stauchungen, Streckungen und Verschiebungen auf den Mittelwert, sowie die Varianz haben, können Sie in der Vorlesung nachlesen.

Task 2.1

[10 Point(s)]

Transformationen a)

read_data() liest einen Datensatz ein. Wenden Sie auf diesen nun Transformationen an, sodass ein Histogramm der transformierten Stichprobe identisch mit dem Zielhistogramm unten ist. Für das Histogramm der transformierten Stichprobe bekommen Sie hierbei keine Punkte. Es soll Ihnen nur dabei helfen, die richtige Transformation zu finden. Punkte gibt es für das Überschreiben von X mit der korrekt transformierten Stichprobe.

Hinweis: Um die richtige Transformation zu finden sollten Sie sich vermutlich charakteristische Lage- und Streuungsparameter anschauen. Wenn diese bei beiden Verteilungen nach einer linearen Transformation übereinstimmen, haben Sie wahrscheinlich die richtige Transformation gefunden.

Zielhistogramm

title

In [11]:
1def read_data():
2    return np.genfromtxt('WuS_Hausaufgabe_2_files/data/data.csv', delimiter=',')
In [12]:
Student's answer(Top)
 1X = read_data()
 2# Überschreiben sie X hier
 3X = 0.1 * X - 20
 4
 5plt.hist(X, bins=100)
 6plt.xlabel("Müslimenge in g")
 7plt.ylabel("Auftrittshäufigkeit")
 8plt.title("Ausgeschüttete Müslimenge pro Schüssel")
 9plt.grid()
10plt.show()
In [13]:
Grade cell: test_02_Deskriptive_Stat_Transformationen_A0 Score: 10.0 / 10.0 (Top)
 1### BEGIN HIDDEN TESTS
 2#from assignmenttest import test_asserts
 3
 4x_ref1 = np.genfromtxt('WuS_Hausaufgabe_2_files/data/data.csv', delimiter=',')
 5x_ref1 = (x_ref1-200)/10
 6
 7x_ref2 = np.genfromtxt('WuS_Hausaufgabe_2_files/data/data.csv', delimiter=',')
 8x_ref2 = (x_ref2-np.mean(x_ref2))/10
 9
10x_ref3 = np.genfromtxt('WuS_Hausaufgabe_2_files/data/data.csv', delimiter=',')
11x_ref3 = (x_ref3-200)/np.std(x_ref3)
12
13x_ref4 = np.genfromtxt('WuS_Hausaufgabe_2_files/data/data.csv', delimiter=',')
14x_ref4 = (x_ref4-np.mean(x_ref4))/np.std(x_ref4)
15
16#@test_asserts(10)
17def check():
18    solution_found = False
19    if np.allclose(X,x_ref1):
20        solution_found = True
21    if np.allclose(X,x_ref2):
22        solution_found = True
23    if np.allclose(X,x_ref3):
24        solution_found = True
25    if np.allclose(X,x_ref4):
26        solution_found = True
27    
28    assert solution_found == True, "expected: " + str(x_ref1) + ", but got: " + str(X) 
29check()
30### END HIDDEN TESTS

Task 2.2

[2 Point(s)]

Transformationen b)

Student's answer Score: 2.0 / 2.0 (Top)

Gegeben sei eine Stichprobe mit Mittelwert = 5 und Varianz = 7.Nun wird die Transformation f(x)=7x5 angewendet. Was ist der resultierende Mittelwert?

0 false
30 correct
35 false
44 false
keiner der Obigen false
In [14]:
1# Zelle zum Ausprobieren
27*5-5
Out[14]:
30

Task 2.3

[2 Point(s)]

Student's answer Score: 2.0 / 2.0 (Top)

Was ist die resultierende Varianz?

1 false
14 false
44 false
49 false
343 correct
2401 false
keine der Obigen false
In [15]:
1# Zelle zum Ausprobieren
27**2*7 
Out[15]:
343

Task 2.4

[3 Point(s)]

Student's answer Score: 3.0 / 3.0 (Top)

Gegeben sei eine Stichprobe mit Mittelwert = 1 und Varianz = 1.Nun wird die Transformation f(x)=3x2+1 angewendet. Was ist der resultierende Mittelwert?

1 false
3 false
4 false
10 false
keiner der Obigen correct
In [16]:
1# Zelle zum Ausprobieren
2test = [0,2]
3test_trans = 3*np.array(test)**2+1
4np.var(test), np.mean(test), np.var(test_trans), np.mean(test_trans)
Out[16]:
(1.0, 1.0, 36.0, 7.0)

Task 2.5

[3 Point(s)]

Student's answer Score: 3.0 / 3.0 (Top)

Was ist die resultierende Varianz?

1 false
3 false
4 false
10 false
keiner der Obigen correct
In [17]:
1# Zelle zum Ausprobieren

Task 3

[35 Point(s)]

Lineare Regression

Task 3.1

[15 Point(s)]

Gewicht / Größe

Zusätzlich zu diesem Notebook wurde Ihnen die Datei health.csv zur Verfügung gestellt.

Dieser Datensatz enthält Umfrageergebnisse einer Gesundheitsumfrage unter Jugendlichen und jungen Erwachsenen aus den USA (https://www.icpsr.umich.edu/icpsrweb/DSDR/studies/21600).

Im Rahmen der National Longitudinal Study of Adolescent to Adult Health wurden 20000 Teilnehmer zu verschiedensten Themen rund um die Gesundheit befragt. Der Datensatz health.csv enthält einen Auszug der Fragen und Antworten von ca. 5000 Teilnehmern.

Der Datensatz enthält folgende Werte:

  • AID - Pseudonym für jeden Teilnehmer
  • H4WGT - Gewicht der Teilnehmer
  • H4HGT - Größe der Teilnehmer
  • BIO_SEX4 - Geschlecht der Teilnehmer
  • H4OD1Y - Das Geburtsjahr der Teilnehmer
In [18]:
 1# Führen Sie diese Zelle aus, um die vorgegebenen Daten in zwei Arrays zu laden
 2import numpy as np
 3import pandas as pd
 4
 5health = None
 6df = pd.read_csv('WuS_Hausaufgabe_2_files/data/health.csv')
 7
 8health = df.rename(columns={
 9    'H4WGT': 'Gewicht',
10    'H4HGT': 'Groesse',
11    'BIO_SEX4': 'Geschlecht',
12    'H4OD1Y': 'Geburtsjahr'
13})
14
15health_cleaned = health.loc[health.Gewicht <= 250].loc[health.Groesse <= 300]
16
17gewicht = np.array(health_cleaned.Gewicht)
18groesse = np.array(health_cleaned.Groesse)
19
20gewicht, groesse
Out[18]:
(array([113.9, 107.8,  68. , ...,  80.6,  75.3,  78.2]),
 array([180., 202., 161., ..., 178., 165., 180.]))

Lineare Regression a)

Wir möchten versuchen das Gewicht einer Person in Abhängigkeit seiner Größe vorherzusagen. Dazu können wir eine Ausgleichsgerade durch die Punkte legen.

Eine Ausgleichsgerade ist eine Gerade, die den mittleren quadratischen Abstand (das Quadrat der Residuen) zwischen der Gerade und den realen Datenpunkten minimiert.

regr.png

Implementieren Sie die Funktion fitLine(x_observed, y_observed) die für beobachtete X und Y Werte eine Ausgleichsgerade berechnet. Die Rückgabe der Funktion ist die Steigung und der Y-Achsenabschnitt der Geraden als Tupel.

Hinweis: Benutzen Sie keine bereits vollständig implementierten Funktionen für die Bestimmung der Ausgleichsgeraden. Sie dürfen hier zwar np.mean, np.cov und np.var benutzen, es wird aber mit Blick auf die Klausur angeraten, es auch mal komplett ohne zu probieren.

In [19]:
Student's answer(Top)
 1def fitLine(x_observed: [float], y_observed: [float]) -> (float, float):
 2    '''
 3    Fits a line f(x) = m * x + b to the observations
 4    
 5    Arguments:
 6        x_observed -- x values of the data
 7        y_observed -- y values of the data
 8    Returns:
 9        m          -- slope
10        b          -- intersect
11    '''
12    m = np.cov(x_observed, y_observed, ddof=0)[0][1] / np.var(x_observed)
13    b = np.mean(y_observed) - m * np.mean(x_observed)
14    return (m, b)
15
16fitLine([0, 1, 2, 3], [2, 3, 4, 5])
Out[19]:
(1.0, 2.0)
In [20]:
Grade cell: test_02_Deskriptive_Stat_Lineare_Regression_ausgleichsgerade_vorhersagen_A0 Score: 15.0 / 15.0 (Top)
 1# Führen Sie diesen Test aus, um sich selbst zu testen:
 2assert fitLine([0, 1, 2, 3], [2, 3, 4, 5]) == (1.0, 2.0)
 3
 4### BEGIN HIDDEN TESTS
 5from assignmenttest import VariableTest, FunctionTest, grade_report
 6from numbers import Number
 7
 8def fitLine_Referenz(x_observed, y_observed):
 9    '''
10    Fits a line f(x) = m * x + b to the observations
11    
12    Arguments:
13        x_observed -- x values of the data
14        y_observed -- y values of the data
15    Returns:
16        m          -- slope
17        b          -- intersect
18    '''
19    eX = np.mean(x_observed)
20    eY = np.mean(y_observed)
21    m = sum((x_observed - eX) * (y_observed - eY)) / sum((x_observed - eX)**2)
22    b = eY - m * eX
23    return m, b
24    
25
26
27
28def expected(xy):
29    return fitLine_Referenz(xy[0],xy[1])
30
31test_data = np.random.random((5,2,20))
32expected_data = [expected(xy) for xy in test_data]
33target = [fitLine(xy[0],xy[1]) for xy in test_data]
34
35def grade():
36    percentage = 1
37
38    try:
39        if np.shape(expected_data) != np.shape(target):
40            print("Dimensionen ihrer Werte falsch, kann leider nicht verglichen werden")
41            return 0
42    except Exception:
43        print("Dimensionen nicht verfügbar")
44        return 0
45    
46    _target = target
47    
48    if (type(expected_data[0][0]) != type(target[0][0])) and (float != type(target[0][0])):
49        print("Typ der Tupelelemente falsch, keine floats")
50        percentage -= .2
51        print("Versuche welche draus zu machen...")
52        try:
53            _target = np.array(target).astype(float)
54        except Exception:
55            print("hat leider nicht geklappt.")
56            return 0
57        print("hat geklappt, kann weitergehen.")
58    
59    if np.allclose(_target, expected_data):
60        return percentage
61
62    print("Ich weiß nicht, was Sie berechnet haben, aber es hat immerhin die richtige Länge.")
63    percentage -= .6
64    return percentage
65
66grade_report(grade(), points=15)
67
68### END HIDDEN TESTS
### BEGIN GRADE
15
### END GRADE

Task 3.2

[5 Point(s)]

Lineare Regression b)

Berechnen Sie folgende Ausgleichsgeraden:

  1. Vorhersage des Gewichts mittels der Größe
  2. Vorhersage der Größe mittels des Gewichts

Speichern Sie Ihre Lösung in den Variablen steigung1, achsenabschnitt1 sowie steigung2, achsenabschnitt2.

In [21]:
Student's answer(Top)
1steigung1, achsenabschnitt1 = fitLine(groesse, gewicht)
2steigung2, achsenabschnitt2 = fitLine(gewicht, groesse)
3steigung1, achsenabschnitt1, steigung2, achsenabschnitt2
Out[21]:
(0.8822131849977667,
 -65.5767974678655,
 0.16342491164047143,
 156.38859820737315)
In [22]:
Grade cell: test_02_Deskriptive_Stat_Lineare_Regression_ausgleichsgerade_vorhersagen_B0 Score: 5.0 / 5.0 (Top)
 1### BEGIN HIDDEN TESTS
 2import numpy.testing as test
 3
 4test.assert_equal(0.8822, float('%.4f'%(steigung1)), "Steigung 1 falsch: " + str(steigung1))
 5test.assert_equal(-65.5768, float('%.4f'%(achsenabschnitt1)), "Achsenabschnitt 1 falsch: " + str(achsenabschnitt1))
 6
 7test.assert_equal(0.1634, float('%.4f'%(steigung2)), "Steigung 2 falsch: " + str(steigung2))
 8test.assert_equal(156.3886, float('%.4f'%(achsenabschnitt2)), "Achsenabschnitt 2 falsch: " + str(achsenabschnitt2))
 9
10
11### END HIDDEN TESTS

Task 3.3

[5 Point(s)]

Lineare Regression c)

Berechnen Sie nun mit Ihren beiden Geraden zu den gegebenen Beispiel-Eingabe-Werten (X) die zugehörigen Funktionswerte und speichern Sie diese in den Variablen y_1 (für steigung1 und achsenabschnitt1) und y_2 (für steigung2 und achsenabschnitt2).

In [23]:
Student's answer(Top)
1X = np.array([130.985888 , 161.8515448,  80.6575286, 200.5113242, 196.1429888])
2y_1 = [steigung1 * x + achsenabschnitt1 for x in X]
3y_2 = [steigung2 * x + achsenabschnitt2 for x in X]
4y_1, y_2
Out[23]:
([49.980679974375235,
  77.21076936695121,
  5.580337732388955,
  111.31693648273625,
  107.46313339636379],
 [177.79495537992184,
  182.83917261518695,
  169.57004769196695,
  189.15714364767206,
  188.44324882091112])
In [24]:
Grade cell: test_02_Deskriptive_Stat_Lineare_Regression_ausgleichsgerade_vorhersagen_C0 Score: 5.0 / 5.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, FunctionTest, grade_report
 3from numbers import Number
 4
 5data = np.array([130.985888 , 161.8515448,  80.6575286, 200.5113242, 196.1429888])
 6
 7def expected(m,b,x):
 8    return m*x+b
 9
10# using steigung and achsenabschnitt for expected to give partial points for wrong slope and intersect
11expected_1 = [expected(steigung1,achsenabschnitt1,x) for x in data]
12target_1 = y_1
13expected_2 = [expected(steigung2,achsenabschnitt2,x) for x in data]
14target_2 = y_2
15expected = expected_1+expected_2
16target = np.append(y_1,y_2)
17
18def grade():
19    percentage = 1
20
21    try:
22        if np.shape(expected) != np.shape(target):
23            print("Dimensionen ihrer Werte falsch, kann leider nicht verglichen werden")
24            return 0
25    except Exception:
26        print("Dimensionen nicht verfügbar")
27        return 0
28    
29    _target = target
30    
31    if (type(expected[0]) != type(target[0])) and (float != type(target[0])):
32        print("Typ der Tupelelemente falsch, keine floats")
33        percentage -= .2
34        print("Versuche welche draus zu machen...")
35        try:
36            _target = np.array(target).astype(float)
37        except Exception:
38            print("hat leider nicht geklappt.")
39            return 0
40        print("hat geklappt, kann weitergehen.")
41    
42    if np.allclose(_target, expected):
43        return percentage
44
45    print("Ich weiß nicht, was Sie berechnet haben, aber es hat immerhin die richtige Länge.")
46    percentage -= .8
47    return percentage
48
49grade_report(grade(), points=5)
50
51### END HIDDEN TESTS
### BEGIN GRADE
5
### END GRADE

Task 3.4

[4 Point(s)]

Lineare Regression e)

Um die Ausgleichsgerade im relevanten Bereich der Daten zu plotten, sollten Sie diesen zunächst bestimmen.

Speichern Sie dafür

  • in gerade_groesse_x1x2 den kleinsten und größten Größenwert,
  • in gerade_groesse_y1y2 die Vorhersage für die beiden Größenwerte und
  • in gerade_gewicht_y1y2 den kleinsten und größten Gewichtswert,
  • in gerade_gewicht_x1x2 die Vorhersage für die beiden Gewichtswerte.
In [25]:
Student's answer(Top)
1gerade_groesse_x1x2 = [min(groesse), max(groesse)]
2gerade_groesse_y1y2 = [min(steigung1*groesse+achsenabschnitt1), max(steigung1*groesse+achsenabschnitt1)]
3
4gerade_gewicht_x1x2 = [min(steigung2*gewicht+achsenabschnitt2), max(steigung2*gewicht+achsenabschnitt2)]
5gerade_gewicht_y1y2 = [min(gewicht), max(gewicht)]
6
7gerade_groesse_x1x2, gerade_groesse_y1y2, gerade_gewicht_x1x2, gerade_gewicht_y1y2
Out[25]:
([122.5, 204.0],
 [42.494317694360916, 114.3946922716789],
 [162.54971737621892, 189.07358053546744],
 [37.7, 200.0])
In [26]:
Grade cell: test_02_Deskriptive_Stat_Lineare_Regression_ausgleichsgerade_vorhersagen_D0 Score: 4.0 / 4.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, grade_report
 3import numpy as np
 4
 5
 6def grade():
 7    points = 0
 8    
 9    if 0 in gerade_groesse_x1x2 or 0 in gerade_gewicht_x1x2:
10        return 0
11    
12    x_gr = np.array([np.min(groesse), np.max(groesse)])
13    y_gr = steigung1 * x_gr + achsenabschnitt1
14    
15    y_ge = np.array([np.min(gewicht), np.max(gewicht)])
16    x_ge = steigung2 * y_ge + achsenabschnitt2
17    
18    if np.allclose(x_gr, gerade_groesse_x1x2, atol=1e-6):
19        points += 1
20    else:
21        print("Extremwerte der Größen falsch.")
22    
23    if np.allclose(y_gr, gerade_groesse_y1y2, atol=1e-6):
24        points += 1
25    else:
26        print("Y-Werte der Größen falsch.")
27    
28    if np.allclose(x_ge, gerade_gewicht_x1x2, atol=1e-6):
29        points += 1
30    else:
31        print("Extremwerte der Gewichte falsch.")
32    
33    if np.allclose(y_ge, gerade_gewicht_y1y2, atol=1e-6):
34        points += 1
35    else:
36        print("Y-Werte der Gewichte falsch.")
37    
38   
39    return points / 4
40    
41
42grade_report(grade(), 4)
43### END HIDDEN TESTS
### BEGIN GRADE
4.0
### END GRADE

Task 3.5

[6 Point(s)]

Lineare Regression d)

Plotten Sie die Verteilung der Datenpunkt (Scatter-Plot) und die beiden Ausgleichsgeraden in einem einzigen Plot: Größe (x-Achse) vs. Gewicht (y-Achse).

Hinweise:

  • Denken Sie an Legende und Beschriftungen (wie immer!), passen diese zu Ihren Plots?
  • Bedenken Sie, dass jede Ausgleichsgerade durch die Punktewolke gehen sollte
  • Wählen Sie für Ihre Geraden sinnvolle Start und Endpunkte (die etwas mit den Daten zu tun haben)
In [27]:
Student's answer Score: 6.0 / 6.0 (Top)
 1import matplotlib.pyplot as plt
 2
 3
 4fig, ax = plt.subplots()
 5
 6ax.scatter(groesse, gewicht, label='Datenpunkte', s=5, color='lightgreen', alpha=0.8)
 7ax.plot(gerade_groesse_x1x2, gerade_groesse_y1y2, linestyle='-', label='Größe(Gewicht)')
 8ax.plot(gerade_gewicht_x1x2, gerade_gewicht_y1y2, linestyle='-', label='Gewicht(Größe)')
 9
10plt.xlabel('Größe in cm')  # Achsenbeschriftung
11plt.ylabel('Gewicht in kg')  # Achsenbeschriftung
12plt.title('Lineare Regression Größe/Gewicht')  # Titel
13
14ax.legend() # Legende
15plt.grid()  # Gitterlinien
16plt.show()

Task 4

[20 Point(s)]

Ereignisalgebren

In der Vorlesung haben wir den Begriff der Ereignisalgebra über einer Ergebnismenge Ω als Mengensystem mit bestimmten Eigenschaften definiert.

Task 4.1

[5 Point(s)]

Ereignisalgebra a)

Geben Sie zur Ergebnismenge Ω={1,2,3,4} die kleinste Ereignisalgebra Σ an, in der {1} und {1,3} als Elemente enthalten sind. Speichern Sie die zugehörigen Teilmengen in den Variablen a bis p wie für a und b beispielhaft angegeben. Sollten weniger als 16 Teilmengen zur Lösung gehören, lassen Sie die übrigen Variablen unberührt.

In [28]:
Student's answer(Top)
 1a=frozenset({1})
 2b=frozenset({1,3})
 3c=frozenset({2,3,4})
 4d=frozenset({2,4})
 5
 6e=frozenset({1,2,3,4})
 7f=frozenset({1,2,4})
 8g=frozenset({3})
 9h=frozenset({})
10
11i=frozenset({})
12j=frozenset({})
13k=frozenset({})
14l=frozenset({})
15
16m=frozenset({})
17n=frozenset({})
18o=frozenset({})
19p=frozenset({})
In [29]:
Grade cell: test_03_Grundlagen_Wkeit_Ereignisalgebra_A0 Score: 5.0 / 5.0 (Top)
 1### BEGIN HIDDEN TESTS
 2
 3## aus der Vorlesung
 4
 5def kompl(A, Omega):
 6    return Omega - A
 7
 8from itertools import chain, combinations
 9
10def powerset(iterable):
11    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
12    s = list(iterable)
13    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
14
15def check_sigma_alg(Omega, Sigma):
16    if Omega not in Sigma:
17        print('Omega not in Sigma')
18        return False
19    
20    for A in Sigma:
21        if kompl(A, Omega) not in Sigma:
22            print(f'Complement of {A} = {kompl(A, Omega)} not in Sigma')
23            return False
24    
25    for sets in powerset(Sigma):
26        union = frozenset(x for A in sets for x in A)
27        if union not in Sigma:
28            print(f'Union of {sets}={union} not in Sigma')
29            return False
30    
31    return True
32
33
34
35from assignmenttest import VariableTest, FunctionTest, grade_report
36sol = {frozenset(s) for s in [{}, {1}, {1, 3}, {2, 3, 4}, {2, 4}, {1, 2, 3, 4}, {1, 2, 4}, {3}]}
37# assert check_sigma_alg({1,2,3,4}, sol), "Aufgabenstellung falsch"
38
39target = [globals().get(x, frozenset()) for x in 'abcdefghijklmnop']
40for t in target:
41    assert isinstance(t, frozenset), f"{t} ist leider kein frozenset, leider keine Punkte"
42def grade():
43    percentage = 1
44    error = ""
45    for t in target:
46        if not (t in sol):
47            percentage -= 0.2
48            error += str(t) + " gehört nicht in die Lösung, \n"
49    for s in sol:
50        if not(s in target):
51            percentage -= 0.2
52            error += str(s) + " fehlt in Ihrer Lösung, \n"
53    if error:
54        print("Fehler:")
55        print(error)
56    else:
57        print('Super, Alles richtig ;)\n')
58    return max(0, percentage)
59grade_report(grade(), points=5)
60### END HIDDEN TESTS
Super, Alles richtig ;)

### BEGIN GRADE
5
### END GRADE

Task 4.2

[10 Point(s)]

Ereignisalgebra b)

Geben Sie zur Ergebnismenge Ω={1,2,3,5,7} die kleinste Ereignisalgebra an, in der {1},{1,2} und {1,3} als Elemente enthalten sind. Speichern Sie die zugehörigen Teilmengen in den Variablen a bis p wie für a bis c beispielhaft angegeben. Sollten weniger als 16 Teilmengen zur Lösung gehören, lassen Sie die übrigen Variablen unberührt.

In [30]:
Student's answer(Top)
 1a=frozenset({1})
 2b=frozenset({1,2})
 3c=frozenset({1,3})
 4d=frozenset({2,3,5,7})
 5
 6e=frozenset({3,5,7})
 7f=frozenset({2,5,7})
 8g=frozenset({1,2,3,5,7})
 9h=frozenset({1,3,5,7})
10
11i=frozenset({1,2,5,7})
12j=frozenset({2})
13k=frozenset({3})
14l=frozenset({2,3})
15 
16m=frozenset({1,5,7})
17n=frozenset({1,2,3})
18o=frozenset({5,7})
19p=frozenset({})
In [31]:
Grade cell: test_03_Grundlagen_Wkeit_Ereignisalgebra_B0 Score: 10.0 / 10.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, FunctionTest, grade_report
 3sol = {frozenset(s) for s in [
 4    {1}, {1, 2}, {1, 3},
 5    {}, {1, 2, 3, 5, 7},
 6    {2, 3, 5, 7}, {3, 5, 7}, {2, 5, 7},
 7    {1, 2, 3}, {1, 2, 5, 7}, {1, 3, 5, 7}, 
 8    {5, 7}, 
 9    {2}, {3}, {2, 3},
10    {1, 5, 7},
11]}
12# assert check_sigma_alg({1,2,3,5,7}, sol), "Aufgabenstellung falsch"
13
14target = [globals().get(x, frozenset()) for x in 'abcdefghijklmnop']
15for t in target:
16    assert isinstance(t, frozenset), f"{t} ist leider kein frozenset, leider keine Punkte"
17def grade():
18    percentage = 1
19    error = ""
20    for t in target:
21        if not (t in sol):
22            percentage -= 0.2
23            error += str(t) + " gehört nicht in die Lösung, \n"
24    for s in sol:
25        if not(s in target):
26            percentage -= 0.2
27            error += str(s) + " fehlt in Ihrer Lösung, \n"
28    if error:
29        print("Fehler:")
30        print(error)
31    else:
32        print('Super, Alles richtig ;)\n')
33    return max(0, percentage)
34grade_report(grade(), points=10)
35### END HIDDEN TESTS
Super, Alles richtig ;)

### BEGIN GRADE
10
### END GRADE

Task 4.3

[5 Point(s)]

Ereignisalgebra c)

Geben Sie zur Ergebnismenge Ω={1,2,3,4,5} die kleinste Ereignisalgebra an, in der {1} und {2,3} als Elemente enthalten sind. Speichern Sie die zugehörigen Teilmengen in den Variablen a bis p wie für a und b beispielhaft angegeben. Sollten weniger als 16 Teilmengen zur Lösung gehören, lassen Sie die übrigen Variablen unberührt.

In [32]:
Student's answer(Top)
 1a=frozenset({1})
 2b=frozenset({2,3})
 3c=frozenset({1,2,3,4,5})
 4d=frozenset({2,3,4,5})
 5
 6e=frozenset({1,4,5})
 7f=frozenset({1,2,3})
 8g=frozenset({4,5})
 9h=frozenset({})
10
11i=frozenset({})
12j=frozenset({})
13k=frozenset({})
14l=frozenset({})
15
16m=frozenset({})
17n=frozenset({})
18o=frozenset({})
19p=frozenset({})
In [33]:
Grade cell: test_03_Grundlagen_Wkeit_Ereignisalgebra_C0 Score: 5.0 / 5.0 (Top)
 1### BEGIN HIDDEN TESTS
 2from assignmenttest import VariableTest, FunctionTest, grade_report
 3sol = {frozenset(s) for s in [
 4    {1}, {2,3},
 5    {1,2,3,4,5}, {},
 6    {2,3,4,5},
 7    {1,4,5},
 8    {4,5},
 9    {1,2,3},
10]}
11#assert check_sigma_alg({1,2,3,4,5}, sol), "Aufgabenstellung falsch"
12
13
14target = [globals().get(x, frozenset()) for x in 'abcdefghijklmnop']
15for t in target:
16    assert isinstance(t, frozenset), f"{t} ist leider kein frozenset, leider keine Punkte"
17def grade():
18    percentage = 1
19    error = ""
20    for t in target:
21        if not (t in sol):
22            percentage -= 0.2
23            error += str(t) + " gehört nicht in die Lösung, \n"
24    for s in sol:
25        if not(s in target):
26            percentage -= 0.2
27            error += str(s) + " fehlt in Ihrer Lösung, \n"
28    if error:
29        print("Fehler:")
30        print(error)
31    else:
32        print('Super, Alles richtig ;)\n')
33    return max(0, percentage)
34grade_report(grade(), points=5)
35### END HIDDEN TESTS
Super, Alles richtig ;)

### BEGIN GRADE
5
### END GRADE

Viel Erfolg

Erinnerungen: Ausführbar? Errors Raised? Abgegeben?

  • Stellen Sie sicher, dass sich Ihr Code ausführen lässt. Code der nicht läuft kann nicht automatisch bewertet werden.
  • Bevor Sie abgeben: Klicken Sie im Menü auf Kernel > Restart & Run All (oder den Button in der Toolbar). Damit führen Sie das Notebook linear von oben nach unten aus. Alle Fehler die dann auftreten, treten auch beim Bewerten auf.
  • Entfernen Sie die raise NotImplementedError(), wenn Sie eine Aufgabe bearbeiten. Ansonsten wird beim Bewerten eine Exception ausgelöst, die uns sagt, dass Sie die Aufgabe nicht bearbeitet haben!
  • Vergessen Sie nicht Ihr bearbeitetes Notebook zu abzugeben (Assignment Tab / Submit Button)! Einfaches Speichern reicht nicht und wird nicht bewertet.
Timestamp:

2023-11-02 17:03:32.857067 CET