Το συγκεκριμένο Wine Dataset περιέχει χημικά χαρακτηριστικά διαφόρων κρασιών και χρησιμοποιείται ευρέως για προβλήματα ιεραρχικής και μη ιεραρχικής συσταδοποίησης (clustering). Το dataset δεν περιέχει ετικέτες (labels), καθιστώντας το ιδανικό για μη εποπτευόμενη μάθηση. Το dataset περιλαμβάνει:
178 παρατηρήσεις (δείγματα κρασιού)
13 μεταβλητές (χημικά χαρακτηριστικά)
Κάθε παρατήρηση (γραμμή) αντιπροσωπεύει ένα δείγμα κρασιού, το οποίο περιγράφεται από μια σειρά αριθμητικών μεταβλητών που σχετίζονται με τα φυσικοχημικά του χαρακτηριστικά, όπως περιεκτικότητα σε αλκοόλη, φαινολικά συστατικά, ένταση χρώματος κ.ά.
Πηγή δεδομένων:https://www.kaggle.com/datasets/harrywang/wine-dataset-for-clustering?resource=download
| Variable | Description | Variable_Type |
|---|---|---|
| Alcohol | Ποσοστό αλκοόλης στο κρασί | Αριθμητική |
| Malic_Acid | Συγκέντρωση μηλικού οξέος | Αριθμητική |
| Ash | Ποσοστό τέφρας | Αριθμητική |
| Alcalinity_of_Ash | Αλκαλικότητα της τέφρας | Αριθμητική |
| Magnesium | Συγκέντρωση μαγνησίου | Αριθμητική |
| Total_Phenols | Συνολικά φαινολικά συστατικά | Αριθμητική |
| Flavanoids | Φλαβονοειδή (τύπος φαινολών) | Αριθμητική |
| Nonflavanoid_Phenols | Μη φλαβονοειδή φαινόλες | Αριθμητική |
| Proanthocyanins | Προανθοκυανίνες (είδος φαινολών) | Αριθμητική |
| Color_Intensity | Ένταση χρώματος | Αριθμητική |
| Hue | Απόχρωση (Hue) | Αριθμητική |
| OD280_OD315 | Αναλογία OD280/OD315 για κρασιά | Αριθμητική |
| Proline | Συγκέντρωση προλίνης | Αριθμητική |
library(readr)
WineDataset <- read.csv("wine-clustering.csv")
summary(WineDataset)
## Alcohol Malic_Acid Ash Ash_Alcanity
## Min. :11.03 Min. :0.740 Min. :1.360 Min. :10.60
## 1st Qu.:12.36 1st Qu.:1.603 1st Qu.:2.210 1st Qu.:17.20
## Median :13.05 Median :1.865 Median :2.360 Median :19.50
## Mean :13.00 Mean :2.336 Mean :2.367 Mean :19.49
## 3rd Qu.:13.68 3rd Qu.:3.083 3rd Qu.:2.558 3rd Qu.:21.50
## Max. :14.83 Max. :5.800 Max. :3.230 Max. :30.00
## Magnesium Total_Phenols Flavanoids Nonflavanoid_Phenols
## Min. : 70.00 Min. :0.980 Min. :0.340 Min. :0.1300
## 1st Qu.: 88.00 1st Qu.:1.742 1st Qu.:1.205 1st Qu.:0.2700
## Median : 98.00 Median :2.355 Median :2.135 Median :0.3400
## Mean : 99.74 Mean :2.295 Mean :2.029 Mean :0.3619
## 3rd Qu.:107.00 3rd Qu.:2.800 3rd Qu.:2.875 3rd Qu.:0.4375
## Max. :162.00 Max. :3.880 Max. :5.080 Max. :0.6600
## Proanthocyanins Color_Intensity Hue OD280
## Min. :0.410 Min. : 1.280 Min. :0.4800 Min. :1.270
## 1st Qu.:1.250 1st Qu.: 3.220 1st Qu.:0.7825 1st Qu.:1.938
## Median :1.555 Median : 4.690 Median :0.9650 Median :2.780
## Mean :1.591 Mean : 5.058 Mean :0.9574 Mean :2.612
## 3rd Qu.:1.950 3rd Qu.: 6.200 3rd Qu.:1.1200 3rd Qu.:3.170
## Max. :3.580 Max. :13.000 Max. :1.7100 Max. :4.000
## Proline
## Min. : 278.0
## 1st Qu.: 500.5
## Median : 673.5
## Mean : 746.9
## 3rd Qu.: 985.0
## Max. :1680.0
Για να διευκολυνθούμε θα πρέπει να ορίσουμε περιγραφικά ονόματα στις στήλες του dataset.
colnames(WineDataset) <- c(
"Alcohol", # Περιεκτικότητα σε Αλκοόλη
"Malic_Acid", # Μηλικό Οξύ
"Ash", # Τέφρα
"Alcalinity_of_Ash", # Αλκαλικότητα της Τέφρας
"Magnesium", # Μαγνήσιο
"Total_Phenols", # Συνολικές Φαινόλες
"Flavanoids", # Φλαβονοειδή
"Nonflavonoid_Phenols", # Μη-Φλαβονοειδείς Φαινόλες
"Proanthocyanins", # Προανθοκυανίνες
"Color_Intensity", # Ένταση Χρώματος
"Hue", # Απόχρωση
"OD280_OD315", # Αναλογία OD280/OD315
"Proline" # Προλίνη
)
Για να αφαιρέσουμε διπλές εγγραφές που τυχόν υπάρχουν στο dataset εκτελούμε την εξής εντολή:
WineDataset = unique(WineDataset)
nrow(WineDataset)
## [1] 178
Αφού ο αριθμός των εγγραφών παραμένει ίδιος αυτό μας υποδεικνύει ότι δεν υπάρχουν διπλότυπες εγγραφές.
Πριν προχωρήσουμε στη συσταδοποίηση, πρέπει να υπολογίσουμε τις αποστάσεις μεταξύ όλων των παρατηρήσεων στο dataset. Επιλέγουμε ευκλείδεια απόσταση και γράφουμε:
dist_wine = dist(WineDataset[0:13], method = "euclidean")
Κάνουμε Ιεραρχική Συσταδοποίηση:
clusterwine <- hclust(dist_wine, method = "ward.D2")
Χρησιμοποιούμε την εντολή plot:
plot(clusterwine,
labels = FALSE, # Δεν δείχνει τα ονόματα κρασιών
hang = -1, # Κάνει τις αποστάσεις ομοιόμορφες
main = "Dendrogram of Wine Clustering",
xlab = "",
ylab = "Height",
sub = "",
cex = 0.6, # Μέγεθος γραμματοσειράς (αν κρατήσεις labels TRUE)
col = "darkblue",
lwd = 1.5) # Πάχος γραμμών
Το plot εμφανίζει το δενδρόγραμμα της ιεραρχικής συσταδοποίησης με τη μέθοδο ward.D2, η οποία ελαχιστοποιεί την εσωτερική διασπορά των ομάδων. Εδώ τι παρατηρούμε:
Στο πάνω μέρος του δενδρογράμματος υπάρχουν μεγάλες κάθετες αποστάσεις. Αυτό σημαίνει ότι οι τελευταίες συγχωνεύσεις (δηλαδή, το πώς δημιουργούνται τα μεγαλύτερα clusters) γίνονται ανάμεσα σε αρκετά διαφορετικές ομάδες.
Αν κόψουμε το δέντρο σε 10 clusters, όπως κάναμε με cutree (clusterWine, k = 10), βλέπουμε πως οι ομάδες είναι διαχωρισμένες με σαφή δομή. Δηλαδή, δεν κόβουμε στη μέση χαοτικού συνόλου, αλλά σε ξεκάθαρα διαχωρισμένα “κλαδιά”.
Εάν το plot σου έχει πυκνές περιοχές με μικρές αποστάσεις μεταξύ συγχωνεύσεων, αυτό δείχνει clusters με πιο κοντινές παρατηρήσεις.
Συμπέρασμα: Η μέθοδος Ward παρήγαγε καλά διαχωρισμένα clusters. Τα μεγάλα ύψη υποδηλώνουν έντονη διαφοροποίηση μεταξύ ομάδων, κάτι θετικό για την ερμηνεία των clusters.
Κόψιμο του δέντρου σε 10 συστάδες και Υπολογισμός μέσων τιμών για το κάθε cluster (ενδεικτικά για Alcohol και Proline)
clusterGroups <- cutree(clusterwine, k = 10)
tapply(WineDataset$Alcohol, clusterGroups, mean)
## 1 2 3 4 5 6 7 8
## 13.71500 13.60000 14.13667 13.13500 13.82786 13.03000 12.82893 12.59552
## 9 10
## 12.35036 12.66400
Υπολογίζει το μέσο ποσοστό αλκοόλ σε κάθε ένα από τα 10 clusters. Αυτό σημαίνει:
Το Cluster 4 έχει τις πιο “δυνατές” συγκεντρώσεις αλκοόλ.
Το Cluster 9 μπορεί να αντιπροσωπεύει πιο ελαφρά κρασιά.
tapply(WineDataset$Proline, clusterGroups, mean)
## 1 2 3 4 5 6 7 8
## 1026.5000 1141.5000 1530.3333 746.6875 1288.2143 865.4286 655.3571 492.7931
## 9 10
## 376.3214 573.1333
Clusters 1, 5, 7, 10 έχουν πολύ υψηλές μέσες τιμές Proline (>1000): πιθανώς περιλαμβάνουν πιο “πλούσια” ή premium κρασιά, με έντονο σώμα και παλαίωση.
Clusters 4, 6, 8 έχουν χαμηλότερες τιμές (<500): ίσως δείχνουν πιο “ελαφριά”, νεαρά ή απλά κρασιά.
Οι ενδιάμεσες τιμές (π.χ. cluster 3 ή 9) μπορεί να εκπροσωπούν ισορροπημένα κρασιά.