Mall Customers - Clustering
2026-04-26
# Φόρτωση βιβλιοθηκών
library(cluster)## Warning: package 'cluster' was built under R version 4.5.3
library(factoextra)## Warning: package 'factoextra' was built under R version 4.5.3
## Loading required package: ggplot2
## Welcome to factoextra!
## Want to learn more? See two factoextra-related books at https://www.datanovia.com/en/product/practical-guide-to-principal-component-methods-in-r/
# Φόρτωση δεδομένων
df <- read.csv("Mall_Customers.csv")Σχολιασμός - Περιγραφή Dataset
Το συγκεκριμένο σύνολο δεδομένων αφορά δεδομένα πελατών ενός εμπορικού κέντρου και χρησιμοποιείται για την τμηματοποίηση της αγοράς. Το dataset περιέχει 200 εγγραφές, με στήλες που περιγράφουν τα δημογραφικά και αγοραστικά χαρακτηριστικά των πελατών. Παρακάτω, υπάρχει μια μικρή περιγραφή για την κάθε στήλη ξεχωριστά, καθώς και σε παρένθεση ο τύπος μεταβλητής κάθε μίας:
CustomerID: Μοναδικός κωδικός για κάθε πελάτη (int)
Genre: Το φύλο του πελάτη (Male/Female) (chr/factor)
Age: Η ηλικία του πελάτη σε έτη (int)
Annual Income (k$): Το ετήσιο εισόδημα του πελάτη σε χιλιάδες δολάρια (int)
Spending Score (1-100): Ένας δείκτης που αποδίδει το εμπορικό κέντρο βάσει της καταναλωτικής συμπεριφοράς (int)
##Στόχος της Συσταδοποίησης:
Η συσταδοποίηση αποτελεί μέθοδο μη επιβλεπόμενης μάθησης, η οποία επιτρέπει την ανακάλυψη κρυφών δομών στα δεδομένα χωρίς τη χρήση προκαθορισμένων κατηγοριών. Ο βασικός στόχος της συσταδοποίησης στο συγκεκριμένο σύνολο δεδομένων είναι η αναγνώριση διακριτών ομάδων πελατών με παρόμοια χαρακτηριστικά. Αναλύοντας μεταβλητές όπως η ηλικία, το ετήσιο εισόδημα και ο δείκτης καταναλωτικής συμπεριφοράς (spending score), οι επιχειρήσεις μπορούν να κατανοήσουν διαφορετικά προφίλ καταναλωτών. Αυτό επιτρέπει την ανάπτυξη στοχευμένων στρατηγικών μάρκετινγκ, όπως προγράμματα επιβράβευσης για πελάτες με υψηλή κατανάλωση ή προσφορές για πελάτες με χαμηλό εισόδημα αλλά υψηλή αγοραστική δραστηριότητα, με στόχο τη βελτιστοποίηση της κατανομής πόρων και την ενίσχυση της αλληλεπίδρασης με τους πελάτες.
Περιγραφή των μεταβλητών (τύπος, εύρος τιμών, μονάδες μέτρησης)
Παρακάτω, εξτάζεται η δομή των δεδομένων. Φαίνονται επίσης κάποιες μετρικές όπως min, max, mean, κτλ. Τέλος, εμφανίζονται ενδεικτικά οι 5 πρώτες γραμμές της βάσης
# Εμφάνιση δομής, περιληπτικών στατιστικών και πρώτων γραμμών
str(df)## 'data.frame': 200 obs. of 5 variables:
## $ CustomerID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Genre : chr "Male" "Male" "Female" "Female" ...
## $ Age : int 19 21 20 23 31 22 35 23 64 30 ...
## $ Annual.Income..k.. : int 15 15 16 16 17 17 18 18 19 19 ...
## $ Spending.Score..1.100.: int 39 81 6 77 40 76 6 94 3 72 ...
summary(df)## CustomerID Genre Age Annual.Income..k..
## Min. : 1.00 Length:200 Min. :18.00 Min. : 15.00
## 1st Qu.: 50.75 Class :character 1st Qu.:28.75 1st Qu.: 41.50
## Median :100.50 Mode :character Median :36.00 Median : 61.50
## Mean :100.50 Mean :38.85 Mean : 60.56
## 3rd Qu.:150.25 3rd Qu.:49.00 3rd Qu.: 78.00
## Max. :200.00 Max. :70.00 Max. :137.00
## Spending.Score..1.100.
## Min. : 1.00
## 1st Qu.:34.75
## Median :50.00
## Mean :50.20
## 3rd Qu.:73.00
## Max. :99.00
head(df)## CustomerID Genre Age Annual.Income..k.. Spending.Score..1.100.
## 1 1 Male 19 15 39
## 2 2 Male 21 15 81
## 3 3 Female 20 16 6
## 4 4 Female 23 16 77
## 5 5 Female 31 17 40
## 6 6 Female 22 17 76
Προετοιμασία Δεδομένων
Για τη συσταδοποίηση, θα εστιάσουμε στο Ετήσιο Εισόδημα και το Σκορ Κατανάλωσης, που περιγράφουν και την οικονομική συμπεριφορά του πελάτη. Είναι απαραίτητο να κανονικοποιήσουμε (scale) τα δεδομένα ώστε οι μεταβλητές να έχουν το ίδιο βάρος.
# Επιλογή στηλών 4 και 5 (Income, Spending Score)
data_cluster <- df[, 4:5]
# Κανονικοποίηση
data_scaled <- scale(data_cluster)Ιεραρχική Συσταδοποίηση
Χρησιμοποιούμε την Ευκλείδεια απόσταση και τη μέθοδο Ward για τη δημιουργία του δενδρογράμματος.
# Υπολογισμός αποστάσεων
dist_matrix <- dist(data_scaled, method = "euclidean")
# Δημιουργία μοντέλου
hc_model <- hclust(dist_matrix, method = "ward.D2")
# Σχεδίαση Δενδρογράμματος
plot(hc_model, main = "Δενδρόγραμμα Πελατών", xlab = "Πελάτες", sub = "")
rect.hclust(hc_model, k = 5, border = 2:6)Η ανάλυση εδώ αναδεικνύει 5 διαφορετικές ομάδες, όπως ορίσαμε.
Συσταδοποίηση K-means
Για να επιβεβαιώσουμε τον βέλτιστο αριθμό συστάδων (K), χρησιμοποιούμε τη μέθοδο “Elbow”.
fviz_nbclust(data_scaled, kmeans, method = "wss") +
labs(subtitle = "Elbow Method")Η ανάλυση υπέδειξε ως βέλτιστο αριθμό συστάδων το k = 5, καθώς σε αυτό το σημείο ελαχιστοποιείται η εσωτερική διασπορά των ομάδων χωρίς να δημιουργείται υπερβολική πολυπλοκότητα. Παρακάτω, εφαρμόζεται ο K-means με k=5.
set.seed(123)
km_res <- kmeans(data_scaled, centers = 5, nstart = 25)
# Οπτικοποίηση συστάδων
fviz_cluster(km_res, data = data_scaled,
palette = "jco",
ggtheme = theme_minimal(),
main = "K-means Clustering (k=5)")Εδώ φαίνεται με την οπτικοποίηση η τελική τμηματοποίηση, επιτρέποντας τον διαχωρισμό των πελατών σε πέντε ευδιάκριτα προφίλ αγοραστικής συμπεριφοράς. Η απουσία σημαντικών επικαλύψεων μεταξύ των συστάδων στο τελικό Cluster Plot υπογραμμίζει την αξιοπιστία της μεθόδου και την καταλληλότητα των μεταβλητών (Income, Spending Score) για τη συγκεκριμένη ανάλυση.
Ο διαχωρισμός των πελατών σε πέντε συστάδες βασίστηκε στην αλληλεπίδραση του Ετήσιου Εισοδήματος και του Σκορ Κατανάλωσης.
Οι Clusters 4 και 5 αντιπροσωπεύουν τους πελάτες υψηλού εισοδήματος, με τη διαφορά ότι το 4 δεν ξοδεύει πολλά, ενώ το 5 έχει υψηλά επίπεδα κατανάλωσης.
Αντίστοιχα, οι Clusters 2 και 3 αποτελούν το κομμάτι της αγοράς με χαμηλό ετήσιο εισόδημα και υψηλή κατανάλωση για το 3, ενώ δεν υπάρχει η αντίστοιχη άνεση, και χαμηλή κατανάλωση για το 2.
Το Cluster 3 αποτελεί τη μάζα των πελατών που κινούνται στον μέσο όρο. Η γεωμετρική καθαρότητα των ομάδων στο τελικό γράφημα αποδεικνύει ότι αυτές οι δύο μεταβλητές επαρκούν για μια πλήρη τμηματοποίηση της αγοράς (Market Segmentation).