6 – Lösungen

Statistische Datenanalyse mit R

Autor

Clemens Brunner

Veröffentlicht

13. November 2025

Übung 1

library(readr)
library(psych)
library(pastecs)
library(car)

df = read_delim("household_power_consumption.zip", delim=";", na=c("", "?"))

sapply(df[, 3:6], mean, na.rm=TRUE)
  Global_active_power Global_reactive_power               Voltage      Global_intensity 
            1.0916150             0.1237145           240.8398580             4.6277593 
sapply(df[, 3:6], median, na.rm=TRUE)
  Global_active_power Global_reactive_power               Voltage      Global_intensity 
                0.602                 0.100               241.010                 2.600 
sapply(df[, 3:6], min, na.rm=TRUE)
  Global_active_power Global_reactive_power               Voltage      Global_intensity 
                0.076                 0.000               223.200                 0.200 
sapply(df[, 3:6], max, na.rm=TRUE)
  Global_active_power Global_reactive_power               Voltage      Global_intensity 
               11.122                 1.390               254.150                48.400 
summary(df[, 3:6])
 Global_active_power Global_reactive_power    Voltage      Global_intensity
 Min.   : 0.076      Min.   :0.0000        Min.   :223.2   Min.   : 0.200  
 1st Qu.: 0.308      1st Qu.:0.0480        1st Qu.:239.0   1st Qu.: 1.400  
 Median : 0.602      Median :0.1000        Median :241.0   Median : 2.600  
 Mean   : 1.092      Mean   :0.1237        Mean   :240.8   Mean   : 4.628  
 3rd Qu.: 1.528      3rd Qu.:0.1940        3rd Qu.:242.9   3rd Qu.: 6.400  
 Max.   :11.122      Max.   :1.3900        Max.   :254.2   Max.   :48.400  
 NA's   :25979       NA's   :25979         NA's   :25979   NA's   :25979   
describe(df[, 3:6])
                      vars       n   mean   sd median trimmed  mad    min    max range  skew kurtosis se
Global_active_power      1 2049280   1.09 1.06   0.60    0.90 0.59   0.08  11.12 11.05  1.79     4.22  0
Global_reactive_power    2 2049280   0.12 0.11   0.10    0.11 0.13   0.00   1.39  1.39  1.26     2.61  0
Voltage                  3 2049280 240.84 3.24 241.01  240.93 2.88 223.20 254.15 30.95 -0.33     0.72  0
Global_intensity         4 2049280   4.63 4.44   2.60    3.83 2.67   0.20  48.40 48.20  1.85     4.60  0
round(stat.desc(df[, 3:6]), 1)
             Global_active_power Global_reactive_power     Voltage Global_intensity
nbr.val                2049280.0             2049280.0   2049280.0        2049280.0
nbr.null                     0.0              481561.0         0.0              0.0
nbr.na                   25979.0               25979.0     25979.0          25979.0
min                          0.1                   0.0       223.2              0.2
max                         11.1                   1.4       254.2             48.4
range                       11.0                   1.4        31.0             48.2
sum                    2237024.9              253525.6 493548304.1        9483574.6
median                       0.6                   0.1       241.0              2.6
mean                         1.1                   0.1       240.8              4.6
SE.mean                      0.0                   0.0         0.0              0.0
CI.mean.0.95                 0.0                   0.0         0.0              0.0
var                          1.1                   0.0        10.5             19.8
std.dev                      1.1                   0.1         3.2              4.4
coef.var                     1.0                   0.9         0.0              1.0

Aus den Ausgaben der zusammenfassenden Statistiken kann abgelesen werden, dass die mittlere Spannung 240.84 und der Median der globale Wirkleistung 0.602 beträgt. Die Funktion summary() zeigt außerdem an, dass es pro Spalte 25979 fehlende Werte gibt (unter NA's).

Übung 2

library(palmerpenguins)

Attaching package: 'palmerpenguins'
The following objects are masked from 'package:datasets':

    penguins, penguins_raw
dim(penguins)  # 344 Zeilen, 8 Spalten
[1] 344   8
summary(penguins)
      species          island    bill_length_mm  bill_depth_mm   flipper_length_mm  body_mass_g       sex     
 Adelie   :152   Biscoe   :168   Min.   :32.10   Min.   :13.10   Min.   :172.0     Min.   :2700   female:165  
 Chinstrap: 68   Dream    :124   1st Qu.:39.23   1st Qu.:15.60   1st Qu.:190.0     1st Qu.:3550   male  :168  
 Gentoo   :124   Torgersen: 52   Median :44.45   Median :17.30   Median :197.0     Median :4050   NA's  : 11  
                                 Mean   :43.92   Mean   :17.15   Mean   :200.9     Mean   :4202               
                                 3rd Qu.:48.50   3rd Qu.:18.70   3rd Qu.:213.0     3rd Qu.:4750               
                                 Max.   :59.60   Max.   :21.50   Max.   :231.0     Max.   :6300               
                                 NA's   :2       NA's   :2       NA's   :2         NA's   :2                  
      year     
 Min.   :2007  
 1st Qu.:2007  
 Median :2008  
 Mean   :2008  
 3rd Qu.:2009  
 Max.   :2009  
               
by(penguins[, 3:5], penguins$species, colMeans, na.rm=TRUE)
penguins$species: Adelie
   bill_length_mm     bill_depth_mm flipper_length_mm 
         38.79139          18.34636         189.95364 
------------------------------------------------------------------------------------------ 
penguins$species: Chinstrap
   bill_length_mm     bill_depth_mm flipper_length_mm 
         48.83382          18.42059         195.82353 
------------------------------------------------------------------------------------------ 
penguins$species: Gentoo
   bill_length_mm     bill_depth_mm flipper_length_mm 
         47.50488          14.98211         217.18699 

Die Faktorspalten species und island haben jeweils drei Stufen, die Spalte sex hat zwei Stufen (wobei hier auch fehlende Werte vorkommen). Laut summary(penguins) gibt es in den Spalten 3–6 jeweils 2 fehlende Werte und in der 7. Spalte 11 fehlende Werte.

Übung 3

str(mtcars)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
describe(mtcars)  # min, max, mean, median
     vars  n   mean     sd median trimmed    mad   min    max  range  skew kurtosis    se
mpg     1 32  20.09   6.03  19.20   19.70   5.41 10.40  33.90  23.50  0.61    -0.37  1.07
cyl     2 32   6.19   1.79   6.00    6.23   2.97  4.00   8.00   4.00 -0.17    -1.76  0.32
disp    3 32 230.72 123.94 196.30  222.52 140.48 71.10 472.00 400.90  0.38    -1.21 21.91
hp      4 32 146.69  68.56 123.00  141.19  77.10 52.00 335.00 283.00  0.73    -0.14 12.12
drat    5 32   3.60   0.53   3.70    3.58   0.70  2.76   4.93   2.17  0.27    -0.71  0.09
wt      6 32   3.22   0.98   3.33    3.15   0.77  1.51   5.42   3.91  0.42    -0.02  0.17
qsec    7 32  17.85   1.79  17.71   17.83   1.42 14.50  22.90   8.40  0.37     0.34  0.32
vs      8 32   0.44   0.50   0.00    0.42   0.00  0.00   1.00   1.00  0.24    -2.00  0.09
am      9 32   0.41   0.50   0.00    0.38   0.00  0.00   1.00   1.00  0.36    -1.92  0.09
gear   10 32   3.69   0.74   4.00    3.62   1.48  3.00   5.00   2.00  0.53    -1.07  0.13
carb   11 32   2.81   1.62   2.00    2.65   1.48  1.00   8.00   7.00  1.05     1.26  0.29
shapiro.test(mtcars$mpg)

    Shapiro-Wilk normality test

data:  mtcars$mpg
W = 0.94756, p-value = 0.1229

Die Nullhypothese der Normalverteilung kann nicht verworfen werden (\(p = 0.123\)).

leveneTest(mtcars$mpg, mtcars$cyl)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value  Pr(>F)   
group  2  5.5071 0.00939 **
      29                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Die Nullhypothese der Varianzhomogenität kann verworfen werden (\(p = 0.009\)).

Übung 4

library(readr)

df = read_tsv("lecturer.dat")

Versuchen wir zunächst, die Mittelwerte der numerischen Spalten mit der Funktion mean() zu berechnen:

by(df[, -(1:3)], df$job, mean)
Warning in mean.default(data[x, , drop = FALSE], ...): argument is not numeric or logical: returning NA
Warning in mean.default(data[x, , drop = FALSE], ...): argument is not numeric or logical: returning NA
df$job: 1
[1] NA
------------------------------------------------------------------------------------------ 
df$job: 2
[1] NA

Dies führt zu Warnungen sowie NA für die Ergebnisse beider Gruppen. Der Grund ist, dass die gruppierten Daten nach wie vor als Data Frame mit vier numerischen Spalten vorliegen. Die Funktion mean() funktioniert aber nur mit einem Vektor (bzw. einer einzigen Spalte eines Data Frames). Daher müssen wir eine andere Aggregierungsfunktion verwenden, die mit Data Frames umgehen kann. Eine Möglichkeit ist die Funktion colMeans():

by(df[, -(1:3)], df$job, colMeans)
df$job: 1
 friends  alcohol   income neurotic 
     2.4     16.0  33400.0     15.0 
------------------------------------------------------------------------------------------ 
df$job: 2
 friends  alcohol   income neurotic 
    13.2     19.2   3622.0     11.2 

Übung 5

set.seed(4)  # stellt sicher, dass die Zufallszahlen reproduzierbar sind
x = rnorm(5001)
shapiro.test(x)
Error in shapiro.test(x): sample size must be between 3 and 5000

Die Funktion shapiro.test() funktioniert nur bis zu einer Stichprobengröße von 5000, darüber hinaus wird ein Fehler ausgegeben. Für dieses Verhalten gibt es zwei Gründe:

  1. Es ist generell nicht sinnvoll, eine sehr große Stichprobe auf Normalverteilung zu testen, da die Teststatistik selbst bei geringsten Abweichungen von der Normalverteilung sehr wahrscheinlich signifikant wird.
  2. Theoretisch könnte der Shapiro-Wilk-Test auch für Stichproben größer als 5000 gerechnet werden, dies wurde in der ursprünglichen Publikation des Tests sowie dessen Implementierung in der Programmiersprache FORTRAN jedoch nicht berücksichtigt. Die Funktion shapiro.wilk() in R basiert auf dieser FORTRAN-Implementierung und ist daher ebenfalls auf Stichproben bis zu einer Größe von 5000 beschränkt.

Eine detaillierte Erklärung von Ben Bolker ist hier zu finden.