install.packages("haven") # falls nicht schon installiert
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:
library(haven) # datenimport für stata-datensätze
library(tidyverse) # tidyverse
<- read_dta("./orig/PENDDAT_cf_W13.dta") pend
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 %>%
:
%>% count(statakt) pend
# 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:
<- table(pend$statakt)
t1 <- pend %>% count(statakt) t2
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:
$statakt[pend$statakt == -5] # nur statakt = -5 aufrufen pend
<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
:
$statakt[pend$statakt == -5] <- NA pend
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:
$statakt[pend$statakt == -9 ] <- NA
pend$statakt[pend$statakt == -10] <- NA pend
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:
$statakt[pend$statakt %in% c(-9,-10)] <- NA
pend$statakt[pend$statakt < 0 ] <- NA pend
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:
%>% count(statakt) pend
# 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:
%>% filter(!is.na(statakt)) %>% count(statakt) pend
# 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()
mitcumsum()
: 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 pct
in 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()
<- pend %>% count(statakt) # ausgangsbefehl
tab_statakt 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:
$pct <- prop.table(tab_statakt$n)
tab_statakt 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:
$Cum <- cumsum(tab_statakt$pct) tab_statakt
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:
<- pend %>% filter(!is.na(statakt)) %>% count(statakt)
tab_statakt2 $pct <- prop.table(tab_statakt2$n)
tab_statakt2$Cum <- cumsum(tab_statakt2$pct)
tab_statakt2 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:
%>% count(zpsex,statakt) pend
# 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
count()
nicht alle Zeilen aus
Bei langen Tabellen werden nicht alle Werte ausgegeben, sondern nur die ersten Zeilen. Um hier alle Werte zu bekommen, hilft print(n=Inf)
:
%>% count(palter) # wird abgeschnitten pend
# 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
%>% count(palter) %>% print(n=Inf) # alle Werte werden gezeigt pend
# 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:
$netges[pend$netges < 0 ] <- NA # missings überschreiben pend
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:
%>% summarise(Minimum = min(netges,na.rm = T),
pend 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()
:
%>% summarise(Minimum = min(netges,na.rm = T),
pend 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:
%>% summarise(Minimum = min(netges,na.rm = T),
pend 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)
<- read_dta("./orig/PENDDAT_cf_W13.dta") pend
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 auchcount()
(Denken Sie daran,{tidyverse}
zu laden fürcount()
). - Ü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 destable()
. - Erstellen Sie eine Kontingenztabelle, indem Sie neben
famstand
auch das Geschlechtzpsex
(2 = Frauen, 1 = Männer) mit einbeziehen
3.6.2 Übung 2
- Erstellen Sie eine Kontingenztabelle für
famstand
undzpsex
- 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
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
:
$palter[pend$palter<0] <- NA
pend$famstand[pend$famstand<0] <- NA pend
- 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.
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?
<- table(pend$palter)
t4 which(t4 == max(t4))] # Modus t4[
51
621
51 ist mit 621 Befragten die häufigste Ausprägung.