fix(svd): remove component 4 from SVD_THEMES (dim 3 has zero party signal)

Dim 3 captures within-party individual disagreement (MPs splitting
from party lines). Party-aggregate votes are structurally 0 on this
dimension, so the axis chart showed all parties at ~0 with no
discrimination. Confirmed via dry-run: identical to existing data.

Also filter comp_options to only show components with a defined theme,
so component 4 is hidden from the selectbox entirely.
main
Sven Geboers 1 month ago
parent 26acd8b964
commit 0a2238f2ba
  1. 22
      explorer.py

@ -1017,24 +1017,6 @@ def build_svd_components_tab(db_path: str) -> None:
"negative_pole": "Strikte handhaving, deregulering en nationalistisch eigenbelang boven humanitaire verplichtingen",
"flip": True,
},
4: {
"label": "Publieke voorzieningen beschermen versus liberale marktwerking",
"explanation": (
"Deze as weerspiegelt de klassieke sociaal-economische tegenstelling tussen links en "
"liberaal-economisch rechts. Aan de positieve kant staan moties van SP en DENK die "
"pleiten voor betaalbare zorg, lage treintarieven, bescherming van politiepersoneel en "
"regionale brandweerposten — allemaal gericht op het beschermen van publieke voorzieningen "
"voor gewone burgers. Aan de negatieve kant staan moties van VVD, D66, Volt en NSC die "
"pleiten voor het EU-Mercosur vrijhandelsverdrag en een flexibele kennismigrantenregeling "
"ten behoeve van het economisch verdienvermogen. Deze dimensie is politiek betekenisvol "
"omdat hij de fundamentele vraag raakt of de staat actief moet ingrijpen om collectieve "
"voorzieningen betaalbaar en toegankelijk te houden, of dat vrije markt en open handel "
"leidend moeten zijn."
),
"positive_pole": "Vrije handel, open economie en marktgerichte arbeidsmigratie",
"negative_pole": "Staatsbescherming van betaalbare publieke voorzieningen voor iedereen",
"flip": False,
},
5: {
"label": "Christelijk-conservatief sociaal beleid versus seculier progressief",
"explanation": (
@ -1177,7 +1159,9 @@ def build_svd_components_tab(db_path: str) -> None:
if r.get("motion_id") not in existing_ids:
bucket.append(r)
comp_options = sorted(comp_map.keys())
# Only show components that have a defined theme (excludes e.g. dim 3 which
# captures within-party individual variance and is uninformative at party level).
comp_options = sorted(c for c in comp_map.keys() if c in SVD_THEMES)
# Build display labels for selectbox: "As 1 — Regulering vs. status-quo"
def _comp_label(c: int) -> str:

Loading…
Cancel
Save