Στην εργασία αυτή εφαρμόζεται συσταδοποίηση σε δεδομένα με στόχο τον διαχωρισμό τους σε ομάδες.
library(ggplot2)
Χρησιμοποιήθηκε το dataset iris, το οποίο περιλαμβάνει μετρήσεις από τρία είδη ανθέων με τέσσερα αριθμητικά χαρακτηριστικά. Η μεταβλητή κατηγορίας αφαιρέθηκε για να εφαρμοστεί μόνο συσταδοποίηση.
iris_data <- iris[, -5]
iris_data <- na.omit(iris_data)
Τα δεδομένα κανονικοποιήθηκαν ώστε όλα τα χαρακτηριστικά να έχουν ίδια κλίμακα. Αυτό εξασφαλίζει ότι κανένα χαρακτηριστικό δεν επηρεάζει δυσανάλογα τα αποτελέσματα.
iris_scaled <- scale(iris_data)
Εφαρμόστηκε ιεραρχική συσταδοποίηση και δημιουργήθηκε δενδρόγραμμα για την οπτικοποίηση των ομάδων. Επιλέχθηκαν 3 clusters για σύγκριση με τις πραγματικές κατηγορίες.
dist_matrix <- dist(iris_scaled)
hc <- hclust(dist_matrix, method = "ward.D2")
plot(hc)
clusters_hc <- cutree(hc, k = 3)
table(clusters_hc)
## clusters_hc
## 1 2 3
## 49 30 71
Ο αλγόριθμος K-means χώρισε τα δεδομένα σε 3 ομάδες με επαναληπτική προσαρμογή των κέντρων. Τα αποτελέσματα σταθεροποιήθηκαν μετά από λίγες επαναλήψεις.
set.seed(123)
kmeans_result <- kmeans(iris_scaled, centers = 3, nstart = 25)
kmeans_result$centers
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 -1.01119138 0.85041372 -1.3006301 -1.2507035
## 2 -0.05005221 -0.88042696 0.3465767 0.2805873
## 3 1.13217737 0.08812645 0.9928284 1.0141287
table(kmeans_result$cluster)
##
## 1 2 3
## 50 53 47
Δημιουργήθηκε γράφημα που δείχνει την κατανομή των clusters στον χώρο των χαρακτηριστικών. Έτσι γίνεται πιο εύκολα οπτικά αντιληπτός ο διαχωρισμός των ομάδων.
library(ggplot2)
iris$Cluster <- as.factor(kmeans_result$cluster)
ggplot(iris, aes(Petal.Length, Petal.Width, color = Cluster)) +
geom_point()
Η συσταδοποίηση αποδείχθηκε αποτελεσματική για την ανάλυση δεδομένων χωρίς ετικέτες. Η κανονικοποίηση ήταν σημαντική για την ορθή λειτουργία των αλγορίθμων και καλύτερα αποτελέσματα.