/2017-wahlprogramm-analyse

Analyse der Wahlprogramme zur Bundestagswahl 2017

Primary LanguageJavaScriptMIT LicenseMIT

Analyse der Wahlprogramme zur Bundestagswahl 2017

Untersuchung der Wahlprogramme zur Bundestagswahl 2017 auf inhaltliche Schwerpunkte und politische Ausrichtung. Grundlage der Auswertung sind alle Wahlprogramme deutscher Parteien mit einem Stimmenanteil von über 5% (nach Umfragen). Die Wahlprogramme wurden automatisiert pro Gliederungspunkt nach politischer Einstellung (links/rechts) und Politikfeld eingeordnet.

Der Einordnung liegt ein Machine-Learning-Algorithmus zugrunde, welcher mit Daten des Manifesto-Projekt trainiert wurde. Auch das Schema für die Klassifizierung der Wahlprogramme (Domains und Labels), sowie das Schema für die Berechnung der Rechts-Links-Einteilung, wurden von diesem Forschungsprojekt übernommen. Eine Analyse von BR Data und Felix Bießmann.

Manifesto-Projekt

Das Manifesto-Projekt untersucht Wahlprogramme aus verschiedenen Ländern auf ihre Inhalte und politischen Positionen. Für das Manifesto-Projekt von DFG und WZB codieren Wissenschaftler Wahlprogramme auf Aussagenebene. Jeweils mehrere Manifesto-Codes bilden eine übergeordnete politische Domain.

Domains repräsentieren die großen Politikfelder: External Relations, Freedom and Democracy, Political System, Economy, Welfare and Quality of Life, Fabric of Society, Social Groups. Einzelne Manifesto-Codes können zudem einer linken oder rechten politisch Ausrichtung (Codebuch, Seite 28) zugeordnet werden.

Wahlprogramme

Die Wahlprogramme stammen jeweils von der offiziellen Webseite der Parteien (Stand 31. Juli 2017):

Für die automatisierte Klassifizierung wurden die PDF-Wahlprogramme in das Markdown-Format umgewandelt. Alle Wahlprogramme im Markdown-Format finden sich im Ordner data/wahlprogramme.

Machine-Learning-Klassifizierung

Die Machine Learning Analyse verwendet Python 3.6 und scikit-learn.

  1. Erstellen eines virtualenv im Ordner des github repositories:
$ python3.6 -m venv venv
  1. Aktieren des virtualenvs:
$ source venv/bin/activate
  1. Installieren der Abhänigkeiten:
$ pip install -r requirements.txt
  1. Eigenen API-Key in manifesto_data.py hinzufügen (mehr Infos). Beispiel:
$ APIKEY  = "36ef88622dd8955fbf8c2afe9b13c7b2"
  1. Ausführen der Analysen:
$ python br.py

Die Ergebnisse werden als Tabelle in data/resultate/results.csv gespeichert. Außerdem wird im gleichen Verzeichnis für jede Domain ein Violin-Plot erstellt, der dabei hilft, die Ergebnisse der Klassifizierung auf ihre Plausibilität hin zu überprüfen.

Analyse und Aggregation

Das Analyse-Skript benötigt mindestens Node.js v6. Die Abhängigkeiten können mit npm install im Ordner analysis installiert werden.

Analyse im Ordner analysis ausführen. Das Skript benötigt die Ergebnisse der Machine-Learning-Klassifizierung aus der Datei data/resultate/results.csv:

$ node analyseResults.js

Die Ergebnisse der Analyse werden in einer JSON-Datei analysis/results/results.json gespeichert. Hier ein Beispiel-Ergebnis für die Metrik rile_calc:

"rile_calc": {
  "AfD": -0.25,
  "CDU/CSU": -0.12,
  "FDP": -0.15,
  "SPD": -0.43,
  "Grüne": -0.22,
  "Die Linke": -0.57
}

Alle Metriken werden jeweils pro Partei berechnet. Folgende Metriken sind verfügbar (unvollständig):

left_mean, right_mean: arithmetisches Mittel aller Links- oder Rechts-Werte.
rile_mean: Differenz des Rechts-Durchschnitts und des Links-Durchschnitts.

left_median, right_median: Median aller Links- oder Rechts-Werte.
rile_median: Differenz des Rechts-Medians und des Links-Medians.

left_stddev, right_stddev: Standardabweichung der Links- oder Rechts-Werte.

Die Berechnungen des arithmetischen Mittels und des Medians sind auch jeweils als gewichteter Mittelwert verfügbar (weighted_mean, weighted_median).

left_calc, right_calc: Anzahl der Paragraphen, welche nach Manifesto-Definition (Codebuch, Seite 28) rechts oder links sind.
rile_calc: Differenz der Summe aller rechten Paragraphen und der Summe alle linken Paragraphen geteilt durch die Anzahl aller Paragraphen (Σ rechts - Σ links / Σ rechts + Σ links)

max_domain: Anzahl der Paragraphen, die einer Domäne (Maximum) zugeordnet wurden.
max_manifesto: Anzahl der Paragraphen, die einem Manifesto-Code (Maximum) zugeordnet wurden.
max_leftright: Anzahl der Paragraphen, die dem Label left ODER right (Maximum) zugeordnet wurden.

max_domain_left, max_domain_right: Durchschnitt aller Links- ODER Rechts-Werte pro Domäne.
max_domain_rile: Differenz der durchschnittlichen Rechts-Werte und der durchschnittlichen Links-Werte pro Domäne.

max_domain_max_left, max_domain_max_right: Anzahl der Paragraphen, die dem Label left ODER right (Maximum) UND einem Manifesto-Code zugeordnet wurden.
max_domain_max_rile: Differenz der Anzahl aller Paragraphen mit max_leftright=left UND max_domain=* und aller Paragraphen mit max_leftright=right UND max_domain=*. Diese Metrik ist allerdings recht schwierig, da das Sample pro Partei und pro Domäne teilweise recht klein ist und extreme Ergebnisse liefert.

Historische Werte zum Vergleich

Die historischen RILE-Werte (2002 bis 2013) werden in einem R-Skript berechnet. Die Daten des Manifesto Projekts werden über die Bibliothek manifestoR geladen.

Visualisierung und inhaltliche Auswertung

Eine Visualisierungen der Ergebnisse findet sich in analysis/charts/index.html. Die unterschiedlichen Visualisierungen verwenden die JavaScript Bibliothek D3 und sind eher für die Exploration der Daten gedacht. Die finale Version der Auswertung findet sich hier.