Διερεύνηση του συνόλου δεδομένων

Περιγραφή

Το συγκεκριμένο Wine Dataset περιέχει χημικά χαρακτηριστικά διαφόρων κρασιών και χρησιμοποιείται ευρέως για προβλήματα ιεραρχικής και μη ιεραρχικής συσταδοποίησης (clustering). Το dataset δεν περιέχει ετικέτες (labels), καθιστώντας το ιδανικό για μη εποπτευόμενη μάθηση. Το dataset περιλαμβάνει:

178 παρατηρήσεις (δείγματα κρασιού)

13 μεταβλητές (χημικά χαρακτηριστικά)

Κάθε παρατήρηση (γραμμή) αντιπροσωπεύει ένα δείγμα κρασιού, το οποίο περιγράφεται από μια σειρά αριθμητικών μεταβλητών που σχετίζονται με τα φυσικοχημικά του χαρακτηριστικά, όπως περιεκτικότητα σε αλκοόλη, φαινολικά συστατικά, ένταση χρώματος κ.ά.

Πηγή δεδομένων:https://www.kaggle.com/datasets/harrywang/wine-dataset-for-clustering?resource=download

Μεταβλητές του Dataset

Πίνακας: Μεταβλητές του Wine Dataset
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

Αφού ο αριθμός των εγγραφών παραμένει ίδιος αυτό μας υποδεικνύει ότι δεν υπάρχουν διπλότυπες εγγραφές.

Hierarchical Clustering στην R

Πριν προχωρήσουμε στη συσταδοποίηση, πρέπει να υπολογίσουμε τις αποστάσεις μεταξύ όλων των παρατηρήσεων στο 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.

Clustering με K-means

Κόψιμο του δέντρου σε 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) μπορεί να εκπροσωπούν ισορροπημένα κρασιά.