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

Το Mall Customer Segmentation Dataset περιλαμβάνει δεδομένα 200 πελατών ενός εμπορικού κέντρου, τα οποία συλλέχθηκαν για την ανάλυση και κατανόηση της συμπεριφοράς και των χαρακτηριστικών των πελατών. Το συγκεκριμένο dataset χρησιμοποιείται συχνά για εφαρμογές συσταδοποίησης (clustering) με στόχο την κατηγοριοποίηση πελατών σε ομοιογενείς ομάδες, που βοηθούν σε στοχευμένες στρατηγικές marketing, βελτίωση εξυπηρέτησης και αύξηση πωλήσεων.

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

df <- data.frame(
  Χαρακτηριστικό = c("CustomerID", "Gender", "Age", "Annual Income ($)", "Spending Score (1-100)"),
   Περιγραφή = c("Μοναδικός αναγνωριστικός αριθμός πελάτη", "Φύλο (Male/Female)", "Ηλικία πελάτη", "Ετήσιο εισόδημα σε χιλιάδες δολάρια", "Βαθμολογία καταναλωτικής συμπεριφοράς (όσο μεγαλύτερη, τόσο πιο ενεργός πελάτης)"
),
  Τύπος = c("Numeric", "Categorical", "Numeric", "Numeric", "Numeric")
)
kable(df, caption = "Πίνακας: Περιγραφή των χαρακτηριστικών του dataset")
Πίνακας: Περιγραφή των χαρακτηριστικών του dataset
Χαρακτηριστικό Περιγραφή Τύπος
CustomerID Μοναδικός αναγνωριστικός αριθμός πελάτη Numeric
Gender Φύλο (Male/Female) Categorical
Age Ηλικία πελάτη Numeric
Annual Income ($) Ετήσιο εισόδημα σε χιλιάδες δολάρια Numeric
Spending Score (1-100) Βαθμολογία καταναλωτικής συμπεριφοράς (όσο μεγαλύτερη, τόσο πιο ενεργός πελάτης) Numeric

3. Έλεγχος για ελλιπείς και διπλότυπες τιμές

cat("Σύνολο ελλιπών τιμών:", sum(is.na(CustomerData)), "\n") #Έλεγχος για ελλιπείς τιμές (NA). Αν αποτέλεσμα > 0 τότε έχουμε ελλιπείς τιμές
## Σύνολο ελλιπών τιμών: 0
cat("Διπλότυπες γραμμές:", sum(duplicated(CustomerData)), "\n") #Έλεγχος για διπλότυπες εγγραφές. Αν το αποτέλεσμα είναι > 0, τότε υπάρχουν διπλές εγγραφές
## Διπλότυπες γραμμές: 0

4. Προ-επεξεργασία δεδομένων

# Μετονομασία στηλών
colnames(CustomerData) <- c("CustomerID", "Gender", "Age", "AnnualIncome", "SpendingScore")

# Κωδικοποίηση του Gender
CustomerData$Gender <- ifelse(CustomerData$Gender == "Male", 1, 0)

# Αφαίρεση του CustomerID
mall_data <- CustomerData %>% select(-CustomerID)

# Δημιουργία scaled version για clustering
mall_scaled <- scale(mall_data)
summary(mall_scaled)
##      Gender             Age           AnnualIncome      SpendingScore      
##  Min.   :-0.8842   Min.   :-1.4926   Min.   :-1.73465   Min.   :-1.905240  
##  1st Qu.:-0.8842   1st Qu.:-0.7230   1st Qu.:-0.72569   1st Qu.:-0.598292  
##  Median :-0.8842   Median :-0.2040   Median : 0.03579   Median :-0.007745  
##  Mean   : 0.0000   Mean   : 0.0000   Mean   : 0.00000   Mean   : 0.000000  
##  3rd Qu.: 1.1253   3rd Qu.: 0.7266   3rd Qu.: 0.66401   3rd Qu.: 0.882916  
##  Max.   : 1.1253   Max.   : 2.2299   Max.   : 2.91037   Max.   : 1.889750

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

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

# Δημιουργία ιεραρχικής συσταδοποίησης με Ward
hc <- hclust(dist_matrix, method = "ward.D2")

# Δενδροδιάγραμμα
plot(hc, labels = FALSE, main = "Δενδροδιάγραμμα - Ιεραρχική Συσταδοποίηση", xlab = "", sub = "")

6. Δημιουργία Συστάδων

# Κατηγοριοποίηση σε 5 ομάδες
clusters_hc <- cutree(hc, k = 5)

# Δημιουργία νέου dataset με τα αρχικά (όχι scaled) δεδομένα
mall_data$HC_Cluster <- factor(clusters_hc, 
                                   levels = 1:5,
                                   labels = c("Balanced Customers",
                                              "Middle-Aged Low Activity",
                                              "Senior Moderate Buyers",
                                              "Adult High Income",
                                              "Wealthy Inactives"))
# Συνοπτικός Πίνακας
table(mall_data$HC_Cluster) %>%
  kable(col.names = c("Cluster", "Count"), caption = "Αριθμός Πελατών ανά Συστάδα")
Αριθμός Πελατών ανά Συστάδα
Cluster Count
Balanced Customers 61
Middle-Aged Low Activity 38
Senior Moderate Buyers 29
Adult High Income 39
Wealthy Inactives 33

7. Οπτικοποίηση Συστάδων

pca <- prcomp(mall_scaled)
pca_df <- data.frame(PC1 = pca$x[,1],
                     PC2 = pca$x[,2],
                     Cluster = factor(clusters_hc))

ggplot(pca_df, aes(x = PC1, y = PC2, color = Cluster)) +
  geom_point(size = 2, alpha = 0.7) +
  labs(title = "Προβολή Συστάδων σε 2 Διαστάσεις (PCA)",
       x = "Κύρια Συνιστώσα 1",
       y = "Κύρια Συνιστώσα 2") +
  theme_minimal() +
  scale_color_brewer(palette = "Set1")

8. Μέσες Τιμές Χαρακτηριστικών για Κάθε Cluster

for (cluster_name in levels(mall_data$HC_Cluster)) {
  cat("Cluster:", cluster_name, "\n")
  print(round(colMeans(subset(mall_data[, 1:4], mall_data$HC_Cluster == cluster_name)), 2))
  cat("\n")
}
## Cluster: Balanced Customers 
##        Gender           Age  AnnualIncome SpendingScore 
##          0.38         26.15         43.77         58.97 
## 
## Cluster: Middle-Aged Low Activity 
##        Gender           Age  AnnualIncome SpendingScore 
##          0.00         49.79         44.11         39.66 
## 
## Cluster: Senior Moderate Buyers 
##        Gender           Age  AnnualIncome SpendingScore 
##          1.00         56.55         50.03         41.34 
## 
## Cluster: Adult High Income 
##        Gender           Age  AnnualIncome SpendingScore 
##          0.46         32.69         86.54         82.13 
## 
## Cluster: Wealthy Inactives 
##        Gender           Age  AnnualIncome SpendingScore 
##          0.55         41.45         89.09         16.18

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

Balanced Customers

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

Middle-Aged Low Spend

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

Senior Moderate Buyers

Πρόκειται για άνδρες μεγαλύτερης ηλικίας (~57 ετών) με μέτριο εισόδημα και επίσης μέτρια βαθμολογία δαπάνης. Δεν είναι ιδιαίτερα ενεργοί καταναλωτές, αλλά παραμένουν συνεπείς στη συμπεριφορά τους.

Adult High Income

Αυτή είναι η πιο πολύτιμη εμπορικά ομάδα. Περιλαμβάνει νέους ενήλικες (~33 ετών) με πολύ υψηλό εισόδημα και υψηλή καταναλωτική δραστηριότητα. Είναι ενεργοί, διαθέτουν οικονομική άνεση και αποτελούν κύριο στόχο στρατηγικών μάρκετινγκ.

Wealthy Inactives

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

9. Σύγκριση Μέσων Όρων Χαρακτηριστικών για Κάθε Cluster

means <- mall_data %>%
  group_by(HC_Cluster) %>%
  summarise(across(c(Gender, Age, AnnualIncome, SpendingScore), mean)) %>%
  melt(id.vars = "HC_Cluster")

ggplot(means, aes(x = variable, y = value, fill = HC_Cluster)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  labs(title = "Μέσοι Όροι Χαρακτηριστικών ανά Cluster",
       x = "Χαρακτηριστικό",
       y = "Μέσος Όρος") +
  theme_minimal()

Gender:

Σε όλες τις ομάδες, η μέση τιμή του φύλου είναι πολύ κοντά στο 0.5. Αυτό δείχνει ότι δεν υπάρχει μεγάλη διαφορά στη σύνθεση των φύλων μεταξύ των clusters.

Age:

Η ομάδα Middle-Aged Low Activity έχει τη χαμηλότερη μέση ηλικία (~35-40).

Οι Senior Moderate Buyers έχουν τη μεγαλύτερη μέση ηλικία (~55-60), όπως υποδηλώνει και το όνομα της ομάδας.

Annual Income:

Οι Wealthy Inactives και οι Adult High Income έχουν το υψηλότερο μέσο εισόδημα (~80-85), με μικρή διαφορά.

Οι υπόλοιπες ομάδες έχουν μέσο εισόδημα χαμηλότερο ή μεσαίο (~40-60).

Spending Score:

Οι Adult High Income και οι Balanced Customers έχουν υψηλότερη βαθμολογία δαπάνης (~60-85).

Η ομάδα Wealthy Inactives έχει τη χαμηλότερη βαθμολογία (~15), δηλώνοντας μικρή καταναλωτική δραστηριότητα.

Οι Middle-Aged Low Activity και Senior Moderate Buyers έχουν ενδιάμεσες τιμές (~40-50).