Kapitel 8 Nominale (kategorielle) Daten zusammenfassen

Sie müssen Statistik nicht lieben. Es hilft aber Kaffee zu mögen.

Bis jetzt haben wir intervallskalierte und ordinale Daten zusammengefasst. Wie fassen wir jedoch nominale Daten zusammen?

8.1 Absolute und relative Häufigkeiten.

Wir erfinden einen Datensatz (Data Frame) mit 100 Patientinnen und Patienten. Wir haben die Variablen Geschlecht und Stürzer (0/1).

Id=1:100
Geschlecht<-sample(c("Frauen","Männer"), size=100, replace = TRUE, prob=c(0.49,0.51))

data<-data.frame(Id, Geschlecht)

data<-data %>% 
  mutate(Stuerzer=case_when(
    Geschlecht=="Frauen"~sample(c(0,1), size=nrow(.), replace=TRUE, prob=c(0.6,0.4)), 
    Geschlecht=="Männer"~sample(c(0,1), size=nrow(.), replace=TRUE, prob=c(0.7, 0.3))
  )) %>% 
  mutate(Stuerzer.factor=factor(Stuerzer, levels=c(0,1), labels=c("Nicht-Stürzer", "Stürzer")))
summarytools::ctable(data$Geschlecht, data$Stuerzer.factor)

Cross-Tabulation, Row Proportions
Geschlecht * Stuerzer.factor
Data Frame: data

Stuerzer.factor Nicht-Stürzer Stürzer Total
Geschlecht
Frauen 31 (64.6%) 17 (35.4%) 48 (100.0%)
Männer 34 (65.4%) 18 (34.6%) 52 (100.0%)
Total 65 (65.0%) 35 (35.0%) 100 (100.0%)
summary <- data %>%
  group_by(Geschlecht, Stuerzer.factor) %>%
  summarise(Freq = n()) %>%
  group_by(Geschlecht ) %>% 
  mutate(Prop = round(Freq / sum(Freq),2))
## `summarise()` has grouped output by 'Geschlecht'. You can override using the
## `.groups` argument.
(ggplot(summary, aes(Stuerzer.factor, y=Freq))) +
  geom_bar(aes(fill=Stuerzer.factor), stat='identity') +
  facet_grid(~Geschlecht)+
  stat_count(aes(label=paste0(sprintf("%1.1f", summary$Prop*100),
                              "%\n", summary$Freq), y=summary$Freq-4+..count..), 
             geom="text", colour="white", size=4, position=position_dodge(width=1)) +
  theme_classic()+
  theme(legend.position="none")+
  ylab("Häufigkeit")+
  xlab("Nicht-Stürzer / Stürzer")+
  scale_fill_manual(values=c("#D321FF", "#822499"))
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
Balkendiagramm absolute und relative Häufigkeit der Stürze, aufgeteilt nach Geschlecht

Abbildung 8.1: Balkendiagramm absolute und relative Häufigkeit der Stürze, aufgeteilt nach Geschlecht

8.2 Absolute Häufigkeit in R

table(data$Diagnosen)
## 
##   Arthrose Knie       Parkinson Rückenschmerzen    Schlaganfall 
##              30              10              50              10

8.3 Relative Häufigkeit in R

Ehrlich gesagt, benutze ich nie die base R Variante die ich hier zeige. Entweder rechne ich es in einem Data Frame aus (nächster Abschnitt), oder ich benutze den Befehl freq vom summarytools Paket.

(diagnosen.freq<-table(data$Diagnosen))
## 
##   Arthrose Knie       Parkinson Rückenschmerzen    Schlaganfall 
##              30              10              50              10
(diagnosen.rel.freq<-diagnosen.freq / nrow(data) )
## 
##   Arthrose Knie       Parkinson Rückenschmerzen    Schlaganfall 
##             0.3             0.1             0.5             0.1

8.3.1 Berechnung der relativen Häufigkeit in einem Data Frame

Die erste Variante funktioniert nur, wenn man keine fehlenden Werte hat. Sonst muss man zuerst die Funktion length2 ausführen und dann anstatt length length2 benutzen. Dank geht an die Autoren dieser Funktion http://www.cookbook-r.com/Manipulating_data/Summarizing_data/

relative_freq <- data %>%
  group_by(Diagnosen) %>%
  summarise(Freq = length(Diagnosen)) %>%
  mutate(Proportion = round(Freq / sum(Freq),2)) %>% 
  mutate(Prozente=round(Proportion*100,1))

DT::datatable(relative_freq)

Zweite Variante falls es fehlenden Werte (NAs) gibt.

Dank an den Autor vom Cookbook-r

# New version of length which can handle NA's: if na.rm==T, don't count them
    length2 <- function (x, na.rm=FALSE) {
        if (na.rm) sum(!is.na(x))
        else       length(x)
    }

# Hier füge ich Missing Values (Nas) ein: 
data$Diagnosen[10:19]<-NA

Erste Version, wo der Anteil der Werte auf alle (d.h. inklusive Missing Values) berechnet wird

relative_freq <- data %>%
  group_by(Diagnosen) %>%
  summarise(Freq = length(Diagnosen)) %>%
  mutate(Proportion = round(Freq / sum(Freq),2)) %>% 
  mutate(Prozente=round(Proportion*100,1))

DT::datatable(relative_freq)

Hier die zweite Version, wo die Prozente der nicht-fehlenden Werte nur auf alle nicht-fehlenden Werte berechnet werden. deswegen sind die Prozente höher, da der Nenner (d.h. das N) reduziert wurde und die Missing Values nicht berüchsichtigt werden. Die fehlenden Werte jedoch so nicht mehr gezählt und nicht dokumentiert.

relative_freq <- data %>%
  group_by(Diagnosen) %>%
  summarise(Freq = length2(Diagnosen, na.rm=TRUE)) %>%
  mutate(Proportion = round(Freq / sum(Freq),2)) %>% 
  mutate(Prozente=round(Proportion*100,1))

DT::datatable(relative_freq)

8.4 Kumulative Prozente

Ein hilfreiches Tool in R ist das Paket summarytools, mit der Funktion freq können wir uns die absolute Häufigkeit, die relative Häufigkeit (%) und die kumulative relative Häufigkeit anzeigen lassen. Die kumulierten relativen Häufigkeiten sind, wie der Name schon sagt, einfach die zusammengezählten Prozente.

summarytools::freq(data$Diagnosen)

Frequencies
data$Diagnosen
Type: Character

Freq % Valid % Valid Cum. % Total % Total Cum.
Arthrose Knie 21 23.33 23.33 21.00 21.00
Parkinson 9 10.00 33.33 9.00 30.00
Rückenschmerzen 50 55.56 88.89 50.00 80.00
Schlaganfall 10 11.11 100.00 10.00 90.00
10 10.00 100.00
Total 100 100.00 100.00 100.00 100.00

8.5 “Culture générale” Proportion (Standardabweichung / Standardfehler)

Lassen Sie sich vom folgenden Abschnitt nicht verwirren!

Im Prinzip präsentieren wir nie eine Standardabweichung für eine Proportion. Die nächsten Zeilen sind nur für diejenigen, die später die Formel zum Standardfehler für eine Proportion besser verstehen wollen: Die Standardabweichung einer Proportion ist:

\[\begin{equation} \sqrt{\pi(1-\pi)} \tag{8.1} \end{equation}\]

Beachte: \(\pi\) steht hier nicht für die mathematische Konstante 3.14159265359, sondern für die Populations-Proportion. Diese Formel für die Standardabweichung hilft uns, die Formel für den Standardfehler zu verstehen.

Die Formel des Standardfehlers einer Proportion wird meistens so dargestellt: \[\begin{equation} \sqrt{\frac{\pi(1-\pi)}{N}} \tag{8.2} \end{equation}\]

Hier sehen wir nicht auf den ersten Blick, dass die Standardabweichung - die wir oben in der Formel gesehen haben - im Zähler ist. Um dies besser zu sehen, können wir diese Formel auch anders darstellen:

\[\begin{equation} \frac{\sqrt{\pi(1-\pi)}}{\sqrt(N)} \tag{8.3} \end{equation}\]

Hier sehen wir jetzt die Standardabweichung \(\sqrt \pi(1-\pi)\) im Zähler. So erinnert uns die Formel an die Formel des Standardfehlers des Mittelwertes:

\[\begin{equation} \frac{\sigma}{\sqrt{(N)}} \tag{8.4} \end{equation}\]

(Sigma ist die Populationsstandardabweichung und wird durch unsere Standardabweichung der Stichprobe ersetzt).

Bei der Formel für den Standardfehler der Proportion ist dies eigentlich genau gleich, der Zähler ist die Standardabweichung.

\[\begin{equation} \frac{\sqrt{\pi(1-\pi)}}{\sqrt(N)} \tag{8.3} \end{equation}\]

Da wir im Zähler und im Nenner eine Wurzel haben, können wir umformulieren, indem wir die beiden Wurzel-Zeichen vor den Bruch ziehen: \[\begin{equation} \sqrt\frac{\pi(1-\pi)}{N} \tag{8.2} \end{equation}\]

Wir lieben Kaffee, aber wir lieben es noch mehr, wenn das Kapitel endlich zu Ende ist…Here we are…