invisible header

Dies ist das Dokument mit Lösungen

Klicke hier, um die Musterlösungen auszublenden.

 

Zur Vorbereitung

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)

 

I. Univariate Statistik

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

 

II. Visualsierung von metrischen Variablen

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.

 

III. Visualisierung von kategorialen Variablen

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.

 

IV. p-Wert und Hypothesentest

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%. 

 

logo.knit

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”