Transparantie & methodologie
CivicStat maakt het stemgedrag van de Tweede Kamer transparant en vergelijkt het met verkiezingsbeloften. Hieronder leggen we uit hoe onze data wordt verzameld, verwerkt en gepresenteerd.
Datapipeline
Alle parlementaire gegevens komen uit de officiële Tweede Kamer OData API. Er wordt geen data handmatig aangepast of gefilterd.
Moties, stemmingen, Kamerleden en fracties worden opgehaald via de OData REST-feed van de Tweede Kamer.
Beloften uit verkiezingsprogramma's worden automatisch gekoppeld aan moties via trefwoordanalyse en semantische AI-matching (Claude).
Per belofte berekenen we de Mandate Consistency Score op basis van het stemgedrag bij gerelateerde moties.
Hoe gebruikt CivicStat AI?
CivicStat gebruikt AI (Anthropic Claude) op twee plekken in de analysepipeline: bij het extraheren van beloften uit verkiezingsprogramma’s, en bij het koppelen van beloften aan Kamermoties. In beide gevallen werkt de AI als een gestructureerde analysator — niet als beoordelaar. Het model geeft geen oordeel over partijen en wordt expliciet geïnstrueerd politiek neutraal te werken.
Belofte-extractie
Verkiezingsprogramma’s (PDF’s van het DNPP Repository, Rijksuniversiteit Groningen) worden verwerkt door Claude om individuele, toetsbare beloften te extraheren.
Input: Ruwe tekstpassages uit officiële verkiezingsprogramma’s.
Opdracht aan het model: Extraheer concrete, toetsbare toezeggingen. Classificeer elk op thema (17 thema’s), specificiteit (SPECIFIEK / GEMIDDELD / VAAG) en toetsbaarheid.
Wat het model niet doet: Het model beoordeelt niet of beloften wenselijk, haalbaar of verstandig zijn. Het extraheert alleen wat er staat.
Kwaliteitscontrole: Geëxtraheerde beloften worden opgeslagen met het label LLM_EXTRACTED. Het totale aantal per partij wordt gemonitord op inflatie.
Semantische koppeling
Voor elke verkiezingsbelofte zoekt CivicStat relevante Kamermoties. Dit gebeurt in twee stappen:
Kandidaat-moties worden geselecteerd op basis van gedeelde trefwoorden en thema. Dit levert per belofte 30–80 kandidaat-moties op uit het totaal van 26.086+ moties.
Een AI-model (Claude Sonnet) beoordeelt elke kandidaat-motie op relevantie voor de belofte. Per motie geeft het model een classificatie, betrouwbaarheidsscore, voorspelde stemrichting en een beknopte motivatie in het Nederlands.
Wat het model te zien krijgt
“Defensie-uitgaven structureel naar NAVO-norm van 2% bbp”
“Motie over structurele verhoging defensiebudget naar 2% bbp”
“Motie roept expliciet op tot structurele verhoging naar 2% bbp — identiek aan de belofte van de VVD.”
Classificatie-uitleg
| Type | Betekenis | Voorbeeld | Gewicht |
|---|---|---|---|
| Expliciet | Motie gaat over exact hetzelfde punt als de belofte | “2% bbp defensie” ↔ “NAVO-norm 2% bbp” | 1.0 |
| Impliciet | Motie valt in hetzelfde thema maar niet over exact hetzelfde punt | “F-35 onderhoud” ↔ “defensie versterken” | 0.5 |
| Tegengesteld | Motie druist in tegen de belofte | “defensiebudget korten” ↔ “defensie naar 2% bbp” | 1.0 (omgekeerd) |
| Geen match | Geen relevante verbinding | — | Niet opgeslagen |
Neutraliteitsinstructie aan het model
“Je bent een neutrale politieke analist. Je beoordeelt of moties relevant zijn voor een belofte. Je geeft geen oordeel over de wenselijkheid van beloften of moties. Gebruik EXPLICIET alleen als de motie echt over hetzelfde concrete punt gaat.”
Betrouwbaarheidsindicator: Niet elke koppeling is even sterk. CivicStat toont bij elke score hoeveel beloften daadwerkelijk gekoppeld konden worden aan moties. Een score op basis van 35 van 210 beloften is minder betrouwbaar dan een score op basis van 150 van 200 beloften. Deze informatie is altijd zichtbaar naast de MCS-score.
Wat CivicStat niet doet
Geen ranking of oordeel — CivicStat rangschikt partijen niet van “betrouwbaar” tot “onbetrouwbaar”. Scores zijn feitelijke consistentie-metingen, geen waardeoordelen.
Geen campagneadvies — CivicStat zegt niet op welke partij je moet stemmen.
Geen AI-gegenereerde conclusies — Het AI-model beoordeelt individuele belofte-motie koppelingen. De MCS-score wordt berekend met een vaste formule op basis van die koppelingen — niet door het AI-model.
Geen verborgen weging — Elke koppeling is traceerbaar. Gebruikers kunnen doorklikken van score → belofte → motie → stemuitslag → bron.
AI-beperkingen
Trefwoord-voorselectie — De voorselectie op trefwoorden kan relevante moties missen als ze over hetzelfde onderwerp gaan maar andere woorden gebruiken. De semantische beoordeling (stap 2) vangt dit gedeeltelijk op.
Model-bias — Hoewel Claude geïnstrueerd wordt neutraal te werken, kan elk AI-model subtiele bias bevatten. Daarom publiceert CivicStat de exacte instructie en is elke koppeling individueel controleerbaar.
Belofte-kwaliteit — De kwaliteit van de MCS hangt af van de kwaliteit van de geëxtraheerde beloften. Vage beloften leveren vagere koppelingen op.
CivicStat gebruikt Claude Sonnet (Anthropic) voor semantische analyse. Het model draait met API-toegang en verwerkt uitsluitend publieke parlementaire data.
Huidige data
CivicStat bevat momenteel de volgende gegevens uit de lopende parlementaire periode (TK2023 & TK2025).
Data wordt elk uur automatisch bijgewerkt via de Tweede Kamer API. Laatste update: 21 april 2026 om 03:03.
Databronnen
Besluiten, stemmingen, personen en fracties. Officiële bron van alle parlementaire data.
gegevensmagazijn.tweedekamer.nlDocumentatiecentrum Nederlandse Politieke Partijen, Rijksuniversiteit Groningen. Academisch archief van alle verkiezingsprogramma's.
dnpprepo.ub.rug.nlScores & berekeningen
Mandate Consistency Score (MCS)
Meet hoe consistent een partij stemt ten opzichte van de eigen verkiezingsbeloften. 100% = altijd consistent. Berekend per thema en als totaalcijfer. Elke match weegt mee op basis van type en betrouwbaarheid.
Belofte-kloof
Het verschil tussen het verwachte stemresultaat (op basis van verkiezingsbeloften × zetels) en het werkelijke stemresultaat. Een positief getal betekent meer steun dan verwacht; een negatief getal minder.
Betrouwbaarheidsscore
Geeft aan hoe goed onderbouwd een voorspelling is. Gebaseerd op het aantal partijen waarvoor een beloftematch beschikbaar is ten opzichte van het totaal. Hoog (≥70%) = veel matches. Laag (<40%) = grotendeels afgeleid.
Matchtype-gewichten: EXPLICIET = 1.0, TEGENGESTELD = 1.0, IMPLICIET = 0.5. Elke match weegt mee op basis van zowel het type als de betrouwbaarheidsscore.
Minimum drempel: Beloften met minder dan 3 gekoppelde moties worden uitgesloten van de scoring en gerapporteerd als “onvoldoende data”.
Steekproefweging: Partijen met meer gekoppelde moties krijgen stabielere scores.
Consistent: ≥70% van de gewogen stemuitlijning is in lijn met de belofte.
Niet in lijn: ≤30% van de gewogen stemuitlijning is in lijn.
Gemengd: tussen 30% en 70%.
Periodes & koersvastheid
CivicStat vergelijkt verkiezingsbeloften over meerdere parlementaire periodes. Momenteel ondersteunen we TK2023 en TK2025.
Periode-filtering
Elk verkiezingsprogramma heeft een parlementaire periode waarbinnen stemmingen worden meegeteld. TK2023: 6 december 2023 t/m 29 oktober 2025. TK2025: 29 oktober 2025 t/m einde volgende parlementaire periode. Stemmingen buiten deze vensters worden uitgesloten van de MCS-berekening.
Periodevergelijking
De periodevergelijking meet hoe stabiel een partij scoort over verschillende parlementaire periodes, met een richting-correctie. Verbetering wordt niet bestraft, verslechtering wel. Een hoge score betekent stabiel en consistent stemgedrag op een hoog niveau.
Periodevergelijking
Richting-gecorrigeerde stabiliteitsscore. Verbetering wordt niet bestraft, verslechtering wel. Houdt rekening met zowel het niveau als de trend.
Matching-algoritme
Moties worden automatisch gekoppeld aan beloften via een trefwoordalgoritme in drie stappen.
Stap 1 — Motiefilter
Procedurele moties worden uitgefilterd vóór de matching. Dit omvat: moties van wantrouwen, moties van afkeuring, moties van orde, ordedebatverzoeken, schorsing/sluiting, regeling van werkzaamheden en spreektijdverzoeken. Dit voorkomt foutieve matches wanneer procedurele taal overlapt met beleidstrefwoorden.
Stap 2 — Trefwoordmatching
Elke belofte heeft een set vooraf gedefinieerde thematische trefwoorden (vastgesteld tijdens extractie, niet algoritmisch afgeleid). Een motie wordt gekoppeld wanneer de titel en tekst voldoende overlap vertonen met de trefwoorden van een belofte.
Stap 3 — Betrouwbaarheidsscore
Elke match krijgt een betrouwbaarheidsscore (0–1) op basis van het aantal en de specificiteit van trefwoordhits. Matches onder 0.3 worden verworpen.
De motie adresseert direct dezelfde concrete toezegging als de belofte. Weegt mee met factor 1.0.
De motie valt binnen hetzelfde thema maar is geen directe vertaling. Weegt mee met factor 0.5.
De motie druist in tegen de belofte. De voorspelde stemrichting wordt omgekeerd. Factor 1.0.
Koppelingen worden gemaakt via drie methodes: trefwoordanalyse, semantische AI-matching en handmatige validatie.
Matchmethoden
Specificiteit van beloften
Elke belofte krijgt een specificiteitsclassificatie die aangeeft hoe concreet en toetsbaar de toezegging is.
Meetbare, concrete toezegging met een duidelijk toetsbaar doel. Bijv. '100.000 woningen per jaar', 'defensie naar 2% bbp'.
Duidelijke richting, maar geen exact meetbaar doel. Bijv. 'stikstofregels versoepelen', 'eigen risico verlagen'.
Abstracte toezegging die moeilijk objectief toetsbaar is. Bijv. 'investeren in onderwijs', 'de economie versterken'.
Neutraliteit & onpartijdigheid
CivicStat is politiek onafhankelijk en ontvangt geen financiering van politieke partijen, bedrijven of belangengroepen.
Alle partijen worden op dezelfde manier behandeld: dezelfde algoritmes, dezelfde drempelwaarden, dezelfde weergave. We publiceren geen rankings of “beste partij”-scores. Elke berekening is reproduceerbaar en fouten en beperkingen worden expliciet benoemd.
Beperkingen
Moties ≠ al het beleid. Wetsvoorstellen, amendementen en begrotingsbesluiten worden nog niet meegenomen.
Automatische matching is imperfect. Versie 2 bevat een procedureel motiefilter dat foutieve matches vermindert, en gebruikt vooraf gedefinieerde trefwoorden per belofte in plaats van automatische extractie. Aanvullend wordt semantische matching met Claude AI ingezet voor diepere inhoudelijke beoordeling.
Coalitiedwang. Partijen in een coalitie stemmen soms mee met het regeerakkoord, ook als dit afwijkt van hun verkiezingsprogramma. Dit nuanceren we nog niet automatisch.
TK2023 & TK2025. CivicStat richt zich op de Tweede Kamerverkiezingen van 2023 en 2025. Oudere parlementaire periodes worden nog niet meegenomen.
Beloften zijn LLM-ondersteund geëxtraheerd. Beloften worden geëxtraheerd uit verkiezingsprogramma’s met behulp van LLM-analyse (Claude, Anthropic) en vervolgens handmatig gevalideerd op volledigheid en correctheid.
AI-logboek
Elke AI-aanroep die CivicStat doet wordt gelogd in Langfuse, een open-source observability-platform. Alle traces zijn publiek toegankelijk zodat journalisten, onderzoekers en geïnteresseerden exact kunnen zien welke AI-modellen worden gebruikt, wat ze te zien krijgen, en wat ze terugsturen.
Recente AI-aanroepen
| Datum | Taak | Tags | Tokens | Latentie | Kosten | |
|---|---|---|---|---|---|---|
| 21 apr, 02:50 | OpenRouter Request | 440 | 1.1s | $0.0015 | Bekijk trace → | |
| 20 apr, 23:52 | OpenRouter Request | 2.491 | 5.8s | $0.0102 | Bekijk trace → | |
| 20 apr, 23:52 | OpenRouter Request | 3.180 | 29.5s | $0.0216 | Bekijk trace → | |
| 20 apr, 23:52 | OpenRouter Request | 3.180 | 30.0s | $0.0216 | Bekijk trace → | |
| 20 apr, 23:51 | OpenRouter Request | 3.262 | 11.8s | $0.0129 | Bekijk trace → | |
| 20 apr, 23:51 | OpenRouter Request | 3.262 | 12.6s | $0.0129 | Bekijk trace → | |
| 20 apr, 23:47 | OpenRouter Request | 438 | 1.3s | $0.0016 | Bekijk trace → | |
| 20 apr, 23:46 | OpenRouter Request | 456 | 5.5s | $0.0016 | Bekijk trace → | |
| 20 apr, 23:44 | OpenRouter Request | 441 | 0.9s | $0.0015 | Bekijk trace → | |
| 20 apr, 23:42 | OpenRouter Request | 445 | 1.2s | $0.0015 | Bekijk trace → | |
| 20 apr, 23:40 | OpenRouter Request | 444 | 1.4s | $0.0015 | Bekijk trace → | |
| 20 apr, 21:45 | OpenRouter Request | 428 | 1.4s | $0.0015 | Bekijk trace → | |
| 20 apr, 21:45 | OpenRouter Request | 443 | 1.2s | $0.0015 | Bekijk trace → | |
| 20 apr, 21:42 | OpenRouter Request | 457 | 2.0s | $0.0016 | Bekijk trace → | |
| 20 apr, 21:40 | OpenRouter Request | 454 | 2.4s | $0.0016 | Bekijk trace → | |
| 20 apr, 21:38 | OpenRouter Request | 457 | 1.1s | $0.0017 | Bekijk trace → | |
| 18 apr, 15:41 | OpenRouter Request | 1.896 | 3.0s | $0.0082 | Bekijk trace → | |
| 18 apr, 15:41 | OpenRouter Request | 1.982 | 4.0s | $0.0091 | Bekijk trace → | |
| 18 apr, 15:39 | OpenRouter Request | 2.606 | 27.5s | $0.0199 | Bekijk trace → | |
| 18 apr, 15:39 | OpenRouter Request | 2.573 | 12.1s | $0.0120 | Bekijk trace → |