In welcher Blase bin ich hier eigentlich?
Nun wollen wir mit den ersten Analysen loslegen. Am besten schauen wir uns erstmal die Damen und Herren etwas genauer an, die mit uns im Kurs sitzen. Genau genommen schauen wir uns die Damen und Herren an, die die Vorlesung im Sommersemester 2020 besucht haben. Damals wurde die Umfrage an verschiedenen Universitäten durchgeführt und erlaubt uns interessante Vergleiche.
Dazu laden wir die (bereits aufbereiteten) Daten der Umfrage herunter und speichern diese unter “/src” – das war der Ordner, in dem wir Ursprungsdatensätze ablegen wollten.
Nun öffnen wir RStudio (indem wir auf die .Rproj
doppelt klicken).
Den gesamten folgenden Code (jeweils grau unterlegt) können Sie nun fortlaufend in den Code Editor
tippen und ausführen. Mit Strg+Enter
können Sie den Code passagenweise ausführen. In der Console sehen Sie dann jeweils, welche Zeilen, mit welchem Ergebnis ausgeführt wurden. Da man sich so die Befehle besser einprägt, empfiehlt es sich übrigens tatsächlich zu tippen und nicht einfach nur zu kopieren.
Nun legen wir uns ein Skript an, mit dem wir die Kursumfrage auswerten. Ein Skript sollte mit einer informativen Beschriftung beginnen.
##----------------------------------
## Skript zur Auswertung der
## Kursumfrage (Sommersemester 2020)
##
## Autor/in: ...
## Datum: ...
##----------------------------------
Jetzt laden wir das Paket tidyverse
. Pakete (bzw. packages) sind Baukästen an Befehlen, die Base R erweitern. Das tidyverse ist eine ganze Sammlung von Paketen, die insbesondere von Hadley Wickham, einem Superhelden im R-Universum, geprägt wurden. Sie machen das Arbeiten mit R sehr intuitiv und vielseitig.
Beim ersten Mal müssen wir das tidyverse
installieren, beim nächsten Mal nicht mehr.
# Pakete laden ------------------------------------------------------------
install.packages("tidyverse") #nur beim ersten Mal notwendig, danach reicht "library"
R gibt einige Meldungen aus, die uns zunächst nicht weiter kümmern müssen. (Wenn Sie hier in dem eingegrauten Bereich Zeilen sehen, die mit “##” beginnen, handelt es sich dabei jeweils um Ausgaben, die auf einem Befehl folgen.)
Wir können mit dem Befehl library()
nun das Paket tidyverse
laden.
library(tidyverse)
## -- Attaching packages --------------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.3 v purrr 0.3.4 ## v tibble 3.1.0 v dplyr 1.0.5 ## v tidyr 1.1.3 v stringr 1.4.0 ## v readr 1.4.0 v forcats 0.5.1
## -- Conflicts ------------------------------------------------------------------------ tidyverse_conflicts() -- ## x dplyr::filter() masks stats::filter() ## x dplyr::lag() masks stats::lag()
Anschließend laden wir den Datensatz der Kursumfrage. Die anonyme Kursumfrage wurde von Ihnen vor dem Start der Vorlesung durchgeführt und gibt Ihnen die schöne Möglichkeit einer sozialforscherischen Selbstbeschauung.
# Daten laden -------------------------------------------------------------
load("src/kurs_survey2020-04.Rda")
R sucht ausgehend vom aktuellen Pfad (der wird Ihnen angezeigt, wenn Sie getwd()
in der Console eingeben) nach der Datei im Ordner src
. Wenn Sie den Kurs korrekt mit der rproj-Datei öffnen sind Sie immer im richtigen Verzeichnis.
Für einen ersten Blick auf die Daten geben wir ein:
glimpse(survey)
## Rows: 530 ## Columns: 33 ## $ kurs <chr> "[TUD] Vorlesung, Einführung in die Vergleichende Politikwissenschaft", "[TUD] Vorl~ ## $ uni <fct> TU Darmstadt, TU Darmstadt, TU Darmstadt, TU Darmstadt, TU Darmstadt, TU Darmstadt,~ ## $ geschlecht <fct> weiblich, männlich, männlich, männlich, männlich, männlich, weiblich, männlich, män~ ## $ trust <fct> ...Menschen normalerweise vertrauen, ...fast nie vorsichtig genug sein im Umgang mi~ ## $ skalo_cdu <fct> 1, -4, 3, 0, 5, -4, 2, 3, 3, 0, -4, 3, 0, -1, -4, -3, 0, 1, -2, 2, -1, -3, 1, 0, -3~ ## $ skalo_spd <fct> 5, -4, 2, 3, -2, -4, 2, -2, 0, -1, 2, 3, -1, 2, 5, 3, 0, 1, 0, 2, -1, 5, 3, 4, 2, 1~ ## $ skalo_pds <fct> 4, -4, 0, 5, -5, -2, 1, -4, -1, -3, 3, 2, -3, 1, 2, 2, 0, 4, 0, 1, 0, 2, 2, 2, -1, ~ ## $ skalo_gru <fct> 5, -4, 4, 1, -1, -5, 4, -2, 2, -2, 2, 2, -2, 0, 1, 4, 0, 3, 3, 1, 0, 3, 5, 3, 1, 1,~ ## $ skalo_fdp <fct> 0, -3, 2, -5, 2, -3, -3, 1, -1, 0, -4, 2, 0, 0, -4, -5, 0, -5, 0, 2, -2, -2, -2, 2,~ ## $ skalo_afd <fct> -5, -5, -5, -5, -5, 1, -5, -5, -3, -3, -5, -4, -3, -2, -5, -5, 0, -5, -4, -4, -5, -~ ## $ vote <chr> "SPD", "FDP", "Die Grünen", "Die Linke", "CDU", "AfD", "Die Grünen", "CDU", "CDU", ~ ## $ lire_self <dbl> 2, 1, 3, 2, 6, 4, 2, 6, 6, 6, 0, 3, 6, 3, 3, 3, 5, 4, 4, 4, 3, 2, 2, 4, 4, 3, 10, 0~ ## $ econ_self <dbl> 1, 5, 7, 3, 5, 4, 2, 7, 4, 6, 3, 2, 6, 3, 5, 4, 8, 4, 3, 4, 5, 2, 3, 2, 5, 4, 0, 0,~ ## $ immi_self <dbl> 1, 8, 3, 0, 5, 10, 3, 2, 4, 5, 2, 6, 5, 3, 0, 4, 5, 4, 2, 5, 2, 2, 3, 3, 5, 5, 10, ~ ## $ klim_self <dbl> 0, 9, 1, 0, 5, 3, 2, 5, 1, 5, 2, 3, 5, 5, 0, 4, 2, 5, 4, 3, 2, 2, 0, 2, 3, 2, 5, 1,~ ## $ euin_self <dbl> 2, 5, 2, 6, 2, 10, 1, 1, 2, 6, 4, 3, 6, 5, 0, 3, 10, 5, 7, 5, 5, 4, 1, 2, 5, 3, 10,~ ## $ mip_brd <chr> "Veraltetes Denken, Rassismus", "Soziale Ungleichheit", "Klimawandel", "Asylpolitik~ ## $ dem_brd <fct> 8, 4, 8, 10, 9, 5, 8, 9, 8, 8, 7, 8, 8, 8, 10, 8, 1, 6, 7, 9, 7, 7, 9, 8, 9, 8, 6, ~ ## $ dem_usa <fct> 2, 5, 3, 5, 3, 3, 3, 7, 6, 6, 3, 2, 6, 3, 4, 2, NA, 2, 5, 4, 4, 5, 5, 2, 6, 7, 1, 4~ ## $ dem_pol <fct> 1, 5, 4, NA, 2, 6, 2, 3, 6, 7, 1, 5, 7, 4, 1, 3, 3, 2, 3, 5, 5, 1, 3, 1, 4, 3, 8, 2~ ## $ design_direktdem <fct> stimme eher zu, stimme gar nicht zu, stimme eher zu, teils/teils, stimme gar nicht ~ ## $ design_introddem <fct> stimme eher nicht zu, stimme gar nicht zu, teils/teils, stimme eher nicht zu, stimm~ ## $ design_intromw <fct> stimme gar nicht zu, teils/teils, stimme eher nicht zu, stimme eher nicht zu, stimm~ ## $ design_minreg <fct> teils/teils, teils/teils, stimme eher nicht zu, stimme eher zu, stimme eher nicht z~ ## $ design_direktbp <fct> stimme eher nicht zu, stimme voll zu, stimme eher nicht zu, stimme eher nicht zu, s~ ## $ design_brdrop <fct> stimme gar nicht zu, stimme gar nicht zu, stimme gar nicht zu, stimme gar nicht zu,~ ## $ design_direktbk <fct> teils/teils, teils/teils, stimme eher nicht zu, stimme eher nicht zu, stimme gar ni~ ## $ design_manyparty <fct> stimme eher zu, stimme voll zu, teils/teils, stimme eher zu, stimme eher nicht zu, ~ ## $ unif_alteBL <chr> "stimme voll zu", "stimme eher zu", "stimme voll zu", "stimme eher zu", "stimme vol~ ## $ unif_neueBL <chr> "stimme eher zu", "stimme eher zu", "stimme voll zu", "stimme voll zu", "stimme vol~ ## $ unif_socialism <chr> "stimme eher zu", "stimme eher zu", "stimme eher zu", "stimme voll zu", "stimme gar~ ## $ statistik <fct> okay, okay, okay, okay, okay, nicht vorhanden, sehr gut, okay, okay, okay, nicht vo~ ## $ statistikprog <fct> nein, ja, nein, ja, nein, nein, nein, nein, nein, nein, nein, nein, nein, nein, nei~
Wir erhalten nun eine Auflistung aller Variablen mit weiteren Informationen. Wenn wir auf das Tabellen-Icon neben dem Objekt survey
im Environment-Fenster klicken, können wir uns die Daten auch als spreadsheet (=Tabellenblatt) ansehen (ja, man kann sich sogar ein wenig Excel-Feeling in R erzeugen). Man kann diese Ansicht auch mit einem Befehl aufrufen:
Wir sehen, dass in jeder Zeile eine Studentin oder ein Student steht und in den Spalten (=Variablen) seine/ihre entsprechenden Antworten auf die einzelnen Fragen der Umfrage.
An der Umfrage haben sich Studierende mehrerer Universitäten beteiligt: die Vorlesungen von Prof. Steffen Ganghof (Uni Potsdam), Prof. Martin Gross (LMU München) und Prof. Jochen Müller (Uni Greifswald). Wie häufig sind die einzelnen Unis vertreten? Dazu lassen wir uns die Anzahl der Fälle innerhalb einer bestimmten Gruppe (Unis) mit count
ausgeben.
count(survey, uni)
## # A tibble: 4 x 2 ## uni n ## <fct> <int> ## 1 TU Darmstadt 109 ## 2 LMU München 261 ## 3 Uni Greifswald 73 ## 4 Uni Potsdam 87
Uff, hoffentlich muss Prof. Gross nicht alle Klausuren allein korrigieren. Versuchen Sie count
mal selbst, z. B. mit der Variable geschlecht
!
Wir interessieren uns nun zunächst für die Darmstädter. Dazu werfen wir alle anderen Studierenden aus dem Datensatz – ich sagte Ihnen ja, mit R ist man sehr mächtig. In R (bzw. dem tidyverse) heißt das filtern.
sample_tud <- filter(survey, uni == "TU Darmstadt")
Nun ist ein neues Objekt sample_tud
angelegt, das nur die Darmstädter enthält (analog können Sie auch ein sample_lmu
etc. anlegen). Mit filter
haben Sie das erste Verb kennen gelernt, mit dem man die Daten bearbeiten kann (auch als data wrangling bezeichnet).
Wie würden die Kursteilnehmer abstimmen, wenn am nächsten Sonntag Bundestagswahl wäre?
Nun sind wir neugierig, welche Parteien von den TUDalern präferiert werden. Diese Information ist in der Variable vote
hinterlegt:
count(sample_tud, vote)
## # A tibble: 8 x 2 ## vote n ## <chr> <int> ## 1 AfD 4 ## 2 CDU 13 ## 3 Die Grünen 41 ## 4 Die Linke 15 ## 5 DIE PARTEI 5 ## 6 FDP 10 ## 7 Sonstige 8 ## 8 SPD 13
Hoppla, offenkundig sind wir hier in einer ziemlich links-liberalen Blase gelandet. Sollte es DIE PARTEI am Ende doch nicht über die 5%-Hürde schaffen, könnte es sogar für eine grüne Alleinregierung reichen. Ein Blick auf aktuelle Umfragen legt nahe, dass der durchschnittliche Bundesbürger politisch anders tickt als Sie und Ihre Kommillitoninnen und Kommillitonen.
Aber auch, wenn Sie zu den wenigen Konservativen im Kurs gehören, brauchen Sie sich keine Sorgen zu machen. Zum Glück respektieren sicher gerade an der Universität alle den fundamentalen Wert der Meinungsfreiheit und werden auch abweichenden Argumenten und Werthaltungen gegenüber respektvoll und aufgeschlossen sein. Sie brauchen auch nicht aus Höflichkeit über die politisch korrekten linksgrünen Scherze des Dozenten lachen. Er hat halt Marktforschung betrieben (Kursumfrage!) und will sich bei der Mehrheit anbiedern.
Wie sieht es denn in Greifswald aus?
survey %>%
filter(uni == "Uni Greifswald") %>%
count(vote)
## # A tibble: 8 x 2 ## vote n ## <chr> <int> ## 1 AfD 2 ## 2 CDU 6 ## 3 Die Grünen 20 ## 4 Die Linke 19 ## 5 DIE PARTEI 3 ## 6 FDP 4 ## 7 Sonstige 5 ## 8 SPD 14
Die letzte Eingabe besteht aus mehreren Zeilen, die durch “%>%” verbunden sind. Dies ist eine sogenannte pipe, die Befehle verknüpft. Die pipe nimmt jeweils den Output der vorhergehenden Zeile als Input der nachfolgenden Zeile, hier: Nimm Dir den survey-Datensatz, dann filtere die Greifswalder heraus, dann zähle ihre Parteipräferenzen. Wir werden die pipe nun immer nutzen, da man damit komplexe Befehlsketten sehr übersichtlich strukturieren kann. Damit Sie keinen Knoten in die Finger bekommen: Nutzen Sie Strg+Shift+M
, um die pipe zu erzeugen. Überhaupt lohnt es sich die wichtigsten keyboard shortcuts drauf zu haben.
Munich, can we have your points, please?
survey %>%
filter(uni == "LMU München") %>%
count(vote)
## # A tibble: 8 x 2 ## vote n ## <chr> <int> ## 1 AfD 1 ## 2 CDU 47 ## 3 Die Grünen 121 ## 4 Die Linke 26 ## 5 DIE PARTEI 9 ## 6 FDP 13 ## 7 Sonstige 10 ## 8 SPD 34
Aufgrund der unterschiedlichen Teilnehmerzahlen, kann man schwer erkennen, ob es relevante Unterschiede zwischen den Unis gibt. Da helfen Prozente.
survey %>%
filter(uni == "LMU München") %>%
count(vote) %>%
# Berechnen der Prozentanteile mit mutate
mutate(totalvotes = sum(n),
share = n/totalvotes*100)
## # A tibble: 8 x 4 ## vote n totalvotes share ## <chr> <int> <int> <dbl> ## 1 AfD 1 261 0.383 ## 2 CDU 47 261 18.0 ## 3 Die Grünen 121 261 46.4 ## 4 Die Linke 26 261 9.96 ## 5 DIE PARTEI 9 261 3.45 ## 6 FDP 13 261 4.98 ## 7 Sonstige 10 261 3.83 ## 8 SPD 34 261 13.0
Die Prozente haben wir mit mutate
berechnet – dies ist das tidyverse
-Verb zum Generieren neuer Variablen. Erst haben wir die totalvote
berechnet. Dies ist die Gesamtzahl aller Stimmen. Mit einem Komma abgetrennt, haben wir eine weitere Variable, share
erstellt, die uns die Prozente ausgibt. Und wir haben gleich noch gelernt, dass man Kommentare mit einem anführenden #
in den Code schreiben kann. Kommentieren Sie am besten immer ausführlicher als Sie es im Moment für notwendig erachten. Dann schauen Sie in vierzehn Tagen weniger ratlos auf den Code, den Sie vor vierzehn Tagen selbst flüssig heruntergeschrieben hat. Sie können nun die Unis vergleichen, indem Sie einfach filter(uni == "LMU München")
beliebig befüllen.
Wenn Sie dies vertiefen wollen, lesen Sie sich dazu am besten auch das Kapitel in R for DataScience durch.
Zurück zu den Darmstädtern: Eine Grafik sagt es meist besser als eine Tabelle, da die Informationen unmittelbar visuell beurteilt werden können. Füttern wir die Parteipräferenzen also in ein Balkendiagramm:
sample_tud %>% count(vote) %>%
mutate(totalvotes = sum(n),
share = n/totalvotes*100) %>%
ggplot() +
geom_col(aes(x = vote, y = share))
Mit dem Balkendiagramm haben wir ggplot2, das Visualisierungspaket im tidyverse
kennengelernt. Mit “ggplot” wird der Grafikbefehl gestartet. Ab da weiß R, dass nun ggplot-Befehle kommen. Danach werden weitere ggplot-Befehle mit “+” verknüpft (Achtung: hier nicht “%>%” benutzen). Danach sagen wir R, welche Art des Graphs, das Geom, gezeichnet werden soll. Mit geom_col
sagen wir R, dass die Daten als Balken dargestellt werden sollen und konkretisieren in (aes(x = vote, y = share))
, dass auf der x-Achse die unterschiedlichen Parteien und auf der y-Achse die Prozente bei der Sonntagsfrage abgebildet werden.
Lesen Sie sich dazu am besten auch das Kapitel in R for DataScience durch.
Nun können Sie die Stimmenanteile zwischen den Unis vergleichen. Schauen Sie sich doch auch mal an, wie die Verteilung bei den politischen Präferenzen aussieht. Dazu müssen Sie nur vote
mit lire_self
oder immi_self
ersetzen. Wenn Sie unterschiedliche Unis betrachten wollen, pipen sie sich einfach eine entsprechende Befehlskette zusammen.
Wer in jungen Jahren nicht links ist, der hat kein Herz oder kommt aus Bayern.
Jetzt lernen wir noch ein weiteres ggplot-geom kennen und nutzen dies gleich für eine Forschungsfrage.
Als SozialwissenschaftlerInnen sind wir ständig auf der Suche nach Mustern und Erklärungen der politischen und sozialen Realität. Da sich mein geschätzter Kollege Martin Gross von der LMU München an der Kursumfrage beteiligt hat, sind wir in der glücklichen Lage, eine politikwissenschaftliche Großtheorie überprüfen zu können. Das folgende bekannte Diktum fasst diese prominente Theorie zusammen: “Wer in jungen Jahren nicht links ist, der hat kein Herz oder kommt aus Bayern.” 😉 Um diese Theorie überprüfen zu können, schauen wir, ob sich die Kohorte von der LMU im “Links-Sein” von den Kohorten aus Darmstadt und Potsdam unterscheidet. In der Umfrage wurden Sie gebeten, sich auf einer allgemeinen “Links-Rechts-Achse” selbst einzuordnen. Diese Information ist in der Variablen lire_self
hinterlegt. Die Verteilung der Variablen bilden wir nun mit einem density-plot ab und lassen uns die Werte für die Unis getrennt darstellen. Wenn die Theorie wahr wäre, sollten wir beobachten, dass die Münchner eher rechte Werte auf der Skala wählen als Studierende der anderen Unis.
survey %>%
ggplot(aes(as.numeric(as.character(lire_self)), color = uni, fill = uni)) +
geom_density(alpha = 0.2, adjust = 1.5) +
labs(title = "Sind Studierende aus Bayern 'rechter'?",
x = "Links-Rechts-Selbsteinschätzung")
Doch weit gefehlt: Es sind eher die Darmstädter, die weiter rechts liegen (allerdings sind die Unterschiede nicht sonderlich groß). Woran könnte das liegen? Haben wir es bei den LMU-Studierenden eventuell mit einer verzerrten Stichprobe der Bayern zu tun, weil darunter besonders viele aus München stammen? Liegt es auch daran, dass unter den TUDalern Männer überrepräsentiert sind und Männer wiederum tendentiell rechter sind? Damit sind wir schon mitten im Interview mit den Daten, die wir im Kurs einüben wollen.
Sie wissen jetzt auch, dass man mit labs()
eine Abbildung und ihre Achsen beschriften kann. Im rechten unteren “plots & files”-pane sehen Sie Ihre Grafik. Speichern Sie diese über Export/Save as Image
in ihren /graph-Ordner.
Eine umfangreichere Auswertung der Umfrage finden Sie hier:
Die Grafiken sind etwas schicker (haben aber auch deutlich mehr Zeit gekostet). Im Laufe des Kurses werden wir die Schönheit und Aussagekraft der Grafiken auch stetig verbessern.
Was sind Ihre eigenen theoretischen Erwartungen!
Sind Frauen politisch “linker” als Männer? Welche Intuitionen über mögliche Datenmuster haben Sie?
Posten Sie ein Ergebnis im moodle-Forum Ihre Grafiken und Skripte im AppetizeR-Kurs. Am besten posten Sie den Code und das .png (aus ihrem “/graphs”-Ordner), damit wir nachvollziehen können, wie Sie zu ihren Ergebnissen kommen (Stichwort: reproducable research).