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¶

  • Installation
  • Exponentialfunktion mit Python
  • Punktgrafiken
  • Liniengrafiken
  • Tabellen

Statistik mit Python¶

Installationshinweise auf https://www.math.uni-duesseldorf.de/~internet/bio2526/software.html

In [1]:
123456 * 987654
Out[1]:
121931812224
In [2]:
88/12
Out[2]:
7.333333333333333
  • Addition +
  • Subtraktion -
  • Multiplikation *
  • Division /
  • Potenz **
In [3]:
2**10
Out[3]:
1024
In [4]:
import numpy as np
  • Es gibt mindestens fünf Implementierungen von $\exp$ in Python
  • Daher müssen die benötigten Bibiotheken explizit geladen werden
In [5]:
np.set_printoptions(legacy='1.21')
In [6]:
np.exp(2)
Out[6]:
7.38905609893065

Der Logarithmus wird aufgerufen als

In [7]:
np.log(7.389056)
Out[7]:
1.9999999866111924
In [8]:
np.log(7.38905609893065)
Out[8]:
2.0

Die Art der ausgewählten Zelle kann geändert werden

  • Markdown: Text
  • Code: Programmcode

jeweils Ausführung durch <Umschalt>-<Eingabe> oder "$\blacktriangleright$ Run" aus der Werkzeugleiste

  • in dieser Vorlesung benutzen wir Python als "erweiterten Taschenrechner"
  • Programmierung ist nicht unser Thema

Plots¶

Wir schauen uns die Daten aus dem Beispiel "Bakterien" an

In [9]:
np.arange(8)
Out[9]:
array([0, 1, 2, 3, 4, 5, 6, 7])
  • np.arange: Bereich (engl. range) von Zahlen
  • Python beginnt Zählungen bei 0
  • hat so viele Elemente, wie angegeben (also 8)
  • np.array: Liste von beliebigen Elementen
In [10]:
zeit = np.arange(8)
  • die Liste wird unter dem Namen zeit gespeichert
  • zeit bezeichnet man als Variable
  • der Variablen zeit wird die Liste np.arange(8) zugewiesen
  • der Inhalt der Variablen wird nicht automatisch ausgegeben
  • das müssen wir anfordern
In [11]:
zeit
Out[11]:
array([0, 1, 2, 3, 4, 5, 6, 7])

Die Konzentrationen aus dem Beispiel von letztem Mittwoch

In [12]:
konzentration = np.array([10000, 8500,  7225, 6141, 5220, 4437, 3771, 3206])
konzentration
Out[12]:
array([10000,  8500,  7225,  6141,  5220,  4437,  3771,  3206])

seaborn¶

Wir benutzen für Grafik die Bibliothek seaborn

In [13]:
import seaborn as sns
In [14]:
sns.scatterplot(x=zeit, y=konzentration)
Out[14]:
<Axes: >
No description has been provided for this image
  • scatterplot: Grafik aus einzelnen Punkten
  • lineplot: durchgezogene Linie

Wir wollen die Achsen beschriften

Dazu geben wir als erstes dem Bild den Namen ax (von axis)

In [15]:
ax = sns.scatterplot(x=zeit, y=konzentration)
No description has been provided for this image
In [16]:
ax.set_xlabel("Zeit")
ax.set_ylabel("Konzentration");
  • Das Semikolon am Ende der letzten Zeile bedeutet, dass die Zelle keine Ausgaben erzeugt
  • Die Zelle auch ohne das Semikolon nicht die Grafik zeigen
  • Die Ausgabe der Grafik muss explizit angefordert werden
In [17]:
ax.figure
Out[17]:
No description has been provided for this image

Jetzt malen wir noch die Kurve $10000 \cdot e^{-0.1625\cdot x}$ dazu.

  • Was ist eine Kurve in Python?
  • Wir könnten die Kurve als scatterplot aus sehr vielen Punkten machen
  • Zuerst machen wir die Punkte
In [18]:
x = np.linspace(0, 7, 100)

100 Zahlen zwischen 0 und 7 (äquidistant)

In [19]:
y = 10000*np.exp(-0.1625*x)

y ist jetzt eine Liste mit den 100 zugehörigen Funktionswerten

In [ ]:
 
In [20]:
sns.scatterplot(x=x, y=y);
No description has been provided for this image

Wir wollen aber keine einzelnen Punkte

In [21]:
sns.lineplot(x=x, y=y);
No description has been provided for this image

Das malen wir jetzt in die andere Achse hinein

In [22]:
ax2 = sns.lineplot(x=x, y=y, ax=ax)
ax2.figure
Out[22]:
No description has been provided for this image

Es gibt eine Unzahl von statistischen Zeichenfunktionen. Die wichtigsten werde ich nach und nach vorstellen.

In [23]:
sns.set_theme()
  • Damit schalten wir einen grauen Hintergrund mit weißem Gitter ein
In [24]:
sns.set_context('talk')
  • Nur für die Vorlesung: dickere Linien und größerer Zeichensatz

Zur Wiederholung eine Grafik zu den Absorbationstiefen¶

In [25]:
tiefe = np.linspace(0, 24, 50)
blau = np.exp(-0.03289*tiefe)
In [26]:
gruen = np.exp(-.1151*tiefe)
rot = np.exp(-.3466*tiefe)
In [27]:
sns.lineplot(x=tiefe, y=blau, color='blue')
sns.lineplot(x=tiefe, y=gruen, color='green')
ax = sns.lineplot(x=tiefe, y=rot, color='red')
ax.set_xlabel('Tiefe [m]')
ax.set_ylabel('Anteil');
No description has been provided for this image

Datensätze¶

Tabellen¶

Konstruktion einer Tabelle in Python

  • Zu Fuß, beispielsweise mit np.array wie im Beispiel zum Scatterplot
  • Einlesen einer Beispieldatei aus seaborn
  • Einlesen einer Datei aus einem Tabellenkalkulationsprogramm

Einlesen einer Beispieldatei aus seaborn¶

In [28]:
df = sns.load_dataset("penguins")

df steht für "Dataframe"

In [29]:
df
Out[29]:
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

  • Eselspinguine heißen englisch "Gentoo penguins"
  • "bill" ist der Schnabel
  • "flipper" der Flügel
  • NaN heißt "not a number", d.h. es liegen keine Daten vor
  • seaborn enthält einige Dutzend Beispieldatensätze, um die verschiedenen Grafiken zu demonstrieren

Einlesen einer Datei mit gemessenen Daten¶

In [30]:
import pandas as pd

pandas ist die Bibliothek zur Tabellenbearbeitung

In [31]:
df = pd.read_csv('https://www.math.uni-duesseldorf.de/~braun/bio2526/barsche.csv')
df
Out[31]:
Nr Art Länge
0 1 gestreift 10.7
1 2 gestreift 10.0
2 3 gestreift 9.8
3 4 gestreift 10.3
4 5 gestreift 10.3
... ... ... ...
115 116 blau 12.1
116 117 blau 12.5
117 118 blau 12.0
118 119 blau 12.1
119 120 blau 12.0

120 rows × 3 columns

  • pd.read_csv() liest eine Table im csv-Format
  • alle Tabellenkalkulationsprogramme können im csv-Format abspeichern
  • Nr ist die laufende Nummer des Fisches aus der Datei
  • Art seine Art
  • Länge seine Länge im mm
  • Die vorderste Spalte ist ein von Pandas hinzugefügter Index
In [32]:
sns.scatterplot(data=df, x='Nr', y='Länge');
No description has been provided for this image
In [ ]: