Unsupervised Learning: Clusteranalyse

DS3 - Vom experimentellen Design zur
explorativen Datenanalyse & Data Mining

Saskia Otto & Monika Eberhard

Universität Hamburg, IMF

Wintersemester 2025/2026

Lernziele

Am Ende dieser VL- und Übungseinheit werden Sie

  • einen groben Überblick über Analysetechniken zu multivariaten Datensätzen in der Biologie haben.
  • wissen, was eine Assoziationsmatrix ist und wie diese berechnet wird.
  • die Grundprinzipien der hierarchischen Clusteranalyse verstanden haben.
  • in der Lage sein, den geeigneten Clustering-Algorithmus für verschiedene Datensätze und Fragestellungen auszuwählen.

Analysen multivariater Daten

Biologische Daten sind oft multivariat… | 1

Biologische Daten sind oft multivariat… | 2

  • Mehrere (Antwort-)Variablen (Abundanzen von Arten, Umweltvariablen, Messungen von biologischen Merkmalen (‘traits’), Gensequenzen, …)
  • Mehrere Objekte (z. B. Standorte, Zeit, Individuen, experimentelle Einheiten,…)

Beispiele multivariater Daten | 1

Genomdaten

  • Microarray-Daten, die aus 6.830 Genexpressionsmessungen (Variablen: kontinuierlich) an 64 Krebszelllinien bestehen.
  • Mögliche Fragestellung: Lassen sich die Krebszelllinien auf Grundlage ihres Genexpressionsprofils in verschiedene Gruppen oder Cluster einordnen?
    • → Schwierige Frage, weil es sehr viele Genexpressionsmessungen pro Zelllinie gibt, was es schwierig macht, die Daten zu visualisieren!

Bildquelle: James et al. (2013): Introduction to Statistical Learning

Beispiele multivariater Daten | 2

Physiologische Daten

  • Fettsäurenzusammensetzung des Blubbers (Variablen: kontinuierlich) bei 89 Schweinswalen.
  • Mögliche Fragestellung: Können wir Gruppen von Individuen mit unterschiedlichen Ernährungsgewohnheiten identifizieren?

Beispiele multivariater Daten | 3

Trait-Daten

  • Merkmale oder traits (Variablen: quantitativ/ qualitativ) verschiedener Fisch- oder Zooplanktonarten.
  • Mögliche Fragestellung: Lassen sich die Arten in funktionelle Gruppen zusammenlegen?

Beispiele multivariater Daten | 4

Abundanzsdaten einer biol. Gemeinschaft

  • Abundanzen von Wolfspinnen (und Umweltparameter) (Variablen: diskret/kontinuerlich), die an verschiedenen Standorten eines Dünenengebiets in den Niederlande gemessen wurden.
  • → Problematisch bei Abundanzdaten: enthalten oft viele Nullen!
  • Mögliche Fragestellungen:

Wie können wir multivariate Daten analysieren?

Indizes berechnen

Diversitätsindizes

  • Diversitätsindizes sind quantitative Maße, die verwendet werden, um die biologische Vielfalt oder Diversität in einem bestimmten Ökosystem, einer Population oder einer Gemeinschaft zu bewerten.
  • Je nach Index wird die Anzahl der verschiedenen Arten sowie deren Häufigkeit, Abundanz bzw. Verteilung, deren Traits und/oder Phylogenie berücksichtigt.
  • Unterscheidet in
    • taxonomische Diversität → hier ist das R Paket vegan nützlich
    • funktionelle Diversität → R Paket mFD
    • phylogenetische Diversität → R Pakete ape und picante
Artenreichtum S und Shannon Index H mit 'vegan' berechnen:
spiderA |> transmute(samples = 1:28,
    S = vegan::specnumber(x = spiderA),
    H =  vegan::diversity(x = spiderA, index = "shannon") ) |>
  arrange(desc(S), desc(H))
   samples  S         H
1       13 11 1.8742271
2        3 11 1.8732193
3        7 10 1.7221199
4        4 10 1.6520490
5        5 10 1.5403056
6       25  9 1.9276654
7       14  9 1.5284480
8        6  8 1.7591828
9        1  8 1.7309509
10       2  8 1.5204418
11       8  8 1.3896573
12      11  7 0.7440770
13      23  6 1.4848760
14      21  6 1.1565256
15      12  6 1.1410240
16       9  6 0.7752108
17      28  5 1.2769439
18      22  5 1.2373886
19      16  5 1.1035352
20      19  5 1.0708014
21      24  4 1.1601124
22      20  4 0.9938215
23      26  4 0.9724515
24      27  4 0.9272491
25      10  4 0.6551416
26      15  3 0.7464108
27      18  3 0.5785328
28      17  3 0.5221718

→ Messung #13 weist die höchste Artenzahl auf (12) und Messung #25 die höchste Shannon Diversität (bei der auch die relative Häufigkeit berücksichtigt wird.)

Einfluss der Umweltbedingungen auf den Artenreichtum (S)

spiderE |> mutate(S = vegan::specnumber(x = spiderA),) |>
  pivot_longer(WaterCon:ReflLux, names_to = "EnvVar", values_to = "Value") |> 
  ggplot(aes(x = Value, y = S)) +
  geom_point() + geom_smooth() + facet_wrap(~EnvVar)

Assoziationsmatrix

2 Typen von Assoziationsmatrix

Q-Mode | Euklidische Distanz 1

Vektorieller Abstand zwischen Punkten in einem p (Anzahl der Variablen) dimensionalen Raum, dem euklidischen Raum.

Q-Mode | Euklidische Distanz 2

Blubber Beispiel

Q-Mode | Euklidische Distanz 3

  • Hängt stark vom Wert der Variablen ab, und dieser Wert wird durch die Skala jeder Variablen beeinflusst. Wird beispielsweise g in mg umgewandelt, so wird der Beitrag dieser Variablen zum euklidischen Abstand mit 1000 multipliziert. Wenn die Variablen unterschiedliche Einheiten haben, müssen sie daher alle standardisiert werden (z-Transformation):
    • \frac{x-\hat{x}}{s} → in R Funktion scale(x, center = TRUE, scale = TRUE)
  • = symmetrischer Koeffizient: betrachtet 0 als genauso aussagekräftig wie jeden anderen Wert. Beispiel Temperatur:
    • Standort1 = 0 °C vs. Standort2 = 15 °C → Es ist kälter bei Standort1unterschiedlich
    • Standort1 = 0 °C vs. Standort2 = 0.2 °C → Es ist bei beiden Standorten kalt → gleich
Anwendung in R: Umweltdaten im spider Datensatz
# Standardisierung
spiderE_scaled <- scale(x = spiderE)
# Und nun die Euklidische Distanz
spiderE_edist <- dist(spiderE_scaled, method = "euclidean") # default

Q-Mode | Artvorkommen

Das Problem der doppelten Nullen!

  • Bei Abundanz- oder Biomassedaten von Arten:
    • Standort1 = 10 vs. Standort2 = 10 → die Standorte bieten ähnliche Umweltbedingungen für das Überleben der Art → ähnlich
    • Standort1 = 0 vs. Standort2 = 0 → bieten sie ähnlich ungünstige Bedingungen für das Überleben der Art? → ähnlich? Nicht unbedingt…
  • Das Fehlen einer Art an zwei Standorten bedeutet nicht direkt eine Ähnlichkeit zwischen diesen Standorten, da dieses doppelte Fehlen verschiedene Gründe haben kann.
  • Die Anzahl der doppelten Abwesenheiten in einer Artenmatrix hängt von der Anzahl der Arten im Datensatz ab und nimmt mit der Anzahl der seltenen Arten in der Matrix stark zu.

Q-Mode | Artvorkommen

Das Problem der doppelten Nullen!

Lösungen

  1. Asymmetrischen Koeffizienten wählen, z.B. Bray-Curtis-(Dis)similaritätsindex → Nachteil: für einige Methoden wie PCA ist Euklidische Distanz Grundlage.
  2. Folgende Standardisierung & anschl. Euklidische Distanz:
    • Chord-Standardisierung (+ Euklidische Distanz = Chord Distanz)
      • Variablen werden auf Länge 1 normalisiert.
    • Hellinger-Standardisierung (+ Euklidische Distanz = Hellinger Distanz)
      • Abundanzen werden durch die Gesamthäufigkeit des Standorts (Objekts) geteilt und dann die Quadratwurzel gezogen.
    • Chord-Standardisierung wurzeltransformierter Abundanzen = Hellinger-Standardisierung → wenn seltene Arten mehr Gewicht bekommen sollen: Hellinger





vegan::decostand()
library(vegan)

### Chord Distanzmatrix
# Chord-Standardisierung
spiderA_chord <- decostand(spiderA, 
  method = "normalize")
# Nun Euklidische Distanz
spiderA_cdist <- dist(spiderA_chord) 

### Hellinger Distanzmatrix
# Hellinger-Standardisierung
spiderA_hell <- decostand(spiderA, 
  method = "hellinger")
# Nun Euklidische Distanz
spiderA_hdist <- dist(spiderA_hell)  

Standardisierung bedeutet im Gegensatz zu Transformation, dass die Einträge relativ zu anderen Einträgen transformiert werden.

Clusteranalyse

Was ist Clustering?

  • Clustering bezieht sich auf ein sehr breites Spektrum von Techniken zum Auffinden von Untergruppen oder Clustern in einem Datensatz.
  • Wenn wir die Beobachtungen eines Datensatzes clustern, versuchen wir, sie in verschiedene Gruppen aufzuteilen, so dass die Beobachtungen innerhalb jeder Gruppe einander recht ähnlich sind, während sich die Beobachtungen in verschiedenen Gruppen recht stark voneinander unterscheiden.

Typen von Clusteranalyse

  • Beim hierarchischen Clustering weiß man nicht im Voraus, wie viele Cluster man haben möchte; man erhält eine baumartige visuelle Darstellung der Beobachtungen, ein so genanntes Dendrogramm, das es ermöglicht, die für jede mögliche Anzahl von Clustern (von 1 bis n) erhaltenen Cluster auf einmal zu betrachten.
  • Beim k-means-Clustering versuchen wir, die Beobachtungen in eine vorgegebene Anzahl von Clustern zu unterteilen.

Hierarchische Clusteranalyse

HC-Algorithmen | Clusterbildung 1

‘Single linkage’ oder ‘nearest neighbor’:

  • Basierend auf dem kürzesten paarweisen Abstand der Objekte.
  • Dendrogramm zeigt oft lange Ketten von Objekten und ist nützlich, um einen ersten Überblick zu erhalten
hc_sing <- hclust(spiderA_hdist, method = "single")


‘Complete linkage’ oder ‘furthest neighbor’:

  • Basiert auf dem weitesten paarweisen Abstand der Objekte
  • Neigt dazu, viele kleine Gruppen zu bilden, die sich bei größeren Abständen zusammenballen.
  • Ist kontrastreicher und nützlich, um Diskontinuitäten in den Daten zu erkennen.
hc_comp <- hclust(spiderA_hdist, method = "complete")


HC-Algorithmen | Clusterbildung 2

‘Arithmetic average’:

  • Basiert auf den paarweisen Durchschnittsabständen aller Objekte.
  • Gewichtet oder ungewichtet nach der Anzahl der Objekte
hc_ave <- hclust(spiderA_hdist, method = "average") # ungewichtet (UPGMC)
hc_mcq <- hclust(spiderA_hdist, method = "mcquitty") # gewichtet (WPGMC)


‘Centroids’:

  • Basiert auf dem Abstand zwischen den Schwerpunkten der Cluster.
  • Gewichtet oder ungewichtet mit der Anzahl der Objekte
hc_cent <- hclust(spiderA_hdist, method = "centroid") # ungewichtet
hc_med <- hclust(spiderA_hdist, method = "median") # gewichtet


‘Ward’s minimum variance’:

  • Führt Cluster so zusammen, dass der Anstieg der gesamten Varianz innerhalb der Cluster minimal bleibt → erzeugt kompakte, homogene Cluster.
hc_ward <- hclust(spiderA_hdist, method = "ward.D2")

HC-Algorithmen | Vergleich

# Standard-Dendrogram erstellen mit plot()
plot(hc_sing, main = "Single", hang = -1)
plot(hc_comp, main = "Complete", hang = -1)
...

HC-Algorithmus: Aber welcher? | 1

  • Es kommt auf das Ziel der Studie an!
  • Clustering ist eine explorative Methode, kein statistischer Test!
  • Die Wahl des Assoziationsmaßes und der Clustering-Methode beeinflusst die Ergebnisse.
  • Es gibt Kriterien wie
    • Kophenetische Korrelation (je höher, desto besser): Korrelation zwischen den Abständen der ursprünglichen Distanzmatrix und den Abständen der Objekte oder Cluster im Dendrogramm (kophenetische Distanzen).
    • Gower-Distanz (je geringer, desto besser): die Summe der quadrierten Differenzen zwischen den ursprünglichen Distanzen und den kophenetischen Distanzen.
    • → Bei diesen beiden Kriterien schneidet der Average linkage (UPMGA) Algorithmus (method = average) meist am besten ab!

Wie viele Gruppen?

Das hängt ganz vom Ziel der Studie ab! Die Auswahl ist oft subjektiv.
Es gibt viele verfügbare Analysen, die auf verschiedenen Kriterien basieren und bei der Entscheidung helfen können (siehe z.B. Borcard et al. 2011; Kassambara 2017…).

Grafische Darstellung der Fusionsstufen/Fusionshöhe Die ‘Fusionsstufen’ eines Dendrogramms sind die Unähnlichkeits- bzw. Distanzwerte, bei denen eine Fusion zwischen zwei Zweigen eines Dendrogramms stattfindet. Die Diagramme können bei der Entscheidungsfindung helfen; es gibt aber nicht die eine beste Wahl und alles hängt von der Zielsetzung ab.

Code
par(mfrow = c(1,2))
plot(hc_ave, main = "Average: unweighted", hang = -1)

# Plot der Fusionshöhen und Clusteranzahlen
plot(hc_ave$height,
  nrow(spiderA_hell):2,  # Anzahl der Cluster von n bis 2
  type = "S",  # "S" für Step-Plot
  main = "Fusionslevel - Average Unweighted Algorithmus",
  ylab = "k (Anzahl der Cluster)",
  xlab = "h (Fusionshöhe)"
)
# Text in rot für die Clusteranzahlen
text(hc_ave$height,
  nrow(spiderA_hell):2,  # Clusteranzahl entlang der Y-Achse
  labels = nrow(spiderA_hell):2,  # Beschriftung der Clusteranzahl
  col = "red"
)

Code
# Cluster aus dem hc Objekt extrahieren und abspeichern
hc_cluster <- as.factor(cutree(tree = hc_ave, k = 4))

Finales Dendrogramm

Für Visualisierungen von Clusteranalysen und PCA ist das R Paket factoextra empfehlenswert:

Code
factoextra::fviz_dend(hc_ave, k = 4, # 4 Gruppen
  cex = 0.8, k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  color_labels_by_k = TRUE, rect = TRUE, lower_rect = -0.2, 
  main = "Cluster Dendrogram: Average unweighted")

Heatmap mit Dendrogramm

Code
library(pheatmap)
rownames(spiderA_hell) <- spider$samples # damit die Standorte als labels erscheinen

# Wir transponieren hier den Datensatz, damit die Darstellung 
# wie im vorherigen Dendrogramm ist
pheatmap::pheatmap(t(spiderA_hell), cutree_cols = 4, 
  clustering_method = "average", cluster_rows = FALSE)

Eine Heatmap ist eine grafische Darstellung von Daten, bei der Farben verwendet werden, um die Intensität oder Häufigkeit von Werten in einem zweidimensionalen Bereich zu visualisieren.

Your turn …

05:00

Clusteranalyse von Blüten und Pinguinen

iris Datensatz

  • Clusteranalyse der vier Blütenmerkmale:
    • Sepal.Length , Sepal.Width, Petal.Length, Petal.Width
  • Ziel: Überprüfung, ob sich die drei Iris-Arten (setosa, versicolor, virginica) anhand dieser Merkmale in Gruppen unterscheiden lassen.

penguins Datensatz (in palmerpenguins)

  • Clusteranalyse der vier Körpermerkmale:
    • bill_length_mm , bill_depth_mm, flipper_length_mm, body_mass_g
  • Ziel: Untersuchung, ob sich die drei Pinguinarten (Adélie, Chinstrap, Gentoo) anhand dieser Merkmale in Gruppen clustern lassen und ob sich zusätzlich Geschlechtsunterschiede zeigen.

Foto: Danielle Langlois; Zugriff über Wikipedia(unter CC-BY-SA 3.0 Lizenz).

Quiz 1 | R Code

### Extraktion und Standardisierung der numerischen Variablen
iris_scaled <- scale(iris[ ,1:4])
rownames(iris_scaled) <- iris$Species
head(iris_scaled)
       Sepal.Length Sepal.Width Petal.Length Petal.Width
setosa   -0.8976739  1.01560199    -1.335752   -1.311052
setosa   -1.1392005 -0.13153881    -1.335752   -1.311052
setosa   -1.3807271  0.32731751    -1.392399   -1.311052
setosa   -1.5014904  0.09788935    -1.279104   -1.311052
setosa   -1.0184372  1.24503015    -1.335752   -1.311052
setosa   -0.5353840  1.93331463    -1.165809   -1.048667
### Berechnung der Euklidischen Distanz
iris_dist <- dist(iris_scaled)

### Hierarchische Clusteranalyse mit der 'ward.D2' Methode
iris_hc <- hclust(iris_dist, method = "ward.D2")

### Visualisierung
plot(iris_hc, hang = -1, cex = 0.7)

Quiz 2 | Interpretation Dendrogramm 1

Um besser zu sehen, ob sich die 3 Arten hinsichtlich ihrer Merkmale unterscheiden, wurden im folgenden Dendrogramm die einzelnen Individuen (die Zeilen im Datensatz) farblich nach ihrer Art unterschieden. Dafür musste der Code allerdings etwas angepasst werden. Wie ist das Dendrogramm zu interpretieren (das Quiz ist auf der folgenden Seite)?

Code
library(RColorBrewer)
library(dendextend)
### Artgruppierung farblich erkennbar machen
### --> Über dendrogram-Objekt erstellen
dend <- as.dendrogram(iris_hc)
# Farben je Species
group_labels <- factor(iris$Species)
group_cols <- setNames(brewer.pal(3, "Set1"), levels(group_labels))
# Species aus den Rownames der Labels ziehen ("setosa17" -> "setosa")
labs <- labels(dend)
# labs <- sub("\\d+$", "", labs)
# Label-Farben setzen & (optional) Schriftgröße
dendextend::labels_colors(dend) <- group_cols[labs]
dend <- set(dend, "labels_cex", 0.7)
# Plot + Legende
plot(dend)
legend("topright", legend = names(group_cols), fill = group_cols, 
  bty = "n", cex = 0.8)

Quiz 2 | Interpretation Dendrogramm 2

Quiz 3 | Interpretation Heatmap 1

Was zeigt die Heatmap der Iris-Blütendaten zusätzlich im Vergleich zum Dendrogramm?

pheatmap::pheatmap(t(iris_scaled), cutree_cols = 4, clustering_method = "ward.D2", 
  cluster_rows = FALSE, fontsize_col = 8)

Quiz 3 | Interpretation Heatmap 2

Quiz 4 | R Code

### Daten laden und modifizieren
data(penguins, package = "palmerpenguins")
penguins <- penguins |> 
  mutate(species_sex = str_c(species, sex, sep = "/")) |> 
  drop_na()

### Extraktion und Standardisierung der numerischen Variablen
penguins_scaled <- scale(penguins[, c(3:6)])
rownames(penguins_scaled) <- penguins$species_sex
head(penguins_scaled)
              bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
Adelie/male       -0.8946955     0.7795590        -1.4246077  -0.5676206
Adelie/female     -0.8215515     0.1194043        -1.0678666  -0.5055254
Adelie/female     -0.6752636     0.4240910        -0.4257325  -1.1885721
Adelie/female     -1.3335592     1.0842457        -0.5684290  -0.9401915
Adelie/male       -0.8581235     1.7444004        -0.7824736  -0.6918109
Adelie/female     -0.9312674     0.3225288        -1.4246077  -0.7228585
### Berechnung der Euklidischen Distanz
penguins_dist <- dist(penguins_scaled)

### Hierarchische Clusteranalyse mit der 'ward.D2' Methode
penguins_hc <- hclust(penguins_dist, method = "ward.D2")

### Visualisierung
plot(penguins_hc, hang = -1, cex = 0.7)

Quiz 5 | Interpretation Dendrogramm 1

Im folgenden Dendrogramm sind die Pinguine farblich nach Art und Geschlecht dargestellt. Welche Muster lassen sich in Bezug auf diese beiden Merkmale aus der Clusteranalyse erkennen? Das Quiz ist auf der folgenden Seite.

Code
library(RColorBrewer)
library(dendextend)
### Art- und Geschlechtsgruppierung farblich erkennbar machen
### --> Über dendrogram-Objekt erstellen
dend <- as.dendrogram(penguins_hc)
# Farben nach species/sex getrennt
group_labels <- factor(penguins$species_sex)
group_cols <- setNames(brewer.pal(6, "Paired"), levels(group_labels))
labs <- labels(dend)
# Label-Farben setzen & (optional) Schriftgröße
labels_colors(dend) <- group_cols[labs]
dend <- set(dend, "labels_cex", 0.7)
# Plot + Legende
plot(dend)
legend("topright", legend = names(group_cols), fill = group_cols, bty = "n", cex = 1.2)

Quiz 5 | Interpretation Dendrogramm 2

Quiz 6 | Interpretation Heatmap 1

Was zeigt die Heatmap der Pinguin Größenmessungen zusätzlich im Vergleich zum Dendrogramm?

pheatmap::pheatmap(t(penguins_scaled), cutree_cols = 5, clustering_method = "ward.D2", 
  cluster_rows = FALSE, fontsize_col = 8)

Quiz 6 | Interpretation Heatmap 2

Übungen

Übungswoche 6

Gemeinschaftsstruktur von Wolfsspinnen und mögliche Umwelteinflüsse (Teil 1)

Vorbereitung @home

  • Univariate Analyse der Umweltbedingungen
    • Datenexploration
  • Multivariate Analyse der Wolfspinnengemeinschaft
    • Wiederholung der Analyse (inkl. dem R Code) und die Ergebnisse zur Spinnengemeinschaft aus der Vorlesung.
  • Beantworten Sie vor der sechsten Übungsstunde die Fragen zu diesem Datensatz und der hierarchischen Clusteranalyse im Moodle-Quiz.

Fragen..??

Total konfus?

Buchkapitel zum Nachlesen

  • The R Book von M.J. Crawley:
    • Kapitel 25.3 Cluster analysis
  • Experimental Design and Data Analysis for Biologists von G.P. Quinn & M.J. Keough:
    • Kapitel 15 Introduction to multivariate analyses
    • Kapitel 18 Multidimensional scaling and cluster analysis
  • Weitere empfehlenswerte Bücher:
    • P. Legendre & L. Legendre (2012): Numerical Ecology, Elsevier Offizielle Webseite
    • Borcard, Gillet & Legendre (2011): Numerical Ecology with R, Springer Offizielle Webseite
    • A. Kassambara (2017): Practical Guide To Cluster Analysis in R. Sthda.com (factoextra package)

Cheetsheets

Empfehlenswert ist auch das Cheatsheet des ‘vegan’ Pakets: https://github.com/rstudio/cheatsheets/blob/main/vegan.pdf

Total gelangweilt?

Dann testen Sie doch Ihr Wissen in folgendem Abschlussquiz…

Abschlussquiz

Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de

Creative Commons License
Diese Arbeit is lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.