Wintersemester 2023/24
© 2023 Prof. Dr. Rüdiger W. Braun
Quantitatives Merkmal:
zahlenmäßig erfassbar; Zahlenwerte besitzen Bedeutung
unterteilt in
stetiges Merkmal:
Zahlenwerte variieren kontinuierlich (z.B. Gewicht, gemessene Zeit) </p>
diskretes Merkmal:
Skala ohne Zwischenwerte (z.B. Anzahl, Zeit in Tagen) </p>
Qualitatives Merkmal:
alle anderen
Grundgesamtheit: alle Bäume einer Baumschule
Merkmal: Art (qualitatives Merkmal)
Ausprägung: Fichte </p>
Merkmal: Größe (quantitativ stetiges Merkmal)
Ausprägung: 3.38m
</p>
Merkmal: Pflanzdatum (quantitativ diskretes Merkmal)
Ausprägung: 9.10.2003
Ist die Matrikelnummer ein quantitatives oder ein qualitatives Merkmal?
Antwort: Qualitatives Merkmal, jedenfalls innerhalb einer Jahrgangs
species = "Adelie"
anzahl = 17
gewicht = 4.880
Zufällige Auswahl ist nicht einfach. Man verwendet
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
import random
zufällige Fließkommazahl zwischen 0 und 1:
random.random()
0.4314311753628782
random.random()
0.8281992976126225
random.random()
0.04102470831501437
Ganze Zufallszahl zwischen n und m:
random.randint(10, 20)
# beide Randpunkte eingeschlossen
14
zufällige Auswahl:
random.sample(range(10), 5)
[3, 4, 0, 5, 8]
range
ist wie np.arange
np.arange
ist bei random
aber nicht zulässig
range(10)
range(0, 10)
list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
random.seed(1234)
random.randint(1, 1000)
990
random.randint(1, 1000)
797
random.seed(1234)
random.randint(1, 1000)
990
Wozu soll das gut sein?
Histogramm: Wie Balkendiagramm, aber Werte werden vorher in Klassen zusammengefasst
Bei Stichprobenumfang $n$ Anzahl der Klassen ungefähr $\sqrt n$
import seaborn as sns
df = sns.load_dataset("penguins") # mitgelieferter DataFrame
df
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
sns.displot(df, x='flipper_length_mm');
/az076/miniconda3/envs/bio/lib/python3.11/site-packages/seaborn/axisgrid.py:118: UserWarning: The figure layout has changed to tight self._figure.tight_layout(*args, **kwargs)
Die Anzahl der Fächer (bins) kann eingestellt werden
sns.displot(df, x='flipper_length_mm', bins=20)
/az076/miniconda3/envs/bio/lib/python3.11/site-packages/seaborn/axisgrid.py:118: UserWarning: The figure layout has changed to tight self._figure.tight_layout(*args, **kwargs)
<seaborn.axisgrid.FacetGrid at 0x7f09db71c290>
Alternativ kann auch die Breite der Fächer eingestellt werden
import warnings
warnings.filterwarnings('ignore', message='The figure layout has changed')
sns.histplot(df, x='flipper_length_mm', binwidth=2.5)
<Axes: xlabel='flipper_length_mm', ylabel='Count'>
Bei qualitativen Merkmalen spricht man von kategoriellen Daten. Zählt man die Vorkommen, erhält man ein Balkendiagramm.
sns.displot(df, x='species')
<seaborn.axisgrid.FacetGrid at 0x7f09dab9ce90>
sns.displot(df, col='island', x='species');
sns.displot(df, col='island', x='species', hue='sex', multiple="stack");
Bevor wir weitere Graphen ansehen, erst noch ein Blick auf pd.DataFrame
sns.load_dataset
lädt einen der mitgelieferten Datensätzepd.DataFrame
, das ist eine Tabelledf
) ohne Anführungszeichen"
oder '
"
und '
, aber vor und hinter dem Wort dasselbe Zeichen verwendenDie erste Spalte eines DataFrames ist der Index, in diesem Beispiel die laufende Nummer
df.index
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
df.flipper_length_mm
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
df.loc[222]
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
sns.displot(df, x='flipper_length_mm');
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
w = df[df.sex=="Female"] # Achtung "==" als Vergleichsoperator"
w
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
sns.histplot(w, x="flipper_length_mm");
Immer noch bimodal. Also das Geschlecht nicht der Grund. Vielleicht die verschiedenen Arten?
sns.displot(df, x="flipper_length_mm", col="species");
sns.displot(df, x="flipper_length_mm", col="species", hue='sex', binwidth=3, multiple='stack');
displot
¶displot(df, x, col, hue, binwidth)
Die Angaben für x
, col
und hue
beziehen sich auf Spaltennamen des DataFrame, sie werden in Anführungszeichen gesetzt
Wie viele Pinguine gibt es von jeder Sorte?
df["species"].value_counts()
species Adelie 152 Gentoo 124 Chinstrap 68 Name: count, dtype: int64
df["species"].value_counts().plot.pie();
pp = sns.light_palette('Navy', as_cmap=True)
df["species"].value_counts().plot.pie(cmap=pp);