R Spickzettel: Univariate deskriptive Statistik

library(ggplot2)
library(psych)
library(tibble)
library(yarrr)
as_tibble(pirates)

# A tibble: 1,000 x 17
      id sex     age height weight headband college tattoos tchests parrots favorite.pirate sword.type eyepatch sword.time
   <int> <chr> <dbl>  <dbl>  <dbl> <chr>    <chr>     <dbl>   <dbl>   <dbl> <chr>           <chr>         <dbl>      <dbl>
 1     1 male     28   173.   70.5 yes      JSSFP         9       0       0 Jack Sparrow    cutlass           1      0.580
 2     2 male     31   209.  106.  yes      JSSFP         9      11       0 Jack Sparrow    cutlass           0      1.11 
 3     3 male     26   170.   77.1 yes      CCCC         10      10       1 Jack Sparrow    cutlass           1      1.44 
 4     4 fema~    31   144.   58.5 no       JSSFP         2       0       2 Jack Sparrow    scimitar          1     36.1  
 5     5 fema~    41   158.   58.4 yes      JSSFP         9       6       4 Hook            cutlass           1      0.11 
 6     6 male     26   190.   85.4 yes      CCCC          7      19       0 Jack Sparrow    cutlass           1      0.59 
 7     7 fema~    31   158.   59.6 yes      JSSFP         9       1       7 Blackbeard      cutlass           0      3.01 
 8     8 fema~    31   173.   74.5 yes      JSSFP         5      13       7 Hook            cutlass           1      0.06 
 9     9 fema~    28   165.   68.7 yes      JSSFP        12      37       2 Anicetus        cutlass           0      0.74 
10    10 male     30   184.   84.7 yes      JSSFP        12      69       4 Jack Sparrow    cutlass           1      0.71 
# ... with 990 more rows, and 3 more variables: beard.length <dbl>, fav.pixar <chr>, grogg <dbl>

Häufigkeitsverteilungen in Zahlen

Absolute Häufigkeiten

table(pirates$sword.type)
  banana  cutlass    sabre scimitar 
      46      830       67       57 

Relative Häufigkeiten

prop.table(table(pirates$sword.type))
  banana  cutlass    sabre scimitar 
   0.046    0.830    0.067    0.057 
absolute_haeufigkeit <- table(pirates$sword.type)
prop.table(absolute_haeufigkeit)
round(prop.table(table(pirates$sword.type)),2)
  banana  cutlass    sabre scimitar 
    0.05     0.83     0.07     0.06 

Prozentwerte

100*prop.table(table(pirates$sword.type))
  banana  cutlass    sabre scimitar 
     4.6     83.0      6.7      5.7

Kumulierte absolute Häufigkeiten

cumsum(table(pirates$tattoos))
   0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19 
   6   17   36   52   81  119  186  255  364  493  615  734  827  893  943  971  984  996  999 1000

Kumulierte relative Häufigkeiten

cumsum(prop.table(table(pirates$tattoos)))
    0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19 
0.006 0.017 0.036 0.052 0.081 0.119 0.186 0.255 0.364 0.493 0.615 0.734 0.827 0.893 0.943 0.971 0.984 0.996 0.999 1.000 

Kumulierte Prozentwerte

cumsum(100*prop.table(table(pirates$tattoos)))
    0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19 
  0.6   1.7   3.6   5.2   8.1  11.9  18.6  25.5  36.4  49.3  61.5  73.4  82.7  89.3  94.3  97.1  98.4  99.6  99.9 100.0 

Kombination verschiedener Häufigkeiten in einer Tabelle

cbind(table(pirates$sword.type), 
       prop.table(table(pirates$sword.type)), 
       100*prop.table(table(pirates$sword.type)))
         [,1]  [,2] [,3]
banana     46 0.046  4.6
cutlass   830 0.830 83.0
sabre      67 0.067  6.7
scimitar   57 0.057  5.7
round(cbind(table(pirates$sword.type), 
             prop.table(table(pirates$sword.type)), 
             100*prop.table(table(pirates$sword.type))), 1)
         [,1] [,2] [,3]
banana     46  0.0  4.6
cutlass   830  0.8 83.0
sabre      67  0.1  6.7
scimitar   57  0.1  5.7
absolut <- table(pirates$sword.type)
relativ <- prop.table(table(pirates$sword.type))
prozent <- 100*prop.table(table(pirates$sword.type))
tabelle <- cbind(absolut, relativ, prozent)
round(tabelle, 1)
         absolut relativ prozent
banana        46     0.0     4.6
cutlass      830     0.8    83.0
sabre         67     0.1     6.7
scimitar      57     0.1     5.7

Grafische Darstellungsweisen von Häufigkeitsverteilungen

Säulendiagramme

barplot(table(pirates$favorite.pirate), ylab="Häufigkeit" )
ggplot(pirates, aes(x=favorite.pirate)) +
  geom_bar() +
  labs(x="Lieblingspirat", y="Häufigkeit")

Histogramme

hist(pirates$age, xlab="Alter", ylab="Häufigkeit")
ggplot(pirates, aes(x=age)) +
  geom_histogram(na.rm = T) +
  labs(x="Alter", y="Häufigkeit")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(pirates, aes(x=age)) +
   geom_histogram(na.rm=T, binwidth = 10) +
   labs(x="Alter", y="Häufigkeit")
ggplot(pirates, aes(x=age)) +
  geom_histogram(na.rm=T, binwidth = 10, boundary=10) +
  labs(x="Alter", y="Häufigkeit")
ggplot(pirates, aes(x=age)) +
  geom_histogram(na.rm=T, binwidth = 10, boundary=10) +
  labs(x="Alter", y="Häufigkeit") +
  scale_x_continuous(breaks=seq(0, 60, 5))

Kennwerte für Häufigkeitsverteilungen

Kennwerte der zentralen Tendenz

Modalwert

which.max(table(pirates$sword.type))
cutlass 
      2
max(table(pirates$sword.type))
[1] 830
table(pirates$sword.type) == 830
  banana  cutlass    sabre scimitar 
   FALSE     TRUE    FALSE    FALSE 

Median

median(pirates$tattoos, na.rm = T)
[1] 10

Arithmetisches Mittel

mean(pirates$age, na.rm = T)
[1] 27.36

Streuungsmaße

Streubereich und Spannweite

range(pirates$age, na.rm = T)
[1] 11 46
diff(range(pirates$age, na.rm = T))
[1] 35

Quartile

quantile(pirates$tattoos, na.rm = T)
  0%  25%  50%  75% 100% 
   0    7   10   12   19 

Interquartilsbereich und Interquartilsabstand

IQR(pirates$tattoos, na.rm = T)
[1] 5

Quantile und Perzentile

quantile(pirates$tattoos, 0.10, na.rm = T)
10% 
   5 
quantile(pirates$tattoos, 0.63, na.rm = T)
63% 
  11 
quantile(pirates$tattoos, seq(0,1,0.01), na.rm = T)
  0%   1%   2%   3%   4%   5%   6%   7%   8%   9%  10%  11%  12%  13%  14%  15%  16%  17%  18%  19%  20%  21%  22%  23%  24% 
   0    1    2    2    3    3    4    4    4    5    5    5    6    6    6    6    6    6    6    7    7    7    7    7    7 
 25%  26%  27%  28%  29%  30%  31%  32%  33%  34%  35%  36%  37%  38%  39%  40%  41%  42%  43%  44%  45%  46%  47%  48%  49% 
   7    8    8    8    8    8    8    8    8    8    8    8    9    9    9    9    9    9    9    9    9    9    9    9    9 
 50%  51%  52%  53%  54%  55%  56%  57%  58%  59%  60%  61%  62%  63%  64%  65%  66%  67%  68%  69%  70%  71%  72%  73%  74% 
  10   10   10   10   10   10   10   10   10   10   10   10   11   11   11   11   11   11   11   11   11   11   11   11   12 
 75%  76%  77%  78%  79%  80%  81%  82%  83%  84%  85%  86%  87%  88%  89%  90%  91%  92%  93%  94%  95%  96%  97%  98%  99% 
  12   12   12   12   12   12   12   12   13   13   13   13   13   13   13   14   14   14   14   14   15   15   15   16   17 
100% 
  19 

Prozentrang

ecdf(pirates$age)(18)
[1] 0.065
plot.ecdf(pirates$age)

Varianz und Standardabweichung

var(pirates$sword.time, na.rm = T)
[1] 87.0448
var(pirates$sword.time, na.rm = T)*
   (length(pirates$sword.time)-1)/
   length(pirates$sword.time)
[1] 86.95775
sd(pirates$sword.time, na.rm=T)
[1] 9.32978
sqrt(var(pirates$sword.time, na.rm = T)*
        (length(pirates$sword.time)-1)/
        length(pirates$sword.time))
[1] 9.325114

Übersicht über Kennwerte

describe(pirates$age)
   vars    n  mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 1000 27.36 5.79     27   27.39 5.93  11  46    35 -0.02     0.01 0.18
X1 1Durchnummerierung der Variablen
n = 1000Stichprobengröße
mean = 27.36Arithmetisches Mittel
sd = 5.79Standardabweichung
median = 27Median
trimmed = 27.39Getrimmtes arithmetisches Mittel (siehe folgenden Abschnitt zu Ausreißerwerten)
mad = 5.93Median der absoluten Abweichungen vom Median (siehe folgenden Abschnitt zu Ausreißerwerten)
min = 11Kleinster Wert
max = 46Größter Wert
range = 35Spannweite
skew = -0.02Schiefe
kurtosis = 0.01Wölbung/Kurtosis der Verteilung gemäß der obigen Definition des Exzesses
se = 0.18Standardfehler (wird in späteren Units behandelt)
describe(data.frame(pirates$age, pirates$weight))
               vars    n  mean    sd median trimmed   mad min   max range  skew kurtosis   se
pirates.age       1 1000 27.36  5.79  27.00   27.39  5.93  11  46.0  35.0 -0.02     0.01 0.18
pirates.weight    2 1000 69.74 10.82  69.55   69.58 11.05  33 105.6  72.6  0.13    -0.08 0.34

Grafische Zusammenfassungen von Kennwerten

ggplot(pirates, aes(x="", y=age)) +
  geom_boxplot() +
  labs(x="", y="Alter der Piraten")
Grafikausgabe nachträglich beschriftet (Grün).
ggplot(pirates, aes(x="", y=age)) +
  stat_boxplot(geom="errorbar", width=0.5) +
  geom_boxplot() +
  labs(x="", y="Alter der Piraten") +
  scale_y_continuous(breaks = seq(10,50,5))

Umgang mit Ausreißerwerten

library(dslabs)
library(ggplot2)
library(psych)
library(tibble)
as_tibble(murders)
# A tibble: 51 x 5
   state                abb   region    population total
   <chr>                <chr> <fct>          <dbl> <dbl>
 1 Alabama              AL    South        4779736   135
 2 Alaska               AK    West          710231    19
 3 Arizona              AZ    West         6392017   232
 4 Arkansas             AR    South        2915918    93
 5 California           CA    West        37253956  1257
 6 Colorado             CO    West         5029196    65
 7 Connecticut          CT    Northeast    3574097    97
 8 Delaware             DE    South         897934    38
 9 District of Columbia DC    South         601723    99
10 Florida              FL    South       19687653   669
# ... with 41 more rows
murders$count_per_mio <- murders$total / murders$population * 1000000
ggplot(murders, aes(x="", y=count_per_mio)) +
  stat_boxplot(geom="errorbar", width=0.5) +
  geom_boxplot() +
  labs(x="", y="Anzahl der Morde pro 1Mio Bevölkerung") +
  scale_y_continuous(breaks = seq(0,200,10))
quantile(murders$count_per_mio, na.rm = T)
        0%        25%        50%        75%       100% 
  3.196211  12.526455  26.871225  33.861036 164.527532 
mean(murders$count_per_mio, na.rm = T)
[1] 27.79125
var(murders$count_per_mio, na.rm = T)
[1] 603.2518
sd(murders$count_per_mio, na.rm = T)
[1] 24.56118
murders2 <- murders[murders$count_per_mio < 60,]
quantile(murders2$count_per_mio, na.rm = T)
       0%       25%       50%       75%      100% 
 3.196211 12.128379 26.751860 32.537239 53.598917 
mean(murders2$count_per_mio, na.rm = T)
[1] 23.98777
var(murders2$count_per_mio, na.rm = T)
[1] 172.7777
sd(murders2$count_per_mio, na.rm = T)
[1] 13.14449
mean(murders$count_per_mio, trim=0.02, na.rm = T)
[1] 25.50266
mad(murders$count_per_mio, na.rm = T)
[1] 16.35604
describe(murders$count_per_mio, trim = 0.02)
   vars  n  mean    sd median trimmed   mad min    max  range skew kurtosis   se
X1    1 51 27.79 24.56  26.87    25.5 16.36 3.2 164.53 161.33 3.44    16.35 3.44

Verwendete Pakete und Funktionen

base

FunktionBeschreibung
Objekt <- …Beliebige Sachverhalte als Objekt abspeichern.
table(Variable)Absolute Häufigkeiten ausgeben.
prop.table(table(Variable))Relative Häufigkeiten bestimmen.
100*prop.table(table(Variable))Prozentwerte ermitteln.
cumsum(table(Variable))Kumulierte absolute Häufigkeiten berechnen.
cumsum(prop.table(table(Variable)))Kumulierte relative Häufigkeiten ausrechnen.
cumsum(100*prop.table(table(Variable))))Kumulierte Prozentwerte bestimmen.
cbind(Vektor1, Vektor2, ..)Eine Reihe von Vektoren identischer Länge als Spalten verknüpfen.
round(x, Anzahl Dezimalstelle)Alle Werte in x auf die Anzahl Dezimalstellen runden.
which.max(table(Variable))Modalwert bestimmen. ❗ Funktioniert nur bei eingipfligen Verteilungen, bei dem der Modalwert eindeutig ist.
max(table(Variable))Anzahl des Modalwerts bestimmen.
mean(Variable, na.rm = T)Arithmetisches Mittel ermitteln.
– Missings ausschließen.
range(Variable, na.rm = T)Streubereich abfragen.
– Missings ausschließen.
diff(range(Variable, na.rm = T))Spannweite berechnen.
– Missings ausschließen.
seq(von,bis,um)Zahlenreihe generieren.
sqrt(Zahl)Quadratwurzel berechnen.
length()Dimension Länge abfragen:
– Vektor : Länge
– Data Frame : Anzahl Variablen

ggplot2

FunktionBeschreibung
ggplot(Datensatz, aes(x=Variable)) +
geom_bar() +
labs(x=”Text”, y=”Text”)
Säulendiagramm erstellen:
– Die y-Variable wurde nicht vorgegeben. ggplot verwendet automatisch die Häufigkeiten der Merkmalsausprägungen der x-Variable
– Beide Achsen beschriften.
ggplot(Datensatz, aes(x=Variable)) +
geom_histogram(
na.rm=T,
binwidth=Zahl
boundary=Zahl) +
labs(x=”Text”, y=”Text”) +
scale_x_continuous(
breaks=seq(von, bis, um))
Histogramm erstellen:
– Missings ausschließen.
– Breite der Säulen vorgeben.
— Ansonsten ist voreingestellt, dass die Werte in 30 Gruppen aufgeteilt werden.
– Intervallgrenzen verschieben.
– Beide Achsen beschriften.
– x-Achsenmarkierungen anpassen.
ggplot(Datensatz, aes(x=””, y=Variable)) +
stat_boxplot(geom=”errorbar”, width=0.5) +
geom_boxplot() +
labs(x=””, y=”Text”) +
scale_y_continuous(breaks = seq(von,bis,um))
Boxplot erstellen:
– Achtung x-Variable muss leer sein.
– Whiskers vor dem Geom hinzufügen.
– Achsen beschriften.
– Achsenmarkierungen anpassen.

graphics

FunktionBeschreibung
barplot(
table(Variable),
ylab=”Text”)
Säulendiagramm erstellen:
– Auf der y-Achse werden die absoluten Häufigkeiten abgetragen.
– Beschriftung der y-Achse.
hist(
Variable,
xlab=”Text”,
ylab=”Text”=
Histogramm für Variable erzeugen.
– Beide Achsen beschriften.

psych

FunktionBeschreibung
describe(Variable, trim=Zahl)Übersicht deskriptiver Kennwerte erstellen.
– Voreinstellung für getrimmtes Mittel ist 10% an beiden Enden.
describe(Data Frame)Übersicht deskriptiver Kennwerte für mehrere Variablen erstellen.

stats

FunktionBeschreibung
median(Variable, na.rm = T)Median ermitteln.
– Missings ausschließen.
quantile(Variable, na.rm = T)Quartile ermitteln.
– Missings ausschließen.
quantile(Variable, 0.10, na.rm = T)10%-Quantil ausgeben.
quantile(Variable, 0.63, na.rm = T)63. Perzentil bestimmen.
quantile(Variable, seq(0,1,0.01), na.rm = T)Alle Perzentile ausgeben.
IQR(Variable, na.rm = T)Interquartilsabstand bestimmen.
– Missings ausschließen.
ecdf(Variable)(Merkmalsausprägung)Prozentrang bestimmen.
plot.ecdf(Variable)Prozentränge grafisch abbilden.
var(Variable, na.rm = T)Populationsvarianz bestimmen.
var(Variable, na.rm = T)*
(length(Variable)-1)/
length(Variable)
Stichprobenvarianz berechnen.
sd(Variable, na.rm=T)Populationsstandardabweichung bestimmen.
sqrt(var(Variable, na.rm = T)*
(length(Variable)-1)/
length(Variable))
Stichprobenstandardabweichung berechnen.
mad(Variable, na.rm = T)Median der absoluten Abweichung vom Median berechnen.

tibble

FunktionBeschreibung
as_tibble()Eine Datensatz, wie bspw. einen Data Frame, eine List oder Matrix in ein sogenanntes Tibble umwandeln. Ein Tibble ist ein Data Frame der Klasse tbl_df.

Schreibe einen Kommentar