Varianz etc. von Schulnoten#
Diese Seite: Vorübungen und Hinführung zum Notebook Runde 1b: Verschachtelte Datenstrukturen mit Tiefe 2
Gegeben: Eine Liste von Schulnoten
z.B.
Noten = [1, 2, 4, 2, 1]
Gesucht:
Noten_avg
: das arithmetisches Mittel („Durchschnitt“)Noten_zentriert
: Subtrahiere von jeder Note den DurchschnittNoten_Varianz
: Bestimme die https://de.wikipedia.org/wiki/Empirische_Varianz.Noten_standardisiert
: Dividiere jeden Wert ausNoten_zentriert
durch die Standardabweichung (Wurzel der Varianz).
Noten = [1, 2, 4, 2, 1] # Schnitt: Kopfrechnen?
n = len(Noten)
Arithmetisches Mittel („Durchschnitt“): Summe dividiert durch Anzahl.
Noten_sum = 0
for x in Noten:
Noten_sum += x
Noten_sum
10
Noten_avg = Noten_sum / n
Noten_avg
2.0
Messwerte so „verschieben“, dass der Durchschnitt auf der y-Achse (also avg == 0
) liegt
Noten_zentriert = []
for x in Noten:
Noten_zentriert.append( x - Noten_avg )
Noten_zentriert
[-1.0, 0.0, 2.0, 0.0, -1.0]
oder als List Comprehension:
Noten_zentriert = [ x - Noten_avg for x in Noten ]
Noten_zentriert
[-1.0, 0.0, 2.0, 0.0, -1.0]
Varianz: Summe der Quadrate der Abweichungen vom empirischen Wert zum Durchschnittswert
Noten_Varianz_1 = sum( [ (x - Noten_avg)**2 for x in Noten ] ) / n
Noten_Varianz_1
1.2
Die Varianz vom ursprünglichen und vom zentrierten Datensatz ist gleich, aber letztere berechnet sich noch einfacher:
Noten_Varianz = sum( [ x**2 for x in Noten_zentriert ] ) / n
Noten_Varianz
1.2
Standardabweichung = Quadratwurzel der Varianz
Noten_Standardabweichung = Noten_Varianz ** 0.5
Noten_Standardabweichung
1.0954451150103321
Standardisiert = zentriert durch Standardabweichung
Noten_standardisiert = [ x / Noten_Standardabweichung for x in Noten_zentriert ]
Noten_standardisiert
[-0.9128709291752769, 0.0, 1.8257418583505538, 0.0, -0.9128709291752769]
Wiederholung von Listenoperatoren: inplace oder Kopie?#
def list_equality(x, y):
"""Vergleicht zwei Listen auf verschiedene Art und Weise."""
print(f"{x=}\n{y=}\n{x == y =}\n{x is y =}")
# print("x=", x, "y=", y, "Gleichheit", x == y, "Pointer Identität:", x is y)
l = [1, 2, 5, 3]
l1 = l
list_equality(l, l1)
x=[1, 2, 5, 3]
y=[1, 2, 5, 3]
x == y =True
x is y =True
l = [1, 2, 5, 3]
l2 = l
l2 += [] # leere Liste anhängen
# l2.append( [] ) # Äquivalent zu +=
list_equality(l, l2)
x=[1, 2, 5, 3]
y=[1, 2, 5, 3]
x == y =True
x is y =True
l = [1, 2, 5, 3]
l3 = l
l3 = l3 + []
list_equality(l, l3)
x=[1, 2, 5, 3]
y=[1, 2, 5, 3]
x == y =True
x is y =False
in Funktionen einpacken#
def avg(x):
"""Gibt das arithmetische Mittel der Elemente der Liste x zurück."""
Summe = 0
Anzahl = 0
for i in x:
Summe += i
Anzahl += 1
return Summe / Anzahl
oder kürzer, wenn man sum()
und len()
benutzen darf:
def avg2(x):
return sum(x) / len(x)
oder noch kürzer:
avg3 = lambda x: sum(x) / len(x)
avg(Noten), avg2(Noten), avg3(Noten)
(2.0, 2.0, 2.0)
def zentriere(x):
"""Subtrahiert den avg(x) von jedem Element einer Liste x."""
a = avg(x)
return [ val - a for val in x ]
def zentriere_inplace(x):
"""Subtrahiert inplace den avg(x) von jedem Element einer Liste x."""
a = avg(x)
for i in range(len(x)):
x[ i ] -= a
l4 = l
l4 = zentriere(l)
list_equality(l, l4)
x=[1, 2, 5, 3]
y=[-1.75, -0.75, 2.25, 0.25]
x == y =False
x is y =False
l5 = l
zentriere_inplace(l)
list_equality(l, l5)
x=[-1.75, -0.75, 2.25, 0.25]
y=[-1.75, -0.75, 2.25, 0.25]
x == y =True
x is y =True