Diese Übung¶
In dieser Übungsaufgabe werden wir eine Hauptkomponentenanalyse der namentlichen Abstimmungen des deutschen Bundestags in den letzten Monaten durchführen.
Sie sollten zunächst die Theorieseite gelesen haben.
Dateien mit den Daten:
(Wer es genau wissen will: Hier ist beschrieben, wie ich die Daten gewonnen habe).
Solange Sie die Analyse selbst implementieren (und nicht etwa existierende Routinen verwenden), können Sie mit einem beliebigen Computersystem arbeiten. Sie können aber auch einfach dieses Notebook herunterladen (oben auf "Source" klicken) und als Vorlage benutzen. Es benötigt eine Julia und eine Jupyter-Installation. Die oben verlinkten Dateien müssen im gleichen Verzeichnis gespeichert werden.
Computerfragestunde ist Donnerstag in der VL ab 11 Uhr.
Der Datensatz¶
using DataFrames
using CSV
using LinearAlgebra
using Plots
df = CSV.read("votes.csv",DataFrame, header=false)
votes = Matrix{Float64}(df)'
fraktionen = readlines("fraks.lst");
mdbNames = readlines("names.lst");
# Das Abstimmungsverhalten ist nun als Matrix verfügbar.
# Es gibt 30 Zeilen - eine pro Abstimmung, und
# 718 Spalten - eine pro MdB
# Schluessel: Ja = 1, Enthaltung = 0, Nein = -1.
# Die Reihenfolge der Spalten entspricht der Reihenfolge der Namen in mdbNames und der Fraktionszugehörigkeite in fraktionen.
votes
30×718 adjoint(::Matrix{Float64}) with eltype Float64: 1.0 1.0 1.0 1.0 1.0 1.0 … -1.0 -1.0 -1.0 -1.0 -1.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 -1.0 0.0 0.0 -1.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 -1.0 0.0 -1.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 … 0.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 -1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 -1.0 0.0 -1.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 -1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 … -1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 0.0 ⋮ ⋮ ⋱ ⋮ 1.0 1.0 1.0 1.0 1.0 0.0 -1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 … -1.0 -1.0 -1.0 -1.0 -1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 -1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 … -1.0 0.0 -1.0 -1.0 -1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 0.0 1.0 1.0 0.0 1.0 1.0 -1.0 -1.0 1.0 -1.0 0.0 0.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.0 -1.0 -1.0 -1.0 -1.0 0.0
# Sie können auch auf Listen mit den Fraktionszugehörigkeiten und Namen der MdBs zugreifen
print(mdbNames[1], " -> ", fraktionen[1], "\n")
print(mdbNames[2], " -> ", fraktionen[2], "\n")
print("...\n")
print(mdbNames[end], " -> ", fraktionen[end], "\n")
# Achtung: Linkspartei und BSW werden als "Fraktionslos" aufgeführt (warum?).
Sanae Abdi -> SPD Adis Ahmetovic -> SPD ... Uwe Witt -> Fraktionslos
Aufgaben¶
- Berechnen Sie die Kovarianzmatrix $R$.
- Erstellen Sie einen Plot der Eigenwerte von $R$. Sie sollten sehen, dass 2 - 3 Eigenwerte dominieren. Berechnen Sie die Summe der ersten beiden und der ersten drei Eigenwerte. Sie sollten Ergebnisse zwischen 80% und 90% erhalten. Ein grosser Teiler der Varianz ist also mit nur ca. 3 Dimensionen assoziiert. (Können Sie das interpretieren? Vielleicht unter Verwendung des Wortes Fraktionszwang.)
- Arbeiten Sie zunächst mit zwei Hauptkomponenten. Projezieren Sie die Daten von $n=30$ Dimensionen auf die beiden ersten Hauptachsen. Sie erhalten also eine $2 \times 718$-Matrix.
- Erstellen Sie einen Scatterplot aller Abgeordneten bzgl. der beiden Hauptachsen. Sie sollten etwa 4 Cluster von Punkten erkennen können.
Anmerkung: Das ist ein bemerkenswertes Resultat! Wer viel Zeitung liest, hätte raten können, dass das Abstimmungsverhalten in vier Gruppen eingeteilt werden kann: Regierungskoalition, Union, AfD und Linke/BSW. Die linearen Algebra-Routinen von Julia wissen nichts über die deutsche Politik. Trotzdem könenn sie diese Struktur aus den Daten extrahieren!
Optional, wenn Sie wollen:
- Nutzen Sie nun die Liste der Fraktionszugehörigkeiten, um die Datenpunkte entsprechend einzufärben.
- Fast alle MdBs werden durch die Hauptkomponentenanalyse der richtigen Fraktion zugeordnet. Einzige Ausnahme ist der Abgeordnete Jens Koeppen. Er gehört der CDU an, wird algorithmisch aber den Linksparteien zugeordnet. Mit etwas Recherche kann man erklären, warum.
- Zum Vergleich können Sie auch eine Analyse mit drei Komponenten erstellen. Kann man mehr Struktur erkennen? (Der Scatterplot auf dem 9. Übungszettel wurde so erstellt).