Mathematik für Biologiestudierende¶

Wintersemester 2023/24

  1. Oktober 2023

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

Merkmale¶

Grundbegriffe¶

  • die Elemente der Grundgesamtheit sind Träger von Merkmalen
  • die Merkmale haben verschiedene Ausprägungen
  • jedes Element der Grundgesamtheit besitzt für jedes Merkmal nur eine Ausprägung

Typen von Merkmalen¶

  • Quantitatives Merkmal:

    zahlenmäßig erfassbar; Zahlenwerte besitzen Bedeutung

    unterteilt in

    • stetiges Merkmal:

      Zahlenwerte variieren kontinuierlich (z.B. Gewicht, gemessene Zeit)

    • diskretes Merkmal:

      Skala ohne Zwischenwerte (z.B. Anzahl, Zeit in Tagen)

  • Qualitatives Merkmal:

    alle anderen

Beispiele zu den Grundbegriffen¶

Grundgesamtheit: alle Bäume einer Baumschule

  • Merkmal: Art (qualitatives Merkmal)

    Ausprägung: Fichte

  • Merkmal: Größe (quantitativ stetiges Merkmal)

    Ausprägung: 3.38m

  • Merkmal: Pflanzdatum (quantitativ diskretes Merkmal)

    Ausprägung: 9.10.2003

Matrikelnummer¶

Ist die Matrikelnummer ein quantitatives oder ein qualitatives Merkmal?

Antwort: Qualitatives Merkmal, jedenfalls innerhalb einer Jahrgangs

Darstellung von Merkmalen in Python¶

  • Ausprägungen qualitativer Merkmale werden als kategorielle Daten bezeichnet
  • sie werden als Zeichenketten (string) dargestellt
  • Beispiel species = "Adelie"
  • diskrete quantitative Merkmale werden als ganze Zahlen (integer) dargestellt
  • Beispiel anzahl = 17
  • kontinuierliche quantitative Merkmale werden als Fließkommazahlen (float) dargestellt
  • Beispiel gewicht = 4.880
  • Der Unterschied zwischen einer Fließkommazahl und einer ganzen Zahl ist, dass die Fließkommazahl einen Dezimalpunkt enthält, die ganze Zahl nicht

Stichproben¶

  • Eine Stichprobe ist eine zufällig gewonnene Teilmenge aus der zu untersuchenden Grundgesamtheit
  • Der Stichprobenumfang ist die Anzahl der Elemente in der Stichprobe
  • Die Daten sind die beobachteten Ausprägungen des Merkmals bzw. der Merkmale
  • Die Erfassung der Daten geschieht in der Urliste, auch Protokoll genannt
  • Die Urliste ist unveränderlich

Zufall¶

  • Zufall bedeutet für uns: Kein erkennbares Muster

  • Zufällige Auswahl ist nicht einfach. Man verwendet

    • Würfel
    • Zufallsgenerator
    • und früher sogar gedruckte Zufallstafeln
  • weil der Computer eine deterministische Maschine ist, sind die in den verschiedenen Programmiersprachen verfügbaren Zufallsgeneratoren in Wahrheit Pseudozufallsgeneratoren

  • die Pseudozufallsgeneratoren der gängigen Programmiersprachen reichen für Versuchsplanung und Modellbildung völlig aus

Zufallsgeneratoren in Python¶

In [1]:
import random

zufällige Fließkommazahl zwischen 0 und 1:

In [2]:
random.random()
Out[2]:
0.12205942664752822
In [3]:
random.random()
Out[3]:
0.7229295760498691
In [4]:
random.random()
Out[4]:
0.45189623582046645

Ganze Zufallszahl zwischen n und m:

In [5]:
random.randint(10, 20)  
#  beide Randpunkte eingeschlossen
Out[5]:
13

zufällige Auswahl:

In [6]:
random.sample(range(10), 5)
Out[6]:
[1, 9, 2, 7, 0]

range ist wie np.arange

np.arange ist bei random aber nicht zulässig

In [7]:
range(10)
Out[7]:
range(0, 10)
In [8]:
list(range(10))
Out[8]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Seeding¶

In [9]:
random.seed(1234)
In [10]:
random.randint(1, 1000)
Out[10]:
990
In [11]:
random.randint(1, 1000)
Out[11]:
797
In [12]:
random.seed(1234)
random.randint(1, 1000)
Out[12]:
990

Wozu soll das gut sein?

  • Auf Maschinen, die nicht in der Lage sind, ein gutes seed zu konstruieren, kann man selber eins angeben
  • Wichtiger: Zur Fehlersuche bei Programmen mit zufälligem Anteil

Versuchsplanung¶

Folgendes Experiment:

  • 25 Fische zufällig ausgewählt
  • Fische lernen, in einem Labyrinth Futter zu suchen; Zeit wird gemessen
  • die Fische werden an 25 Artgenossen verfüttert
  • die Artgenossen sollen im selben Labyrinth Futter suchen; Zeit wird gemessen
  • die neuen Fische sind schneller
  • Nobelpreis?

Grafiken¶

  • Balkendiagramm: Für jeden möglichen Wert ein Balken, der die Anzahl anzeigt

  • Histogramm: Wie Balkendiagramm, aber Werte werden vorher in Klassen zusammengefasst

    Bei Stichprobenumfang $n$ Anzahl der Klassen ungefähr $\sqrt n$

  • Tortendiagramm: Anteile an der Gesamtpopulation werden grafisch dargestellt

Beispiel Pinguine¶

In [13]:
import seaborn as sns
df = sns.load_dataset("penguins")   # mitgelieferter DataFrame
In [14]:
df
Out[14]:
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
... ... ... ... ... ... ... ...
339 Gentoo Biscoe NaN NaN NaN NaN NaN
340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female
341 Gentoo Biscoe 50.4 15.7 222.0 5750.0 Male
342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female
343 Gentoo Biscoe 49.9 16.1 213.0 5400.0 Male

344 rows × 7 columns

Ein DataFrame ist eine Tabelle ähnlich einem Excel-Spreadsheet

Histogramm¶

In [15]:
sns.displot(df, x='flipper_length_mm');
No description has been provided for this image

Die Anzahl der Fächer (bins) kann eingestellt werden

In [16]:
sns.displot(df, x='flipper_length_mm', bins=20)
Out[16]:
<seaborn.axisgrid.FacetGrid at 0x7c546eb79a00>
No description has been provided for this image

Alternativ kann auch die Breite der Fächer eingestellt werden

In [17]:
import warnings
warnings.filterwarnings('ignore', message='The figure layout has changed')
In [18]:
sns.histplot(df, x='flipper_length_mm', binwidth=2.5)
Out[18]:
<Axes: xlabel='flipper_length_mm', ylabel='Count'>
No description has been provided for this image

Balkendiagramm¶

Bei qualitativen Merkmalen spricht man von kategoriellen Daten. Zählt man die Vorkommen, erhält man ein Balkendiagramm.

In [19]:
sns.displot(df, x='species')
Out[19]:
<seaborn.axisgrid.FacetGrid at 0x7c5466578fb0>
No description has been provided for this image
In [20]:
sns.displot(df, col='island', x='species');
No description has been provided for this image
In [21]:
sns.displot(df, col='island', x='species', hue='sex', multiple="stack");
No description has been provided for this image

DataFrames¶

Bevor wir weitere Graphen ansehen, erst noch ein Blick auf pd.DataFrame

  • sns.load_dataset lädt einen der mitgelieferten Datensätze
  • Der Datensatz kommt als pd.DataFrame, das ist eine Tabelle
  • Variablennamen (z.B. df) ohne Anführungszeichen
  • andere Bezeichner mit Anführungszeichen " oder '
  • kein Unterschied zwischen " und ', aber vor und hinter dem Wort dasselbe Zeichen verwenden
  • später mehr zu diesem Thema

Die erste Spalte eines DataFrames ist der Index, in diesem Beispiel die laufende Nummer

In [22]:
df.index
Out[22]:
RangeIndex(start=0, stop=344, step=1)

Die Spalten zeigen Ausprägungen von Merkmalen

Wir erhalten die Spalte flipper_length_mm des DataFrame df auf einer der beiden folgenden Weisen

  • df.flipper_length_mm
  • df['flipper_length_mm']

Wenn der Spaltenname Leerzeichen enthält, funktioniert nur die zweite Variante

In [23]:
df.flipper_length_mm
Out[23]:
0      181.0
1      186.0
2      195.0
3        NaN
4      193.0
       ...  
339      NaN
340    215.0
341    222.0
342    212.0
343    213.0
Name: flipper_length_mm, Length: 344, dtype: float64

NaN bedeutet "not a number", in der Praxis meist, dass der Wert nicht erhoben werden konnte

Die Daten des Pinguins Nummer 222 erhält man so

In [24]:
df.loc[222]
Out[24]:
species              Gentoo
island               Biscoe
bill_length_mm         48.7
bill_depth_mm          14.1
flipper_length_mm     210.0
body_mass_g          4450.0
sex                  Female
Name: 222, dtype: object
In [25]:
sns.displot(df, x='flipper_length_mm');
No description has been provided for this image

Die Verteilung ist bimodal, d. h. es gibt zwei Maxima.

Das könnte daran liegen, dass die beiden Geschlechter unterschiedliche Flügellängen haben. Wir betrachten nur die weiblichen Pinguine

Wir speichern die Daten der weiblichen Pinguine im DataFrame w

In [26]:
w = df[df.sex=="Female"]  #  Achtung "==" als Vergleichsoperator"
w
Out[26]:
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
6 Adelie Torgersen 38.9 17.8 181.0 3625.0 Female
12 Adelie Torgersen 41.1 17.6 182.0 3200.0 Female
... ... ... ... ... ... ... ...
332 Gentoo Biscoe 43.5 15.2 213.0 4650.0 Female
334 Gentoo Biscoe 46.2 14.1 217.0 4375.0 Female
338 Gentoo Biscoe 47.2 13.7 214.0 4925.0 Female
340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female
342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female

165 rows × 7 columns

In [27]:
sns.histplot(w, x="flipper_length_mm");
No description has been provided for this image

Immer noch bimodal. Also das Geschlecht nicht der Grund. Vielleicht die verschiedenen Arten?

In [28]:
sns.displot(df, x="flipper_length_mm", col="species");
No description has been provided for this image
In [29]:
sns.displot(df, x="flipper_length_mm", col="species", hue='sex', binwidth=3, multiple='stack');
No description has been provided for this image

displot¶

displot(df, x, col, hue, binwidth)

  • df: DataFrame
  • x: Variable auf der x-Achse, deren Elemente gezählt werden sollen, quantitativ oder kategoriell
  • col: für jeden Wert dieser Variable wird ein Bild gezeichnet, kategoriell (optional)
  • hue: Unterteilung der Zählung, durch Farben ausgedrückt, kategoriell (optional)
  • binwidth: Breite der Fächer (optional)
  • bins: Anzahl der Fächer (alternativ zu binwidth, optional)

Die Angaben für x, col und hue beziehen sich auf Spaltennamen des DataFrame, sie werden in Anführungszeichen gesetzt

Tortendiagramme¶

  • findet man selten in Fachzeitschriften
  • daher kein Bestandteil von seaborn

Wie viele Pinguine gibt es von jeder Sorte?

In [30]:
df["species"].value_counts()
Out[30]:
species
Adelie       152
Gentoo       124
Chinstrap     68
Name: count, dtype: int64
In [31]:
df["species"].value_counts().plot.pie();
No description has been provided for this image
In [32]:
pp = sns.light_palette('Navy', as_cmap=True)
df["species"].value_counts().plot.pie(cmap=pp);
No description has been provided for this image