Mathematik für Biologiestudierende¶

Wintersemester 2025/26

  1. Oktober 2025

© 2025 Prof. Dr. Rüdiger W. Braun

Wiederholung (interaktiv)¶

Gehen Sie auf die Website

  • https://pingo.coactum.de

und geben Sie folgende Zugangsnummer ein

  • 670719

oder scannen Sie den QR-Code

QR-Code

Themen heute¶

  • Streuungsparameter
  • Quartile
  • Box-Whisker Plots
  • Python und Pandas: Verwendung von Klammern
In [1]:
import numpy as np
np.set_printoptions(legacy='1.21')
import seaborn as sns
sns.set_theme()
sns.set_context('talk')
import pandas as pd

Streuungsparameter¶

Empirische Varianz und Stichprobenstreuung¶

  • Beim Stichprobenumfang $n$ seien $x_1, x_2, x_3, \dots, x_n$ die Messwerte, dann ist das empirische Varianz gleich \begin{equation*} s^2 = \frac{(x_1-\overline x)^2 + (x_2-\overline x)^2 + (x_3-\overline x)^2 + \dots + (x_n-\overline x)^2}{n-1} \end{equation*} Dabei ist $\overline x$ das arithmetische Mittel
  • Die empirische Varianz wird mit $s^2$ bezeichnet.
  • Die Zahl $s$ heißt empirische Standardabweichung oder Stichprobenstreuung
  • Die Stichprobenstreuung ist also die Quadratwurzel der empirischen Varianz

Konkrete Rechnung¶

Bei fünf Proben wurden die folgenden Massen in [g] gewogen:

Nummer 1 2 3 4 5
Masse 1.1 1.3 1.6 1.3 2.0

$$\displaystyle \sum_{j=1}^5 x_j = 7.3g$$ $$\overline x = \frac{7.3g}5 = 1.46g$$ $$\sum_{j=1}^5 (x_j-\overline x)^2 = 0.4920g^2$$ $$s^2 = \frac{0.4920g^2}4 = 0.1230g^2 \quad\text{und}\quad s = \sqrt{0.1230g^2} = 0.3507g$$

In [2]:
maeuse = pd.DataFrame()
maeuse['Gewicht'] = [21.3, 19.8, 20.4, 19.0, 22.7]
maeuse
Out[2]:
Gewicht
0 21.3
1 19.8
2 20.4
3 19.0
4 22.7
In [3]:
maeuse.var()
Out[3]:
Gewicht    2.033
dtype: float64

var empirische Varianz

In [4]:
maeuse.std()
Out[4]:
Gewicht    1.425833
dtype: float64

std Stichprobenstreuung (engl. "sample standard deviation")

Stichprobenstreuung vs. Varianz¶

  • Der Vorteil der Stichprobenstreuung gegenüber der Varianz ist, dass die Stichprobenstreuung richtig skaliert
  • Das bedeutet folgendes: Wenn ich alle Daten mit 1000 multipliziere, dann
    • multipliziert sich das arithmetische Mittel mit 1000
    • multipliziert sich die Varianz mit 1000000
    • multipliziert sich die Stichprobenstreuung mit 1000
  • Das bedeutet auch, dass die Stichprobenstreuung in derselben Einheit angegegeben wird wie die Daten

Formeln für die Varianz¶

  • Die Definition ohne Pünktchen \begin{equation*} s^2 = \frac1{n-1} \sum_{j=1}^n \left(x_j - \overline x \right)^2 \end{equation*}
  • Eine etwas einfachere Formel, deren Richtigkeit leicht nachgerechnet werden kann \begin{equation*} s^2 = \frac1{n-1} \biggr( \Bigr( \sum_{j=1}^n x_j^2 \Bigr) - n {\overline x}^2 \biggr) \end{equation*}

Warum $n - 1$ im Nenner?¶

  • $n-1$ ist die Zahl Freiheitsgrade
  • Das ist ein heuristisches Konzept:
    • erstmal hat man pro Stichprobe einen Freiheitsgrad
    • für jeden Wert, den man hilfsweise schätzen muss, wird ein Freiheitsgrad abgezogen
  • zur Berechnung der Varianz muss das arithmetische Mittel bestimmt werden: also ein Freiheitgrad Abzug
  • Das bedeutet, dass man, wenn man für viele Datensätze die Varianz mit dieser Methode feststellt, im Mittel näher an der wahren Varianz ist, als wenn man den Nenner $n$ benutzt
  • Alle großen Software-Pakete machen das so

Software-Pakete:

  • python mit pandas und scipy.stats
  • R
  • SPSS

Wenn gewünscht, kann man von Nenner $n-1$ zu Nenner $n$ umschalten

In [5]:
maeuse.var(ddof=0)
Out[5]:
Gewicht    1.6264
dtype: float64
In [6]:
maeuse.var()
Out[6]:
Gewicht    2.033
dtype: float64

ddof = delta degrees of freedom; das ist die Zahl, die man vom Stichprobenumfang abzieht, um die Zahl der Freiheitsgrade zu bekommen

Achten Sie auf Ihren Taschenrechner!

Zusammenfassungen mit describe¶

In [7]:
maeuse.describe()
Out[7]:
Gewicht
count 5.000000
mean 20.640000
std 1.425833
min 19.000000
25% 19.800000
50% 20.400000
75% 21.300000
max 22.700000
  • count: Anzahl
  • mean: arithmetisches Mittel
  • std: Stichprobenstreuung
  • min: kleinster Wert
  • 50%: Median
  • 25%, 75%: Quartile (s.u.)
  • max: größter Wert

Funktioniert auch für DataFrames

In [8]:
df = sns.load_dataset("penguins")
df.describe()
Out[8]:
bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
count 342.000000 342.000000 342.000000 342.000000
mean 43.921930 17.151170 200.915205 4201.754386
std 5.459584 1.974793 14.061714 801.954536
min 32.100000 13.100000 172.000000 2700.000000
25% 39.225000 15.600000 190.000000 3550.000000
50% 44.450000 17.300000 197.000000 4050.000000
75% 48.500000 18.700000 213.000000 4750.000000
max 59.600000 21.500000 231.000000 6300.000000
  • Spalten, die kategorielle Daten enthalten, werden ausgelassen
  • bei count sind die NaN nicht mitgezählt

Quartile¶

  • Das Quartil $Q_1$ ist als derjenige Wert definiert, unter dem 25% und über dem 75% der Messwerte liegen
  • Das Quartil $Q_3$ ist als derjenige Wert definiert, über dem 25% und unter dem 75% der Messwerte liegen
  • Das Quartil $Q_2$ ist der Median
  • Bei den Schnabellängen: $Q_1 = 39.225$ und $Q_3 = 48.5$

Beispielgrafik¶

die vier Viertel sind unterschiedlich gefärbt

Image

Zusammenhang zwischen Quartilen und Quantilen¶

  • Allgemeiner ist für $q$ zwischen $0$ und $1$ das $q$-Quantil derjenige Wert, so dass der Anteil der Messwerte unterhalb dieses Wertes gleich $q$ und der Anteil oberhalb gleich $1-q$ ist
  • Wenn $q$ in Prozent ausgedrückt wird, dann spricht man auch von Perzentilen
Quartil Quantil
1. Quartil 25%-Quantil
Median 50%-Quantil
3. Quartil 75%-Quantil

Beispiel

  • Leute, die zu den reichsten 1% der Bevölkerung gehören, haben ein Einkommen oberhalb des 99%-Quantils

Interquartilabstand¶

  • Der Interquartilabstand ist definiert als $$ \text{IQR} = Q_3 - Q_1 $$
  • Der Interquartilabstand ist ein robustes Maß für die Streuung

Berechnung des Interquartilabstands

In [9]:
body = df.body_mass_g.describe()
body
Out[9]:
count     342.000000
mean     4201.754386
std       801.954536
min      2700.000000
25%      3550.000000
50%      4050.000000
75%      4750.000000
max      6300.000000
Name: body_mass_g, dtype: float64
In [10]:
body['75%'] - body['25%']
Out[10]:
1200.0

Box-Whisker-Plots¶

In [11]:
sns.boxplot(df, x="species", y="body_mass_g");
No description has been provided for this image

Ein Boxplot, auch Box-Whisker-Plot genannt, zeigt von unten nach oben

  • untere Einzelpunkte
  • unterster Datenpunkt, der kein Einzelpunkt ist
  • $Q_1$
  • Median
  • $Q_3$
  • oberster Datenpunkt, der kein Einzelpunkt ist
  • obere Einzelpunkte

Einzelpunkte sind solche, die weiter als 1.5 Interquartilabstände von $Q_1$ bzw. $Q_3$ weg sind

Manchmal werden die Einzelpunkte als "Ausreißer" bezeichnet. Das kann man aber nicht so einfach gleichsetzen.

In [12]:
maeuse2 = pd.DataFrame()
maeuse2['Gewicht'] = [21.3, 19.8, 20.4, 19.0, 22.7, 287] 
In [13]:
sns.boxplot(maeuse2.Gewicht);
No description has been provided for this image

Das ist wirklich ein Ausreißer (engl. "outlier")