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

Een melding is nog geen zekerheid

Gebruik basiskansen en foutmeldingen om de betekenis van een positieve modeluitkomst te berekenen.

45 min3 checkpoints
DIT GA JE ONTDEKKEN
  • Je legt uit waarom de basiskans de betekenis van een positieve voorspelling verandert.
  • Je berekent Bayes met aantallen echte en onterechte meldingen.

Een fictief spamfilter herkent 90 procent van alle spam. Toch kan het merendeel van zijn spammeldingen onterecht zijn. Om dat te begrijpen, moeten we ook weten hoeveel gewone berichten er zijn en hoe vaak die ten onrechte worden gemarkeerd.

Onze verzonnen mailbox bevat gemiddeld één procent spam; van gewone mail krijgt vijf procent een onterechte melding. Dit zijn oefengetallen, geen metingen van een bestaande dienst. We rekenen met 10.000 berichten om de groepen zichtbaar te maken.

1. Eerst de berichten in vier groepen verdelen

Eén procent van 10.000 is 100: zoveel spam verwachten we. De overige 9.900 berichten zijn gewoon. Het filter vindt 90 procent van de honderd spamgevallen, dus 90 echte meldingen, en mist er 10.

Bij gewone mail veroorzaakt vijf procent een foutmelding: 9.900 × 0.05 = 495. De overige 9.405 gewone berichten blijven ongemarkeerd. Alle vier aantallen samen zijn weer 10.000.

VAN PERCENTAGE NAAR AANTALLENHoeveel meldingen zijn echt spam?

Verwachte aantallen per 10.000 fictieve berichten. Let ook op de grote groep gewone mail.

De vier mogelijkheden
WerkelijkheidMeldingGeen melding
Spam9010
Gewoon4959405
VERDELING BINNEN ALLE MELDINGENecht spamonterecht gemarkeerd
Echte meldingen 90Alle meldingen 585P(spam | melding) 15.4%

Lees eerst de beginwaarden in de tabel. De rij vertelt wat een bericht werkelijk is; de kolom vertelt wat het filter doet. Een melding is dus geen uitspraak die altijd waar is.

Voor deze vier vakken gebruiken we vaste namen:

  • TP (true positive): terecht gemelde spam, hier 90.
  • FN (false negative): gemiste spam, hier 10.
  • FP (false positive): gewone mail die toch wordt gemeld, hier 495.
  • TN (true negative): gewone mail zonder melding, hier 9.405.

De parameters heten N voor het totale aantal, p voor de spamfractie, t voor de herkenningskans binnen spam en f voor de foutmeldingkans binnen gewone mail. De basiskans (base rate) p beschrijft hoe vaak spam vóór de melding voorkomt.

N = 10000
p = 0.01
t = 0.9
f = 0.05
spam = N * p
gewoon = N * (1 - p)
TP = spam * t
FN = spam * (1 - t)
FP = gewoon * f
TN = gewoon * (1 - f)
print([TP, FN, FP, TN])
# ongeveer [90, 10, 495, 9405]

1 - p is het overgebleven deel gewone berichten; dezelfde gedachte geeft 1 - t en 1 - f. Dit zijn verwachte aantallen: bij andere kansen kunnen ze kommagetallen zijn. Rond ze niet af in je functie aantallen(N, p, t, f); geef de lijst in de opgegeven volgorde terug.

01
CHECKPOINTTel beide soorten positieve meldingen

2. Kijk alleen binnen de meldingen

Er zijn 90 + 495 = 585 meldingen. Daarvan zijn er slechts 90 echte spam: 90/585 is ongeveer 0.154, dus 15.4 procent. De grote groep gewone berichten veroorzaakt ondanks het lagere foutpercentage veel meer meldingen dan de kleine spamgroep.

P(S|M)=TPTP+FP

S betekent spam, M een melding en de streep betekent weer “gegeven”. Deze aangepaste kans heet de posterior (posterior probability). Invullen van de twee verwachte aantallen en wegdelen van de gemeenschappelijke N geeft Bayes voor deze twee groepen:

ptpt+(1−p)f

p maal t is het aandeel van alle berichten dat echte meldingen oplevert. De tweede term in de noemer is het aandeel onterechte meldingen. Samen vormen ze precies de groep waaruit je na een melding kiest.

echt = p * t
onterecht = (1 - p) * f
print(echt / (echt + onterecht))
# ongeveer 0.153846

Veelgemaakte fout: de herkenningskans 90 procent lezen als “een melding is voor 90 procent correct”. Herkenning kijkt binnen alle spam; de posterior kijkt binnen alle meldingen. Die groepen hebben verschillende noemers.

Verhoog in het diagram alleen p naar 0.10. Nu verwacht je 900 echte en 450 onterechte meldingen: 900/1350 is ongeveer 66.7 procent, terwijl t en f gelijk blijven. Maak posterior(p, t, f) en geef None terug als beide soorten meldingen samen nul zijn.

02
CHECKPOINTVraag welk deel van de meldingen klopt

3. Dezelfde kans als verhouding schrijven

Je kunt een kans ook vergelijken met de overblijvende kans op “niet”. Dat levert odds op: de verhouding wel tegenover niet. Bij kans 0.2 zijn er bijvoorbeeld twintig positieve tegenover tachtig negatieve gevallen, dus 20/80 = 0.25, oftewel één tegen vier.

odds=p1−p

Hier is p een willekeurige kans tussen 0 en 1. Vóór de melding waren de spam-odds 100/9900, ongeveer 0.0101. Binnen de meldingen worden ze 90/495, ongeveer 0.1818: dezelfde verschuiving van overtuiging, nu als verhouding.

p = 0.2
print(p / (1 - p))   # 0.25
print(90 / 495)      # ongeveer 0.181818

Odds zijn geen percentage en mogen boven 1 uitkomen. Bij kans 1 is er geen “niet”-groep meer; onze functie geeft dan float("inf") terug, Pythons getalswaarde voor positieve oneindigheid. Controleer p == 1 vóór de deling in odds(p); bij kans 0 zijn de odds gewoon 0.

03
CHECKPOINTKans en verhouding zijn twee notaties

Wat neem je mee?

  • De basiskans bepaalt hoeveel berichten in beide werkelijke groepen zitten.
  • De kans na een melding is het aandeel echte meldingen binnen alle meldingen.
  • Odds schrijven dezelfde kans als wel-tegenover-nietverhouding; zij zijn geen percentage.

In de volgende les vat je gegevens samen met gemiddelde, mediaan en spreiding. Ook daar bepaalt de gekozen samenvatting wat je wel en niet ziet.

Verder lezen & bronnen

Inhoud gecontroleerd op 2026-10-27.
DE VOLGENDE STAPEén gemiddeld getal vertelt niet alles
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
Tel beide soorten positieve meldingen

Geef met aantallen(N, p, t, f) de verwachte aantallen [TP, FN, FP, TN]. De kansen liggen tussen 0 en 1; rond niet af.

Een hint

Splits N in spam en gewone mail. Pas t en 1-t toe op spam, f en 1-f op gewone mail.

02
Vraag welk deel van de meldingen klopt

Schrijf posterior(p, t, f) voor kansen tussen 0 en 1; geef None als de totale meldingkans nul is.

Een hint

Echte meldingen hebben aandeel p*t; onterechte aandeel (1-p)*f. Deel het eerste door de som.

03
Kans en verhouding zijn twee notaties

Schrijf odds(p) voor p tussen 0 en 1; geef float("inf") terug bij p = 1.

Een hint

Controleer de grens eerst. Deel anders p door de resterende kans 1-p.

Vastgelopen? Bekijk de voorbeeldoplossing
def aantallen(N, p, t, f):
    spam = N * p
    gewoon = N * (1 - p)
    TP = spam * t
    FN = spam * (1 - t)
    FP = gewoon * f
    TN = gewoon * (1 - f)
    return [TP, FN, FP, TN]


def posterior(p, t, f):
    echt = p * t
    onterecht = (1 - p) * f
    if echt + onterecht == 0:
        return None
    return echt / (echt + onterecht)


def odds(p):
    if p == 1:
        return float("inf")
    return p / (1 - p)

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