32  Deskriptive Statistik

Zur Beschreibung von Verteilungen eigenen sich Tabellen, Lage- und Streuungskenngrößen.

32.1 Häufigkeiten

Eine Häufigkeitstabelle wird mit der Funktion table() erstellt

# Daten erzeugen
x <- c(1, 3, 5, 7, 7, 7, 6, 34)

# Häufigkeitstabelle
table(x)
## x
##  1  3  5  6  7 34 
##  1  1  1  1  3  1

Für relative Häufigkeiten teilt man einfach durch die Länge der Variable x. So ändert sich der Befehl in:

# relative Häufigkeitstabelle
table(x)/length(x)
## x
##     1     3     5     6     7    34 
## 0.125 0.125 0.125 0.125 0.375 0.125

Kumulierte Häufigkeiten erhält man mit der Funktion cumsum()

# kumulierte Häufigkeitstabelle
cumsum(table(x))
##  1  3  5  6  7 34 
##  1  2  3  4  7  8

Und entsprechend auch kumulierte relative Häufigkeiten

# kumulierte relative Häufigkeitstabelle
cumsum(table(x)/length(x))
##     1     3     5     6     7    34 
## 0.125 0.250 0.375 0.500 0.875 1.000

Eine weitere Option bietet die Funktion freq() aus dem rettyR-Paket. Sie erstellt eine Tabelle mit absoluten und relativen Häufigkeiten sowie relativen Häufikeiten ohne fehlende Wert (NA).

# Paket "prettyR" installieren
install.packages("prettyR", dependencies=TRUE)
# Paket laden
library(prettyR)

# Häufigkeitstabelle mit absoluten und relative Werten erstellen
freq(x)
## 
## Frequencies for x 
##         7    1    3    5    6   34   NA
##         3    1    1    1    1    1    0
## %    37.5 12.5 12.5 12.5 12.5 12.5    0 
## %!NA 37.5 12.5 12.5 12.5 12.5 12.5

Die Funktion freqTable() aus dem jgsbook-Paket erstellt für einen Vektor eine vollständige Häufigkeitstabelle mit absoluten, relativen und kumulierten Werten.

# 234 Zufallswerte zwischen 21 und 30
x <- sample(21:30, 234, replace = TRUE)
# Häufigkeitstabelle
jgsbook::freqTable(x)
##    Wert Haeufig Hkum Relativ   Rkum
## 1    21      19   19    8.12   8.12
## 2    22      18   37    7.69  15.81
## 3    23      30   67   12.82  28.63
## 4    24      23   90    9.83  38.46
## 5    25      24  114   10.26  48.72
## 6    26      36  150   15.38  64.10
## 7    27      15  165    6.41  70.51
## 8    28      24  189   10.26  80.77
## 9    29      23  212    9.83  90.60
## 10   30      22  234    9.40 100.00

32.2 Lagekenngrößen

Mit dem Befehl summary() erhält man eine erste Zusammenfassung der Werteverteilung mit den wichtigsten Lagekenngrößen.

# Daten erzeugen
x <- c(1, 3, 5, 7, 7, 7, 6, 34)

# Zusammenfassung
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    4.50    6.50    8.75    7.00   34.00

Die Funktion describe() aus dem psych-Zusatzpaket liefert noch detailiertere Übersichten:

psych::describe(x)
##    vars n mean    sd median trimmed  mad min max range skew kurtosis   se
## X1    1 8 8.75 10.43    6.5    8.75 1.48   1  34    33 1.69     1.35 3.69

Das Funktioniert auch bei kompletten Datensätzen.

# Zusammenfassung von pf8
psych::describe(pf8)
##                vars   n   mean    sd median trimmed   mad min max range  skew
## Standort*         1 731   2.85  1.61      2    2.81  1.48   1   5     4  0.28
## Alter             2 730  37.00 18.00     28   34.98 12.60  15  86    71  0.74
## Geschlecht*       3 725   1.61  0.49      2    1.63  0.00   1   3     2 -0.40
## Größe             4 730 174.04  9.62    173  173.84 10.38 151 206    55  0.26
## Gewicht           5 720  75.53 16.88     73   73.93 16.31  45 175   130  1.12
## Bildung*          6 506   4.88  1.77      5    4.98  2.97   1   7     6 -0.39
## Beruf*            7 731  40.42 37.04     34   38.58 48.93   1 104   103  0.26
## Familienstand*    8 729   2.11  1.12      2    1.99  1.48   1   6     5  0.83
## Kinder            9 727   0.38  0.79      0    0.18  0.00   0   5     5  2.19
## Wohnort*         10 729   1.41  0.49      1    1.39  0.00   1   2     1  0.36
## Rauchen*         11 729   1.21  0.40      1    1.13  0.00   1   2     1  1.45
## SportHäufig      12 677   2.56  1.88      2    2.41  1.48   0  21    21  1.91
## SportMinuten     13 667  62.42 40.14     60   60.47 44.48   0 400   400  1.53
## SportWie*        14 656   1.64  0.69      2    1.55  1.48   1   3     2  0.62
## SportWarum*      15 454   3.75  1.64      4    3.49  1.48   1   8     7  1.06
## LebenZufrieden   16 724   7.91  1.59      8    8.07  1.48   1  11    10 -1.10
##                kurtosis   se
## Standort*         -1.53 0.06
## Alter             -0.70 0.67
## Geschlecht*       -1.75 0.02
## Größe             -0.26 0.36
## Gewicht            2.40 0.63
## Bildung*          -1.26 0.08
## Beruf*            -1.55 1.37
## Familienstand*     0.48 0.04
## Kinder             4.45 0.03
## Wohnort*          -1.87 0.02
## Rauchen*           0.11 0.01
## SportHäufig       12.75 0.07
## SportMinuten       8.64 1.55
## SportWie*         -0.77 0.03
## SportWarum*        0.79 0.08
## LebenZufrieden     1.86 0.06

Die Lagewerte lassen sich auch einzeln bestimmen.

Mit der Funktion min() wird das Minimum der Verteilung ausgegeben.

# Minimum bestimmen
min(x)
## [1] 1

Dementsprechend liefert max() das Maximum.

# Maximum bestimmen
max(x)
## [1] 34

Die Spannweite wird mit range() abgefragt.

# Spannweite bestimmen
range(x)
## [1]  1 34

Das arithmetische Mittel wird mit der Funktion mean() bestimmt

# x-quer bestimmen
mean(x)
## [1] 8.75

Sind fehlende Werte in der Reihe enthalten, gibt R nur NA zurück.

#  mean für "Gewicht" im Datensatz "pf8"
mean(pf8$Gewicht)
## [1] NA

Beheben kann man dies, indem der Parameter na.rm auf TRUE gesetzt wird.

#  mean für "Gewicht" im Datensatz "pf8"
# entferne NAs
mean(pf8$Gewicht, na.rm=TRUE)
## [1] 75.5325

Der Median wird mit der Funktion median() ermittelt.

# Median bestimmen
median(x)
## [1] 6.5

Auch hier müssen enthaltene NAs ausgeblendet werden:

# Median bestimmen, OHNE NAs
median(pf8$Gewicht, na.rm=TRUE)
## [1] 73

In den R-Hausmitteln existiert keine eigene Funktion zur Bestimmung des Modalwertes. Wir können ihn daher “auf Umwegen” bestimmen. Wir lassen mittels table() eine Häufigkeitstabelle der Variable ausgeben. Diese sortieren wir mittels sort() absteigend. Der Modus ist dann der erste Wert der sortierten Tabelle.

# Daten als Häufigkeitstabelle
table(x)
## x
##  1  3  5  6  7 34 
##  1  1  1  1  3  1
# absteigend sortieren
sort(table(x), decreasing=TRUE)
## x
##  7  1  3  5  6 34 
##  3  1  1  1  1  1
# Modalwert
sort(table(x), decreasing=TRUE)[1]
## 7 
## 3

Es ist der Wert 7 und er kommt 3 mal vor.

Eine weitere Möglichkeit bietet das Zusatzpaket statip. Es enthält die Funktion mfv(), mit welcher der Modalwert bestimmt werden kann.

# Daten als Häufigkeitstabelle
library(statip)

# Modalwert bestimmen
mfv(x)
## [1] 7
# bzw. auch
statip::mfv(x)
## [1] 7

Die vier Quartile werden mit der Funktion quantile() ermittelt (ja, der Befehl für Quartile heisst in R quantile()).

# Quartile bestimmen, ohne NAs
quantile(x, na.rm=T)
##   0%  25%  50%  75% 100% 
##  1.0  4.5  6.5  7.0 34.0

Es lassen sich beliebige Quantile berechnen.

# Quartile bestimmen, ohne NAs
quantile(x, probs = c(.333, .666))
## 33.3% 66.6% 
## 5.331 7.000

Und auch die Art der Berechnung lässt sich über den Parameter type festlegen. Beispielsweise verwendet type=6 die Methode von SPSS.

# Quartile bestimmen, ohne NAs
# so wie SPSS
quantile(x, probs = c(.333, .666), type=6)
## 33.3% 66.6% 
## 4.994 7.000

Die Schiefe der Verteilung (Skewness) kann mittels skew() aus dem psych-Paket bestimmt werden. Ein positiver Wert bedeutet eine rechtsschiefe Verteilung, ein negativer Wert eine linksschiefe Verteilung.

psych::skew(x, type=2) # rechne wie SPSS oder SAS
## [1] 2.577408

Ebenso enthält das Paket die Funktion kurtosi(), mit welcher die “Spitzigkeit” der Verteilung bestimmt werden kann.

psych::kurtosi(x, type=2) # rechne wie SPSS oder SAS
## [1] 7.020852

32.3 Streuungskenngrößen

Die wichtigste Streuungskenngröße ist wahrscheinlich die Standardabweichung. Sie wird mittels der Funktion sd() bestimmt.

# Standardabweichung bestimmen
sd(x, na.rm=T)
## [1] 10.43004

Die Varianz der Stichprobe wird mit var() berechnet.

# Varianz von x bestimmen
var(x, na.rm=T)
## [1] 108.7857

Der Interquartilsabstand (oder einfach nur Quartilsabstand) wird mit der Funktion IQR() bestimmt.

# Quartilsabstand bestimmen
IQR(x, na.rm=T)
## [1] 2.5

Ebenso wie bei quantile() lässt sich über den Parameter type die Berechnungsart ändern. Mit type=6 nutzt R die Methode wie in SPSS:

# Quartilsabstand bestimmen
# Methode wie in SPSS
IQR(x, na.rm=T, type=6)
## [1] 3.5

32.4 Kreuztabellen

Mit der Funktion table() lassen sich auch Kreuztabellen erstellen, indem einfach beide Variablen übergeben werden.

# erzeuge Daten
Punktwert <- c(2 , 12 , 7 , 15 , 10 , 4 , 13 , 9 , 16 , 19)
Geschlecht <- rep(c("maennlich" , "weiblich") ,5)

# Kreuztabelle
table(Punktwert, Geschlecht)
##          Geschlecht
## Punktwert maennlich weiblich
##        2          1        0
##        4          0        1
##        7          1        0
##        9          0        1
##        10         1        0
##        12         0        1
##        13         1        0
##        15         0        1
##        16         1        0
##        19         0        1

Ebenso steht die Funktion xtabs() zur Verfügung.

# Kreuztabelle mit "xtabs()"
xtabs(~ Punktwert + Geschlecht)
##          Geschlecht
## Punktwert maennlich weiblich
##        2          1        0
##        4          0        1
##        7          1        0
##        9          0        1
##        10         1        0
##        12         0        1
##        13         1        0
##        15         0        1
##        16         1        0
##        19         0        1

Siehe Abschnitt 36.1 für weitere Beispiele zur Kreuztabelle.

32.5 z-Transformation

Die z-Transformation erfolgt mit der Funktion scale().

# Wertereihe
Punktwerte <- c(2 , 12 , 7 , 15 , 10 , 4 , 13 , 9 , 16 , 19)

# z-Transformation
scale(Punktwerte)
##             [,1]
##  [1,] -1.6183421
##  [2,]  0.2418212
##  [3,] -0.6882604
##  [4,]  0.7998702
##  [5,] -0.1302114
##  [6,] -1.2463094
##  [7,]  0.4278376
##  [8,] -0.3162278
##  [9,]  0.9858866
## [10,]  1.5439356
## attr(,"scaled:center")
## [1] 10.7
## attr(,"scaled:scale")
## [1] 5.375872

Hierbei berechnet scale() automatisch Mittelwert und Standardabweichung der übergebenen Werte. In der Ausgabe erkennen Sie diese unter attr(,"scaled:center") (in unserem Fall 10.7) und attr(,"scaled:scale") (in unserem Fall 5.375872).

Über die Parameter center und scale können Mittelwert und Standardabweichung aber auch beliebig spezifiziert werden.

scale(Punktwerte, center=15, scale=3)
##             [,1]
##  [1,] -4.3333333
##  [2,] -1.0000000
##  [3,] -2.6666667
##  [4,]  0.0000000
##  [5,] -1.6666667
##  [6,] -3.6666667
##  [7,] -0.6666667
##  [8,] -2.0000000
##  [9,]  0.3333333
## [10,]  1.3333333
## attr(,"scaled:center")
## [1] 15
## attr(,"scaled:scale")
## [1] 3

Das Ergebnis ist ein matrix-Objekt. Wenn Sie nur den z-Wert als numerischen Wert ausgeben möchten, kann die as.numeric()-Funktion verwendet werden.

# gebe nur die z-Werte aus
as.numeric(scale(Punktwerte))
##  [1] -1.6183421  0.2418212 -0.6882604  0.7998702 -0.1302114 -1.2463094
##  [7]  0.4278376 -0.3162278  0.9858866  1.5439356

32.6 Korrelation

Die allgemeine Funktion zur Berechnung von Korrelationen heisst cor(). Die Korrelation nach Pearson berechnet sich mit der Funktion cor() und deren Parameter method="pearson".

# erzeuge Daten
Lesetest <- c(2 , 12 , 7 , 15 , 10 , 4 , 13 , 9 , 16 , 19)
Rechtschreibung <- c(3 , 14 , 9 , 17 , 12 , 4 , 16 , 12 , 18 , 20)

# Pearson Maßkorrelationskoeffizient
cor(Lesetest, Rechtschreibung, method="pearson")
## [1] 0.9884616

Mit der Funktion cor.test() kann direkt ein Siginifkanztest mitgefahren werden

# Pearson Maßkorrelationskoeffizient
# mit Signifikanztest
cor.test(Lesetest, Rechtschreibung, method="pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  Lesetest and Rechtschreibung
## t = 18.458, df = 8, p-value = 7.648e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9502085 0.9973659
## sample estimates:
##       cor 
## 0.9884616

Sollten fehlende Wert (NA) enthalten sein, gibt der Befehl nur ein NA zurück.

# Pearson Maßkorrelationskoeffizient
# mit Datensatz "pf8", da sind NAs enthalten!!!
cor(pf8$Alter, pf8$Größe, method="pearson")
## [1] NA

Mit dem Parameter use="complete.obs" (nutze nur vollständige Beobachtungen) können wir dies beheben.

# Pearson Maßkorrelationskoeffizient
# mit Datensatz "pf8", verwende nur "komplette" Daten (ohne NA)
cor(pf8$Alter, pf8$Größe, method="pearson", use="complete.obs")
## [1] -0.1067484

Für die Korrelationsberechnung nach Spearmen (Spearman’s \(\rho\)) wird der Parameter method auf spearman gesetzt.

# Spearman's Korrelationsberechnung
cor(Lesetest, Rechtschreibung, method="spearman")
## [1] 0.9969651

Auch hier müssen NAs mit dem Parameter use="complete.obs" unterdrückt werden.

# Spearman's Rho
# mit Datensatz "pf8", verwende nur "komplette" Daten (ohne NA)
cor(pf8$Alter, pf8$Größe, method="spearman", use="complete.obs")
## [1] -0.05920716

Auch für Spearman’s Rho kann ein Signifikanztest mitgefahren werden, indem cor.test() aufgerufen wird.

# Spearman's Korrelationsberechnung
# mit Signifikanztest
cor.test(Lesetest, Rechtschreibung, method="spearman")
## Warning in cor.test.default(Lesetest, Rechtschreibung, method = "spearman"):
## Kann exakten p-Wert bei Bindungen nicht berechnen
## 
##  Spearman's rank correlation rho
## 
## data:  Lesetest and Rechtschreibung
## S = 0.50076, p-value = 3.698e-10
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.9969651

Die Warnmeldung kann ignoriert werden, der p-Wert wird in der Ausgabe angezeigt.

Da cor.test() ein Objekt der Klasse Liste zurückliefert, kann auf die einzelnen Komponenten des Tests zugegriffen werden.

# schreibe Testergebnis in Variable "test"
test <- cor.test(Lesetest, Rechtschreibung, method="spearman")

# zeige nur p-Wert an
test$p.value
## [1] 3.698093e-10
# zeige nur Teststatistik an
test$statistic
##         S 
## 0.5007599
# zeige nur Spearmans's Rho an
test$estimate
##       rho 
## 0.9969651