flights_origin_freq <- table(flights$origin)
flights_origin_freq
EWR JFK LGA
120835 111279 104662
flights_origin_df <- as.data.frame(flights_origin_freq)
names(flights_origin_df) <- c("origin", "n")I keep saying the sexy job in the next ten years will be statisticians. People think I’m joking, but who would’ve guessed that computer engineers would’ve been the sexy job of the 1990s?
Hal Varian, Chief Economist bei Google
Viele der Kennzahlen für deskriptive statistischen Analysen haben wir schon in den vorangegangenen Kapitel an der ein oder anderen Stelle kennengelernt. Dieses Kapitel soll einen zusammenhängenden Überblick über die aus der Statistikvorlesung bekannten Maße geben. Ein wichtiger Teil der deskriptiven Statistik ist die Visualisierung von Häufigkeiten und Kennzahlen. In diesem Kapitel werden einige Darstellungsmöglichkeiten kurz gezeigt; die systematische und ausführliche Einführung in Visualisierungsprinzipien folgt in Kapitel Kapitel 5.
Der erste Schritt zur Beschreibung von Daten für ein besseres Verständnis ist typischerweise die Analyse von Häufigkeiten oder Häufigkeitsverteilungen.
Absolute Häufigkeiten – geeignet für nominal- und kardinal skalierte Merkmale – können wir mit Hilfe der table Funktion auszählen. So ergeben sich zum Beispiel die Anzahl der abgehenden Flüge je Flughafen in NYC in 2013 als
EWR JFK LGA
120835 111279 104662
Das Resultat dieser Berechnung ist ein Objekt vom Typ table
'table' int [1:3(1d)] 120835 111279 104662
- attr(*, "dimnames")=List of 1
..$ : chr [1:3] "EWR" "JFK" "LGA"
Ein table Objekt ist einfach ein Vektor oder eine Matrix.
Auch für metrische Merkmale kann der table Befehl verwendet werden, R berechnet ganz analog eine Häufigkeitstabelle. Bei metrischen Merkmalen mit sehr vielen verschiedenen Ausprägungen kann die Berechnung allerdings sehr lange dauern und die Ausgabe sehr groß werden. Da die Ausgabe ohnehin nicht sehr aussagekräftig ist, sollte für metrische Merkmale normalerweise keine table erstellt werden.
Zur Veranschaulichung lassen sich Häufigkeiten durch Balken- bzw. Stabdiagramme und Tortendiagramme darstellen. Für eine konsistente Darstellungslogik verwenden wir hier ggplot2. Ein Balkendiagramm der Anzahl Flüge je Flughafen können wir aus der Häufigkeitstabelle mit Hilfe des Befehls
erstellen. Abbildung 4.1 zeigt das Resultat. Ein Stabdiagramm erhält man mit
Das Ergebnis zeigt Abbildung 4.2.
Ein Tortendiagramm bzw. Pie-Chart erhalten wir mit
In Abbildung 4.3 ist das Ergebnis dargestellt.
Absolute Häufigkeiten lassen sich auch über mehr als eine Dimension abfragen. Möchten wir herausfinden, wie viele Flüge an jedem Flughafen mit mehr als 15 Minuten Verspätung abgeflogen sind, können wir dies erreichen durch
Delay_gt15
Origin FALSE TRUE
EWR 88654 28942
JFK 86766 22650
LGA 82327 19182
Fehlende Werte (NA) werden von der table Funktion standardmäßig ignoriert. Möchten wir sie mit ausgeben, geht dies über das Argument useNA. Dabei gibt es die Optionen "no" (Standard, NA werden ignoriert), " ifany" (NA werden angegeben, falls welche vorliegen) und " always" (NA werden immer angegeben, auch wenn keine vorliegen).
DepDelay_gt15
Origin FALSE TRUE <NA>
EWR 88654 28942 3239
JFK 86766 22650 1863
LGA 82327 19182 3153
DepDelay_gt15
Origin FALSE TRUE <NA>
EWR 88654 28942 3239
JFK 86766 22650 1863
LGA 82327 19182 3153
<NA> 0 0 0
Als Möglichkeit für eine graphische Darstellung für Häufigkeiten über zwei Dimensionen bietet sich eine Heatmap an. Ein Beispiel für die Anzahl Flüge nach Flughafen des Abflugs und Fluggesellschaft zeigt Abbildung 4.4.
Origin
Carrier EWR JFK LGA
9E 1268 14651 2541
AA 3487 13783 15459
AS 714 0 0
B6 6557 42076 6002
DL 4342 20701 23067
EV 43939 1408 8826
F9 0 0 685
FL 0 0 3260
HA 0 342 0
MQ 2276 7193 16928
OO 6 0 26
UA 46087 4534 8044
US 4405 2995 13136
VX 1566 3596 0
WN 6188 0 6087
YV 0 0 601
Auch mit mehr als zwei Dimensionen funktioniert table noch, die Ausgabe wird dann allerdings unübersichtlich.
, , DepDelay_gt15 = FALSE
Origin
Month EWR JFK LGA
1 7319 7581 6665
2 6616 6350 5928
3 7259 7624 6858
4 7564 7164 6693
5 7536 7282 6962
6 6742 6619 6030
7 7100 6688 6269
8 7809 7625 7035
9 8050 7566 7727
10 8262 7959 8148
11 8106 7593 7415
12 6291 6715 6597
, , DepDelay_gt15 = TRUE
Origin
Month EWR JFK LGA
1 2336 1480 1102
2 1992 1678 1126
3 2794 1888 1550
4 2707 1870 1664
5 2807 2007 1639
6 3056 2610 2177
7 3096 3124 2208
8 2373 2265 1734
9 1357 1250 1172
10 1750 1149 1385
11 1520 1081 1320
12 3154 2248 2105
Besser geht dies mit ftable:
Delay_gt15 FALSE TRUE
Month Origin
1 EWR 7319 2336
JFK 7581 1480
LGA 6665 1102
2 EWR 6616 1992
JFK 6350 1678
LGA 5928 1126
3 EWR 7259 2794
JFK 7624 1888
LGA 6858 1550
4 EWR 7564 2707
JFK 7164 1870
LGA 6693 1664
5 EWR 7536 2807
JFK 7282 2007
LGA 6962 1639
6 EWR 6742 3056
JFK 6619 2610
LGA 6030 2177
7 EWR 7100 3096
JFK 6688 3124
LGA 6269 2208
8 EWR 7809 2373
JFK 7625 2265
LGA 7035 1734
9 EWR 8050 1357
JFK 7566 1250
LGA 7727 1172
10 EWR 8262 1750
JFK 7959 1149
LGA 8148 1385
11 EWR 8106 1520
JFK 7593 1081
LGA 7415 1320
12 EWR 6291 3154
JFK 6715 2248
LGA 6597 2105
Zunächst lassen sich relative Häufigkeiten natürlich sehr einfach berechnen, indem man durch die entsprechende Summe der Beobachtungen teilt, also mit
oder
Beim Befehl table(flights$origin)/length(flights$origin) ist Vorsicht geboten! Während die table Funktion standardmäßig fehlende Werte ignoriert, werden sie bei length mitgezählt. Damit kann das Resultat nicht dem gewünschten Ergebnis entsprechen.
Genauso können relative Häufigkeiten aus jedem table Objekt mit Hilfe der prop.table Funktion extrahiert werden.
Alternativ funktioniert auch wieder die Schreibweise mit Pipes
origin
EWR JFK LGA
0.3587993 0.3304244 0.3107763
Mit dem Argument margin gibt man an, ob sich die relativen Häufigkeiten (im zweidimensionalen Fall) zeilenweise (margin = 1), spaltenweise (margin = 2) oder insgesamt zu 100% aufsummieren sollen (Standardwert margin = NULL).
Delay_gt15
Origin FALSE TRUE
EWR 0.7538862 0.2461138
JFK 0.7929919 0.2070081
LGA 0.8110315 0.1889685
Delay_gt15
Origin FALSE TRUE
EWR 0.3439574 0.4089355
JFK 0.3366324 0.3200328
LGA 0.3194101 0.2710317
Delay_gt15
Origin FALSE TRUE
EWR 0.26985794 0.08809787
JFK 0.26411097 0.06894536
LGA 0.25059890 0.05838896
Die Tabelle inklusive Randhäufigkeiten erhält man mit addmargins
Delay_gt15
Origin FALSE TRUE Sum
EWR 88654 28942 117596
JFK 86766 22650 109416
LGA 82327 19182 101509
Sum 257747 70774 328521
Delay_gt15
Origin FALSE TRUE Sum
EWR 0.26985794 0.08809787 0.35795581
JFK 0.26411097 0.06894536 0.33305633
LGA 0.25059890 0.05838896 0.30898786
Sum 0.78456781 0.21543219 1.00000000
oder nur die Randhäufigkeiten über margin.table
Eine weitere Möglichkeit für die Erstellung von Kreuztabellen bietet die Funktion xtabs, welche als Input auch Formeln verwenden kann, die wir aber erst in Kapitel 7 kennenlernen werden.
Häufigkeitsverteilungen für metrische Variablen werden typischerweise über eine vorgeschobene Klassenbildung ermittelt und mittels eines Histogramms oder der empirischen Verteilungsfunktion dargestellt.
Die Funktion cut “schneidet” bzw. teilt eine metrische Variable in Klassen ein und ordnet jeder Beobachtung dann die jeweilige Klasse zu. Möchten wir also die Dauer der verspäteten Ankünfte der Flüge in 60-Minuten-Intervalle unterteilen, erhalten wir
Origin
Delay EWR JFK LGA
(-90,-30] 6582 9473 6697
(-30,30] 90303 83027 79765
(30,90] 13642 11287 10046
(90,150] 4169 3368 2818
(150,210] 1494 1213 1050
(210,270] 584 427 433
(270,330] 223 171 191
(330,390] 86 65 83
(390,450] 23 23 24
(450,510] 8 5 17
(510,570] 2 1 2
(570,630] 1 3 4
(630,690] 3 2 2
(690,750] 0 1 1
(750,810] 2 4 3
(810,870] 2 4 2
(870,930] 2 0 2
(930,990] 0 2 0
(990,1.05e+03] 0 1 0
(1.05e+03,1.11e+03] 1 0 0
(1.11e+03,1.17e+03] 0 1 0
(1.17e+03,1.23e+03] 0 0 0
(1.23e+03,1.29e+03] 0 1 0
Dabei erzeugt die cut Funktion eine neue Variable, welche vom Typ factor ist und ein Faktorlevel je gebildeter Klasse enthält, der als jeweils mit der Definition des Intervalls bezeichnet wird:
Für die Bestimmung der Klassengrenzen in der cut Funktion können Hilfsfunktionen genutzt werden. In dem gezeigten Beispiel wurden gleich breite Klassen bzw. deren Klassengrenzen mit Hilfe der seq Funktion hergeleitet. Genauso lassen sich gleichgroße Klassen mit Hilfe von Quantilen (also der quantile Funktion) bestimmen. Eine weitere nützliche Funktionen in diesem Zusammenhang ist pretty für schöne “runde” Zahlen als Klassengrenzen.
Ein Beispiel für die Verwendung von Quantilen als Klassengrenzen ist in Abbildung 4.5 dargestellt. Der dazugehörige Code lautet:
Delay
Origin 1 2 3 4 5 6 7 8 9 10
EWR 10689 11949 11832 10040 11981 12372 11992 10887 12459 12925
JFK 13880 11640 10977 9377 10907 11104 10571 9721 10546 10356
LGA 11065 11651 10587 8757 10240 10368 10372 9427 9631 9042
tbl_delay_df <- as.data.frame(prop.table(tbl_delay, margin = 2))
colnames(tbl_delay_df) <- c("Origin", "Delay", "Share")
ggplot(tbl_delay_df, aes(x = Delay, y = Share, fill = Origin)) +
geom_col() +
scale_y_continuous(labels = scales::label_percent()) +
labs(x = "Quantil", y = "Relativer Anteil", fill = "Abflughafen")
Die hist Funktion berechnet Histogramme. Auch hier können wieder über breaks die Klassengrenzen angegeben werden. Es sind allerdings auch Algorithmen zur optimalen Klassenwahl hinterlegt, wie diejenigen von Sturges (1926), Scott (1979) (bzw. Scott (1992)) oder Freedman und Diaconis (1981). Mit ggplot2 lässt sich dieselbe Idee über geom_histogram umsetzen (vgl. Abbildung 4.6).
Warning: Removed 9430 rows containing non-finite outside the scale range
(`stat_bin()`).
An dieser Stelle wollen wir aber nicht weiter auf die Details der grafischen Darstellung eingehen, Kapitel 5 wird sich intensiv mit diesem Thema beschäftigen.
Die empirische Verteilungsfunktion ist in R in Form der Funktion ecdf implementiert
Empirical CDF
Call: ecdf(flights$arr_delay)
x[1:577] = -86, -79, -75, ..., 1127, 1272
Diese lässt sich auch mit Hilfe der plot Funktion grafisch darstellen (vgl. Abbildung 4.7).
Als weitere Darstellung der Verteilung von metrischen Variablen kennen wir aus der Statistikvorlesung Boxplots. Boxplots der Verspätungen je Monat sind in Abbildung 4.8 dargestellt.
Häufigkeiten
Bereits in Kapitel 2 und Kapitel 3 haben wir gesehen, wie sich statistische Kennzahlen von Vektoren, Matrizen oder Data Frames berechnen lassen. An dieser Stelle folgt ein zusammenhängender Überblick über Lage- und Streuungsmaße und deren Verwendung in R.
Tabelle 4.1 listet die wichtigsten Lagemaße auf und die Funktion, mit der Sie in R aufgerufen werden können. Nicht jedes Maß ist tatsächlich in den Standardfunktionen enthalten, aber ein geometrisches Mittel beispielsweise lässt sich sehr einfach implementieren.
| Lagemaß | Funktion |
|---|---|
| arithmetisches Mittel | mean |
| Median | median |
| Quantile | quantile |
| Modus | keine Standardfunktion |
| Geometrisches Mittel | keine Standardfunktion |
| Harmonisches Mittel | keine Standardfunktion |
Tabelle 4.2 listet die wichtigsten Streuungsmaße auf, welche in den Standardbibliotheken in R implementiert sind. Weitere sind in entsprechenden spezialisierten Paketen zu finden.
| Streuungsmaß | Funktion |
|---|---|
| Spannweite | range |
| Varianz | var |
| Standardabweichung | sd |
| Mittlere Absolute Abweichung (MAD) | mad |
| Interquartilsabstand | IQD |
Die Anwendung der Lage- und Streuungsmaße ist typischerweise auf einen Zahlenvektor ausgelegt, kann aber auf ganze Datensätze (je Spalte) oder gruppenweise (auf eine Auswahl von Zeilen) wie in Kapitel 2.3.2 oder Kapitel 3.3.2 beschrieben angewendet werden.
Lage- und Streuungsmaße
AirPassengers Datensatz.Die wichtigste Funktion in R zur Messung von Zusammenhängen ist cor. Mit ihr lassen sich der Korrelationskoeffizient nach (Bravais-)Pearson, der Korrelationskoeffizient nach Spearman und Kendalls Tau berechnen (steuerbar über die Option method und deren mögliche Werte "pearson", "kendall" oder "spearman".
Es lassen sich Korrelationen von zwei Variablen bestimmen (über Angabe zweier Vektoren x und y), aber auch paarweise Korrelationen von mehr als zwei Variablen (über die Angabe einer Matrix oder eines Data Frames x).
Falls fehlende Werte vorhanden sind, kann mit dem Argument use entschieden werden, wie mit den fehlenden Werten umgegangen wird:
" everything": alle Beobachtungen werden verwendet und das Ergebnis der Berechnung ist NA falls einer der Werte NA ist" all.obs": alle Beobachtungen werden verwendet und die Funktion gibt einen Fehler zurück, falls fehlende Werte vorhanden sind"complete.obs": nur Beobachtungspaare ohne fehlende Werte werden berücksichtigt; falls es keine Paare ohne fehlenden Wert gibt, wird ein Fehler zurückgegeben"na.or.complete": gleiche Funktionalität wie "complete.obs", allerdings gibt die Funktion in diesem Fall ein NA zurück, falls es keine Beobachtungspaare ohne fehlenden Wert gibt"pairwise.complete.obs": es werden nur Beobachtungen berücksichtigt, die bei allen Variablen keine NA enthalten (Unterschied zu "complete.obs" also nur bei mehr als zwei Variablen)Ein Beispiel für den iris Datensatz:
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.00000000 -0.07699679 0.7185159 0.6553086
Sepal.Width -0.07699679 1.00000000 -0.1859944 -0.1571257
Petal.Length 0.71851593 -0.18599442 1.0000000 0.8068907
Petal.Width 0.65530856 -0.15712566 0.8068907 1.0000000
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1667777 0.8818981 0.8342888
Sepal.Width -0.1667777 1.0000000 -0.3096351 -0.2890317
Petal.Length 0.8818981 -0.3096351 1.0000000 0.9376668
Petal.Width 0.8342888 -0.2890317 0.9376668 1.0000000
Korrelationsmatrizen sind häufig schwer zu lesen, vor allem wenn sie eine große Anzahl Variablen enthalten. Abhilfe schafft eine Visualisierung der Korrelationsstruktur durch ein sogenanntes Korrelogramm: In einer Matrix werden die Korrelationen durch Einfärbungen oder Tortendiagramme ähnlich wie in einer Heatmap grafisch dargestellt. In R bietet das Paket corrgram eine solche Darstellung (Wright 2021). Das Beispiel für den iris Datensatz zeigt Abbildung 4.9.
iris Datensatz
Zusammenhangsmaße