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 Durchschnitt

  • Noten_Varianz: Bestimme die https://de.wikipedia.org/wiki/Empirische_Varianz.

  • Noten_standardisiert: Dividiere jeden Wert aus Noten_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