3  Einen Überblick erhalten

Nachdem wir Datensätze importiert haben, wollen wir nun einen Überblick erhalten. Jede statistische Auswertung startet mit einer Beschreibung der Variablen. In dieser Session werden wir sehen, wie wir uns mit Tabellen einen Überblick über die Informationen in einem Datensatz verschaffen können. Wir werden auch in dieser Session mit dem ETB2018 arbeiten. Wir starten also mit dem Einlesen der Daten:

install.packages("haven") # falls nicht schon installiert 
library(haven) # datenimport für stata-datensätze
library(tidyverse) # tidyverse
pend <- read_dta("./orig/PENDDAT_cf_W13.dta")

3.1 Häufigkeitsauszählungen

Uns stehen verschiedene Befehle zur Verfügung, um eine Häufigkeitsauszählung zu erstellen:

  • table()
  • count() aus {dplyr}

Einfachster Befehl für die Auszählung von Häufigkeiten ist der table() Befehl. Beispielsweise mit der Variable statakt zur Ausbildung der Befragten.

table(pend$statakt)

 -10   -9   -5    1    2    3 
3765 3289  280 9470 6139 5481 

Wir bekommen hier die absoluten Häufigkeiten angezeigt. In der ersten Zeile werden die verschiedenen Ausprägungen aufgelistet, in der zweiten Zeile stehen dann die Häufigkeiten.

Allerdings werden sowohl für table() die Labels in der Ausgabe erstmal ignoriert. Mit as_factor() aus dem Paket {haven} können wir die Labels aus dem Datensatz abrufen und die numerischen Werte mit den Labels überschreiben. Der table() zeigt dann die Labels als Beschriftungen an:

table(as_factor(pend$statakt))

Item fuer Fragebogenversion nicht relevant 
                                      3765 
               Item in Welle nicht erhoben 
                                      3289 
   Generierung nicht mgl. (fehlende Werte) 
                                       280 
                             Erwerbstaetig 
                                      9470 
        Arbeitslos (Gemeldet und sonstige) 
                                      6139 
                                   Inaktiv 
                                      5481 

9470 Befragte sind erwerbstätig, 5481 Befragte sind inaktiv usw. (Zu labels und die Arbeit mit value labels in R später mehr)

Mit count() aus {dplyr} bekommen wir die labels direkt angezeigt, auch hier verwenden wir wieder die Schreibweise mit der Pipe %>%:

pend %>% count(statakt)
# A tibble: 6 × 2
  statakt                                              n
  <dbl+lbl>                                        <int>
1 -10 [Item fuer Fragebogenversion nicht relevant]  3765
2  -9 [Item in Welle nicht erhoben]                 3289
3  -5 [Generierung nicht mgl. (fehlende Werte)]      280
4   1 [Erwerbstaetig]                               9470
5   2 [Arbeitslos (Gemeldet und sonstige)]          6139
6   3 [Inaktiv]                                     5481

Wir können auch Tabellen unter einem frei wählbaren Namen ablegen und später wieder aufrufen:

t1 <- table(pend$statakt)
t2 <- pend %>% count(statakt)

Wir sehen hier, dass die Tabelle mit table() eine neue Objektform ist, ein table. Mit count() wird hingegen ein data.frame erstellt.

class(t1)
[1] "table"
class(t2)
[1] "tbl_df"     "tbl"        "data.frame"

3.2 Fehlende Werte in R: NA

Etwas störend sind aber die negativen Werte.

Um die Werte wie -5 auch in R als fehlende Angabe zu kennzeichnen, müssen wir sie in pend auf NA setzen. Dazu rufen wir pend$statakt auf und filtern mit [] nur die Werte für statakt gleich -1 heraus. Im vorherigen Kapitel haben wir kennengelernt, dass wir so spezifische Werte aufrufen können:

pend$statakt[pend$statakt == -5] # nur statakt = -5 aufrufen
<labelled<double>[280]>: Aktueller Hauptstatus, generiert (ab Welle 2)
  [1] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
 [26] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
 [51] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
 [76] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[101] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[126] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[151] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[176] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[201] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[226] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[251] -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5
[276] -5 -5 -5 -5 -5

Labels:
 value                                      label
   -10 Item fuer Fragebogenversion nicht relevant
    -9                Item in Welle nicht erhoben
    -5    Generierung nicht mgl. (fehlende Werte)
     1                              Erwerbstaetig
     2         Arbeitslos (Gemeldet und sonstige)
     3                                    Inaktiv

(Hier bekommen wir nochmal die Labels ausgespuckt, was etwas suboptimal für die Übersichtlichkeit ist.)

Wenn wir daran mit <- einen neuen Wert angeben, werden die aufgerufenen Werte damit überschrieben - hier überschreiben wir also alle Werte für statakt == -1 mit NA:

pend$statakt[pend$statakt == -5]  <- NA

NA ist in der R der Code für fehlende Angaben, sie werden dann in table() nicht aufgeführt:

table(pend$statakt)

 -10   -9    1    2    3 
3765 3289 9470 6139 5481 

Wir können aber mit der Option exclude = NULL die Auszählung von NA explizit anfordern:

table(pend$statakt,exclude = NULL)

 -10   -9    1    2    3 <NA> 
3765 3289 9470 6139 5481  280 

Allerdings haben wir ja jetzt noch nicht alle negativen Werte überschrieben, die -10 und -9 fehlen noch. Natürlich wäre es so etwas möglich, aber etwas umständlich:

pend$statakt[pend$statakt == -9 ]  <- NA
pend$statakt[pend$statakt == -10]  <- NA

Stattdessen können wir den %in%-Operator verwenden, den wir schon im Zusammenhang mit filter() kennengelernt hatten - alternativ klappt für die PASS-Daten auch < 0, weil alle Missing-Codes kleiner 0 sind:

pend$statakt[pend$statakt %in% c(-9,-10)]  <- NA
pend$statakt[pend$statakt < 0 ]  <- NA

Damit sind wir für statakt am Ziel:

table(pend$statakt)

   1    2    3 
9470 6139 5481 
table(pend$statakt,exclude = NULL)

   1    2    3 <NA> 
9470 6139 5481 7334 

In count() wird NA auch mit ausgezählt:

pend %>% count(statakt)
# A tibble: 4 × 2
  statakt                                     n
  <dbl+lbl>                               <int>
1  1 [Erwerbstaetig]                       9470
2  2 [Arbeitslos (Gemeldet und sonstige)]  6139
3  3 [Inaktiv]                             5481
4 NA                                       7334

Möchten wir das umgehen, nehmen wir wieder filter() zu Hilfe - mit is.na() können wir NA identifizieren. Durch Voranstellen von ! können wir damit anfordern, dass alle nicht-NA-Werte mit TRUE behalten werden:

pend %>% filter(!is.na(statakt)) %>% count(statakt)
# A tibble: 3 × 2
  statakt                                    n
  <dbl+lbl>                              <int>
1 1 [Erwerbstaetig]                       9470
2 2 [Arbeitslos (Gemeldet und sonstige)]  6139
3 3 [Inaktiv]                             5481

Mehr zu fehlenden Werten findet sich beispielsweise im The missing book von Nicholas Tierney & Allison Horst.

3.2.1 Übung

3.3 Andere Tabellenwerte

Mit Hilfe weiterer Funktionen können wir die Häufigkeitstabellen jeweils anpassen:

  • prop.table(): relative Werte/Anteile
table(pend$statakt) %>% prop.table(.) 

        1         2         3 
0.4490280 0.2910858 0.2598862 

29.109% aller Befragten sind arbeitslos.

  • cumsum(): kumulierte Werte
table(pend$statakt) %>% cumsum(.)
    1     2     3 
 9470 15609 21090 

15609 Befragte sind erwerbstätig oder sind arbeitslos.

  • prop.table() mit cumsum(): kumulierte relative Häufigkeiten
table(pend$statakt) %>% prop.table() %>% cumsum()
        1         2         3 
0.4490280 0.7401138 1.0000000 

74.011% aller Befragten sind erwerbstätig oder arbeitslos (und nicht inaktiv).

Aus Stata kennen viele sicherlich folgende Ansicht mit tab statakt:

   Aktueller Hauptstatus, generiert (ab |
                               Welle 2) |      Freq.     Percent        Cum.
----------------------------------------+-----------------------------------
                          Erwerbstaetig |      9,470       33.32       33.32
     Arbeitslos (Gemeldet und sonstige) |      6,139       21.60       54.91
                                Inaktiv |      5,481       19.28       74.20
                                      . |      7,334       25.80      100.00
----------------------------------------+-----------------------------------
                                  Total |     28,424      100.00

Standardmäßig ein table() oder count() immer nur eine Art von Kennzahlen. Da wir aber mit count() die Auszählungen als data.frame() erhalten, können wir die relativen und kumulierten Häufigkeiten einfach als neue Variablen anfügen.

Dazu verwenden wir dat1$var <- ...., das wir im vorherigen Kapitel kennen gelernt hatten. Um also eine neue Spalte pctin unseren data.frame mit den Auszählungen einzufügen gehen wir wie folgt vor: + Zuerst erstellen wir einen data.frame mit der Auszählung mit Hilfe von count()

tab_statakt <- pend %>% count(statakt) # ausgangsbefehl
tab_statakt
# A tibble: 4 × 2
  statakt                                     n
  <dbl+lbl>                               <int>
1  1 [Erwerbstaetig]                       9470
2  2 [Arbeitslos (Gemeldet und sonstige)]  6139
3  3 [Inaktiv]                             5481
4 NA                                       7334
  • Dann fügen wir eine neue Spalte für die relativen Häufigkeiten hinzu, welche mit prop.table() berechnet werden:
tab_statakt$pct <- prop.table(tab_statakt$n)
tab_statakt
# A tibble: 4 × 3
  statakt                                     n   pct
  <dbl+lbl>                               <int> <dbl>
1  1 [Erwerbstaetig]                       9470 0.333
2  2 [Arbeitslos (Gemeldet und sonstige)]  6139 0.216
3  3 [Inaktiv]                             5481 0.193
4 NA                                       7334 0.258

Wenn wir jetzt noch die kumulierten Häufigkeiten erstellen möchten, dann können wir cumsum() auf pct anwenden:

tab_statakt$Cum <- cumsum(tab_statakt$pct)

Etwas störend ist aber noch das NA, die für fehlende Angaben steht und nicht berücksichtigt werden soll. Das können wir einfach !is.na() in filter() ausschließen:

tab_statakt2 <- pend %>% filter(!is.na(statakt)) %>% count(statakt) 
tab_statakt2$pct <- prop.table(tab_statakt2$n)
tab_statakt2$Cum <- cumsum(tab_statakt2$pct)
tab_statakt2
# A tibble: 3 × 4
  statakt                                    n   pct   Cum
  <dbl+lbl>                              <int> <dbl> <dbl>
1 1 [Erwerbstaetig]                       9470 0.449 0.449
2 2 [Arbeitslos (Gemeldet und sonstige)]  6139 0.291 0.740
3 3 [Inaktiv]                             5481 0.260 1    

3.4 Kontingenztabellen

Aus Kontingenztabellen erfahren wir, wie häufig Merkmalskombinationen auftreten. Auch für Kontingenztabellen können wir table() verwenden. Zum Beispiel können wir uns eine Tabelle anzeigen lassen, die uns die Häufigkeiten des Erwerbsstatus getrennt nach Geschlechtern zeigt:

table(pend$zpsex, pend$statakt)
   
       1    2    3
  1 4685 3240 2047
  2 4785 2899 3434

Wir erkennen aus dieser Tabelle beispielsweise, dass 3434 Befragte weiblich (zpsex=2) und inaktiv (statakt = 3) sind.

Mit addmargins() können wir die Tabelle um die Summenwerte erweitern:

table(pend$zpsex, pend$statakt) %>% addmargins()
     
          1     2     3   Sum
  1    4685  3240  2047  9972
  2    4785  2899  3434 11118
  Sum  9470  6139  5481 21090

Möchten wir jetzt die relativen Häufigkeiten, dann wenden wir wieder prop.table() an:

table(pend$zpsex, pend$statakt) %>% prop.table()
   
             1          2          3
  1 0.22214320 0.15362731 0.09706022
  2 0.22688478 0.13745851 0.16282598

Für Zeilenprozente benötigen wir die zusätzliche Option margin = 1:

table(pend$zpsex, pend$statakt) %>% prop.table(margin = 1)
   
            1         2         3
  1 0.4698155 0.3249097 0.2052748
  2 0.4303832 0.2607483 0.3088685

30.89% der weiblichen Befragten (zpsex=2) sind inaktiv (statakt = 3).

Für Zeilenprozente dann margin = 2:

table(pend$zpsex, pend$statakt) %>% prop.table(margin = 2)
   
            1         2         3
  1 0.4947202 0.5277733 0.3734720
  2 0.5052798 0.4722267 0.6265280

62.65% der inaktiven Befragten (statakt = 3) sind weiblich (zpsex=2).

Übrigens funktioniert auch hier addmargins():

table(pend$zpsex, pend$statakt) %>% prop.table(margin = 2) %>% addmargins()
     
              1         2         3       Sum
  1   0.4947202 0.5277733 0.3734720 1.3959654
  2   0.5052798 0.4722267 0.6265280 1.6040346
  Sum 1.0000000 1.0000000 1.0000000 3.0000000

Für eine Kontingenztabelle mit count() geben wir einfach die Variablen in count() an. Das Ergebnis wird immer im “long shape” Format ausgegeben:

pend %>% count(zpsex,statakt)
# A tibble: 8 × 3
  zpsex         statakt                                     n
  <dbl+lbl>     <dbl+lbl>                               <int>
1 1 [Maennlich]  1 [Erwerbstaetig]                       4685
2 1 [Maennlich]  2 [Arbeitslos (Gemeldet und sonstige)]  3240
3 1 [Maennlich]  3 [Inaktiv]                             2047
4 1 [Maennlich] NA                                       3555
5 2 [Weiblich]   1 [Erwerbstaetig]                       4785
6 2 [Weiblich]   2 [Arbeitslos (Gemeldet und sonstige)]  2899
7 2 [Weiblich]   3 [Inaktiv]                             3434
8 2 [Weiblich]  NA                                       3779

Hier ist count() informativer als table(). Hier werden die Labels verwendet. Der Übersichtlichkeit halber verwende ich meistens count(), auch wenn das long shape Format etwas gewöhnungsbedürftig ist.

3.4.1 Übung

Bei langen Tabellen werden nicht alle Werte ausgegeben, sondern nur die ersten Zeilen. Um hier alle Werte zu bekommen, hilft print(n=Inf):

pend %>% count(palter) # wird abgeschnitten
# A tibble: 84 × 2
   palter                n
   <dbl+lbl>         <int>
 1 -2 [Keine Angabe]    60
 2 14                    1
 3 15                  271
 4 16                  308
 5 17                  276
 6 18                  282
 7 19                  266
 8 20                  296
 9 21                  282
10 22                  330
# … with 74 more rows
pend %>% count(palter) %>% print(n=Inf) # alle Werte werden gezeigt
# A tibble: 84 × 2
   palter                n
   <dbl+lbl>         <int>
 1 -2 [Keine Angabe]    60
 2 14                    1
 3 15                  271
 4 16                  308
 5 17                  276
 6 18                  282
 7 19                  266
 8 20                  296
 9 21                  282
10 22                  330
11 23                  338
12 24                  325
13 25                  371
14 26                  401
15 27                  438
16 28                  460
17 29                  449
18 30                  502
19 31                  495
20 32                  502
21 33                  515
22 34                  513
23 35                  511
24 36                  500
25 37                  474
26 38                  504
27 39                  484
28 40                  517
29 41                  521
30 42                  526
31 43                  536
32 44                  540
33 45                  552
34 46                  610
35 47                  604
36 48                  600
37 49                  585
38 50                  601
39 51                  621
40 52                  597
41 53                  598
42 54                  615
43 55                  575
44 56                  566
45 57                  561
46 58                  618
47 59                  589
48 60                  568
49 61                  512
50 62                  507
51 63                  534
52 64                  469
53 65                  438
54 66                  424
55 67                  376
56 68                  326
57 69                  316
58 70                  291
59 71                  259
60 72                  239
61 73                  212
62 74                  188
63 75                  177
64 76                  134
65 77                  126
66 78                  119
67 79                   96
68 80                   74
69 81                   62
70 82                   54
71 83                   48
72 84                   40
73 85                   26
74 86                   27
75 87                   23
76 88                   15
77 89                   11
78 90                   12
79 91                   11
80 92                    9
81 93                    7
82 94                    4
83 95                    2
84 97                    2

3.5 Lage- & Konzentrationsmaße

Lagemaße sind statische Kennzahlen zur Beschreibung von metrischen Variablen, wie beispielsweise das arithmetische Mittel oder der Median. Einen Überblick bietet summary():

summary(pend$netges)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
    -5.0     -3.0     -3.0    567.9    990.0 111419.0 

Allerdings gibt es im Datensatz natürlich keine Befragten mit einem Bruttoverdienst von -5.0 EUR. Werte kleiner Null sind Zahlencodes für keine Angabe:

name value
Item fuer Fragebogenversion nicht relevant -10
Item in Welle nicht erhoben -9
Generierung nicht mgl. (fehlende Werte) -5
Trifft nicht zu (Filter) -3

Um aussagekräftige Werte zu bekommen, müssen wir diese Werte mit NA überschreiben:

pend$netges[pend$netges < 0 ] <- NA # missings überschreiben
summary(pend$netges)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
      0     880    1320    1562    1890  111419   18056 

Wir können aber auch bestimmte Kennzahlen anfordern sehen uns die Bruttoverdienste der Befragten zu beschreiben:

  • Minimum und Maximum: min(), max()
  • arithm. Mittel: mean()
  • Median: median()
  • Quantile: quantile()
  • Varianz: var()
  • Standardabweichung: sd()
  • Gini-Koeffizient: Gini aus dem Paket {ineq}

Wenn eine Variable NA enthält, müssen diese explizit ignoriert werden - ansonsten wird nur NA ausgegeben:

mean(pend$netges)
[1] NA

Deshalb müssen wir die Option na.rm = T angeben:

mean(pend$netges,na.rm = T)
[1] 1562.3

Ein Quantil einer Verteilung trennt die Daten so in zwei Teile, dass x% der Daten darunter und 100-x% darüber liegen. Mit quantile()wir durch Angabe in der Option probs = beliebige Quantilgrenzen anfordern, zB. für die 40%-Quantilgrenze:

quantile(pend$netges,probs = .4, na.rm = T)
 40% 
1125 

Den Gini-Koeffizienten können wir mit Gini() aus dem Paket ineq berechnen:

install.packages("ineq") # einmal installieren
library(ineq) # ineq laden
Gini(pend$netges)
[1] 0.3560557

3.5.1 Kennzahlentabelle mit summarise

Mit Hilfe von summarise() aus {dplyr} können wir ein eigenes summary() bauen:

pend %>% summarise(Minimum = min(netges,na.rm = T),
                    Median = median(netges,na.rm = T),
                    Mittelwert = mean(netges,na.rm = T),
                    Maximum = max(netges,na.rm = T),
                    Gini = Gini(netges))
# A tibble: 1 × 5
  Minimum   Median Mittelwert Maximum    Gini
  <dbl+lbl>  <dbl>      <dbl> <dbl+lbl> <dbl>
1 0           1320      1562. 111419    0.356

Der Vorteil des Ganzen wird im nächsten Schritt klarer.

3.5.2 Lage- und Streuungsmaße vergleichen

Häufig werden diese Kennzahlen erst im Vergleich richtig spannend.
Dafür hilft uns das Argument .by = in summarise():

pend %>% summarise(Minimum = min(netges,na.rm = T),
                    Median = median(netges,na.rm = T),
                    Mittelwert = mean(netges,na.rm = T),
                    Maximum = max(netges,na.rm = T),
                    Gini = Gini(netges),
                   .by = welle)
# A tibble: 13 × 6
   welle                    Minimum   Median Mittelwert Maximum    Gini
   <dbl+lbl>                <dbl+lbl>  <dbl>      <dbl> <dbl+lbl> <dbl>
 1  1 [Welle 1 (2006/2007)] 1          1200       1525. 111419    0.416
 2  3 [Welle 3 (2008/2009)] 0          1298.      1498.  12000    0.349
 3  2 [Welle 2 (2007/2008)] 0          1320       1529.   7200    0.333
 4  4 [Welle 4 (2010)]      0          1210       1447.  10800    0.334
 5  5 [Welle 5 (2011)]      0          1250       1494.  33363    0.367
 6  6 [Welle 6 (2012)]      0          1215       1459.  15950    0.348
 7  7 [Welle 7 (2013)]      0          1250       1539.  87835    0.382
 8  8 [Welle 8 (2014)]      0          1255       1456.   9000    0.322
 9 10 [Welle 10 (2016)]     0          1375       1541.   6300    0.317
10 11 [Welle 11 (2017)]     0          1500       1748.  44440    0.340
11 12 [Welle 12 (2018)]     0          1500       1667.   7150    0.312
12 13 [Welle 13 (2019)]     0          1550       1816.  88453    0.358
13  9 [Welle 9 (2015)]      0          1280       1613. 110451    0.387

Hier stört aber die Sortierung der Welle (R übernimmt die Sortierung aus den Daten). Also hängen wir ein arrange() an, um die Sortierung nach welle anzufordern:

pend %>% summarise(Minimum = min(netges,na.rm = T),
                    Median = median(netges,na.rm = T),
                    Mittelwert = mean(netges,na.rm = T),
                    Maximum = max(netges,na.rm = T),
                    Gini = Gini(netges),
                   .by = welle) %>% 
  arrange(welle)
# A tibble: 13 × 6
   welle                    Minimum   Median Mittelwert Maximum    Gini
   <dbl+lbl>                <dbl+lbl>  <dbl>      <dbl> <dbl+lbl> <dbl>
 1  1 [Welle 1 (2006/2007)] 1          1200       1525. 111419    0.416
 2  2 [Welle 2 (2007/2008)] 0          1320       1529.   7200    0.333
 3  3 [Welle 3 (2008/2009)] 0          1298.      1498.  12000    0.349
 4  4 [Welle 4 (2010)]      0          1210       1447.  10800    0.334
 5  5 [Welle 5 (2011)]      0          1250       1494.  33363    0.367
 6  6 [Welle 6 (2012)]      0          1215       1459.  15950    0.348
 7  7 [Welle 7 (2013)]      0          1250       1539.  87835    0.382
 8  8 [Welle 8 (2014)]      0          1255       1456.   9000    0.322
 9  9 [Welle 9 (2015)]      0          1280       1613. 110451    0.387
10 10 [Welle 10 (2016)]     0          1375       1541.   6300    0.317
11 11 [Welle 11 (2017)]     0          1500       1748.  44440    0.340
12 12 [Welle 12 (2018)]     0          1500       1667.   7150    0.312
13 13 [Welle 13 (2019)]     0          1550       1816.  88453    0.358

Was aber wenn wir nur Welle 1 und 10 vergleichen wollen? Wir schalten einen filter() vor:

pend %>% 
  filter(welle %in% c(1,10)) %>% 
  summarise(Minimum = min(netges,na.rm = T),
                    Median = median(netges,na.rm = T),
                    Mittelwert = mean(netges,na.rm = T),
                    Maximum = max(netges,na.rm = T),
                    Gini = Gini(netges),
                   .by = welle)
# A tibble: 2 × 6
  welle                    Minimum   Median Mittelwert Maximum    Gini
  <dbl+lbl>                <dbl+lbl>  <dbl>      <dbl> <dbl+lbl> <dbl>
1  1 [Welle 1 (2006/2007)] 1           1200      1525. 111419    0.416
2 10 [Welle 10 (2016)]     0           1375      1541.   6300    0.317

3.5.3 Übung

3.6 Übungen

Alle Übungen beziehen sich auf das PASS CampusFile:

library(haven)
pend <- read_dta("./orig/PENDDAT_cf_W13.dta")

Zur Erinnerung: hier geht’s zur Übersicht der Einlesebefehle

3.6.1 Übung 1

Wir interessieren uns für die Variable famstand, welche den Familienstand der Befragten enthält:

famstand label
-8 Unplausibler Wert
-4 Frage irrtuemlich nicht gestellt
-3 Trifft nicht zu (Filter)
-2 Keine Antwort
1 Ledig
2 Verheiratet/eing. Lebensp., zus. lebd.
3 Verheiratet/eing. Lebensp., getr. lebd.
4 Geschieden
5 Verwitwet
  • Lassen Sie sich eine Tabelle mit den absoluten Häufigkeiten anzeigen, nutzen Sie dafür sowohl table() als auch count() (Denken Sie daran, {tidyverse} zu laden für count()).
  • Überschreiben Sie Missing-Codes mit NA.
  • Hat das Überschreiben der Missings mit NA geklappt? Erstellen Sie die Tabelle erneut.
  • Lassen Sie sich der relativen Häufigkeiten (Anteile) ausgeben. Verwenden Sie prop.table() auf Basis des table().
  • Erstellen Sie eine Kontingenztabelle, indem Sie neben famstand auch das Geschlecht zpsex (2 = Frauen, 1 = Männer) mit einbeziehen

Zurück nach oben

3.6.2 Übung 2

  • Erstellen Sie eine Kontingenztabelle für famstand und zpsex
  • Wie viel Prozent der Befragten sind geschiedene Frauen?
  • Wie viel Prozent der befragten Frauen sind geschieden? Nutzen Sie die margin =-Option
  • Wie viel Prozent der befragten Geschiedenen sind Frauen? Nutzen Sie die margin =-Option

Zurück nach oben

3.6.3 Übung 3

Beschreiben Sie das Alter der Befragten (palter) mit summary und erstellen Sie selbst einen Überblick mit Hilfe von summarise(), der einen Vergleich des Befragtenalters nach Familienstand erlaubt.

  • Überschreiben Sie zunächst die Missings mit NA:
pend$palter[pend$palter<0] <- NA
pend$famstand[pend$famstand<0] <- NA
  • Erstellen Sie einen Überblick mit summary()
  • Erstellen Sie einen Überblick mit dem Minimum, Median, arith. Mittel, Varianz und Maximum der Alterswerte mit Hilfe von summarise()
  • Erweitern Sie diesen Überblick dann so, dass sie einen Vergleich der Kennzahlen für die verschiedenen famstand-Kategorien ausgegeben bekommen.

Zurück nach oben

3.7 Hinweise

3.7.1 Runden mit round()

Erläuterung: Sie können mit round(x , 3) Werte auf eine gewisse Zahl von Ziffern runden. Die zweite Zahl in der Klammer (nach dem Komma) gibt an, wieviele Dezimalstellen wir möchten:

round(21.12121123,digits = 3)
[1] 21.121
round(21.12121123,digits = 5)
[1] 21.12121
round(21.12121123,digits = 0)
[1] 21

Wir können also die relativen Häufigkeiten runden und so die Tabelle von oben übersichtlicher machen:

xtabs(~zpsex+statakt, data = pend) %>% 
  prop.table(.,margin = 1) %>% 
  round(.,3)
     statakt
zpsex     1     2     3
    1 0.470 0.325 0.205
    2 0.430 0.261 0.309

3.7.2 Wie kann ich mir in R automatisch die häufigste/seltenste Ausprägung ausgeben lassen?

t4 <- table(pend$palter)
t4[which(t4 == max(t4))] # Modus
 51 
621 

51 ist mit 621 Befragten die häufigste Ausprägung.