Το Mall Customer Segmentation Dataset περιλαμβάνει δεδομένα 200 πελατών ενός εμπορικού κέντρου, τα οποία συλλέχθηκαν για την ανάλυση και κατανόηση της συμπεριφοράς και των χαρακτηριστικών των πελατών. Το συγκεκριμένο dataset χρησιμοποιείται συχνά για εφαρμογές συσταδοποίησης (clustering) με στόχο την κατηγοριοποίηση πελατών σε ομοιογενείς ομάδες, που βοηθούν σε στοχευμένες στρατηγικές marketing, βελτίωση εξυπηρέτησης και αύξηση πωλήσεων.
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")| Χαρακτηριστικό | Περιγραφή | Τύπος |
|---|---|---|
| CustomerID | Μοναδικός αναγνωριστικός αριθμός πελάτη | Numeric |
| Gender | Φύλο (Male/Female) | Categorical |
| Age | Ηλικία πελάτη | Numeric |
| Annual Income ($) | Ετήσιο εισόδημα σε χιλιάδες δολάρια | Numeric |
| Spending Score (1-100) | Βαθμολογία καταναλωτικής συμπεριφοράς (όσο μεγαλύτερη, τόσο πιο ενεργός πελάτης) | Numeric |
cat("Σύνολο ελλιπών τιμών:", sum(is.na(CustomerData)), "\n") #Έλεγχος για ελλιπείς τιμές (NA). Αν αποτέλεσμα > 0 τότε έχουμε ελλιπείς τιμές## Σύνολο ελλιπών τιμών: 0
cat("Διπλότυπες γραμμές:", sum(duplicated(CustomerData)), "\n") #Έλεγχος για διπλότυπες εγγραφές. Αν το αποτέλεσμα είναι > 0, τότε υπάρχουν διπλές εγγραφές## Διπλότυπες γραμμές: 0
# Μετονομασία στηλών
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
# Υπολογισμός αποστάσεων
dist_matrix <- dist(mall_scaled, method = "euclidean")
# Δημιουργία ιεραρχικής συσταδοποίησης με Ward
hc <- hclust(dist_matrix, method = "ward.D2")
# Δενδροδιάγραμμα
plot(hc, labels = FALSE, main = "Δενδροδιάγραμμα - Ιεραρχική Συσταδοποίηση", xlab = "", sub = "")# Κατηγοριοποίηση σε 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 |
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")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 ετών) παρουσιάζουν ελάχιστη καταναλωτική δραστηριότητα. Αν και διαθέτουν αγοραστική δύναμη, για κάποιο λόγο παραμένουν ανενεργοί ή αδιάφοροι στην αγορά.
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).