1. Περιγραφή Dataset

Το dataset περιέχει 200 πελάτες ενός εμπορικού κέντρου και καταγράφει χαρακτηριστικά όπως φύλο, ηλικία, ετήσιο εισόδημα και καταναλωτική συμπεριφορά (spending score). Χρησιμοποιείται συχνά για αναλύσεις συσταδοποίησης στην επιχειρηματική αναλυτική.

Πηγή: Mall Customers Dataset – Kaggle

2. Επιχειρηματική Αναλυτική

Η συσταδοποίηση πελατών βάσει δημογραφικών και οικονομικών χαρακτηριστικών αποτελεί βασικό εργαλείο στη σύγχρονη επιχειρηματική ανάλυση, καθώς επιτρέπει:

-Τη στοχευμένη τμηματοποίηση της αγοράς (market segmentation) -Την ανάπτυξη εξατομικευμένων στρατηγικών marketing -Την εις βάθος κατανόηση της καταναλωτικής συμπεριφοράς

Ερωτήματα:

  • Υπάρχουν διακριτές ομάδες πελατών;
  • Τι ρόλο παίζει το εισόδημα και η καταναλωτική συμπεριφορά στον διαχωρισμό;
  • Πώς μπορούν να στοχευτούν διαφορετικά τα τμήματα;

3. Ανάγνωση Δεδομένων

mall_customers <- read.csv("C:\\Users\\rafai\\Documents\\Mall_Customers.csv", sep = ",")
head(mall_customers)
##   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
# Μετονομασία των στηλών για ευκολία χρήσης
colnames(mall_customers) <- c("CustomerID", "Genre", "Age", "AnnualIncome", "SpendingScore")

4. Περιγραφή Μεταβλητών

Πίνακας Μεταβλητών του Dataset Mall_Customers
Μεταβλητή Τύπος Περιγραφή
CustomerID Αριθμητικό Αναγνωριστικό πελάτη
Genre Κατηγορική Φύλο πελάτη (Male/Female)
Age Αριθμητικό Ηλικία πελάτη
AnnualIncome Αριθμητικό Ετήσιο εισόδημα (σε χιλιάδες $)
SpendingScore Αριθμητικό Βαθμός καταναλωτικής συμπεριφοράς (1–100)

5. Περιγραφικά Στατιστικά

# Σύνοψη των αριθμητικών μεταβλητών
summary(mall_customers)
##    CustomerID        Genre                Age         AnnualIncome   
##  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  
##  SpendingScore  
##  Min.   : 1.00  
##  1st Qu.:34.75  
##  Median :50.00  
##  Mean   :50.20  
##  3rd Qu.:73.00  
##  Max.   :99.00

Επιλογή Μεταβλητών για Συσταδοποίηση

Για λόγους απλότητας και εύκολης ερμηνείας των διαγραμμάτων, θα επιλεχθούν δύο αριθμητικές μεταβλητές για την ανάλυση συσταδοποίησης. Για να επιλεγούν οι καταλληλότερες, θα ληφθούν υπόψη η διασπορά και η συσχέτιση μεταξύ των αριθμητικών μεταβλητών του dataset.

# Επιλογή αριθμητικών μεταβλητών από το dataset
numeric_vars <- mall_customers[, sapply(mall_customers, is.numeric)]

# Υπολογισμός διασποράς (variance) για κάθε αριθμητική μεταβλητή
variances <- sapply(numeric_vars, var)
variances_sorted <- sort(variances, decreasing = TRUE)

# Γράφημα διασποράς με χρωματική απόδοση
barplot(variances_sorted, las = 2, col = "skyblue",
        main = "Διασπορά Αριθμητικών Μεταβλητών", ylab = "Variance")

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

Όπως φαίνεται στο παραπάνω διάγραμμα, η μεταβλητή CustomerID παρουσιάζει τη μεγαλύτερη διασπορά. Ωστόσο, επειδή πρόκειται για τεχνητό αριθμητικό αναγνωριστικό χωρίς ουσιαστικό επιχειρησιακό περιεχόμενο, δεν ενδείκνυται για χρήση στη συσταδοποίηση.

Οι μεταβλητές AnnualIncome και SpendingScore παρουσιάζουν επίσης υψηλή διασπορά και έχουν ουσιαστικό νόημα για την καταναλωτική συμπεριφορά. Για τον λόγο αυτό επιλέγονται για την ανάλυση συστάδων.

Η μεταβλητή Age εμφανίζει σχετικά μικρότερη διασπορά και παραλείπεται για λόγους απλότητας, χωρίς όμως να αποκλείεται από μελλοντική ανάλυση.

# Υπολογισμός πίνακα συσχέτισης
cor_matrix <- cor(numeric_vars)

# Οπτικοποίηση με corrplot
corrplot(cor_matrix, method = "color", type = "upper",
         tl.col = "black", tl.cex = 0.8, order = "hclust",
         title = "Πίνακας Συσχέτισης Μεταβλητών")

Η συσχέτιση μεταξύ των αριθμητικών μεταβλητών του dataset αποκαλύπτει χρήσιμες πληροφορίες για τη μεταξύ τους σχέση και την καταλληλότητά τους για συσταδοποίηση:

  • AnnualIncomeκαιSpendingScore` εμφανίζουν πολύ χαμηλή συσχέτιση μεταξύ τους. Αυτό σημαίνει ότι κάθε μία φέρει διαφορετική πληροφορία, γεγονός που τις καθιστά κατάλληλες για χρήση σε τεχνικές συσταδοποίησης.
  • CustomerID δεν συσχετίζεται με καμία άλλη μεταβλητή, καθώς είναι απλά ένα μοναδικό αναγνωριστικό χωρίς ουσιαστικό περιεχόμενο. Γι’ αυτό και αποκλείεται από την περαιτέρω ανάλυση.
  • Age παρουσιάζει μια ήπια αρνητική συσχέτιση με το SpendingScore (περίπου -0.3), γεγονός που υποδηλώνει ότι οι νεότεροι πελάτες τείνουν να έχουν υψηλότερο spending score. Αν και αυτή η πληροφορία είναι ενδιαφέρουσα, η Age δεν επιλέγεται στην παρούσα φάση για λόγους απλότητας.

Επιλογή μεταβλητών για συσταδοποίηση

# Επιλογή των δύο μεταβλητών με υψηλή διασπορά και χαμηλή μεταξύ τους συσχέτιση
cluster_data <- mall_customers[, c("AnnualIncome", "SpendingScore")]

# Κανονικοποίηση δεδομένων
scaled_data <- scale(cluster_data)
  • AnnualIncome (Ετήσιο εισόδημα)
  • SpendingScore (Δείκτης καταναλωτικής συμπεριφοράς)

Οι δύο μεταβλητές παρουσιάζουν υψηλή διασπορά και ανεξαρτησία μεταξύ τους, χαρακτηριστικά που τις καθιστούν ιδανικές για ομαδοποίηση πελατών βάσει οικονομικού και καταναλωτικού προφίλ. Η κανονικοποίηση είναι απαραίτητη, καθώς οι δύο μεταβλητές βρίσκονται σε διαφορετική κλίμακα μέτρησης (AnnualIncome σε χιλιάδες δολάρια και SpendingScore σε κλίμακα 1–100). Αν δεν γίνει κανονικοποίηση, η μεταβλητή με τη μεγαλύτερη κλίμακα θα κυριαρχήσει στον υπολογισμό αποστάσεων, οδηγώντας σε λανθασμένες ή μεροληπτικές συστάδες.

Ιεραρχική Συσταδοποίηση

# Υπολογισμός αποστάσεων (ευκλείδεια απόσταση)
dist_matrix <- dist(scaled_data, method = "euclidean")

# Δημιουργία δενδρογράμματος με Ward.D2
hc_model <- hclust(dist_matrix, method = "ward.D2")

# Οπτικοποίηση δενδρογράμματος
plot(hc_model, labels = FALSE, hang = -1,
     main = "Ιεραρχική Συσταδοποίηση (Ward.D2)",
     xlab = "", ylab = "Απόσταση")
abline(h = 6, col = "red", lty = 2)

Η ιεραρχική συσταδοποίηση εφαρμόστηκε με τη μέθοδο Ward.D2, η οποία ελαχιστοποιεί τη συνολική ενδοσυσταδική διακύμανση, εξασφαλίζοντας πιο συνεκτικές ομάδες. Το παραγόμενο δενδρόγραμμα οπτικοποιεί τη διαδικασία συγχώνευσης των παρατηρήσεων και επιτρέπει την επιλογή αριθμού συστάδων βάσει της απόστασης (ύψους) των συνδέσεων. Η τομή του δενδρογράμματος στο ύψος h = 6 αποκαλύπτει την παρουσία 3 κύριων ομάδων πελατών, οι οποίες φαίνεται να διαχωρίζονται κυρίως βάσει: - του ετήσιου εισοδήματος, και - του δείκτη καταναλωτικής συμπεριφοράς (Spending Score).

Ο συγκεκριμένος διαχωρισμός παρέχει σημαντική πληροφορία για την κατηγοριοποίηση πελατών σε χαμηλής, μεσαίας και υψηλής εμπορικής αξίας.

# Κατανομή των παρατηρήσεων σε 3 συστάδες
clusters_hc <- cutree(hc_model, k = 3)

# Προβολή πλήθους παρατηρήσεων ανά συστάδα
table(clusters_hc)
## clusters_hc
##   1   2   3 
## 129  39  32

Η ιεραρχική συσταδοποίηση με τομή στο ύψος h = 6 κατένειμε τους πελάτες σε 3 ομάδες με την εξής κατανομή:

Cluster 1: 129 πελάτες Cluster 2: 39 πελάτες Cluster 3: 32 πελάτες

Αναλύοντας τη σύνθεση των συστάδων βάσει των μεταβλητών AnnualIncome και SpendingScore, προκύπτουν οι ακόλουθοι ενδεικτικοί τύποι πελατών:

Cluster 1: Πελάτες με χαμηλό εισόδημα και χαμηλό spending score Cluster 2: Πελάτες με μεσαίο εισόδημα και υψηλό spending score Cluster 3: Πελάτες με υψηλό εισόδημα και μεταβλητή αγοραστική συμπεριφορά

Ο διαχωρισμός αυτός μπορεί να αξιοποιηθεί για στοχευμένες εμπορικές ενέργειες.

Συσταδοποίηση με K-Means

Επιλέγουμε k=3, καθώς από την ιεραρχική συσταδοποίηση φάνηκε να γίνεται ένας καλός διαχωρισμός.

# Εκπαίδευση μοντέλου K-means με k = 3
set.seed(123)
kmeans_model <- kmeans(scaled_data, centers = 3, nstart = 25)

# Επισύναψη αποτελεσμάτων στο dataset
cluster_data$cluster <- factor(kmeans_model$cluster)

# Προβολή κατανομής παρατηρήσεων
table(cluster_data$cluster)
## 
##   1   2   3 
## 123  38  39
  • Cluster 1 – 123 πελάτες
    Πελάτες με χαμηλό εισόδημα και χαμηλό έως μέτριο spending score.
  • Cluster 2 – 38 πελάτες
    Πελάτες με υψηλό spending score, ανεξαρτήτως εισοδήματος.
  • Cluster 3 – 39 πελάτες
    Πελάτες με μεσαίο εισόδημα και μέτριο spending score.
# Γράφημα των 3 συστάδων σε 2D επίπεδο
ggplot(cluster_data, aes(x = AnnualIncome, y = SpendingScore, color = cluster)) +
  geom_point(alpha = 0.6, size = 2) +
  labs(title = "K-Means με 3 Συστάδες",
       x = "Ετήσιο Εισόδημα",
       y = "Spending Score",
       color = "Συστάδα") +
  theme_minimal()

Το διάγραμμα των 3 συστάδων που δημιουργήθηκε με K-Means επιβεβαιώνει και οπτικά τα παρακάτω: Συστάδα 1 (κόκκινη): Ποικιλία εισοδημάτων με μεγάλο εύρος στο Spending Score — ένδειξη ετερογενούς ομάδας ή ενεργών καταναλωτών. Συστάδα 2 (πράσινη): Υψηλό εισόδημα αλλά χαμηλό Spending Score — πελάτες με οικονομική δυνατότητα αλλά περιορισμένη κατανάλωση. Συστάδα 3 (μπλε): Μέσο προς υψηλό Spending Score με μέτριο εισόδημα — ενεργοί και ισορροπημένοι καταναλωτές.

Η σαφής διαχωρισιμότητα των ομάδων επιβεβαιώνει την καταλληλότητα των μεταβλητών AnnualIncome και SpendingScore για πελατειακή συσταδοποίηση.

# Υπολογισμός WCSS για k από 1 έως 10
set.seed(123)
wcss <- numeric(10)

for (k in 1:10) {
  model <- kmeans(scaled_data, centers = k, nstart = 20)
  wcss[k] <- model$tot.withinss
}

# Διάγραμμα Elbow
plot(1:10, wcss, type = "b", pch = 19, col = "steelblue",
     xlab = "Αριθμός Συστάδων (k)",
     ylab = "WCSS (Εντός-Συστάδων Σφάλμα)",
     main = "Elbow Method – Mall Customers")

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