Auswertungen — Bundesland × Partei × Wahlperiode Aggregations-Dashboard #58

Closed
opened 2026-04-09 10:20:45 +02:00 by tobias · 1 comment
Owner

Ziel

Die GWÖ-Antragsprüfer-DB enthält bald hunderte Assessments über mehrere Bundesländer und Wahlperioden hinweg. Bisher gibt es nur die Detail-Ansicht pro Antrag. Es fehlt eine Aggregations-Sicht, die Muster sichtbar macht: Welche Partei in welchem Bundesland in welcher Wahlperiode liefert welche Durchschnitts-Scores?

Die heutige CLAUDE.md hat eine fest eingebackene 5-Zeilen-Statistik-Tabelle (Stand 2026-03-28, 20 Anträge) — die ist genau die Art von Übersicht, die dynamisch aus der DB kommen sollte und für alle drei Dimensionen drillbar ist.

Drei Dimensionen

  1. Bundesland (NRW, MV, BE, LSA, BW, HH, TH, SH, BB, RP, ... + später BUND)
  2. Partei / Fraktion (kanonisch via Parteinamen-Mapper #55, also CDU, SPD, GRÜNE, FDP, LINKE, AfD, BSW, FW-BAYERN, BVB-FW-BB, ...)
  3. Wahlperiode (z.B. NRW WP18, MV WP8, BE WP19, BB WP8) — entweder als ID oder als Zeitraum start..end

Aggregations-Werte pro Zelle

Pro (BL, Partei, WP)-Zelle:

  • Anzahl Anträge (n)
  • Ø GWÖ-Gesamt-Score (0–10)
  • Ø Wahlprogramm-Treue-Score (0–10) — wie kohärent die Anträge mit dem Wahlprogramm der Partei sind
  • Optional in v2: Median, Standardabweichung, Min, Max
  • Optional in v2: Aufschlüsselung der 5 GWÖ-Werte (Menschenwürde, Solidarität, ökol. Nachhaltigkeit, soziale Gerechtigkeit, Mitbestimmung) als Mini-Radar

Drei Visualisierungs-Ebenen

A) 2D-Matrix (Default-Ansicht)

Zwei Dimensionen als Tabelle, dritte als Filter:

  • Default: Zeilen = Partei, Spalten = Bundesland, Filter = Wahlperiode (Drop-down, default 'aktuelle WP')
  • Tausch-Button: Zeilen ↔ Spalten
  • Zellen-Inhalt: Ø-Score (n=...) mit Farbcode (rot ≤ 3, gelb 3–6, grün > 6)
  • Klick auf Zelle → Drill-down auf die Liste der zugrundeliegenden Anträge

B) Zeitreihe (3D-Schnitt)

Für eine fixe (BL, Partei)-Kombination: Score-Verlauf über mehrere Wahlperioden hinweg. Macht Drift sichtbar, z.B. 'NRW SPD ist von WP17 zu WP18 von Ø 7.2 auf Ø 6.8 gerutscht'.

C) CSV / Excel Export

Alle drei Dimensionen als Long-Format-Tabelle (bundesland,partei,wahlperiode,n,score_gwoe,score_treue), nutzbar für externe Auswertungen / Reports / Vergleiche.

Datenquellen + Berechnung

  • Eingabe: assessments-Tabelle in data/gwoe-antraege.db, Felder bundesland, fraktionen (JSON-Array), gwoe_score, wahlprogramm_scores (JSON mit Per-Fraktion-Detail)
  • Wahlperiode-Mapping: aus dem datum-Feld der Drucksache + BUNDESLAENDER[bl].wahlperiode_start/naechste_wahl-Konfig in bundeslaender.py ableiten — Drucksachen vor wahlperiode_start gehören zur Vorgänger-WP
  • Partei-Normalisierung: strikt über normalize_partei() aus #55 (mit bundesland-Kontext, damit FW-Familie korrekt aufgelöst wird)
  • Score-Aggregation: SQL-AVG() über die nicht-NULL-Scores; SQLite kann das ohne externes BI-Tool

Acceptance Criteria

  • Neuer Endpoint GET /api/auswertungen mit Query-Parametern bundesland, partei, wahlperiode (alle optional)
  • Neuer Endpoint GET /api/auswertungen/matrix der die 2D-Matrix als JSON liefert (Filter auf Wahlperiode)
  • Neuer Endpoint GET /api/auswertungen/zeitreihe?bl=...&partei=... für die 3D-Sicht
  • Neuer Endpoint GET /api/auswertungen/export.csv für Long-Format-Export
  • Neue Webapp-Seite /auswertungen mit Matrix-Tabelle, Wahlperioden-Filter, Tausch-Button, Klick-zu-Drill-down
  • CSV-Download-Button auf der Seite
  • Wahlperioden-Mapping-Helper in app/wahlperioden.py (oder Erweiterung von bundeslaender.py) — nimmt Datum + BL und liefert WP-ID
  • Neue Unit-Tests für die Wahlperioden-Zuordnung (insbesondere Edge-Cases an WP-Übergängen)
  • Neue Integration-Tests in tests/integration/test_auswertungen.py die gegen die echte gwoe-antraege.db die Matrix-Aggregation prüfen
  • CLAUDE.md hartcodierte Statistik-Tabelle entfernen, durch Link zu /auswertungen ersetzen

Bewusst NICHT in scope

  • Dashboards mit Drittanbieter-BI (Grafana, Metabase) — wäre ein eigenes Stack-Element
  • Trend-Prognosen / ML-Vorhersagen — die Datenmenge ist zu klein und es ist nicht der Zweck der Analyse
  • Fraktion-Cluster-Analysen (z.B. 'wer stimmt mit wem öfter überein') — separates Folge-Issue, braucht andere Datenstruktur
  • Bundes-Aggregationen über alle BL hinweg — erst sinnvoll wenn der BUND-Adapter (#56) live ist

Bezug

  • Hängt am Parteinamen-Mapper #55 — ohne kanonische Partei-Keys ist die Aggregation zwangsläufig fehlerhaft (FW-RLP würde mit BVB-FW-BB in einen Topf gerührt)
  • Profitiert von #56 (Bundespolitik) — wenn der BUND-Adapter live ist, wird die Matrix um eine Zeile/Spalte breiter
  • Synergiert mit Sub-Issue D #54 — die Property-Verification kann später eine 'Zitat-Quote-pro-Partei'-Spalte in der Matrix anbieten ('CDU MV: 87% der Zitate verifiziert')
## Ziel Die GWÖ-Antragsprüfer-DB enthält bald hunderte Assessments über mehrere Bundesländer und Wahlperioden hinweg. Bisher gibt es nur die Detail-Ansicht pro Antrag. Es fehlt eine **Aggregations-Sicht**, die Muster sichtbar macht: Welche Partei in welchem Bundesland in welcher Wahlperiode liefert welche Durchschnitts-Scores? Die heutige CLAUDE.md hat eine fest eingebackene 5-Zeilen-Statistik-Tabelle (Stand 2026-03-28, 20 Anträge) — die ist genau die Art von Übersicht, die dynamisch aus der DB kommen sollte und für alle drei Dimensionen drillbar ist. ## Drei Dimensionen 1. **Bundesland** (NRW, MV, BE, LSA, BW, HH, TH, SH, BB, RP, ... + später BUND) 2. **Partei / Fraktion** (kanonisch via Parteinamen-Mapper #55, also CDU, SPD, GRÜNE, FDP, LINKE, AfD, BSW, FW-BAYERN, BVB-FW-BB, ...) 3. **Wahlperiode** (z.B. NRW WP18, MV WP8, BE WP19, BB WP8) — entweder als ID oder als Zeitraum `start..end` ## Aggregations-Werte pro Zelle Pro `(BL, Partei, WP)`-Zelle: - **Anzahl Anträge** (n) - **Ø GWÖ-Gesamt-Score** (0–10) - **Ø Wahlprogramm-Treue-Score** (0–10) — wie kohärent die Anträge mit dem Wahlprogramm der Partei sind - Optional in v2: Median, Standardabweichung, Min, Max - Optional in v2: Aufschlüsselung der 5 GWÖ-Werte (Menschenwürde, Solidarität, ökol. Nachhaltigkeit, soziale Gerechtigkeit, Mitbestimmung) als Mini-Radar ## Drei Visualisierungs-Ebenen ### A) 2D-Matrix (Default-Ansicht) Zwei Dimensionen als Tabelle, dritte als Filter: - Default: Zeilen = Partei, Spalten = Bundesland, Filter = Wahlperiode (Drop-down, default 'aktuelle WP') - Tausch-Button: Zeilen ↔ Spalten - Zellen-Inhalt: `Ø-Score (n=...)` mit Farbcode (rot ≤ 3, gelb 3–6, grün > 6) - Klick auf Zelle → Drill-down auf die Liste der zugrundeliegenden Anträge ### B) Zeitreihe (3D-Schnitt) Für eine fixe (BL, Partei)-Kombination: Score-Verlauf über mehrere Wahlperioden hinweg. Macht Drift sichtbar, z.B. 'NRW SPD ist von WP17 zu WP18 von Ø 7.2 auf Ø 6.8 gerutscht'. ### C) CSV / Excel Export Alle drei Dimensionen als Long-Format-Tabelle (`bundesland,partei,wahlperiode,n,score_gwoe,score_treue`), nutzbar für externe Auswertungen / Reports / Vergleiche. ## Datenquellen + Berechnung - **Eingabe:** `assessments`-Tabelle in `data/gwoe-antraege.db`, Felder `bundesland`, `fraktionen` (JSON-Array), `gwoe_score`, `wahlprogramm_scores` (JSON mit Per-Fraktion-Detail) - **Wahlperiode-Mapping:** aus dem `datum`-Feld der Drucksache + `BUNDESLAENDER[bl].wahlperiode_start`/`naechste_wahl`-Konfig in `bundeslaender.py` ableiten — Drucksachen vor `wahlperiode_start` gehören zur Vorgänger-WP - **Partei-Normalisierung:** strikt über `normalize_partei()` aus #55 (mit `bundesland`-Kontext, damit FW-Familie korrekt aufgelöst wird) - **Score-Aggregation:** SQL-`AVG()` über die nicht-NULL-Scores; SQLite kann das ohne externes BI-Tool ## Acceptance Criteria - [ ] Neuer Endpoint `GET /api/auswertungen` mit Query-Parametern `bundesland`, `partei`, `wahlperiode` (alle optional) - [ ] Neuer Endpoint `GET /api/auswertungen/matrix` der die 2D-Matrix als JSON liefert (Filter auf Wahlperiode) - [ ] Neuer Endpoint `GET /api/auswertungen/zeitreihe?bl=...&partei=...` für die 3D-Sicht - [ ] Neuer Endpoint `GET /api/auswertungen/export.csv` für Long-Format-Export - [ ] Neue Webapp-Seite `/auswertungen` mit Matrix-Tabelle, Wahlperioden-Filter, Tausch-Button, Klick-zu-Drill-down - [ ] CSV-Download-Button auf der Seite - [ ] Wahlperioden-Mapping-Helper in `app/wahlperioden.py` (oder Erweiterung von `bundeslaender.py`) — nimmt Datum + BL und liefert WP-ID - [ ] Neue Unit-Tests für die Wahlperioden-Zuordnung (insbesondere Edge-Cases an WP-Übergängen) - [ ] Neue Integration-Tests in `tests/integration/test_auswertungen.py` die gegen die echte gwoe-antraege.db die Matrix-Aggregation prüfen - [ ] CLAUDE.md hartcodierte Statistik-Tabelle entfernen, durch Link zu `/auswertungen` ersetzen ## Bewusst NICHT in scope - **Dashboards mit Drittanbieter-BI** (Grafana, Metabase) — wäre ein eigenes Stack-Element - **Trend-Prognosen / ML-Vorhersagen** — die Datenmenge ist zu klein und es ist nicht der Zweck der Analyse - **Fraktion-Cluster-Analysen** (z.B. 'wer stimmt mit wem öfter überein') — separates Folge-Issue, braucht andere Datenstruktur - **Bundes-Aggregationen** über alle BL hinweg — erst sinnvoll wenn der BUND-Adapter (#56) live ist ## Bezug - **Hängt am Parteinamen-Mapper #55** — ohne kanonische Partei-Keys ist die Aggregation zwangsläufig fehlerhaft (FW-RLP würde mit BVB-FW-BB in einen Topf gerührt) - **Profitiert von #56** (Bundespolitik) — wenn der BUND-Adapter live ist, wird die Matrix um eine Zeile/Spalte breiter - **Synergiert mit Sub-Issue D #54** — die Property-Verification kann später eine 'Zitat-Quote-pro-Partei'-Spalte in der Matrix anbieten ('CDU MV: 87% der Zitate verifiziert')
Author
Owner

Phase C aus Roadmap #59 deployed (Commit 3631e54).

  • Backend: app/auswertungen.py mit Matrix/Zeitreihe/CSV-Long-Format
  • app/wahlperioden.py mit wahlperiode_for(datum, bl)
  • 4 neue Endpoints: /auswertungen, /api/auswertungen/matrix, /.../zeitreihe, /.../export.csv
  • Frontend: app/templates/auswertungen.html mit Vanilla-JS-Matrix-Tabelle, WP-Filter, CSV-Button
  • 19 neue Tests (176 Unit-Tests grün)

Live verifiziert: Matrix liefert 31 Assessments (4 BL × 5 Parteien), CSV-Export sauber, Page lädt mit 200. Schließt zusammen mit #45 (CSV-Export) ab.

Phase C aus Roadmap #59 deployed (Commit `3631e54`). - Backend: `app/auswertungen.py` mit Matrix/Zeitreihe/CSV-Long-Format - `app/wahlperioden.py` mit `wahlperiode_for(datum, bl)` - 4 neue Endpoints: `/auswertungen`, `/api/auswertungen/matrix`, `/.../zeitreihe`, `/.../export.csv` - Frontend: `app/templates/auswertungen.html` mit Vanilla-JS-Matrix-Tabelle, WP-Filter, CSV-Button - 19 neue Tests (176 Unit-Tests grün) Live verifiziert: Matrix liefert 31 Assessments (4 BL × 5 Parteien), CSV-Export sauber, Page lädt mit 200. Schließt zusammen mit #45 (CSV-Export) ab.
Sign in to join this conversation.
No description provided.