invisible header
Lade die ESS-Daten der Welle 8 (2016) und setze deine working directory:
# Working directory setzen (z.B. "c:\daten" oder "~/daten")
setwd("mein_laufwerk/mein_datenverzeichnis")
# Daten einlesen
library(haven)
ess <- read_dta("ESS8e02_2.dta")
# oder
ess <- read_sav("ESS8e02_2.sav")
Erstelle ein neues Übungsskript:
# Statistik 1: R Tutorat
# Übungsskript zur univariaten Statistik
# Datum: 03.11.2023
# AutorIn: XXX
Installiere und aktiviere die für die univariate Datenanalyse relevanten Packages tidyverse, summarytools, stargazer und ggplot2:
#install.packages("tidyverse")
library(tidyverse)
#install.packages("summarytools")
library(summarytools)
#install.packages("stargazer")
library(stargazer)
#install.packages("ggplot2")
library(ggplot2)
1. Erstelle in einen Teildatensatz “ess_familie”, in den einige familiensoziologisch relevante Variablen einbezogen sind: hhmmb (Haushaltsgrösse), agea (Alter), gndr (Gender), rshpsts (Rechtlicher Status der bestehenden Partnerschaft) und wkhct (Arbeitsstunden pro Woche).
ess_familie <- select(ess, idno, hhmmb, agea, gndr, rshpsts, wkhct)
Mit dem select-Befehl aus tidyverse bzw. dplyr können wir die gewünschten Variablen auswählen, um daraus einen Teildatensatz zu erstellen.
2. Analysiere die Verteilung der Variable Geschlecht. Starte mit einer Inspektion der Variablen und erstelle anschliessend eine übersichtliche Häufigkeitsauszählung.
attributes(ess_familie$gndr)
## $label
## [1] "Gender"
##
## $format.stata
## [1] "%12.0g"
##
## $class
## [1] "haven_labelled" "vctrs_vctr" "double"
##
## $labels
## Male Female No answer
## 1 2 NA
freq(ess_familie$gndr)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------- --------- -------------- --------- --------------
## 1 21027 47.38 47.38 47.37 47.37
## 2 23351 52.62 100.00 52.61 99.98
## <NA> 9 0.02 100.00
## Total 44387 100.00 100.00 100.00 100.00
Die Variable Gender (gndr) hat zwei Ausprägungen,
männlich (1) und weiblich (2), sowie 9 als NA codierte
Missings. Obacht: Obgleich es sich hier um eine kategoriale Variable
handelt, ist sie, nicht typkonsistent, als ‘numeric’ (bzw. ‘double’)
klassifiziert. (check: is.numeric(ess_familie$gndr)
). Das
ist kein grosses Drama, die Darstellung und Analyse eines kategorialen
Merkmals wird jedoch meist durch Zuweisung des konsistenten Datentyps
“factor” erleichtert. Wir faktorisieren also die Variable.
ess_familie$gndr <- as_factor(ess_familie$gndr)
freq(ess_familie$gndr)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## --------------- ------- --------- -------------- --------- --------------
## Male 21027 47.37 47.37 47.37 47.37
## Female 23351 52.61 99.98 52.61 99.98
## No answer 9 0.02 100.00 0.02 100.00
## <NA> 0 0.00 100.00
## Total 44387 100.00 100.00 100.00 100.00
Die Darstellung ist nun zwar verbessert, allerdings wurde im Zuge der Faktorisierung das Label der NA-Kategorie - “No answer” - zu einer eigenständigen Kategorie - ein unschöner, relativ häufiger Kollateralschaden der Faktorisierung. Unschön unter anderem deswegen, weil nun die gültigen Prozente auch die fehlenden Werte inkludieren. Wir nehmen daher eine einfache Korrektur der Variable durch Rekodierung vor:
ess_familie$gndr[ess_familie$gndr == "No answer"] <- NA
freq(ess_familie$gndr)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## --------------- ------- --------- -------------- --------- --------------
## Male 21027 47.38 47.38 47.37 47.37
## Female 23351 52.62 100.00 52.61 99.98
## No answer 0 0.00 100.00 0.00 99.98
## <NA> 9 0.02 100.00
## Total 44387 100.00 100.00 100.00 100.00
Die überflüssige Zeile “No answer” stellt nunmehr nur noch ein kosmetisches Problem dar. Es lässt sich leicht beheben mit fct_drop - einem Befehl, mit dem wir Phantomkategorien aus Faktorvariablen leicht eliminieren (und so ein häufiges Problem mit faktorisieren Variablen lösen) können:
### fct_drop: eliminiert Phantomkategorienm
library(forcats)
freq(fct_drop(ess_familie$gndr))
Von 44387 Merkmalsträgern im Datensatz bezeichnen sich 47.37% als männlich, 52.62% als weiblich und 0.02% sind ohne gültige Angabe. Unter Ausschluss der fehlenden Werte beträgt der Anteil männlicher Merkmalsträger 47.38% und der der weiblichen 52.62%.
3. Inspiziere die Variable wkhct und bereinige sie gegebenenfalls. Stell anschliessend die Verteilung der Variable tabellarisch dar. Achte insbesondere auf (a) sinnvolle Kategoriebildung und Kategorienamen, sowie (b) eine sinnvolle Kategoriereihenfolge innerhalb der Tabelle.
attributes(ess_familie$wkhct)
## $label
## [1] "Total contracted hours per week in main job overtime excluded"
##
## $format.stata
## [1] "%14.0g"
##
## $class
## [1] "haven_labelled" "vctrs_vctr" "double"
##
## $labels
## Not applicable Refusal Don't know No answer
## NA NA NA NA
summary(ess_familie$wkhct)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 35.00 40.00 37.32 40.00 555.00 8331
Die Variable wkhct hat eine Spannweite von 0 bis 555
Stunden pro Woche, der Mean beträgt 37.32 Stunden, der Median 40. Die
Anzahl Missings beträgt 8331 - weil in dieser Variable Personen, die
nicht erwerbstätig sind, ausgefiltert wurden.
Eine Woche hat 168 Stunden, somit sind Werte über 168 nicht plausibel
(bzw. unmöglich). Wir rekodieren diese unplausiblen Werte zu
Missings.
ess_familie$wkhct[ess_familie$wkhct > 168] <- NA
summary(ess_familie$wkhct)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 35.00 40.00 37.29 40.00 168.00 8333
Die Zahl der Missings erhöht sich dadurch auf 8333 (+2), der Mean sinkt leicht auf 37.29 Stunden, das Maximum beträgt nun 168.
Eine tabellarische Aufbereitung diese metrischen Variable bedingt zwingen eine Zusammenfassung von Wertebereichen. Wir könnten dazu jeweils gleich grosse Klassen (z.B. 0-10; 11-20 etc.) bilden, oder die Zuweisung zu den Kategorien eines Konzeptes zur Messung des Arbeitszeitmodells. Wir entscheiden uns für die zweite Variante und legen übliche OECD-Definitonen unterschiedlicher Arbeistzeitmodelle an: Wir kategorisieren in “Teilzeit”, “vollzeitnahe Teilzeit” und “Vollzeit”.
ess_familie$azmod[ess_familie$wkhct >= 0 & ess_familie$wkhct < 30] <- "Teilzeit"
ess_familie$azmod[ess_familie$wkhct >=30 & ess_familie$wkhct < 37] <- "Vollzeitnah"
ess_familie$azmod[ess_familie$wkhct >= 37] <-"Vollzeit"
Nun können wir unsere neu erstellte, kategorisierte Variable azmod faktorisieren und die Reihenfolge unserer Kategorien festlegen. Dies tun wir über den factor-Befehl. Hinweis: Für die Faktorisierung von Variablen benutzen wir normalerweise “as_factor”. Da wir aber gleichzeitig die Reihenfolge der Kategorien festlegen wollen, verwenden wir hier “factor”.
ess_familie$azmod <- factor(ess_familie$azmod,
levels = c("Teilzeit", "Vollzeitnah", "Vollzeit"))
freq(ess_familie$azmod)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------- ------- --------- -------------- --------- --------------
## Teilzeit 5488 15.22 15.22 12.36 12.36
## Vollzeitnah 4618 12.81 28.03 10.40 22.77
## Vollzeit 25948 71.97 100.00 58.46 81.23
## <NA> 8333 18.77 100.00
## Total 44387 100.00 100.00 100.00 100.00
4. Inspiziere die Variable rshpsts und bereinige sie gegebenenfalls. Was misst die Variable? Stellt die Verteilung der Variable tabellarisch dar.
attributes(ess_familie$rshpsts)
## $label
## [1] "Relationship with husband/wife/partner currently living with"
##
## $format.stata
## [1] "%47.0g"
##
## $class
## [1] "haven_labelled" "vctrs_vctr" "double"
##
## $labels
## Legally married
## 1
## In a legally registered civil union
## 2
## Living with my partner - not legally recognised
## 3
## Living with my partner - legally recognised
## 4
## Legally separated
## 5
## Legally divorced/Civil union dissolved
## 6
## Not applicable
## NA
## Refusal
## NA
## Don't know
## NA
## No answer
## NA
summary(ess_familie$rshpsts)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.000 1.000 1.000 1.419 1.000 6.000 18501
dim (ess_familie)
## [1] 44387 7
Die Variable rshpsts misst den rechtlichen Status einer aktuell bestehenden eheähnlichen, kohabitierenden Gemeinschaft. Die Variable hat mit 18501 eine hohe Anzahl an Missings - für über 40% der insgesamt 44387 Merkmalsträger liegt keine gültige Messung vor. Dies liegt daran, dass die Frage ausschliesslich solchen Personen gestellt wurde, die angegeben haben, in einer kohabitierenden Partnerschaft zu leben. Alle anderen, Singles etc., wurden im Fragebogen um diese Frage herumgeführt (“ausgefiltert”) und sind daher in der Variable als “Missing” codiert.
Auch diese Variable ist genuin kategorial, wurde aber beim einlesen als numerisch klassifiziert. Wir nehmen daher eine Faktorisierung vor.
ess_familie$rshpsts <- as_factor(ess_familie$rshpsts)
freq(ess_familie$rshpsts)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------------------------------------------- ------- --------- -------------- --------- --------------
## Legally married 20909 47.106 47.106 47.106 47.106
## In a legally registered civil union 247 0.556 47.663 0.556 47.663
## Living with my partner - not legally recognised 3707 8.352 56.014 8.352 56.014
## Living with my partner - legally recognised 960 2.163 58.177 2.163 58.177
## Legally separated 8 0.018 58.195 0.018 58.195
## Legally divorced/Civil union dissolved 55 0.124 58.319 0.124 58.319
## Not applicable 18289 41.204 99.522 41.204 99.522
## Refusal 14 0.032 99.554 0.032 99.554
## Don't know 7 0.016 99.570 0.016 99.570
## No answer 191 0.430 100.000 0.430 100.000
## <NA> 0 0.000 100.000
## Total 44387 100.000 100.000 100.000 100.000
Durch die Faktorisierung über as_factor wurden nun die unterschiedlichen NAs in jeweils eigenständige Kategorien aufgespalten und mit konkreten Werten belegt. Wohl oder übel müssen wir die entsprechenden Missings nun wieder als NAs re-rekodieren…
ess_familie$rshpsts[ess_familie$rshpsts == "Refusal"] <- NA
ess_familie$rshpsts[ess_familie$rshpsts == "Don't know"] <- NA
ess_familie$rshpsts[ess_familie$rshpsts == "Not applicable"] <- NA
ess_familie$rshpsts[ess_familie$rshpsts == "No answer"] <- NA
freq (ess_familie$rshpsts)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------------------------------------------- ------- --------- -------------- --------- --------------
## Legally married 20909 80.773 80.773 47.106 47.106
## In a legally registered civil union 247 0.954 81.728 0.556 47.663
## Living with my partner - not legally recognised 3707 14.320 96.048 8.352 56.014
## Living with my partner - legally recognised 960 3.709 99.757 2.163 58.177
## Legally separated 8 0.031 99.788 0.018 58.195
## Legally divorced/Civil union dissolved 55 0.212 100.000 0.124 58.319
## Not applicable 0 0.000 100.000 0.000 58.319
## Refusal 0 0.000 100.000 0.000 58.319
## Don't know 0 0.000 100.000 0.000 58.319
## No answer 0 0.000 100.000 0.000 58.319
## <NA> 18501 41.681 100.000
## Total 44387 100.000 100.000 100.000 100.000
…und anschliessend die verbleibenden Phantomkategorien eliminieren
ess_familie$rshpsts<-fct_drop(ess_familie$rshpsts)
freq (ess_familie$rshpsts)
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------------------------------------------- ------- --------- -------------- --------- --------------
## Legally married 20909 80.773 80.773 47.106 47.106
## In a legally registered civil union 247 0.954 81.728 0.556 47.663
## Living with my partner - not legally recognised 3707 14.320 96.048 8.352 56.014
## Living with my partner - legally recognised 960 3.709 99.757 2.163 58.177
## Legally separated 8 0.031 99.788 0.018 58.195
## Legally divorced/Civil union dissolved 55 0.212 100.000 0.124 58.319
## <NA> 18501 41.681 100.000
## Total 44387 100.000 100.000 100.000 100.000
5. Erstelle eine Übersichtsstatistik mit allen metrischen Variablen des Teildatensatzes “ess_familie”. Berechne für alle metrischen Variablen das 95%-Konfidenzintervall.
# Erster Schritt: Alle metrischen Variablen selektieren
ess_familie_met<-select(ess_familie, hhmmb, agea, wkhct)
# Zweiter Schritt: Stichprobenstatistik generieren
library(stargazer)
stargazer(as.data.frame(ess_familie_met), median = TRUE, type = "text",
title = "Übersichtstabelle: European Social Survey 2016 (ausgewählte Variablen)", digits = 2)
##
## Übersichtstabelle: European Social Survey 2016 (ausgewählte Variablen)
## ==============================================
## Statistic N Mean St. Dev. Min Median Max
## ----------------------------------------------
## hhmmb 44,263 2.62 1.38 1 2 20
## agea 44,232 49.14 18.61 15 49 100
## wkhct 36,054 37.29 13.00 0 40 168
## ----------------------------------------------
# Dritter Schritt: 95%-KI manuell berechnen
ci_hhmmb <- t.test(ess_familie$hhmmb)
ci_hhmmb$conf.int
ci_agea <- t.test(ess_familie$agea)
ci_agea$conf.int
ci_wkhct <- t.test(ess_familie$wkhct)
ci_wkhct$conf.int
6. Erstellt für die Variable hhmmb (Haushaltsgrösse) ein Balkendiagram. Achtet insb. auf eine sinnvolle Taktung der Wertelabel auf der x-achse. So sollte z.B der inexistente Wert ‘0’ nicht auftauchen. Weshalb bietet sich für dieses Merkmal eher ein Balken- als Histogramm zur Visualisierung der Verteilung an - obgleich es metrisch ist? Welche Erkenntnisse ergeben sich aus der Visualisierung der Verteilung?
library(ggplot2)
plot_hhmmb <- ggplot(ess_familie, aes(x = (hhmmb))) +
geom_bar (fill = "lightblue")+
scale_x_continuous(breaks = seq(1, 20, 1)) +
labs(x = "Haushaltsgrösse", y = "Anzahl Befragte", title = "Haushaltsgrössen in Europa ",caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=44263)")
plot_hhmmb
Es handelt sich bei der Haushaltsgrösse zwar um eine metrische, allerdings gleichzeitig auch diskrete Variable mit wenigen Kategorien. In diesem Fall würde die histogramm-spezifische Andeutung kontinuierlicher Messwerte irritieren. Für diese Variable ist daher ein Balkendiagramm die bessere Lösung. Zusätzlich sinnvoll sind, wie so oft, prozentuale Angaben auf der y-Achse. Zudem ist es legitim, die Aussreisser (z.B. >8) aus Gründen der Übersichtlichkeit nicht mit in die Darstellung aufzunehmen (und darauf ggf. in der Caption zu verweisen):
plot_hhmmb + aes(y = after_stat(count / sum(count)))+
scale_y_continuous(labels = scales::percent)+ labs (y="Anteil") +
coord_cartesian (xlim=c(1,8))+
labs(caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=44263, nicht dargestellt sind Werte über 8)")
Das “coord_cartesian”-Argument, eine Art Zoomfunktion, sorgt dafür, dass die Berechnung der Prozente unter Berücksichtigung der gesamten Fälle (ausgenommen NAs) erfolgt - anders als z.B. bei der “xlim”-Funktion, welche die Berechnungsgrundlage auf abgebildete Fälle einschränkt (könnt ihr leicht überprüfen, wenn ihr den Ausschnitt noch weiter verkleinert). Das “scale_x_continous”-Argument sorgt für eine sinnvolle Achsenbelegung.
Eine relative Mehrheit von etwa 15’000 der Befragten im ESS-Datensatz, das sind etwa 35%, lebt in einem 2-Personen-Haushalt, gefolgt von 1-Personen-Haushalten, 3- und 4- Personen-Haushalten. In diesen 4 Haushaltstypen leben etwa 90% der Befragten. Eine kleine Gruppe verteilt sich absteigend auf die Kategorien der 5-, 6- und 7-Personen-Haushalte. Nur sehr wenige Befragte leben in noch grösseren Haushalten.
8. Erstellt für die Variable wkhct ein Histogramm. Beschriftet die Achsen, setzt einen Titel und ergänzt die Quelle und die Anzahl Fälle in der Caption. Wählt eine Farbe für die Füllung und den Rahmen der Säulen. Wählt eine für euch sinnvoll erscheinende Anzahl an Säulen. Welche Aussagen lassen sich bezüglich der Verteilung der Arbeitsstunden pro Woche der Befragungspersonen treffen?
plot_wkhct <- ggplot(ess_familie, aes(x = wkhct)) +
geom_histogram(fill = "lightblue", binwidth = 10, center=5) +
aes(y = after_stat(count / sum(count)))+
scale_y_continuous(labels = scales::percent) +
labs(x = "Anzahl Arbeitsstunden pro Woche", y = "Anteil", title = "Wochenarbeitsstunden in Europa", caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=36054)") +
coord_cartesian (xlim=c(0,80))+
scale_x_continuous(breaks = seq(0,168,10))
plot_wkhct
wkhct ist eine metrische und kontinuierliche Variable mit vielen Ausprägungen, ein Histogramm eignet sich daher für ihre Darstellung. Die Anzahl Säulen kann mit dem bins-Argument nach oben oder unten angepasst werden. Alternativen für bins sind binwidth, breaks = c() oder breaks = seq(). Mit dem Zusatz scale_x_continuous(breaks=seq(0,168,10)) werden die Abstände auf der x-Achse auf 10 gesetzt. Durch das Argument center = 5 wird die Mittelachse der ersten Säule auf 5 gesetzt und so verhindert, dass ein negativer, irrealer Wert (-5) den Startwert des Plots bildet. Dies hätte auch durch die Spezifikation breaks = seq(0,168,10) innerhalb des geom_histogram-Argumentes erzielt werden können. Mit coord_cartesian wurde der abgebildete Ausschnitt wiederum auf den gut deutbaren Bereich begrenzt. Da es beim Histogramm in erster Linie um die Entwicklung eines Gesamteindrucks zur Verteilungsform geht, könnte die Achsenbeschriftung der y-Achse im Prinzip auch weggelassen werden - einer Konvetion folgend übernehmen wir sie trotzdem.
Eine deutliche Mehrheit arbeitet durchschnittlich zwischen 30 und 40 Stunden pro Woche. Zumindest nicht-vollzeitnahe Teilzeitarbeit ist in Europa insgesamt eher ein Randphänomen.
9. Erstellt für die Variable agea einen Boxplot. Beschriftet die y-Achse und den Plot und setzt eine Caption. Wählt eine Farbe für die Füllung und den Rahmen. Was könnt ihr bezüglich der Verteilung des Alters aus dem Boxplot ablesen?
plot_agea <- ggplot(ess_familie, aes(x = "", y = agea)) +
geom_boxplot(colour = "red",fill="lightblue") +
labs(y = "Alter", x = "",
title = "Boxplot: Altersverteilung in Europa",
caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=44232)") +
scale_y_continuous(breaks = seq(15,100,5)) +
stat_summary(fun=mean, geom="point", shape=23, size=3, color="blue", fill="white")
plot_agea
Die Altersvariable ist ebenfalls metrisch. Ihre Verteilungsparameter können deshalb als Boxplot visualisiert werden. Mit dem aes()-Argument wird die y-Achse gewählt und somit spezifiziert, dass der Boxplot auf der vertikalen Achse ausgerichtet wird. Die y-Achse wird für den empirisch realisierten Bereich zwischen 15 und 100 Jahren abgebildet, die Abstände zwischen den angezeigten Werten betragen jeweils 5 Jahre. Alternativ hätte man ylim(15,100) schreiben können. Alle Markierungen auf der x-Achse werden durch **labs(x = ““) gelöscht, da sie für einen Boxplot irrelevant sind.
Die mittleren 50% des Altersrankings sind zwischen 34 (1. Quartil) und 64 (3.Quartil) Jahre alt. Der Kern der Altersverteilung, bzw. der Interquartilsrange, ist somit 30 Jahre breit. Die Person in der Mitte des Altersrankings ist 49 Jahre alt - ihre Abstände zum 1. und 3. Quartil sind folglich etwa gleich (Achtung: Dies ist nicht immer so - nur dann, wenn die Belegungen unter- und oberhalb des Medians sehr ähnlich sind). Das Minimum beträgt 15 Jahre, das Maximum liegt bei 100 Jahren. Keine Werte werden als Ausreisser angezeigt, das heisst, keine Werte über- oder unterschreiten den 1.5-fachen IQR.
10. Erstellt für rshpsts (Rechtlicher Status der Partnerschaft) einen Barplot. Beschriftet die Achsen, setzt einen Titel und ergänzt die Quelle und die Anzahl Fälle in der Caption. Wählt eine Farbe für die Füllung und den Rahmen der Säulen. Was können wir über den rechtlichen Beziehungsstatus für Partnerschaften im ESS aussagen?
# Sinnvoll vorab (falls noch nicht geschehen): Faktorisierung der Variablen
ess_familie$rshpsts<-as_factor(ess_familie$rshpsts)
# Eliminiere Missings
ess_familie_N<-filter(ess_familie, rshpsts != "NA")
# ...jetzt das Balkendiagramm
plot_rshpsts <- ggplot(ess_familie_N, aes(x = rshpsts)) +
geom_bar(colour = "red",fill = "lightblue") +
aes(y = after_stat(count / sum(count)))+
scale_y_continuous(labels = scales::percent) +
labs(x = "", y = "",title = "Rechtestatus kohabitierender Partnerschaften",caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=25886)") +
theme(axis.text.x = element_text(angle=90))
plot_rshpsts
Mit axis.text.x=element_text(angle=90) lassen sich die Beschriftungen auf der x-Achse um 90 Grad drehen, gleichwohl ist die Darstellung der Kategorienamen aufgrund deren Länge nach wie vor zu unübersichtlich. Durch Neubelegung der Kategoriennamen im Rahmen des Befehls sieht’s schon viel besser aus - und die Drehung der Kategorienbeschriftung braucht es nun auch nicht mehr:
plot_rshpsts <- ggplot(ess_familie_N, aes(x = rshpsts)) +
geom_bar(colour = "red",fill = "lightblue") +
aes(y = after_stat(count / sum(count)))+
scale_y_continuous(labels = scales::percent) +
scale_x_discrete(labels=c("Verheiratet", "Eingetragen", "Nicht anerkannt", "Anerkannt", "Getrennt", "Geschieden")) +
labs(x = "", y = "",title = "Rechtestatus kohabitierender Partnerschaften",caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=25886)") +
theme(axis.text.x = element_text(angle=0))
plot_rshpsts
… gerade bei längeren Kategorienamen kann manchmal auch ein Wechsel der Achsen sinnvoll sein, der sich ganz einfach über das zusätzliche Argument coord_flip() umsetzen lässt (hier ist das jetzt eigentlich nicht mehr nötig, daher nur zur Demonstration):
plot_rshpsts <- ggplot(ess_familie_N, aes(x = rshpsts)) +
geom_bar(colour = "red",fill = "lightblue") +
aes(y = after_stat(count / sum(count)))+
scale_y_continuous(labels = scales::percent) +
scale_x_discrete(labels=c("Verheiratet", "Eingetragen", "Nicht anerkannt", "Anerkannt", "Getrennt", "Geschieden")) +
labs(x = "", y = "",title = "Rechtestatus kohabitierender Partnerschaften",caption = "Quelle: ESS 2016 Round 8 (Gültige Fälle=25886)") +
theme(axis.text.x = element_text(angle=0)) +
coord_flip()
plot_rshpsts
Eine Mehrheit der Befragten im ESS, die in einer eheähnlichen, kohabitierenden Gemeinschaft leben, tun dies in einer Ehe. Diese 80% werden gefolgt von einer kleineren Gruppe von etwa 15%, die in einer rechtlich nicht anerkannten Partnerschaft und einer noch kleineren Gruppe von etwas unter 5% der Befragten, die in einer rechtlich anerkannten Partnerschaft leben.
Wir wollen wissen, wie viele Personen in der Schweiz im mittlerem Alterssegment und höherer akademischer Bildung (=Population) einem EU-Beitritt der Schweiz zustimmen würden.
12. Grenze zunächst den ESS auf alle Personen in der Schweiz (cntry==“CH”) mit höherer tertiärer Bildung (eisced==7) ein, die älter als 30 und jünger als 40 sind.
ess_ch<-filter(ess, cntry=="CH" & eisced==7 & agea>30 & agea<40)
13. Inspiziere die Variable vteubcmb, setzte andere Werte als “Zustimmung” oder “Ablehnung” auf “NA”
attributes (ess_ch$vteubcmb)
## $label
## [1] "Would vote for [country] to become member of European Union or remain outside"
##
## $format.stata
## [1] "%37.0g"
##
## $labels
## Become a member of the European Union Remain outside the European Union
## 1 2
## Would submit a blank ballot paper Would spoil the ballot paper
## 33 44
## Would not vote Not eligible to vote
## 55 65
## Refusal Don't know
## NA NA
## No answer
## NA
##
## $class
## [1] "haven_labelled" "vctrs_vctr" "double"
ess_ch$vteubcmb[ess_ch$vteubcmb > 2] <- NA
14. Wie viele SchweizerInnen mit höherer akademischer Bildung unterstützen einen EU-Beitritt der Schweiz?
freq (fct_drop(as_factor(ess_ch$vteubcmb)))
## Frequencies
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ------------------------------------------- ------ --------- -------------- --------- --------------
## Become a member of the European Union 9 25.71 25.71 21.43 21.43
## Remain outside the European Union 25 71.43 97.14 59.52 80.95
## Don't know 1 2.86 100.00 2.38 83.33
## <NA> 7 16.67 100.00
## Total 42 100.00 100.00 100.00 100.00
15. Ermittle zur Annahme, dass der Anteil an Befürwortenden und Oppositionierenden sich in der Population die Wage hält, den p-Wert. Interpretiere diesen und den entsprechenden Output in R.
prop.test(table(ess_ch$vteubcmb),p=0.5)
##
## 1-sample proportions test with continuity correction
##
## data: table(ess_ch$vteubcmb), null probability 0.5
## X-squared = 6.6176, df = 1, p-value = 0.0101
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1351002 0.4465129
## sample estimates:
## p
## 0.2647059
Die Wahrscheinlichkeit, dass unter der Annahme von Ausgewogenheit in der Population ein Verhältnis wie in der Stichprobe (bzw. eine Abweichung von mindestens 7 vom Erwartungswert Unterstützender, der bei 17,5 liegt) auftritt, liegt bei etwas über einem Prozent.
16. Binde den p-Wert in einen Test der Hypothese, dass sich die Anteile an Pro-/Contra-Stimmen in der Population unterscheiden, ein.
### Ha: Der Anteil an Pro/Contra Stimmen in der Population unterscheidet sich, Pr!=0.5
### H0: Der Anteil an Pro/Contra Stimmen in der Population unterscheidet sich nicht Pr=0.5
### Beobachtung: Verältniss von 74% zu 26% in der Stichprobe, p=0.0101
### Nullhypothese kann abgelehnt werden unter Verwendung eines Signifikanzuniveaus von 5%.
### Nullhypothese kann jedoch nicht abgelehnt werden unter Verwendung eines Signifikanzniveaus von 1%.
17. Binde den p-Wert in einen Test der Hypothese, dass der Anteil an Contra-Stimmen in der Population überwiegt, ein.
### Ha: Der Anteil an Contra Stimmen in der Population überwiegt (bzw.: Die Pro Stimmen in der Population sind in der Minderheit): Pr<0.5
### H0: Der Anteil an Contra Stimmen in der Population überwiegt nicht (bzw.: Die Pro Stimmen in der Population sind NICHT in der Minderheit): Pr>=0.5
### Beobachtung: Verältniss von 74% zu 26% zugunsten der Contra-Stimmen in der Stichprobe
### Forschungshhypothese ist einseitig formuliert, daher Halbierung des p-Wert p=0.0101/2=0,005, check:
prop.test(table(ess_ch$vteubcmb),p=0.5, alternative = "less")
##
## 1-sample proportions test with continuity correction
##
## data: table(ess_ch$vteubcmb), null probability 0.5
## X-squared = 6.6176, df = 1, p-value = 0.005049
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
## 0.0000000 0.4185739
## sample estimates:
## p
## 0.2647059
### Nullhypothese kann abgelehnt werden auch unter Verwendung eines strengen Signifikanzuniveaus von 1%.
Conforti, E., Siefart, F., De Min, N., Dürr, R., Moos, M., Senn, S., Strassmann-Rocha, D., Giesselmann, M. (2022): “R für das Soziologiestudium an der UZH”