Werkplaats / De werkplaats
In jouw eigen tempo
← Wiskunde-fundament
MODULE 04 · LES 14

Samen bewegen is nog geen oorzaak

Bouw covariantie, correlatie en standaardisatie met aandacht voor schaal en constante kenmerken.

45 min3 checkpoints
DIT GA JE ONTDEKKEN
  • Je berekent een lineaire samenhang zonder daar causaliteit uit af te leiden.
  • Je standaardiseert getallen en behandelt een constante kolom.

Op warme dagen worden meer ijsjes verkocht én gaan meer mensen zwemmen. Dat maakt ijsverkoop nog geen oorzaak van zwemmen: de temperatuur kan beide beïnvloeden. Een model kan zo'n samenhang gebruiken, maar een patroon alleen bewijst geen oorzaak.

We onderzoeken correlatie (correlation) met twee even lange lijsten gekoppelde metingen. Positie i in beide lijsten hoort steeds bij dezelfde waarneming. Als je één lijst afzonderlijk sorteert, verbreek je die koppeling en bereken je iets anders.

1. Bewegen afwijkingen dezelfde kant op?

Neem twee oefenmetingen: x is [1, 3] en y is [2, 6]. Hun gemiddelden zijn 2 en 4. De eerste meting ligt bij beide kenmerken eronder, de tweede bij beide erboven.

Afwijkingen van het eigen gemiddelde
Metingx − 2y − 4Product
Eerste−1−22
Tweede122

Twee afwijkingen met hetzelfde teken geven een positief product. Tegengestelde tekens geven een negatief product. De populatiecovariantie (population covariance) neemt het gemiddelde van deze producten: (2 + 2)/2 = 2.

covariantie=Cn=42=2

C is de som van de producten van gekoppelde afwijkingen; n is het aantal paren. Afwijkingen maken door het eigen gemiddelde af te trekken heet centreren (centering). Dezelfde berekening in code:

xs = [1, 3]
ys = [2, 6]
mx = 2
my = 4
C = 0
for i in range(len(xs)):
    dx = xs[i] - mx
    dy = ys[i] - my
    C = C + dx * dy
print(C / len(xs))   # 2.0

Verwissel de twee y-metingen naar [6, 2]: de producten worden beide −2 en de covariantie −2. De richting verandert dus van samen stijgen naar tegengesteld bewegen. Maak covariantie(xs, ys) met zelf berekende gemiddelden en deling door n; bij lege lijsten geef je None.

01
CHECKPOINTKijken naar gezamenlijke afwijkingen

2. De grootte van de eenheden eruit halen

Vermenigvuldig alle y-waarden met honderd, bijvoorbeeld door meters om te rekenen naar centimeters. Dan worden hun afwijkingen én de covariantie honderdmaal groter, hoewel het patroon gelijk blijft. Voor een vergelijking zonder die schaalinvloed gebruiken we Pearsons correlatie (Pearson correlation).

Uit de les Inproduct ken je cosinusgelijkenis: een inproduct gedeeld door het product van de twee vectorlengtes. Pas dat toe op de gecentreerde vectoren [-1, 1] en [-2, 2]. Hun inproduct is C = 4, hun kwadratensommen zijn A = 2 en B = 8.

r=CAB=416=1

r noemt de correlatie. A is de som van gekwadrateerde x-afwijkingen, B die van de y-afwijkingen; de noemer is de wortel van hun product. Hij is hetzelfde als het product van beide vectorlengtes.

dx = [-1, 1]
dy = [-2, 2]
A = 0
B = 0
C = 0
for i in range(len(dx)):
    A = A + dx[i] ** 2
    B = B + dy[i] ** 2
    C = C + dx[i] * dy[i]
print(C / (A * B) ** 0.5)   # 1.0

Zoals eerder betekent ** 0.5 de vierkantswortel. r ligt tussen −1 en 1: de uitersten beschrijven een perfect dalende of stijgende rechte lijn. Een constante reeks heeft vectorlengte nul; haar correlatie is niet gedefinieerd en wordt hier None, net als bij lege invoer.

PATRONEN ZIJN GEEN OORZAKENWat ziet een lineaire correlatie?

Verander de richting en de vaste ruis. Een boog kan sterk samenhangen terwijl de lineaire correlatie nul is.

-8-4048xy-4-2024
Pearson r 0.978Patroon lineair

Zet eerst Hoeveelheid vaste ruis op 0 en kies Lijn. Verander de helling: een stijgende lijn blijft r = 1, een dalende wordt r = −1; voeg daarna ruis toe. Kies vervolgens Boog met helling 1 en ruis 0: er is een duidelijk patroon, maar r is 0 doordat de lineaire bijdragen elkaar opheffen.

Veelgemaakte fout: “r is nul, dus er is geen verband”. r meet lineaire samenhang, niet ieder mogelijk patroon. Maak nu correlatie(xs, ys) door te centreren en de drie sommen op te bouwen.

02
CHECKPOINTEen schaalvrije lineaire maat

3. Een kenmerk in eenheden van spreiding schrijven

Bij standaardiseren (standardization) trek je het gemiddelde af en deel je door de standaardafwijking (standard deviation). Die standaardafwijking is de wortel van de variantie en heeft daardoor weer dezelfde eenheid als de oorspronkelijke waarden. Een gestandaardiseerde waarde zegt hoeveel standaardafwijkingen hij boven of onder het gemiddelde ligt.

z=x−ms

x is één waarneming, m het gemiddelde, s de standaardafwijking en z de nieuwe waarde. Voor [1, 3] is m = 2, de populatievariantie 1 en s = 1. De nieuwe waarden zijn (1−2)/1 = −1 en (3−2)/1 = 1.

xs = [1, 3]
m = 2
s = 1
zs = []
for i in range(len(xs)):
    zs.append((xs[i] - m) / s)
print(zs)   # [-1.0, 1.0]

Maak standaardiseer(xs) met zelf berekende m en populatiestandaardafwijking s. Geef bij lege invoer []; bij constante data is s nul en kiezen we één nul per invoerwaarde. Controleer dit vóór delen door s.

03
CHECKPOINTVerschillende eenheden vergelijkbaar maken

Later leer je een model met trainingsgegevens en controleer je het op apart gehouden gegevens. Bereken m en s dan alleen op de trainingsgegevens en hergebruik ze voor die controle. Anders beïnvloedt de controleverzameling vooraf de bewerking en blijft zij niet volledig apart.

Wat neem je mee?

  • Covariantie kijkt naar producten van gekoppelde afwijkingen en hangt af van eenheden.
  • Correlatie is cosinusgelijkenis na centreren; zij meet lineaire samenhang en bewijst geen oorzaak.
  • Standaardiseren gebruikt gemiddelde en standaardafwijking, met een aparte keuze voor constante data.

Hierna vat je onzekerheid samen: hoeveel verrassing bevat een kansverdeling, en wat kost een verkeerde voorspelling?

Verder lezen & bronnen

Inhoud gecontroleerd op 2026-10-27.
DE VOLGENDE STAPHoe verrassend is een uitkomst?
JOUW EXPERIMENT

Probeer het zelf

Python
main.py

Python start zodra jij code uitvoert.

UITVOER

Je uitvoer verschijnt hier.
Alles rekent in je eigen browser.

Jouw checkpoints0 / 3
01
Kijken naar gezamenlijke afwijkingen

Schrijf covariantie(xs, ys) voor even lange lijsten, met deling door n. Geef None bij lege invoer.

Een hint

Bereken beide gemiddelden met een lus of eigen helper. Tel de producten van gekoppelde afwijkingen op.

02
Een schaalvrije lineaire maat

Schrijf correlatie(xs, ys) voor even lange lijsten; geef None bij lege invoer of een constante reeks.

Een hint

Bereken na centreren C, A en B zoals in het voorbeeld. Controleer A*B op nul en deel C door (A*B)**0.5.

03
Verschillende eenheden vergelijkbaar maken

Maak standaardiseer(xs) met populatievariantie; geef [] voor lege invoer en een nul per waarde voor constante data.

Een hint

Bereken gemiddelde m en de wortel s van de populatievariantie. Voeg met append voor elke waarde de passende uitkomst toe.

Vastgelopen? Bekijk de voorbeeldoplossing
def gemiddelde(xs):
    totaal = 0
    for i in range(len(xs)):
        totaal = totaal + xs[i]
    return totaal / len(xs)


def covariantie(xs, ys):
    n = len(xs)
    if n == 0:
        return None
    mx = gemiddelde(xs)
    my = gemiddelde(ys)
    C = 0
    for i in range(n):
        dx = xs[i] - mx
        dy = ys[i] - my
        C = C + dx * dy
    return C / n


def correlatie(xs, ys):
    n = len(xs)
    if n == 0:
        return None
    mx = gemiddelde(xs)
    my = gemiddelde(ys)
    A = 0
    B = 0
    C = 0
    for i in range(n):
        dx = xs[i] - mx
        dy = ys[i] - my
        A = A + dx ** 2
        B = B + dy ** 2
        C = C + dx * dy
    if A * B == 0:
        return None
    return C / (A * B) ** 0.5


def standaardiseer(xs):
    n = len(xs)
    if n == 0:
        return []
    m = gemiddelde(xs)
    Q = 0
    for i in range(n):
        Q = Q + (xs[i] - m) ** 2
    s = (Q / n) ** 0.5
    zs = []
    for i in range(n):
        waarde = 0
        if s > 0:
            waarde = (xs[i] - m) / s
        zs.append(waarde)
    return zs

Voer de code uit en verklaar voor jezelf waarom elke stap werkt.