7 Deskriptive Auswertungen
Nach dem Gespräch mit der Dozentin zur statistischen Analyse, lässt sich Emma zunächst Häufigkeitsauszählungen der Merkmale ausgeben. Dazu greift sie nach Internetrecherche auf das sjmisc-Paket zurück.
Zuerst lädt sie das Paket mit dem library-Befehl. Um sich etwas Arbeit zu sparen und nicht jedes Mal den Datensatz bei der Auswertung der einzelnen Variablen mit angeben zu müssen, spezifiziert Emma den Datensatz für die nachfolgenden Auswertungenf mit dem attach-Befehl . Wenn Emma nicht anderes angibt, beziehen sich die folgenden Befehle also immer auf den Datensatz “ALLBUS_21_young”, welcher im vorherigen Kapitel erstellt wurde. Emma lässt sich die Häufigkeiten für Geschlecht, politisches Interesse und Wahlabsicht auszählen.
library (sjmisc)
attach (ALLBUS_21_young) #Zugriff auf den Datensatz, damit entfällt die Angabe Datensatz$Variable
frq (sex) #Häufigkeitsauszählung der Variable sex (Geschlecht)
frq (pa02a) #Häufigkeitsauszählung der Variable pa02a (politisches Interesse)
frq (pv01) #Häufigkeitsauszählung der Variable pv01 (Wahlabsicht)
#> GESCHLECHT, BEFRAGTE(R) (x) <numeric>
#> # total N=387 valid N=387 mean=1.51 sd=0.50
#>
#> Value | Label | N | Raw % | Valid % | Cum. %
#> -----------------------------------------------------
#> -9 | KEINE ANGABE | 0 | 0.00 | 0.00 | 0.00
#> 1 | MANN | 191 | 49.35 | 49.35 | 49.35
#> 2 | FRAU | 196 | 50.65 | 50.65 | 100.00
#> 3 | DIVERS | 0 | 0.00 | 0.00 | 100.00
#> <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
#> POLITISCHES INTERESSE, BEFR. (ORDINAL) (x) <numeric>
#> # total N=387 valid N=386 mean=2.83 sd=0.98
#>
#> Value | Label | N | Raw % | Valid % | Cum. %
#> ---------------------------------------------------------
#> -42 | DATENFEHLER: MFN | 0 | 0.00 | 0.00 | 0.00
#> -9 | KEINE ANGABE | 0 | 0.00 | 0.00 | 0.00
#> 1 | SEHR STARK | 36 | 9.30 | 9.33 | 9.33
#> 2 | STARK | 97 | 25.06 | 25.13 | 34.46
#> 3 | MITTEL | 169 | 43.67 | 43.78 | 78.24
#> 4 | WENIG | 65 | 16.80 | 16.84 | 95.08
#> 5 | UEBERHAUPT NICHT | 19 | 4.91 | 4.92 | 100.00
#> <NA> | <NA> | 1 | 0.26 | <NA> | <NA>
#> BEFR.: WAHLABSICHT BUNDESTAGSWAHL (x) <numeric>
#> # total N=387 valid N=285 mean=18.05 sd=30.79
#>
#> Value | Label | N | Raw % | Valid % | Cum. %
#> -------------------------------------------------------------
#> -50 | NICHT WAHLBERECHTIGT | 0 | 0.00 | 0.00 | 0.00
#> -42 | DATENFEHLER: MFN | 0 | 0.00 | 0.00 | 0.00
#> -9 | KEINE ANGABE | 0 | 0.00 | 0.00 | 0.00
#> -8 | WEISS NICHT | 0 | 0.00 | 0.00 | 0.00
#> -7 | VERWEIGERT | 0 | 0.00 | 0.00 | 0.00
#> 1 | CDU-CSU | 30 | 7.75 | 10.53 | 10.53
#> 2 | SPD | 31 | 8.01 | 10.88 | 21.40
#> 3 | FDP | 44 | 11.37 | 15.44 | 36.84
#> 4 | DIE GRUENEN | 93 | 24.03 | 32.63 | 69.47
#> 6 | DIE LINKE | 29 | 7.49 | 10.18 | 79.65
#> 42 | AFD | 18 | 4.65 | 6.32 | 85.96
#> 90 | ANDERE PARTEI | 22 | 5.68 | 7.72 | 93.68
#> 91 | WUERDE NICHT WAEHLEN | 18 | 4.65 | 6.32 | 100.00
#> <NA> | <NA> | 102 | 26.36 | <NA> | <NA>
7.1 Visualisierungen mit base-R-Befehlen
Die in den Häufigkeitstabellen sichtbaren Ergebnisse möchte Emma nun über Diagramme visualisieren. Zu Beginn erstellt sie für das politische Interesse ein Säulen-, ein Balken- und ein Kreisdiagramm. Dazu verwendet sie zunächst base-R-Befehle zur Graphikerstellung.
7.1.1 Säulendigramm mit base-R-Befehlen
Im ersten Schritt erstellt Emma das Säulendiagramm. Sie definiert wie auch schon oben, zuerst wieder mit attach den Datensatz, mit dem sie in den nächsten Schritten arbeiten möchte. Der Befehl barplot wird dann dafür genutzt, um ein Balkendiagramm zu erstellen. Sie muss dann aber im Code zusätzlich noch angeben, auf welcher statistischen Grundlage das Balkendiagramm erstellt werden soll. Dazu gibt sie table (pa02a) für eine einfache Häufigkeitsauszählung an. Das Ergebnis der Häufigkeitsauszählung wird in absoluten Zahlen dargestellt.
#Säulendiagramm mit base-R-Befehlen
attach (ALLBUS_21_young)
barplot (table (pa02a)) #Säulendiagramm fuer Interesse an Politik (absolute Zahlen)
Da sich Emma auch für die prozentualen Anteile interessiert, wandelt sie ihren Code im nächsten Schritt leicht ab. Sie nutzt jetzt nicht mehr table, sondern 100*prop.table um das Säulendiagramm in relativen Zahlen (Prozentwerte) angezeigt zu bekommen.
barplot (100*prop.table (table(pa02a))) #Säulendiagramm fuer Interesse an Politik (relative Zahlen)
Damit hat sie ein einfaches Diagramm erstellt, das ihr einen ersten groben Überblick gibt, aber immer noch schwer zu lesen ist, wenn man die Variablenausprägungen nicht kennt. Damit die Diagramme informativer aussehen, möchte Emma diese individuell anpassen und beschriften. Dazu nutzt sie unterschiedliche Optionen in ihrem Befehl:
names=c() - Beschriftung der einzelnen Elemente der X-Achse
ylim=c() - Festlegung des Wertebereich auf der Y-Achse
cex.names () - Anpassung der Schriftgröße
main= - Festlegung eines Diagrammtitels
xlab= - Beschriftung der X-Achse
ylab= - Beschriftung der Y-Achse
col=c() - Festlegung der Farbe(n) für die Balken
grid(col=c()) - Gitternetz des Diagramms
# Säulendiagramm mit base-R-Befehlen & Beschriftungen:
barplot (100*prop.table (table(pa02a)),
names=c("sehr stark", "stark", "mittel", "wenig", "überhaupt nicht"), #Beschriftung für x-Achse
ylim=c(0,50), #Wertebereich der y-Achse
cex.names=0.9, #Schriftgröße für Beschriftung
main= "Wie stark interessieren Sie sich\n für Politik? (N=386)", #Diagrammtitel
xlab="Antwortkategorien", #X-Achsen-Titel
ylab="Prozent", #Y-Achsen-Titel
col=c("cornflowerblue")) #Farbe der Balken
grid (col=c("darkgrey")) #Gitternetz für Diagramm
7.1.2 Darstellung als Balkendiagramm
Emma ist immer noch nicht richtig zufrieden mit der Darstellung und versucht es deshalb im nächsten Schritt mit einem Balkendiagramm. Der grundlegende Code für das Balkendiagramm ist zunächst identisch zu dem für die Säulendiagramme. Es kommt lediglich eine Drehung des Diagramms um 90° hinzu. Dazu wird die Bedingung horiz=TRUE hinzugefügt. Um auch die Beschriftung der Achse anzupassen, verwendet sie die zusätzliche Bedingungen las=1.
#Balkendiagramm mit base-R-Befehlen
barplot (100*prop.table (table(pa02a)),
horiz=TRUE, #Drehung des Diagramms um 90 Grad
names=c("sehr\nstark", "stark", "mittel", "wenig", "über-\nhaupt\n nicht"), #Beschriftung für y-Achse
xlim=c(0,50), #Wertebereich der x-Achse
cex.names=0.9, #Schriftgröße für Beschriftung
main= "Wie stark interessieren Sie sich\n für Politik? (N=386)", #Diagrammtitel
xlab="Prozent", #Y-Achsen-Titel
las =1,
col=c("cornflowerblue")) #Farbe der Balken
grid (col=c("darkgrey")) #Gitternetz für Diagramm
7.1.3 Darstellung als Kreisdiagramm
Als weitere Alternative für die Darstellung möchte Emma sich noch ein Kreisdiagramm ansehen, um dann entscheiden zu können, was für sie die beste Darstellung ist. Dazu ist wieder ein bisschen Vorarbeit nötig: Zuerst werden zwei Objekte für die Antwortkategorien und die Prozentwerte angelegt. Im ersten Schritt wird das Objekt “prozent” erzeugt. Hier werden die Antworten der Variablen pa02a (politisches Interesse) als Prozentwerte gespeichert. Der vorangestellte round-Befehl rundet die Prozentwerte auf eine Nachkommastelle (,1). Im zweiten Schritt wird dann das Objekt “antworten” erstellt. Die Antwortmöglichkeiten werden dabei einzeln aufgeführt und als eigenes Objekt gespeichert. Danach werden diese beide Objekte, welche Emma für die Beschriftung braucht, mit dem paste-Befehl zusammengeführt.
Nachdem die Vorarbeit geschafft ist, beginnt Emma mit der Erstellung des Kreisdiagramms. Dazu nutzt sie den pie-Befehl. Für eine ansprechende Gestaltung fügt sie wieder einige Bedingungen hinzu:
labels= - ermöglicht ihr die Beschriftung des Diagramms. Emma kann dafür jetzt das eben erstellte Objekt “Beschriftung” nutzen.
main= - Diagrammtitel
col=c() - Farben der Kreissektoren
#Kreisdiagramm mit base-R-Befehlen
prozent <- round((prop.table (table(pa02a))*100),1) #Abspeichern der Prozentwert als separates Objekt
antworten <- c("sehr stark", "stark", "mittel", "wenig", "überhaupt nicht") #Antwortoptionen als separates Objekt
beschriftung <- paste(antworten, prozent, "%", sep=" ") #Zusammenführung beider Objekte
pie(table(pa02a), #Kreisdiagramm
labels = beschriftung, #Beschriftung basiert auf dem zusammengeführten Objekt "beschriftung"
main = "Wie stark interessieren Sie sich\n für Politik? (N=386)", #Diagrammtitel
col = c("red", "orange", "yellow", "blue", "black")) #Farbe der Kreissektoren
7.2 Visualisierung mit dem ggplot2-package
Emma hat von ihrer Dozentin den Tipp bekommen, für Visualisierungen das im tidyverse-Paket enthaltene Paket “ggplot2” zu nutzen, weil dieses eine noch bessere Individualisierung der Graphiken ermöglicht.
7.2.1 Säulendiagramm mit absoluten Werten
Emma arbeitet jetzt mit ggplot2. Auch hier wählt sie zuerst den Datensatz auf den sie zugreifen möchte, aus. Im zweiten Schritt filtert sie mit dem Befehl filter(!is.na(pa02a)) die fehlenden Werte der Variable “Politisches Interesse” aus dem Datensatz heraus. Sie fügt dann über die weiteren Bedingungen ein, wie das Diagramm aussehen soll.
ggplot(aes(x = sjlabelled::as_label(pa02a))) - ist die Grundlage für das Diagramm. Die ausgewählte Variable wird als Plot dargestellt. Es werden die gespeicherten Wertelabels verwendet.
geom_bar(width=0.5, fill=“Cornflowerblue”) - gibt die Form des Diagramms an. In diesem Fall ein Säulendiagramm (geom_bar), mit einer Balkenbreite von 0.5 (width=0.5) und der Füllfarbe “cornflowerblue” (fill=“cornflowerblue).
labs () - gibt die Möglichkeit verschiedene Beschriftungen am Diagramm vorzunehmen. Emma nutzt die Beschriftung für die X-Achse, Y-Achse, gibt dem Diagramm einen Titel sowie Untertitel und fügt noch die Quelle des Datensatzes hinzu.
#Säulendiagramm mit absoluten Werten
ALLBUS_21_young%>% #Zugriff auf Datensatz
filter(!is.na(pa02a)) %>% #Herausfiltern der fehlenden Werte
ggplot(aes(x = sjlabelled::as_label(pa02a))) + #Plot der Variable "pa02", dabei werden die abgespeicherten Wertelabels genutzt
geom_bar(width=0.5, fill="Cornflowerblue")+ #als Säulendiagramm
labs (x= "Antwortkategorien", #Beschriftung X-Achse
y= "Anzahl", #Beschriftung Y-Achse
title="Wie stark interessieren Sie sich für Politik? (N=386)", #Diagrammtitel
subtitle = "ALLBUS 2021", #Untertitel
caption = "Quelle: ALLBUS 2021, https://doi.org/10.4232/1.14002") #Quelle
7.2.2 Säulendiagramm mit Prozentwerten
Auch hier greift Emma zuerst wieder auf den Datensatz zu und filtert die fehlenden Werte heraus. Dann berechnet Emma die prozentuierten Werte. Dazu nutzt sie:
count (pa02a = sjlabelled::as_label(pa02a)) - zählt die Häufigkeit der gewählten Variable aus.
mutate (pct =prop.table (n)) - berechnet die prozentualen Anteile zur vorherigen Auszählung.
geom_bar (stat =“identity”, width=0.5, fill=“cornflowerblue”) - wird dann wieder genutzt um, das Säulendiagramm zu erstellen und gestalten.
geom_text(vjust = -1.5, size = 3.8) - wird genutzt, um die %-Werte oberhalb der Säulen anzuzeigen.
scale_y_continuous(labels=scales::percent_format(), limits = c(0, 0.6)) - wird genutzt, um die Beschriftung der y-Achse anzupassen. Die y-Werte werden mit %-Zeichen ausgegeben und haben einen Wertebereich (limits) von 0 (=0%) bis 0.6 (=60%).
Der Skriptteil “scales::” ist eine Besonderheit. Hier wird nur für diese eine Befehlszeile das scale-package verwendet. Mit den beiden Doppelpunkten wird eine derartige Verwendung von Paketen im R-Script angezeigt.
Die weiteren Beschriftungen hat Emma wie bei den Diagrammen mit absoluten Werten vorgenommen.
#Säulendiagramm mit prozentualen Werten
ALLBUS_21_young %>% #Zugriff auf Datensatz
filter(!is.na(pa02a)) %>% #Herausfiltern der fehlenden Werte
count (pa02a = sjlabelled::as_label(pa02a)) %>% #Absolute Häufigkeiten der Variable pa02a
mutate (pct =prop.table (n)) %>% #Berechnung der prozentualen Häufigkeiten
ggplot(aes(x = pa02a, y = pct, label = scales::percent(pct))) + #Plot der Variable pa02a und ihrer prozentualen Häufigkeiten
geom_bar (stat ="identity", width=0.5, fill="cornflowerblue")+ #Säulendiagramm der erzeugten Berechnungen
geom_text(vjust = -1.5,
size = 3.8)+ #Hinzufügen der Prozentwerte oberhalb der Säulen
scale_y_continuous(labels=scales::percent_format(), limits = c(0, 0.6))+
labs (x= "Antwortkategorien", #Beschriftung X-Achse
y= "Prozentualer Anteil", #Beschriftung Y-Achse
title="Wie stark interessieren Sie sich für Politik? (N=386)", #Diagrammtitel
subtitle = "ALLBUS 2021", #Untertitel
caption = "Quelle: ALLBUS 2021, https://doi.org/10.4232/1.14002") #Quelle
Nachdem Emma sich das politische Interesse der sie interessierenden Altersgruppe im Säulendiagramm angeschaut hat, erstellt sie ein weiteres Diagramm zur Parteienpräferenz (Frage: “Was würden Sie wählen, wenn am nächsten Sonntag Bundestagswahl wäre?”).
Dabei geht sie grundsätzlich ähnlich wie auch beim vorherigen Diagramm vor. Sie möchte allerdings die Balken in unterschiedlichen Farben einfärben und orientiert sich dabei an den typischen Farben mit denen die Parteien dargestellt werden. Deshalb gibt sie folgende Bedingung mit ein:
geom_bar (stat =“identity”, width=0.5, fill= c(“black”, “red”, “yellow”, “green”, “purple”, “cornflowerblue”, “slategrey”, “darkgrey”))
Außerdem möchte Emma die Koordinatenachsen tauschen. Die Prozentwerte sollen auf der X-Achse abzulesen sein. Dazu verwendet sie die Bedingung:
coord_flip()
#Säulendiagramm mit prozentualen Werten
ALLBUS_21_young %>%
filter(!is.na(pv01)) %>% #Herausfiltern der fehlenden Werte
count (pv01 = sjlabelled::as_label(pv01)) %>% #Absolute Häufigkeiten der Variable pv01
mutate (pct =round(prop.table (n),3)) %>% #Berechnung der prozentualen Häufigkeiten
ggplot(aes(x = pv01, y = pct, label = scales::percent(pct))) + #Plot der Variable pv01 und ihrer prozentualen Häufigkeiten, Prozentwerte werden als Label für die Y-Achse übernommen
geom_bar (stat ="identity", width=0.5, fill= c("black", "red", "yellow", "green", "purple", "cornflowerblue", "slategrey", "darkgrey"))+ #Säulendiagramm der erzeugten Berechnungen
geom_text(hjust = -0.5,
size = 3.0)+ #Hinzufügen der Prozentwerte rechts der Säulen
scale_y_continuous(labels=scales::percent_format(), limits = c(0, 0.5))+
labs (x= "Antwortkategorien", #Beschriftung X-Achse
y= "Prozentualer Anteil", #Beschriftung Y-Achse
title="Wahlabsicht Bundestagswahl? (N=285)", #Diagrammtitel
subtitle = "ALLBUS 2021", #Untertitel
caption = "Quelle: ALLBUS 2021, https://doi.org/10.4232/1.14002")+#Quelle
coord_flip()
7.2.3 Gruppierte Diagramme
Nach dem Gespräch mit der Dozentin versucht sich Emma an einer Visualisierung der Unterschiede zwischen den Altersgruppen. Dazu erstellt Sie mit ihrem Datensatz “ALLBUS_21_Analyse” ein gruppiertes Säulendiagramm für das politische Interesse der beiden erzeugten Altersgruppen.
Sie greift wieder zuerst auf den Datensatz zu und filtert die fehlenden Werte heraus. Bevor sie weitermachen kann, muss sie nun die Gruppierung festlegen. Dazu nutzt sie die Bedingung:
group_by(age_group) - damit wird das Diagramm anhand der Variable “age_group” gruppiert, d.h. je nach Altersgruppe verschiedene Säulen erzeugt. Im Datensatz gibt es die beiden Gruppen “18-25jährige” und “älter als 25 Jahre”.
Dann fährt Emma wie auch schon beim vorherigen Diagramm mit der Prozentuierung fort und gibt die Bedingungen für die Darstellung ein. Dabei wird die Variable pa02a auf der X-Achse dargestellt und die berechneten %-Werte für die Y-Achse übernommen. Es wird das Säulendiagramm erzeugt und beschriftet. Als neue Beschriftung fügt Emma jetzt außerdem eine Legende hinzu, welche auch wieder individuell gestaltet wird:
scale_fill_manual (name=‘Altersgruppen’, labels=c(‘18 - 25ährige’,‘älter als 25 Jahre’), values=c(“#0072B2”, “#D55E00”))
Die Legende bekommt die Bezeichnung “Altersgruppe”. Sie wird aufgeteilt in die beiden Gruppen “18-25jährige” und “älter als 25 Jahre. Es werden dann noch die Farben für die jeweiligen Balken im Diagramm angegeben. Die weitere Beschriftung orientiert sich an den Beschriftungen der vorherigen Diagramme.
ALLBUS_21_Analyse %>% #Zugriff auf Datensatz
filter(!is.na(pa02a), !is.na(age_group)) %>% #Herausfiltern der fehlenden Werte
group_by(age_group) %>% #Gruppierung der Daten nach Variable age_group
count (pa02a = sjlabelled::as_label(pa02a)) %>% #Absolute Häufigkeiten der Variable pa02a
mutate (pct =round (prop.table (n),3)) %>% #Berechnung der prozentualen Häufigkeiten
ggplot(aes(x = pa02a, y = pct, label = scales::percent(pct), fill=age_group)) + #Plot der Variable pa02a und ihrer prozentualen Häufigkeiten, , Prozentwerte werden als Label für die Y-Achse übernommen
geom_bar (position=position_dodge(),stat ="identity", width=0.9)+ #Säulendiagramm der erzeugten Berechnungen
scale_y_continuous(labels=scales::percent_format(), limits = c(0, 0.6))+
scale_fill_manual (name='Altersgruppen',
labels=c('18 - 25ährige','älter als 25 Jahre'),
values=c("#0072B2", "#D55E00"))+#Manuelle Gestaltung der Legende
geom_text(position=position_dodge(.9), vjust = -1.5, size = 2.5)+ #Anzeige der Prozentwerte über den Säulen
labs (x= "Antwortkategorien", #Beschriftung X-Achse
y= "Prozentualer Anteil", #Beschriftung Y-Achse
title="Wie stark interessieren Sie sich für Politik? (N=386)", #Diagrammtitel
subtitle = "ALLBUS 2021 - nach Altersgruppen", #Untertitel
caption = "Quelle: ALLBUS 2021, https://doi.org/10.4232/1.14002") #Quelle
Einen ähnlichen Vergleich nimmt Sie bei der Parteienpräferenz (wenn am nächsten Sonntag Bundestagswahl wäre) vor. Hier stellt sie die entsprechenden Diagramme für die beiden Altersgruppen nebeneinander dar.
Dazu kann Emma ihren bereits vorhandenen Code nutzen und muss diesen nur etwas anpassen. Sie greift auch hier wieder auf den Datensatz zu, filtert die fehlende Werte heraus, gruppiert die Variable, prozentuiert die Werte und gibt an, wie das Diagramm dargestellt werden soll.
Um die beiden Altersgruppen nebeneinander darzustellen, verwendet sie folgende Bedingung: facet_wrap (~age_group)
Außerdem unterdrückt sie die Legende, da die Gruppierung in den beiden Diagrammen erklärt wird:
theme(legend.position=“none”)
library (tidyverse)
ALLBUS_21_Analyse %>% #Zugriff auf Datensatz
filter(!is.na(pv01), !is.na(age_group)) %>% #Herausfiltern der fehlenden Werte
group_by(age_group) %>% #Gruppierung der Daten nach Variable age_group
count (pv01 = sjlabelled::as_label(pv01)) %>% #Absolute Häufigkeiten der Variable pv01
mutate (pct = round (prop.table (n),3)) %>% #Berechnung der prozentualen Häufigkeiten
ggplot(aes(fill= age_group, x = pv01, y = pct, label = scales::percent(pct))) + #Plot der Variable pv01 und ihrer prozentualen Häufigkeiten
geom_bar (stat ="identity", width=0.5)+ #Säulendiagramm der erzeugten Berechnungen
facet_wrap (~age_group)+ # erzeugt nach Altersgruppen getrennte Diagramme
scale_fill_manual (values=c("#0072B2", "#D55E00"))+ #Festlegung der Säulenfarbe
theme(legend.position="none") +#Unterdrückung der Legende
geom_text(hjust = -0.4, size = 3.0)+ #Hinzufügen der Prozentwerte rechst neben den Säulen
scale_y_continuous(labels=scales::percent_format(), limits = c(0, 0.6))+
labs (x= "Antwortkategorien", #Beschriftung X-Achse
y= "Prozentualer Anteil", #Beschriftung Y-Achse
title="Wahlabsicht Bundestagswahl? (N=285)", #Diagrammtitel
subtitle = "ALLBUS 2021", #Untertitel
caption = "Quelle: ALLBUS 2021, https://doi.org/10.4232/1.14002")+#Quelle
coord_flip() #Drehung des Diagramms