Clusterananlyse

Übung: 3D-CA – Geschlecht, Größe, Gewicht, Schuhgröße

Author
Affiliation

Prof. Dr. Armin Eichinger

TH Deggendorf

Published

14.11.2024

Aufgabe

  1. Denken Sie an vier Personen, die Sie gut kennen. Sie sollten die folgenden Informationen angeben können:

    • Geschlecht
    • Gewicht in kg
    • Größe in cm
    • Schuhgröße in deutschen Größen
  2. Tragen Sie die Werte bitte in die Datei auf iLearn ein.

  3. Laden Sie die Dateien im Verzeichnis 3D-CA herunter und speichern Sie sie im selben Verzeichnis.

  4. Öffnen Sie die qmd-Datei mit RStudio und lassen Sie den Code laufen bzw. rendern Sie die Datei (→ blauer Pfeil). Wahrscheinlich bittet Sie RStudio erstmal, das Paket rgl zu installieren. Tun Sie das!

  5. Ersetzen Sie die csv-Dateien mit den von uns erhobenen Werten, die ich ebenfalls über iLearn verfügbar machen werde.

  6. Spielen Sie mit der 3D-Darstellung. Sehen Sie Gruppen, die zusammengehören? Das lässt sich bi der dreidimensionalen Ansicht nicht so einfach beantworten. Bei mehr als drei Dimensionen ist das darstellerisch unmöglich. Daher machen wir die Clusteranalyse.

  7. Suchen Sie im Dendrogramm nach Ausreißern (das sind Elemente, die erst recht spät – also recht weit oben – einer Gruppe zugeordnet werden).

  8. Interpretieren Sie den Scree-Plot. Wo macht der einen Knick. Lesen Sie die Zahl an der X-Achse ab. Diese Cluster-Zahl wird uns vorgeschlagen. Aber das ist nur ein Vorschlag! Wenn inhaltliche Gründe gegen für eine andere Zahl sprechen, spricht nichts dagegen.

  9. Interpretieren Sie die Profil-Plots. Hier werden für jeden Cluster die Mittelwerte der ursprünglichen Variablen dargestellt (nachdem sie z-transformiert worden sind). Wie unterscheiden sich die Cluster voneinander hinsichtlich dieser Variablen? Zum Beispiel: Gibt es ein Cluster großer, dicker Männer mit kleinen Füßen, kleiner Frauen mit mittelgroßen Füßen, …?

  10. Vesuchen Sie die z-transformierten Werte grob einschätzen zu können. Wählen Sie eine Person. Schätzen Sie deren Geschlecht, Größe, Gewicht, Schuhgröße.

  11. Wo im Code wird die z-Transformation durchgeführt (die alle numerischen Werte auf die gleiche Einheit bringt)?

  12. Wo im Code wird die Distanzmatrix erzeugt? Mit welcher Distanz wird gearbeitet?

  13. Nach welchem Verfahren werden die Cluster gebildet?

  14. Dendrogramm: Auf welcher Höhe liegt eine 9-Cluster-Lösung (Höhe kann als Ähnlichkeit interpretiert werden: je weiter unten, desto ähnlicher; je weiter oben, desto unähnlicher)?

####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 
# Der Code ist völlig uninteressant
# Wir wollen nur mit der 3D-Abbildung spielen
####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 

# Benötigte Bibliotheken laden
library(dplyr)
library(rgl)

setupKnitr(autoprint = TRUE)

data_str <- read.csv("ca_3d_data.csv", sep=";", dec=",")

# Für die 3D-Darstellung verwenden wir die Wörter
data <- data_str

# Farben für Geschlecht festlegen
colors <- ifelse(data_str$Geschlecht == "Maennlich", "blue", "pink")

# 3D-Plot erstellen
plot3d(
  x = data$Groesse_cm,
  y = data$Gewicht_kg,
  z = data$Schuhgroesse,
  col = colors,
  size = 4,
  type = 's',
  xlab = "Groesse (cm)",
  ylab = "Gewicht (kg)",
  zlab = "Schuhgroesse"
)
####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 
####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 

# Daten einlesen
data_num <- read.csv("ca_3d_data_num.csv", sep=";", dec=",")

# Im Folgenden verwenden wir 0/1 statt der Wörter. Damit können wir besser rechnen
data <- data_num

# z-Transformation der Daten
data <- scale(data) 

# Erstellen der Distanzmatrix
dist_matrix <- dist(data, method = "euclid")

# Durchführen der CA 
hc_result <- hclust(dist_matrix, method = "complete")

# Dendrogramm erstellen
plot(hc_result, hang=-1)

# Scree-Plot erstellen
plot(1:(length(hc_result$height)), rev(hc_result$height), type = "b",
     xlab = "Anzahl der Cluster",
     ylab = "Höhe der Fusionen",
     main = "Screeplot für hierarchische Clusteranalyse")

#### Clusterzuordnung
# Cluster-Zuordnung für k Cluster
# Wie viele Clustrer wollen wir verwenden? Das ist eine inhaltliche Frage!
cluster_assignments <- cutree(hc_result, k = 3)

# Matrix wird in Dataframe umgewandelt (macht das Spalte-Anhängen leichter)
data <- as.data.frame(data)

# Der Dataframe erhält eine neue Spalte "Cluster"
data$Cluster <- factor(cluster_assignments)

# Daten MIT Cluster
data
   Geschlecht  Groesse_cm  Gewicht_kg Schuhgroesse Cluster
1  -0.9831921  1.36407675  1.13146567    1.3962883       1
2  -0.9831921 -0.15403270  0.23995436    1.6189819       2
3  -0.9831921  0.57365613 -2.05924038    1.9129373       2
4  -0.9831921  0.78537594 -1.84992903    0.4476140       2
5  -0.9831921  0.60580617  1.79428495    1.4408270       1
6  -0.9831921  0.20589098  0.21798959   -0.5366914       1
7  -0.9831921  1.47464154 -1.21101260    0.2917285       2
8  -0.9831921  0.21451660  0.34848617    0.2338282       1
9  -0.9831921  1.87142014  1.69221336   -1.1602332       1
10 -0.9831921  0.23960932  2.35180252    1.0221632       1
11 -0.9831921  1.31232302  0.09782937    1.1735948       1
12 -0.9831921  2.08235580  0.26579527    0.6703075       1
13 -0.9831921 -0.80017019 -1.19356998    1.6679744       2
14 -0.9831921  0.07023347  0.96091568    0.3451749       1
15 -0.9831921  0.18471900 -0.10502175   -0.2293743       1
16  0.9831921 -0.45906605 -0.56175979   -0.4030753       3
17  0.9831921 -1.23929275 -0.20515527   -0.2783669       3
18  0.9831921  0.17530923  0.05131574   -0.4787911       3
19  0.9831921 -1.00091193  0.57976229   -1.3829267       3
20  0.9831921 -0.31870366 -0.79432796   -1.5254506       3
21  0.9831921 -0.52807102  0.51709809    0.2204666       3
22  0.9831921 -1.22204151 -0.10760585   -0.6168610       3
23  0.9831921  0.25842886  0.34654810   -0.7326617       3
24  0.9831921 -0.32732928  0.27031743   -0.8707316       3
25  0.9831921 -0.67392245  0.14111289   -1.5878048       3
26  0.9831921 -0.55708448 -0.99847113   -0.3808059       3
27  0.9831921 -0.30458900 -0.38281151   -0.9375397       3
28  0.9831921 -0.67392245  0.07844869   -0.9108165       3
29  0.9831921 -2.60763004 -0.94097511   -0.1670201       3
30  0.9831921 -0.55159545 -0.67545979   -0.2427359       3
#### Profildiagramme
# Code-Vorlage arbeitet mit "df", daher umbenennen
df <- data

####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 
#### Code ab hier uninteressant
####### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ###### ##### 

# Mittelwerte für jede Dimension pro Cluster berechnen
cluster_means <- aggregate(. ~ Cluster, data = df, FUN = mean)

# Anzahl der Cluster
num_clusters <- length(unique(df$Cluster))

# Layout für die Plots
par(mfrow = c(1, num_clusters))  # Layout festlegen für die Anzahl der Cluster

# Für jedes Cluster ein Balkendiagramm erstellen
for (i in 1:num_clusters) {
  # Daten für das aktuelle Cluster (ohne Cluster-Spalte)
  data <- as.numeric(cluster_means[i, -1])
  
  # Namen der Attribute für die x-Achse
  names(data) <- names(cluster_means)[-1]
  
  # Balkendiagramm erstellen
  barplot(
    data,
    main = paste("Cluster", cluster_means$Cluster[i]),  # Titel des Diagramms
    ylim = c(-2, 2),  # Skalierung der y-Achse
    col = "lightblue",  # Farbe der Balken
    xlab = "Attribute",  # Bezeichnung der x-Achse
    ylab = "Mittelwert",  # Bezeichnung der y-Achse
    las = 2  # Dreht die x-Achsenbeschriftungen für bessere Lesbarkeit
  )
}