- 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.
| Meting | x − 2 | y − 4 | Product |
|---|---|---|---|
| Eerste | −1 | −2 | 2 |
| Tweede | 1 | 2 | 2 |
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.
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.
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 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.
Verander de richting en de vaste ruis. Een boog kan sterk samenhangen terwijl de lineaire correlatie nul is.
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.
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.
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.
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?