15  Deskriptive Statistik

Letzte Änderung am 23. April 2024 um 10:31:50

“Alles was überhaupt gedacht werden kann, kann klar gedacht werden. Alles was sich aussprechen lässt, lässt sich klar aussprechen.” — Ludwig Wittgenstein, Satz 4.116

Wir nutzen die deskriptive Statistik um Zahlen zusammenzufassen. Zahlen, die wir an Individuen oder Beobachtungen erhoben haben. Diese Zahlen fassen wir dann in einem Datensatz zusammen. Das heißt wir haben am Ende einen Datensatz mit Spalten in denen sich Zahlen befinden vorliegen. Wir nehmen hier als Beispiel den Datensatz zu den Sprungweiten der Hundeflöhe. Wir wollen jetzt den Datensatz in wenigen Zahlen zusammenfassen (eng. summarize). Wie können wir mit wenigen Zahlen die Sprungweite charakterisieren? Oder aber eine Aussage über die Infektionen machen? Dafür hiolfen uns dann die statistischen Maßzahlen in diesem Kapitel.

Warum mit wenigen Zahlen Daten zusammenfassen? Wenn wir das Ergebnis präsentieren wollen, dann müssen es wenige Zahlen sein, die den Datensatz gut zusammenfassen. Wir haben ja nicht den Platz ganze Exceltabellen abzubilden. Auch ist diese Form der Datendarstellung sehr unübersichtlich. Daher ist es wichtig zu verstehen, dass wir dutzende bis hunderte Zahlen aus einem Datensatz durch meist eine oder zwei statistische Maßzahlen beschreiben wollen. Wir brauchen die statistischen Maßzahlen später um teilweise noch extrem größere Datensätze darstellen zu können. Ebenso werden wir die Maßzahlen aus diesem Kapitel dafür verwenden statistische Tests und Modelle zu rechnen. Springen die Hundeflöhe im Mittel weiter als die Katzenflöhe? Hier würden wir dann die Mittelwerte der Sprungweiten vergleichen. Dazu dann aber später in einem anderen Kapitel mehr.

Nun ist es so, dass wir nicht jede Spalte an Zahlen in einem Datensatz gleich zusammenfassen können. Wir du schon in dem Kapitel über die Zahlen und Buchstaben in R gesehen hast unterscheidet R Zahlen je nach Eigenschaften der Zahlen. Das macht aber nicht nur R so, sondern jedes statistische Programm. Nicht jede statistische Maßzahl passt zu jeder Zahlenreihe. Es gibt es nicht nur “Zahlen”, sondern auch kontinuierliche Zahlen oder aber kategoriale Zahlen. Eine Besonderheit stellen Zahlen dar, die eine Eigenschaft von Tieren nur mit zwei Ausprägungen beschreiben.

Konkret ist eine Variable gleich einer Spalte in einem Datensatz.

Die Tabelle 15.1 zeigt nochmal die gekürzte Übersicht über einzelne Variablennamen aus dem Hundeflohdatensatz und deren zugehörigen Zahlen sowie deren Bezeichnung in R, als Skalenniveau und welcher Verteilungsfamilie die Variable angehören würde. Leider ist es so, dass wieder gleiche Dinge unterschiedliche benannt werden. Aber an dieses doppelte Benennen können wir uns in der Statistik schon mal gewöhnen.

Tabelle 15.1— Zusammenfassung und Übersicht von Variablennamen und deren Benenung in R und als Skalenniveau.
Variablenname Beispiel R Skalenniveau Verteilungsfamilie
jump_length 5.7, 8.9, 11.8 numeric continuous Gaussian
flea_count 18, 22, 17 integer discrete Poisson
grade 8, 6, 7 ordered categorical / ordinal Ordinal
infected 0, 1 factor dichotomous / binary / nominal Binomial

Soweit so kompliziert. Wir gehen jetzt aber mal die gängigen statistischen Maßzahlen für verschiedene Zahlen, die wir so erheben können, durch. Dabei fokussieren wir einmal auf die händische Berechnung und ich zeige dann aber auch die Berechnung in R. Dabei nehmen wir erstmal den Hundeflohdatensatz als Beispiel für die händische Berechnung und für die Automatisierung in R am Ende des Kapitels unseren Gummibärchendatensatz.

15.1 Genutzte R Pakete

Wir wollen folgende R Pakete in diesem Kapitel nutzen.

pacman::p_load(tidyverse, magrittr, readxl, gtsummary,
               janitor, see, patchwork, modelsummary)

An der Seite des Kapitels findest du den Link Quellcode anzeigen, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.

15.2 Daten

In diesem Kapitel wollen wir uns einmal die Daten zu den Sprungweiten verschiedener Hundeflöhe sowie die Eigenschaften der Hunde einmal genauer ansehen. Wir laden also als erstes einmal die Daten und filtern nur die Hunde aus den Daten. Wir wollen jetzt die Spalten oder eben auch Variablen der Daten einmal sinnvoll zusammenfassen und durch wenige statistische Maßzahlen beschreiben.

flea_dog_tbl <- read_excel("data/flea_dog.xlsx") 

Die Tabelle 15.2 zeigt nochmal die Daten dargestellt. Zur Erinnerung, wir wollen jetzt die Spalten mit wenigen Zahlen zusammenfassen.

Tabelle 15.2— Tabelle der Sprunglängen [cm], Anzahl an Flöhen, Boniturnote sowie der Infektionsstatus von Hundeflöhen.
animal jump_length flea_count weight grade infected
dog 5.7 18 2.1 8 0
dog 8.9 22 2.3 8 1
dog 11.8 17 2.8 6 1
dog 5.6 12 2.4 8 0
dog 9.1 23 1.2 7 1
dog 8.2 18 4.1 7 0
dog 7.6 21 3.2 9 0

Wir fangen jetzt erstmal mit den kontinuierlichen Variablen an und schauen dann später auf die kategorialen Variablen. Nehmen wir also als erstes Beispiel die Sprungweiten in [cm] von Hundeflöhen. Wir messen die Sprungweiten von sieben Hundeflöhen und erhalten dabei folgende Werte in [cm]: 5.7, 8.9, 11.8, 5.6, 9.1, 8.2 und 7.6. Wir schreiben diese Sprungweiten nun als \(y\) in einen Vektor in der folgenden Form auf.

\[ y = \{5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6\}. \]

Du findest in Kapitel 9 den Einstieg für die Programmierung in R. Da findest du auch die Erklärung für c() und den Zuweisungspfeil <-.

In R würde der Vektor der Zahlen etwas anders aussehen, aber das hat eher was mit der Schreibweise der Mathematik und der Informatik zu tun. Inhaltlich sehen wir hier gleichen Informationen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6) 

Wir wollen nun die Sprungweiten in \(y\) beschrieben und durch wenige andere Zahlen zusammenfassen. Einige dieser statistischen Maßzahlen sind dir vermutlich schon bekannt, andere eher neu. Wir gehen jetzt also gemeinsam eine Menge an statistischen Maßzahlen durch. Nicht alle wirst du immer brauchen und dir auch nicht merken müssen. Wichtig ist zu wissen, dass es die folgenden statistischen Maßzahlen gibt und das du dann im Zweifel den Begriff nachschlagen kannst. Ich mache das im Prinzip auch nicht anders.

Warum \(y\) und nicht \(x\)?

Wenn du dir andere Statistikbücher anschaust, dann wird meist die Variable, mit der wir den Mittelwert berechnen, mit \(x\) bezeichnet. Wir machen das hier nicht denn wir haben später für das \(x\) eine andere Verwendung. In einem statistischen Modell schauen wir uns den Zusammenhang von \(y \sim x\) an. Die Sprungweite von Hundeflöhen ist das \(y\) und nicht das \(x\). Glaube mir, es wird nachher leichter zu verstehen. Dafür nehmen wir jetzt einen etwas schwierigen Weg.

15.3 Arithmetisches Mittel

Der Mittelwert einer Zahlenreihe beschreibt den Schwerpunkt der Zahlen. Was soll das Bedeuten? Was ist der Schwerpunkt von Zahlen? Du kannst dir das wie eine Wippe vorstellen, der Mittelwert liegt so, dass links und rechts des Mittelwerts gleiche Abstände zu den Zahlen vorliegen. Der Mittelwert wird auch als Lageparameter benannt. Der Mittelwert ist damit auch der Lageparameter einer Verteilung. Er beschreibet die numerische Stelle, wo die Verteilungskurve am höchsten ist. Wir schreiben den Mittelwert mit einem Strich über den Vektor, der die Zahlen enthält. Im Folgenden ist die Formel für den Mittelwert der Sprungweite in [cm] der Hunde gezeigt. Der Mittelwert ist in dem Sinne eine künstliche Zahl, da der Mittelwert häufig nicht in den beobachteten Zahlen vorkommt.

Wir werden immer mal wieder Formeln vereinfachen. Zum Beispiel nur \(\sum\) schreiben anstatt \(\sum_i^n\), wenn wir einen Vektor aufsummieren und uns die Indizes sparen. Ja, das ist nicht schön, aber einfacher.

Im Folgenden sehen wir einmal wie der Mittelwert mathematisch oder schrittweise in R berechnet wird. Beachte hierbei die unterschiedliche Schreibweise. Wir haben hier ja auch zwei unterschiedliche Sprachen abgebildet. Wir haben nämlich eine mathematische Sprache und einmal eine Programmiersprache vorliegen.

\[ \bar{y} = \sum_{i=1}^{n}\cfrac{y_i}{n} = \cfrac{5.7 + 8.9 + 11.8 + 5.6 + 9.1 + 8.2 + 7.6}{7} = \cfrac{56.9}{7} = 8.13 \]

Einmal der Vektor y mit den Zahlen, die wir benutzen wollen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6) 
y
[1]  5.7  8.9 11.8  5.6  9.1  8.2  7.6

Die Summe von y.

sum(y)
[1] 56.9

Die Länge des Vektors y oder eben die Anzahl \(n\) gleich der Fallzahl.

length(y)
[1] 7

Und dann einmal händisch der Mittelwert von y berechnet.

sum(y)/length(y)
[1] 8.128571
mean(y)
[1] 8.128571

Wir sagen also, dass im Durchschnitt oder im Mittel die Hundeflöhe 8.13 cm weit springen. In der Abbildung 15.1 wollen wir die Formel nochmal visualisieren. Vielleicht fällt dir dann der Zusammenhang von dem Index \(i\) und der gesamten Fallzahl \(n\) leichter.

Abbildung 15.1— Zusammenhang zwischen \(y\) sowie dem Index \(i\) in der Formel für den Mittelwert.

In R können wir den Mittelwert einfach mit der Funktion mean() berechnen. Dann nutzen wir nochmal den Pipe Operator |> für die Berechnung des Mittelwertes. Wir wollen dann den Mittelwert noch auf die zweite Kommastelle runden. Das machen wir dann mit der Funktion round(). Du findest in Kapitel 9 den Einstieg für die Programmierung in R. Da findest du auch die Erklärung für den Pipe Operator |>.

## mit pipe-Operator
y |> mean() |> round(2)
[1] 8.13

Wir erhalten das gleiche Ergebnis wie oben in unserer händischen Rechnung. Die Hundeflöhe springen im Mittel 8.13 cm weit. Ja, für so einfache Beispiele ist es natürlich etwas kompliziert R zu nutzen und Code zu schreiben, später wird uns der Code aber sehr helfen.

Der Mittelwert ist eine bedeutende statistische Maßzahl der Normalverteilung. Später wirst du noch mehr über Verteilungen von Zahlen erfahren und deshalb hier schon mal die kurze Verbindung vom Mittelwert zur Normalverteilung. Daher merken wir uns hier schon mal, dass wir den Mittelwert brauchen werden. Auch wenn wir darüber nachdenken ob sich zwei Gruppen unterscheiden, so nutzen wir hierzu den Mittelwert. Unterscheiden sich die mittleren Sprungweiten in [cm] von Hunde- und Katzenflöhen?

15.4 Geometrisches Mittel

Im Gegensatz zum arithmetischen Mittel ist das geometrische Mittel nur für nicht negative Zahlen \(y\) definiert. Wir können also für negative Zahlen kein geometrische Mittel berechnen. Das geometrische Mittel ist daher nur für echt positive Zahlen sinnvoll. Wenn eine der Zahlen in \(y\) gleich Null ist, ist schon das ganze Produkt der Zahlen gleich Null. Somit ist dann das geometrische Mittel sinnlos. Schauen wir uns einmal die Formel des geometrischen Mittels an.

\[ \bar{y}_\mathrm{geom} = \sqrt[n]{\prod_{i=1}^n{y_i}} = \sqrt[n]{y_1 \cdot y_2 \dotsm y_n} = (y_1 \cdot y_2 \dotsm y_n)^{1/n} \]

Dann rechnen wir doch auch gleich mal ein Beispiel mit den vier Zahlen \(y = \{4, 3, 6, 9\}\).

\[ \bar{y}_\mathrm{geom} = \sqrt[4]{4 \cdot 3 \cdot 6 \cdot 9} =\sqrt[4]{648} = 5.045 \]

Um die Besonderheit des geometrische Mittelwerts zum arithmetischen Mittel zu verstehen, nehmen wir einmal ein Beispiel mit nur den Zahlen \(y = \{1,9\}\). Bei der geometrischen Mittelwertbildung weichen beide Werte vom Mittelwert um denselben Multiplikator ab. Diese Eigenschaft ist beim arithmetischen Mittel nicht gegeben. So ergibt sich aus den Zahlen 1 und 9 das arithmetische Mittel 5. Dabei ist die 1 vom Mittelwert 5 um Faktor 5 entfernt, während die 9 lediglich um Faktor 1.8 davon entfernt liegt.

Das geometrische Mittel aus 1 und 9 hingegen ergibt den Mittelwert \(\bar{y}_\mathrm{geom} = 3\). Sowohl der niedrige Wert 1 wie auch der hohe Wert 9 sind vom Mittelwert 3 um den Faktor 3 entfernt. Der Unterschied zwischen arithmetischem und geometrischem Mittelwert kann beträchtlich sein, was in der Praxis unter Umständen zur Fehlinterpretation von Durchschnittsangaben führt.

In R können wir das geometrische Mittel einfach mit der Funktion geometric.mean() aus dem R Paket {psych} berechnen.

c(4, 3, 6, 9) |> 
  psych::geometric.mean()
[1] 5.045378

Das geometrische Mittel ist der einzige korrekte Mittelwert, wenn normalisierte Ergebnisse gemittelt werden, daher Zahlen und Ergebnisse, die als Verhältnis zu Referenzwerten dargestellt werden. Eine Anwendung ist hierbei der Wirkungsgrad von zum Beispiel Pflanzenschutzmitteln.

15.5 Spannweite

Die Spannweite erlaubt uns zu überprüfen was die kleinste Zahl und die größte Zahl ist. Also uns das Minimum und das Maximum einer Zahlenreihe anzuschauen. Auf den ersten Blick mag das nicht so sinnig sein, aber wenn wir uns hunderte von Beobachtungen anschauen, wollen wir wissen, ob wir nicht einen Fehler bei Eintragen der Daten gemacht haben. Wir wissen eigentlich, dass z.B keine negativen Zuwachsraten auftreten können.

\[ y_{range} = y_{max} - y_{min} = 12.1 - 4.9 = 7.2 \]

Die Hundeflöhe springen in einer Spannweite von 7.2 cm. Das kommt einem normal vor und wir würden meinen, dass Flöhe in diesem Bereich springen könnten. Die Spannweite ist nicht übertrieben groß. Der minimale Wert ist \(4.9cm\) und der maximale Wert ist \(12.1cm\) und somit sind beide Zahlen in Ordnung. Keine der beiden Zahlen ist übertrieben klein oder gar negativ. Später musst du dann selber schauen, ob die Zahlen in die biologische Fragestellung passen. Besonders wenn du Datenbanken ausliest, kann es schnell passieren, dass du unplausible Werte wiederfindest. Dann musst du diese Werte meist entfernen.

In R können wir die Spannweite mit range() wie folgt berechnen. Wir erhalten den minimalen und maximalen Wert.

## ohne pipe-Operator
range(y) 
[1]  5.6 11.8
## mit pipe-Operator
y |> range()
[1]  5.6 11.8

Wir merken uns, dass die Spannweite eine Maßzahl für die Validität der Daten ist. Hat das Experiment geklappt oder kamen da nur komische Zahlen bei raus, die wir so in der Realität nicht erwarten würden. Zum Beispiel negative Sprungweiten, weil wir einmal auf das Minuszeichen auf der Tastatur beim eingeben der Zahlen gekommen sind.

15.6 Varianz

Bis jetzt können wir mit dem Mittelwert \(\bar{y}\) die Lage oder den Mittelpunkt unserer Zahlenreihe \(y\) beschreiben. Uns fehlt damit aber die Information über die Streuung der Zahlen. Sind die Zahlen alle eher gleich oder sehr verschieden? Liegen die Zahlen daher alle bei dem Mittelwert oder sind die Zahlen weit um den Mittelwert gestreut. Es macht ja einen bedeutenden Unterschied, ob wir \(n\)-mal das “Gleiche” messen oder eben \(n\)-mal sehr unterschiedliche Zahlen.

Die Abweichungsquadrate in der Statistik

Abweichungsquadrate sind ein wichtiges Konzept in der Statistik. Wenn wir wissen wollen, wie groß eine Abweichung von einer Zahl zu einer anderen ist, dann nutzen wir immer das Quadrat der Abweichung und bilden die Quadratsumme.

Die Streuung der Zahlen \(y\) um den Mittelwert beschreibt die Varianz. Wir schreiben für die Varianz auch \(s^2\). Wir berechnen die Varianz indem wir von jeder Zahl \(i\) den Mittelwert aller Zahlen \(\bar{y}\) abziehen und dann das Ergebnis quadrieren. Das machen wir für alle Zahlen und addieren dann die Summe auf. Wir erhalten die Quadratsumme von \(y\). Wie immer ist Mathematik in Textform etwas sperrig, deshalb einmal auch hier die Formel. Dann kannst du dir auch noch die Umsetzung in R anschauen. Auch hier die etwas sperrige Form in Schritten, später nutzt du dann die Funktion var().

\[ s^2 = \sum_{i=1}^n\cfrac{(y_i - \bar{y})^2}{n-1} = \cfrac{(5.7 - 8.13)^2 + ... + (7.6 - 8.13)^2}{7-1} = \cfrac{27.59}{6} = 4.6 \]

Einmal der Vektor y mit den Zahlen, die wir benutzen wollen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6)
y
[1]  5.7  8.9 11.8  5.6  9.1  8.2  7.6

Die Summe von y.

sum(y)
[1] 56.9

Die Länge des Vektors y minus 1 oder eben die Anzahl \(n - 1\) gleich der Fallzahl.

length(y) - 1
[1] 6

Dann einmal die Formel für die Varianz zusammengebaut. Statt \(8.13\) kannst du auch sum(y)/length(y) oder eben mean(y) schreiben.

sum((y - 8.13)^2)/(length(y) - 1)
[1] 4.59905
var(y)
[1] 4.599048

Die Varianz beschreibt also die Streuung der Zahlen im Quadrat um den Mittelwert. Das heißt in unserem Beispiel, dass die Sprungweite eine Varianz von \(4.6cm^2\) hat. Wir können Quadratzentimeter schlecht biologisch interpretieren. Wir leben nicht in einer Welt mit quadratischen Einheiten. Deshalb führen wir gleich die Wurzel der Varianz als die Standardabweichung ein. Die Standardabweichung ist also einfach die Wurzel der Varianz. Da die Standardabweichung aber sehr bedeutend ist, kommen wir auf die Standardabweichung gleich nochmal in einem extra Abschnitt zu sprechen. Wir benötigen die Varianz häufig nur als Zwischenschritt um die Standardabweichung zu berechnen. Das Konzept der Abweichungsquadrate benötigen wir aber in der Varianzanalyse (ANOVA) und für die Beschreibung einer Normalverteilung zusätzlich zum Mittelwert.

15.7 Standardabweichung

Die Standardabweichung \(s\) ist die Wurzel der Varianz \(s^2\). Wo die Varianz die Abweichung der Sprungweite in [cm\(^2\)] beschreibt, beschreibt die Standardabweichung die Streuung der Sprungweite in [cm]. Damit können wir dann die Standardabweichung viel besser interpretieren als die Varianz.

\[ s = \sqrt{s^2} = \sqrt{4.6} = 2.14 \]

Einmal der Vektor y mit den Zahlen, die wir benutzen wollen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6)
y
[1]  5.7  8.9 11.8  5.6  9.1  8.2  7.6

Die Summe von y.

sum(y)
[1] 56.9

Die Länge des Vektors y minus 1 oder eben die Anzahl \(n - 1\) gleich der Fallzahl.

length(y) - 1
[1] 6

Dann einmal die Formel für die Varianz zusammengebaut. Statt \(8.13\) kannst du auch sum(y)/length(y) oder eben mean(y) schreiben.

sum((y - 8.13)^2)/(length(y) - 1)
[1] 4.59905

Dann noch die Wurzel aus der Varianz um die Standardabweichung zu berechnen. Denn nichts anderes haben wir ja bis jetzt noch nicht berechnet.

sqrt(sum((y - 8.13)^2)/(length(y) - 1))
[1] 2.14454
sd(y)
[1] 2.144539

Wir können also schreiben, dass die Flöhe im Mittel 8.13 \(\pm\) 2.14cm weit springen. Somit haben wir die Lage und die Streuung der Zahlenreihe \(y\) der Sprungweite in [cm] mit zwei Zahlen beschrieben. Wichtig ist hierbei zu merken, dass wir den Abstand vom Mittelwert nach “oben” und “unten” jeweils mit dem gleichen Abstand beschreiben. Unsere Zahlen können also nicht mehr in die eine als in die andere Richtung streuen. Merke dir hier nochmal, dass du die Varianz nur als Zwischenschritt für die Standardabweichung berechnest. Später interessiert dich die Standardabweichung, die du dann auch in deinen Berichten oder deiner Abschlussarbeit nutzt.

Schreibweise des Mittelwerts und der Standardabweichung

Wir schreiben immer den Mittelwert plusminus die Standardabweichung. Also immer in der Form \(\bar{y} \pm s\). Meistens willst du dann aber nicht eine Tabelle haben, sondern wir nutzen dann den Mittelwert plusminus die Standardabweichung um uns Säulendiagramme zu erstellen.

15.8 Mittelwert und Varianz - eine Herleitung

Was ist der Mittelwert und die Varianz genau? Schauen wir uns das einmal in Abbildung 15.2 an. Die graue Linie oder Grade beschreibt den Mittelwert der fünf Beobachtungen. Die fünf Beobachtungen sind als blaue Kreuze dargestellt. Auf der \(x\)-Achse ist nur der Index \(i\) der Beobachtung. Das heißt \(y_1\) ist die erste Beobachtung und somit ist der Index \(i\) gleich 1. In der Form stellen wir dann alle Beobachtungen in der Abbildung dar. Die eigentlichen Zahlenwerte sind dann auf der \(y\)-Achse.

Abbildung 15.2— Die graue Linie beschreibt den Mittelwert der genau so durch die blauen Punkte geht, dass die Abstände der Punkte oberhalb und unterhalb zu Null aufaddieren. Die Linie liegt in der Mitte der Punkte. Die quadrierten Abstände sind die Varianz der blauen Punkte. Auf der x-Achse ist der Index des Punktes eingetragen.

Wenn wir die Summe der Abweichungen von \(y_1\) bis \(y_5\) zu dem Mittelwert bilden, so wird diese Summe 0 sein. Der Mittelwert liegt genau in der Mitte der Punkte. In unserem Beispiel ist der Mittelwert \(\bar{y} = 5.8\). Wir können jetzt die Abstände wie in der folgenden Tabelle 15.3 berechnen.

Tabelle 15.3— Zusammenhang von den Werten von \(y\), dem Mittelwert sowie die Abweichung vom Mittelwert \(\epsilon\)
Index \(i\) y \(\boldsymbol{\epsilon_i = y_i - \bar{y}}\) Wert
1 5.7 \(\epsilon_1 = y_1 - \bar{y}\) \(5.7 - 8.13 = -2.43\)
2 8.9 \(\epsilon_2 = y_2 - \bar{y}\) \(8.9 - 8.13 = 0.77\)
3 11.8 \(\epsilon_3 = y_3 - \bar{y}\) \(11.8 - 8.13 = 3.67\)
4 8.2 \(\epsilon_4 = y_4 - \bar{y}\) \(8.2 - 8.13 = 0.07\)
5 5.6 \(\epsilon_5 = y_5 - \bar{y}\) \(5.6 - 8.13 = -2.53\)
6 9.1 \(\epsilon_6 = y_4 - \bar{y}\) \(9.1 - 8.13 = 0.97\)
7 7.6 \(\epsilon_7 = y_5 - \bar{y}\) \(7.6 - 8.13 = -0.53\)

Wir nennen die Abstände \(y_i - \bar{y}\) nach dem griechischen Buchstaben Epsilon \(\epsilon\). Das \(\epsilon\) soll an das \(e\) von Error erinnern. So meint dann Error eben auch Abweichung. Ja, es gibt hier viele Worte für das gleiche Konzept. Aber manche Sachen brauchen wir dann wiederholt und es ist gut, die Worte hier schon mal zu lesen. Oder sich später hier wieder an das Konzept zu erinnern. Wir berechnen einen Mittelwert von den Epsilons mit \(\bar{\epsilon} = 0\). Ein Mittelwert nahe Null bzw. von Null wundert uns nicht. Wir haben die Gerade ja so gebaut, das nach oben und unten die gleichen Abstände sind.

15.9 Standardfehler oder Standard Error (SE)

Der Standardfehler ist eine statistische Maßzahl, die wir häufig im Kontext des statistischen Testens benutzen. Wenn wir den Mittelwert der Sprungweiten berichten dann gehört die Standardabweichung der Sprungweiten mit als beschreibendes, statistisches Maß dazu. Wir berichten keinen Mittelwert ohne Standardabweichung. Nun ist es aber so, dass der Mittelwert und die Standardabweichung von der Fallzahl abhängen. Je mehr Fallzahl bzw. Beobachtungen wir haben, desto genauer wird der Mittelwert sein. Oder anders ausgedrückt unserer in der Stichprobe unserer Daten ermittelte Mittelwert \(\bar{y}\) wird sich dem wahren, unbekannten Mittelwert \(\mu_y\) annähern. Das gleiche gilt auch für unsere beobachtete Standardabweichung \(s_y\), die sich der wahren, unbekannten Standardabweichung \(\sigma_y\) mit steigender Fallzahl annähert.

Aus diesem Grund brauchen wir noch einen Fehler bzw. eine statistische Maßzahl für die Streuung, die unabhängig von der Fallzahl ist. Damit erhalten wir dann den Standardfehler (abk. \(SE\) oder auch eng. standard error of the mean, abk. \(SEM\)). Mit der Fallzahl meinen wir hier die Anzahl an Beobachtungen. Wir skalieren also die Standardabweichung mit der Fallzahl indem wir die Standardabweichung durch die Wurzel der Fallzahl teilen.

\[ SE = \cfrac{s}{\sqrt{n}} = \cfrac{2.14}{\sqrt{7}} = \cfrac{2.14}{2.65} = 0.81 \]

Einmal der Vektor y mit den Zahlen, die wir benutzen wollen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6)
y
[1]  5.7  8.9 11.8  5.6  9.1  8.2  7.6

Die Summe von y.

sum(y)
[1] 56.9

Die Länge des Vektors y minus 1 oder eben die Anzahl \(n - 1\) gleich der Fallzahl.

length(y) - 1
[1] 6

Dann einmal die Formel für die Varianz zusammengebaut. Statt \(8.13\) kannst du auch sum(y)/length(y) oder eben mean(y) schreiben.

sum((y - 8.13)^2)/(length(y) - 1)
[1] 4.59905

Dann noch die Wurzel aus der Varianz um die Standardabweichung zu berechnen. Denn nichts anderes haben wir ja bis jetzt noch nicht berechnet.

sqrt(sum((y - 8.13)^2)/(length(y) - 1))
[1] 2.14454

Und dann den ganzen Term nochmal durch die Wurzel der Fallzahl.

sqrt(sum((y - 8.13)^2)/(length(y) - 1))/sqrt(length(y))
[1] 0.8105598
se <- sd(y)/sqrt(length(y))
se
[1] 0.8105596

Wir müssten ein Paket in R laden um den Standardfehler zu berechnen. Das Laden von zusätzlichen Paketen wollen wir hier aber vermeiden; wir können den Standardfehler auch einfach selber berechnen. Wir erhalten einen Standardfehler von \(0.81cm\). Diese Zahl ist in dem Sinne nicht zu interpretieren, da wir hier nur Experimente losgelöst von deren Fallzahl miteinander vergleichen können. Wenn du also zwei Sprungweitenexperimente mit unterschiedlichen Fallzahlen \(n_1\) und \(n_2\) bezüglich der Streuung in den Experimenten vergleichen willst, dann nutzt du den Standardfehler, da der Standardfehler unabhängig von der Fallzahl der beiden Experimente ist. Auf der anderen Seite können wir ohne die berichtete Fallzahl nicht vom Standardfehler auf die Standardabweichung schließen.

Das Buch A biologist’s guide to statistical thinking and analysis von Fay und Gerow (2018) liefert in dem dem Abschnitt A quick guide to interpreting different indicators of variation nochmal einen Überblick über die verschiedenen Arten der Variation eines Datensatz und deren Interpretation. Ich habe die Interpretationen abhängig von der Variationsquelle nochmal in der Tabelle 15.4 zusammengefasst. Die Standardabweichung ist eine biologische Interpretation der Variation oder Streuung in den Daten. Die beiden anderen Quellen Standardfehler und Konfidenzintervall ist dagegen statistische Maßzahlen, die anders interpretiert werden können und müssen. Hier ist der Kontext dann ein anderer.

Tabelle 15.4— Verschiedene Quellen der Variation für den Fehlerbalken und die sich dadurch ergebende Interpretation der Fehlerbalken. Für mehr Informationen siehe auch den Abschnitt A quick guide to interpreting different indicators of variation aus Fay und Gerow (2018).
Art des Fehlerbalkens Überschneidung der Fehlerbalken Nicht überlappende Fehlerbalken
Standardabweichung Kein Rückschluss möglich Kein Rückschluss möglich
Standardfehler Kein signifikanter Unterschied zwischen den Mittelwerten Kein Rückschluss möglich
Konfidenzintervall Kein signifikanter Unterschied zwischen den Mittelwerten Signifikanter Unterschied zwischen den Mittelwerten

In der Abbildung 15.3 siehst du dann die Aussagen der Tabelle 15.4 nochmal visualisiert. Alle Mittelwerte haben die gleichen Werte für die beiden Behandlungen für den Fall der sich überschneidenden Fehlerbalken sowie für die sich nicht überlappenden Fehlerbalken. Je nach Variationsquelle sehen die Fehlerbalken anders aus und haben auch eine andere Interpretation.

Abbildung 15.3— Verschiedene Quellen der Variation für den Fehlerbalken und die sich dadurch ergebende Interpretation der Fehlerbalken nach deren Überlappung oder nicht. Nur die Fehlerbalken, die aus Konfidenzintervallen bestehen, können im Sinne einer vollständigen statistischen Interpretation mit n.s als nicht signifikant und s als signifikant genutzt werden.

Je nachdem, was du nun zeigen möchtest, kannst du jetzt entscheiden, welche Variationsquelle du nutzen willst. Wir benötigen den Standardfehler eigentlich nicht zum Berichten mit Fokus von biologischen Ergebnissen. Bei manchen Modellen und Outcomes macht aber der Standardfehler mehr Sinn als die Standardabweichung. Wir können nämlich sonst Werte erhalten die biologisch keinen Sinn ergeben. Der Standardfehler ist nicht als Zahl biologisch interpretierbar und somit eine reine statistische Größe. Tabelle 15.5 zeigt die Zusammenfassung und den Vergleich von Standardabweichung und Standardfehler nochmal aus einer anderen Perspektive. Das Konfidenzintervall ist eine statistische Größe, die wir dann in den folgenden Kapiteln noch behandelt werden.

Tabelle 15.5— Zusammenfassung und Vergleich von Standardabweichung und Standardfehler
Standardabweichung Standardfehler
… ist eine Aussage über die Streuung der erhobenen Werte einer Stichprobe. … ist eine Aussage über die Genauigkeit des Mittelwertes einer Stichprobe.
… hängt von der biologischen Variabilität ab. … abhängig von der Messgenauigkeit
… ist ein beschreibendes Maß. … ist ein statistisches Maß.
… ist nur wenig durch die Größe der Stichprobe beineinflussbar. … steht im direkten Verhältnis zur Größe der Stichprobe.

15.10 Median

Jetzt haben wir uns eine Möglichkeit den Schwerpunkt von einer Zahlenreihe zu berechnen angeschaut. Nun gibt es aber noch eine weitere Möglichkeit die “Mitte” von Zahlen zu ermitteln. Wir wollen uns jetzt noch eine andere Art der Zusammenfassung von Zahlen anschauen. Anstatt mit den Zahlen zu rechnen und die Zahlen aufzusummieren, sortieren wir jetzt die Zahlen. Wir nehmen also die Zahlen aus dem Vektor \(y = \{5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6\}\) und sortieren diese Zahlen nach dem Rang. Wir rechnen dann mit den Rängen und nicht mehr mit den Werten der Zahlen. Die kleinste Zahl kriegt den kleinsten Rang, die nächst größere Zahl dann den nächsten Rang. Wir können R über die Funktion sort() nutzen um den Vektor \(y\) zu sortieren. Klar das geht auch schnell per Hand, aber wenn die Zahlenvektoren länger werden, dann ist so eien Funktion schon praktisch.

y |> sort()
[1]  5.6  5.7  7.6  8.2  8.9  9.1 11.8

Die neue Art die Mitte von dem sortierten Zahlenvektor zu bestimmen, nennen wir dann den Median berechnen. Der Median \(\tilde{y}\) ist die mittlere Zahl eines Zahlenvektors. Wir haben hier sieben Zahlen, also ist der Median die vierte Zahl. Wir müssen hier aber zwischen einer ungeraden Anzahl und einer geraden Anzahl unterscheiden.

Ungerade Anzahl

Wenn wir eine ungerade Anzahl an Zahlen vorliegen haben, ist der Median die mittlere Zahl des Vektors \(y\): \[ 5.6, 5.7, 7.6, \underbrace{8.2,}_{Median} 8.9, 9.1, 11.8 \]

In R können wir den Median einfach mit der Funktion median()berechnen.

## ohne pipe-Operator
median(y) 
[1] 8.2
## mit pipe-Operator
y |> median()
[1] 8.2
Gerade Anzahl

Wenn wir eine gerade Anzahl von Zahlen vorliegen haben, ist der Median der Mittelwert der beiden mittleren Zahlen des Vektors \(y\). Ich habe hier einfach die Zahl 13.1 aus dem Hut gezaubert. Es könnte auch eine beliebige andere Zahl sein, die größer als 11.8 ist. Nur damit wir hier eine gerade Anzahl an Zahlen haben: \[ 5.6, 5.7, 7.6, \underbrace{8.2, 8.9,}_{Median = \tfrac{8.2+8.9}{2}=8.55} 9.1, 11.8, \color{blue}{13.1} \]

In R können wir den Median wieder einfach mit der Funktion median()berechnen. Wir müssen nur die Zahl 13.1 zu dem Vektor y mit der Funktion c() hinzufügen.

c(y, 13.1) |> median() 
[1] 8.55

Der Median ist eine Alternative zu dem Mittelwert. Insbesondere in Fällen, wo es sehr große Zahlen gibt, die den Mittelwert in der Aussage verzerren, kann der Median sinnvoll sein. Wenn der Mittelwert stark von dem Median abweicht, deutet dies auf eine schiefe Verteilung oder aber Ausreißer in den Daten hin. Wir müssen dann in der explorativen Datenanalyse der Sachlage nachgehen.

Median versus Mittelwert

Zur Veranschaulichung des Unterschiedes zwischen Median und Mittelwert nehmen wir die Mietpreise in New York. Der mittlere Mietpreis für eine 2-Zimmerwohnung in Manhattan liegt bei 5000$ pro Monat. In den mittleren Mietpreis gehen aber auch die Mieten der Billionaires’ Row mit ein. Der mediane Mietpreis liegt bei 4000$. Die hohen Mieten ziehen den Mittelwert nach rechts.

15.11 Quantile und Quartile

Bei dem Mittelwert beschreibt die Standardabweichung die Streuung der Daten um den Mittelwert. Bei dem Median sind dies die Quartile. Die Quartile beschreiben die Streuung der Daten um den Median. Damit beschreiben wir also die Streuung der Beobachtungen um den Median anhand der Quartile. Um die Quartile bestimmen zu können, teilen wir die Daten in 100 Quantile. Du kannst dir Quantile wie Prozente vorstellen. Wir schneiden die Daten also in 100 Scheiben. Das geht natürlich erst wirklich, wenn wir hundert Zahlen haben. Deshalb hilft man sich mit Quartilen - von Quarta, ein Viertel - aus. Tabelle 15.6 zeigt dir da nochmal den Zusammenhang.

Tabelle 15.6— Zusammenfassung und Vergleich von Quantilen, Quartilen und Median
Quantile Quartile Median
25% Quantile 1\(^{st}\) Quartile
50% Quantile 2\(^{nd}\) Quartile Median
75% Quantile 3\(^{rd}\) Quartile

Damit haben wir sogar eine Dreifachbelegung der “mittleren” Zahl. Zum einen handelt es sich um das 50% Quantil, weil 50% der Zahlen größer und 50% der Zahlen kleiner sind. Zum anderen handelt es sich auch um das 2\(^{nd}\) Quartile. Da die Mitte einer Zahlenreihe als Median definiert ist, haben wir dann hier auch den Median vorliegen.

Wir bestimmen die Quartile wie den Median. Wir müssen unterscheiden, ob wir eine ungerade Anzahl an Zahlen oder eine gerade Anzahl an Zahlen vorliegen haben.

Ungerade Anzahl

Bei einer ungeraden Anzahl von Zahlen, ist das 1\(^{st}\) Quartile die mittlere Zahl des unteren Mittels und das 3\(^{rd}\) Quartile die mittlere Zahl des oberen Mittels des Vektors \(y\): \[ 5.6, \underbrace{5.7,}_{1st\ Quartile} 7.6, 8.2, 8.9, \underbrace{9.1,}_{3rd\ Quartile} 11.8 \]

Gerade Anzahl

Bei einer geraden Anzahl von Zahlen, ist das 1\(^{st}\) Quartile der Mittelwert der beiden mittleren Zahl des unteren Mittels und das 3\(^{rd}\) Quartile der Mittelwert der beiden mittleren Zahlen des oberen Mittels des Vektors \(y\). Ich habe hier einfach die Zahl 13.1 aus dem Hut gezaubert. Es könnte auch eine beliebige andere Zahl sein, die größer als 11.8 ist. Nur damit wir hier eine gerade Anzahl an Zahlen haben: \[ 5.6, \underbrace{5.7, 7.6,}_{1st\ Quartile = \tfrac{5.7+7.6}{2}=6.65} 8.2, 8.9, \underbrace{9.1, 11.8}_{3rd\ Quartile = \tfrac{9.1+11.8}{2}=10.45} \color{blue}{13.1} \]

Das 95% Quantile und das 97.25% Quantile werden wir später nochmal im statistischen Testen brauchen. Auch hier ist die Idee, dass wir die Daten in hundert Teile schneiden und uns dann die extremen Zahlen anschauen.

In R können wir den Median einfach mit der Funktion quantile() berechnen. Wir berechnen hier das 25% Quantile also das 1\(^{st}\) Quartile sowie das 50% Quantile also den Median und das 75% Quantile also das 3\(^{rd}\) Quartile.

y |> quantile(probs = c(0.25, 0.5, 0.75)) |> round(2)
 25%  50%  75% 
6.65 8.20 9.00 
c(y, 13.1) |> quantile(probs = c(0.25, 0.5, 0.75)) |> round(2) 
 25%  50%  75% 
7.12 8.55 9.77 

Warum unterscheiden sich die händisch berechneten Quartile von den Quartilen aus R? Es gibt verschiedene Arten der Berechnung. In der Klausur nutzen wir die Art und Weise wie die händische Berechnung hier beschrieben ist. Später in der Anwendung nehmen wir die Werte, die R ausgibt. Die Abweichungen sind so marginal, dass wir diese Abweichungen in der praktischen Anwendung ignorieren wollen.

15.12 Interquartilesabstand (IQR)

Der Interquartilesabstand (IQR) beschreibt den Abstand zwischen dem 1\(^{st}\) Quartile und dem 3\(^{rd}\) Quartile. Daher ist der Interquartilesabstand (IQR) ähnlich der Spannweite zwischen dem maximalen und minimalen Wert. Wir benötigen das Interquartilesabstand (IQR) in der explorativen Datenanalyse wenn wir einen Boxplot erstellen wollen.

\[ IQR = 3^{rd}\,\mbox{Quartile} - 1^{st}\,\mbox{Quartile} = 9.1 - 5.7 = 3.4 \]

Wir verwenden das IQR als Zahl eher selten.

Parametrik versus Nicht-Parametrik

Wenn wir einen Zahlenvektor wie durch \(y = \{5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6\}\) beschrieben zusammenfassen wollen, haben wir zwei Möglichkeiten.

  1. Die parametrische Variante indem wir mit den Zahlen rechnen und deskriptive Maßzahlen wie Mittelwert, Varianz und Standardabweichung berechnen. Diese Maßzahlen kommen aber in den Zahlen nicht vor.
  2. Die nicht-parametrische Variante indem wir die Zahlen in Ränge umwandeln, also sortieren, und mit den Rängen der Zahlen rechnen. Die deskriptiven Maßzahlen wären dann Median, Quantile und Quartile.

15.13 Variationskoeffizient

Im Gegensatz zu der Varianz ist der Variationskoeffizient ein relatives Streuungsmaß, das heißt, der Variationskoeffizient hängt nicht von der Maßeinheit von \(y\) ab. Die Motivation für den Variationskoeffizient ist, dass ein \(y\) mit großem Mittelwert häufig eine größere Varianz aufweist als eine mit einem kleinen Mittelwert. Da die Varianz und die daraus abgeleitete Standardabweichung nicht normiert sind, kann ohne Kenntnis des Mittelwerts nicht beurteilt werden, ob eine Varianz groß oder klein ist. Der Variationskoeffizient ist eine Normierung der Varianz. Ist die Standardabweichung somit größer als der Mittelwert, so ist der Variationskoeffizient größer 1. Der Variationskoeffizient wird häufig verwendet, um die Variation zwischen zwei verschiedenen Datensätzen zu vergleichen.

Wir können den Variationskoeffizient basierend auf dem Mittelwert und der Standardabweichung berechnen. In unserem Beispiel würden wir als die Standardabweichung \(s\) und den Mittelwert \(\bar{y}\) in die Formel einsetzen.

\[ v = \cfrac{s}{\bar{y}} = \cfrac{2.14}{8.13} = 0.26 \]

Einmal der Vektor y mit den Zahlen, die wir benutzen wollen.

y <- c(5.7, 8.9, 11.8, 5.6, 9.1, 8.2, 7.6)
y
[1]  5.7  8.9 11.8  5.6  9.1  8.2  7.6

Die Summe von y.

sum(y)
[1] 56.9

Die Länge des Vektors y minus 1 oder eben die Anzahl \(n - 1\) gleich der Fallzahl.

length(y) - 1
[1] 6

Dann einmal die Formel für die Varianz zusammengebaut. Statt \(8.13\) kannst du auch sum(y)/length(y) oder eben mean(y) schreiben.

sum((y - 8.13)^2)/(length(y) - 1)
[1] 4.59905

Dann noch die Wurzel aus der Varianz um die Standardabweichung zu berechnen. Denn nichts anderes haben wir ja bis jetzt noch nicht berechnet.

sqrt(sum((y - 8.13)^2)/(length(y) - 1))
[1] 2.14454

Dann nochmal den Mittelwert berechnen den wir nochmal brauchen. Aber auch hier getht natürlich auch die Built-in Funktion mean(y).

sum(y)/length(y)
[1] 8.128571

Dann einmal alles zusammen und wir haben den Variationskoeffizient Schritt für Schritt berechnet.

sqrt(sum((y - 8.13)^2)/(length(y) - 1))/(sum(y)/length(y))
[1] 0.2638274
var_coef <- sd(y)/mean(y)
var_coef
[1] 0.2638273

Wir können den Variationskoeffizient auch basierend auf dem Median berechnen.

\[ v_r=\cfrac{x_{0.75}-x_{0.25}}{\tilde{x}_{0.5}} \]

In unserem Fall müssen wir hier dann die Quartile und den Median in die Formel einsetzen.

\[ v_r=\cfrac{9.1 - 5.7}{8.2} = 0.41 \]

Im Bereich der Agrarwissenschaften kommt der Variationskoeffizient eher selten vor. Der Variationskoeffizient ist eben eine statistische Maßzahl des Labors. Aber dennoch kommt der Variationskoeffizient immer mal wieder vor. Ich berechne denn Variationskoeffizient immer in R direkt aus der Standardabweichung und dem Mittelwert oder aber ich baue mir die Formel in R selber. So schwer ist es dann auch nicht.

var_coef <- function(y) {
  return(sd(y)/mean(y))
}
var_coef(y)
[1] 0.2638273

15.14 Häufigkeiten

Neben der Darstellung von kontinuierlichen Zahlen, wollen wir auch häufig kategoriale Zahlen sinnvoll darstellen und zusammenfassen. Zwar können wir auch ohne weiteres die mittlere Note berechnen, aber meistens wollen wir dann doch wissen, wie viele Noten jeweils vergeben worden sind. Auch wenn wir uns mit einer \(0/1\) Variable beschäftigen, also zum Beispiel infiziert ja/nein, wollen wir diese Variablen zusammenfassen. Wir wollen hier also Häufigkeiten (eng. frequency) berechnen und darstellen. Dabei gibt es verschiedene Arten von Häufigkeiten, die wir uns jetzt nacheinander einmal anschauen.

Fangen wir also einmal mit der Variable infected an. Wir haben in dieser Variable abgelegt, ob der Hund mit einem Floh infiziert ist 1 oder eben nicht infiziert ist 0. Wie du siehst, kodieren wir das “Ja” mit einer 1 und das “Nein” mit einer 0.

\[ y_{infected} = \{0, 1, 1, 0, 1, 0, 0\}. \]

In R würde der Vektor der Zahlen etwas anders aussehen, aber das hat eher was mit der Schreibweise der Mathematik und der Informatik zu tun. Inhaltlich sehen wir hier gleichen Informationen.

y_infected <- c(0, 1, 1, 0, 1, 0, 0) 

Schauen wir uns als einmal die drei Möglichkeiten die kategorialen Daten als Häufigkeiten abzubilden an. Wir können zum einen die absoluten Häufigkeiten berichten. Wir sagen also ganz einfach, wie viele Hunde sind von der Gesamtheit infiziert.

Absolute Häufigkeit

Wir zählen die Anzahl an infizierten Tieren und berichten die Anzahl zusammen mit der gesamt Anzahl an Tieren. Also haben wir dann als absolute Häufigkeit \(f_{absolut} = n_{infiziert} / n_{gesamt}\) zu berichten.

Damit könne wir auch die absoluten Häufigkeiten einfach ausrechnen und berichten. Wir haben ja drei infizierte Hunde von sieben Hunden vorliegen.

\[ f_{infected} = 3 / 7 \]

Als nächstes schauen wir uns die relativen Häufigkeiten an. Relative Häufigkeiten werden weit häufiger berichtet. Wir haben ja dann die guten, alten Prozente vorliegen.

Relative Häufigkeit

Wir zählen die infizierten Tiere und teilen die Anzahl an infizierten Tiere durch die gesamte Anzahl an Tieren. Wir rechnen also die relative Häufigkeit mit \(f_{relativ} = n_{infiziert} / n_{gesamt}\).

Sieht erstmal aus wie die absolute Häufigkeit, aber hier rechnen wir den Term dann auch aus. Damit teilen wir dann unsere drei infizierten Hunde durch die gesamte Anzahl von sieben Tieren.

\[ f_{infected} = \cfrac{3}{7} = 0.43 \]

Meistens schreiben wir dann aber einen Hybriden aus absoluter und relativer Häufigkeit mit \(3 / 7\; (43\%)\). Wir ergänzen also die absoluten Häufigkeiten um die relativen Häufigkeiten. Ist dann eigentlich doppelt gemoppelt, aber wir wollen häufig auch sehen auf welcher Gesamtzahl die relative Häufigkeit sich begründet.

Neben der klassischen Häufigkeit, die wir durch die prozentuale Angabe kennen, gibt es auch noch die Chance. Die Chance infiziert zu sein, ist was anderes als die Wahrscheinlichkeit infiziert zu sein. Die Wahrscheinlichkeit ist eine relative Häufigkeit. Die Chance berechnet sich dabei etwas anders, den die Chance ist ein Anteil.

Chance

Die Chance beschreibt den Anteil der infizierten Tiere an den nicht infizierten Tieren. Oder aber wir schreiben für die Chance \(f_{chance} = n_{1} : n_{0}\) mit \(n_1\) gleich der Anzahl an infizierten Tieren und \(n_0\) gleich der Anzahl der nicht infizierten also gesunden Tiere.

Wie du im Folgenden siehst, ergibt sich bei der Chance ein anderer Wert als bei der relativen Häufigkeiten. Wir haben also eine andere Chance infiziert zu sein, als die Wahrscheinlichkeit infiziert zu sein. Das ist auch so gewollt, denn wir betrachten ja bei der Chance etwas anders. Wir schauen den Anteil der drei infizierten Tiere im Vergleich zu den vier gesunden Tieren an. Wir erhalten dann eine Chance von \(75\%\) um infiziert zu sein.

\[ f_{infected} = 3 : 4 = 0.75 \]

Wenn wir die Häufigkeiten berechnen wollen, dann nutzen wir auch wieder R. Es gibt viele Funktionen in R, die wir nutzen könne. Hier erstellen wir eine Tabelle in R mit der Funktion tabyl() aus dem R Paket {janitor}. Es gibt noch andere Möglichkeiten, die schauen wir uns aber gleich im nächsten Abschnitt an.

Einmal die sehr simplen Form der Berechnung für die infizierten Hunden. Die Funktion tabyl() liefert neben der absoluten Häufigkeiten dann auch die relativen Häufigkeiten. Deshalb mag ich diese Funktion sehr gerne für das schnelle Nachschauen.

y_infected |> 
  tabyl()
 y_infected n   percent
          0 4 0.5714286
          1 3 0.4285714

Oder aber etwas komplexer für die Noten der Hunde. Hier siehst du dann nochmal schöner, wie sich die Tabelle aufbaut.

flea_dog_tbl |>
  pull(grade) |> 
  tabyl()
 pull(flea_dog_tbl, grade) n   percent
                         6 1 0.1428571
                         7 2 0.2857143
                         8 3 0.4285714
                         9 1 0.1428571

Damit sind wir dann auch schon durch mit den Häufigkeiten. Selten berichten wir die reinen Häufigkeiten jeweils separat sondern in einer großen Übersichtstabelle. Um diese großen Übersichtstabelle und deren Erstellung wollen wir uns jetzt im nächsten Abschnitt einmal anschauen.

15.15 Automatisierung in R

Ups, das hier ist mir aber zu wild!

Der folgende Abschnitt ist nicht relevant für eine Klausur. Wir brauchen aber die Automatisierung in R um später sinnvoll Daten in einer Abschlussarbeit oder einem Projekt auswerten zu können. Also keine Angst, bitte überspringt den Abschnitt, wenn du nur für die Klausur lernst.

Im Folgenden wollen wir einmal den Datensatz zu den Gummibärchen zusammenfassen und zu beschreiben. Hier können wir nicht einfach so einen Überblick kriegen in dem wir uns einfach nur die Daten anschauen. Die Exceltabelle ist dafür viel zu lang um einen Überblick zu erlangen. Laden wir also einmal den Datensatz und wählen nur ein paar Spalten aus, damit wir hier nicht zu viel Tabellen produzieren.

gummi_tbl <- read_excel("data/gummibears.xlsx")  |>
  select(gender, height, age, count_color, 
         most_liked) |> 
  mutate(gender = as_factor(gender))

Wir erhalten das Objekt gummi_tbl mit dem Datensatz in Tabelle 17.1 nochmal als Auszug dargestellt. Wir brauchen aber nicht alle Spalten aus dem ursprünglichen Datensatz und somit ist die Tabelle etwas übersichtlicher. Wir schauen uns also dann mal zwei kontinuierlichen und kategorialen Variablen an.

Tabelle 15.7— Auszug aus den selektierten Daten zu den Gummibärchendaten mit zwei kontinuierlichen und kategorialen Variablen
gender height age count_color most_liked
m 193 35 3 lightred
w 159 21 5 yellow
w 159 21 6 white
w 180 36 5 white
m 187 24 6 darkred
m 182 24 4 green
w 170 23 4 white
w 180 24 6 green

Ich stelle jetzt zwei R Pakete mit {gtsummary} und {modelsummary} vor, die du nutzen kannst um Daten zusammenzufassen. Es gibt aber noch weit mehr Pakete, aber wir konzentrieren uns mal auf diese beiden Pakete.

Was gibt es noch an Möglichkeiten?

Neben den beiden vorgestellten gibt es natürlich auch Alternativen zu {gtsummary} und {modelsummary}. Da müsstest du dann aber mal selber schauen oder mich direkt Fragen. Wenn Interesse besteht kann ich auch noch andere Pakete vorstellen.

15.15.1 Mit dem Paket {gtsummary}

Meiner Meinung nach ist das Paket {gtsummary} das Paket für die Erstellung von Übersichttabellen. Wie du auf derHilfeseite von gtsummary sehen wirst, gibt es wirklich sehr viele Möglichkeiten eine schöne Tabelle zu bauen. Neben der Zusammenfassung kannst du auch \(p\)-Werte aus statistischen Tests ergänzen oder auch die Differenzen zwischen zwei Gruppen. Hier ist wirklich viel möglich in dem Paket.

Fangen wir also einmal an eine Übersichtstabelle zu erstellen. Wir bauen eine simple Tabelle über alle Variablen in dem Datensatz gummi_tbl aufgeteilt nach dem Geschlecht. Das geht recht schnell und ohne viel Schnickschnack.

gummi_tbl |> 
  tbl_summary(by = gender)
Characteristic m, N = 3561 w, N = 3431
height 184 (178, 189) 169 (164, 174)
age 22.0 (21.0, 24.0) 22.0 (20.0, 25.0)
count_color

    2 0 (0%) 1 (0.3%)
    3 18 (5.1%) 15 (4.4%)
    4 94 (26%) 83 (24%)
    5 189 (53%) 164 (48%)
    6 55 (15%) 80 (23%)
most_liked

    darkred 137 (38%) 135 (39%)
    green 83 (23%) 91 (27%)
    hellrot 1 (0.3%) 0 (0%)
    lightred 36 (10%) 21 (6.1%)
    none 30 (8.4%) 14 (4.1%)
    orange 15 (4.2%) 15 (4.4%)
    white 38 (11%) 51 (15%)
    yellow 16 (4.5%) 16 (4.7%)
1 Median (IQR); n (%)

Das ist schon toll, sich so schnell eine Übersicht über die Daten zu schaffen. Wir haben alle Informationen, die wir brauchen, um mal eine Idee der Daten zu erhalten. Das ist dann immer so eine Sache, meist wollen wir dann die Daten dann doch nicht so exakt zusammenfassen. Aber auch hier hilft {gtsummary} mit sehr vielen Optionen. In der Abbildung 15.4 siehst du nochmal die Optionen in {gtsummary} übersetzt in die ausgegebene Tabelle.

Abbildung 15.4— Darstellung der {gtsummary} Optionen in die ausgegebene Tabelle.

Hier nochmal ein Beispiel mit mehr Optionen und dann einer anderen Darstellung. Siehe das hier aber nur als Beispiel, es gibt aber noch sehr viel mehr Optionen für die Darstellung. Du kannst auch {mean} ({sd}) durch {mean}+/-{sd} ersetzen um eine andere Schreibweise zu haben.

gummi_tbl |>
  tbl_summary(
    by = gender,
    statistic = list(
      all_continuous() ~ "{mean} ({sd})",
      all_categorical() ~ "{n} / {N} ({p}%)"
    ),
    digits = all_continuous() ~ 2,
    label = count_color ~ "Anzahl Farben",
    missing_text = "(Missing)"
  )
Characteristic m, N = 3561 w, N = 3431
height 183.65 (7.80) 168.84 (7.31)
age 23.12 (4.44) 23.66 (6.41)
Anzahl Farben

    2 0 / 356 (0%) 1 / 343 (0.3%)
    3 18 / 356 (5.1%) 15 / 343 (4.4%)
    4 94 / 356 (26%) 83 / 343 (24%)
    5 189 / 356 (53%) 164 / 343 (48%)
    6 55 / 356 (15%) 80 / 343 (23%)
most_liked

    darkred 137 / 356 (38%) 135 / 343 (39%)
    green 83 / 356 (23%) 91 / 343 (27%)
    hellrot 1 / 356 (0.3%) 0 / 343 (0%)
    lightred 36 / 356 (10%) 21 / 343 (6.1%)
    none 30 / 356 (8.4%) 14 / 343 (4.1%)
    orange 15 / 356 (4.2%) 15 / 343 (4.4%)
    white 38 / 356 (11%) 51 / 343 (15%)
    yellow 16 / 356 (4.5%) 16 / 343 (4.7%)
1 Mean (SD); n / N (%)

Das ist soweit schon mal gut, aber wir wollen meist die Tabelle dann doch in Word haben. Nicht das du deine Abschlussarbeit auch mit \(\LaTeX\) schreiben könntest. Wir können dafür dann über die Funktion gtsave aus dem R Paket gt unsere Tabelle dann in einem Worddokument speichern. Wie toll ist das denn? Aber Achtung, bitte nicht in dein Hauptdokument abspeichern sondern immer eine Datei für eine Tabelle. Sonst kann es sein, dass du dir aus Versehen mal deine Tabellen überschreibst.

gummi_tbl |> 
  tbl_summary(by = gender) |> 
  as_gt() |>  
  gt::gtsave(filename = "example.docx")

Frag mich gerne, wenn du weitere Informationen brauchst oder schau auch mal das Cheatsheet für gtsummary an. Du findest im Cheatsheet auch nochmal einen Überblick was alles möglich ist. Ich finde da den Überblick wirklich super.

15.15.2 Mit dem Paket {modelsummary}

Eine andere Möglichkeit ist das R Paket {modelsummary}. Hier haben wir auch die Möglichkeit neben Modellvergleiche auch Daten in schönen Tabellen zusammenzufassen. Auch hier hilft die Hilfeseite von {modelsummary} um über die vielen Möglichkeiten einen Überblick zu erlangen. Meiner Meinung nach braucht das Paket {modelsummary} etwas mehr Programmiererfahrung für die Bedienung, kann dafür dann aber auch mehr. Du musst dich vorab um fehlende Daten kümmern oder aber die Funktionen entsprechend umdefinieren. Also entfernen wir erstmal grob alle fehlenden Werte mit na.omit(). Das ist jetzt aber die etwas ungünstige Variante, da wir das jetzt über alle Variablen die fehlenden Werte entfernen. Sobald eine Variable einen fehlenden Wert hat, schmeißen wir die ganze Beobachtung raus.

gummi_clean_tbl <- gummi_tbl |> 
  na.omit()

Jetzt nutzen wir die Funktion datasummary_skim() um einmal einen schnellen Überblick zu produzieren. Wir müssen die Funktion aber zweimal nutzen. Einmal um uns die kontinuierlichen Variablen type = "numeric" anzuschauen und einmal für die kategorialen Variablen type = "categorical". Du kriegst zwar im Folgenden die fehlenden Werte angezeigt, aber das ist eben nur in der Funktion datasummary_skim() möglich.

gummi_clean_tbl |> 
  datasummary_skim(type = "numeric")
Unique Missing Pct. Mean SD Min Median Max
height 53 0 176.4 10.6 147.0 176.0 205.0
age 35 0 23.4 5.5 11.0 22.0 61.0
count_color 5 0 4.8 0.8 2.0 5.0 6.0

Dann nochmal die Anzahl und die relative Häufigkeit für die kategorialen Variablen. Ich habe hier jetzt nicht nochmal tiefer die Ausgabe modifiziert.

gummi_clean_tbl |> 
  datasummary_skim(type = "categorical")
N %
gender m 356 50.9
w 343 49.1
most_liked darkred 272 38.9
green 174 24.9
hellrot 1 0.1
lightred 57 8.2
none 44 6.3
orange 30 4.3
white 89 12.7
yellow 32 4.6

Es gibt aber in dem R Paket {modelsummary} noch wirklich eine Menge mehr Optionen. Bitte schau da nochmal die Hilfeseite datasummary: Crosstabs, frequencies, correlations, balance (a.k.a. “table 1”), and more an. Wir gehen hier dann nicht tiefer auf die Möglichkeiten ein.

Und auch hier kannst du ganz einfach deine Tabelle in ein Worddokument speichern. Ich habe mich hier an der Hilfeseite datasummary als *.docx abspeichern orientiert und den Code etwas angepasst. Faktisch ergänzt du einfach die Option output = "table.docx". Damit speicherst du dann deine datasumary Tabelle in die Datei table.docx.

datasummary(height ~ gender * (mean + sd),
            data = gummi_clean_tbl, 
            output = 'table.docx')

Referenzen

Fay DS, Gerow K. 2018. A biologist’s guide to statistical thinking and analysis. WormBook: The Online Review of C. elegans Biology [Internet].