Το datasheet που επιλέξαμε αφορά καταναλωτικές συμπεριφορές πελατών σε ένα κατάστημα Supermarket. Συγκεκριμένα γνωρίζουμε το εισόδημα τους, τα έξοδα που κάνανε σε διάφορες κατηγορίες τροφίμων (κρέας/γαλακτοκομικά/αλκολούχα ποτά) καθώς και εάν έχουν παιδιά ή όχι. Παράλληλα γνωρίζουμε εάν έχουν χρησιμοποιήσει την ιστοσελίδα του Supermarket για online ψώνια, καθώς και πότε ήταν η τελευταία αγορά και εάν χρησιμοποιούν κουπόνια έκπτωσης.
Σκοπός μας είναι η συσταδοποίηση των πελατών σε groups για να βελτιώσουμε και να έχουμε πιο στοχευμένο marketing.
Αφού φορτώσαμε το dataset μας, δημιουργούμε δύο νέες στήλες. Υπολογίζουμε τα συνολικά έξοδα (TotalSpend) αθροίζοντας τις επιμέρους κατηγορίες τροφίμων και ποτών, καθώς και τον συνολικό αριθμό παιδιών (TotalKids) στο σπίτι.
df <- df %>%
mutate(
TotalSpend = MntWines + MntFruits + MntMeatProducts + MntFishProducts + MntSweetProducts + MntGoldProds,
TotalKids = Kidhome + Teenhome
)
colnames(df)
## [1] "ID" "Year_Birth" "Education"
## [4] "Marital_Status" "Income" "Kidhome"
## [7] "Teenhome" "Dt_Customer" "Recency"
## [10] "MntWines" "MntFruits" "MntMeatProducts"
## [13] "MntFishProducts" "MntSweetProducts" "MntGoldProds"
## [16] "NumDealsPurchases" "NumWebPurchases" "NumCatalogPurchases"
## [19] "NumStorePurchases" "NumWebVisitsMonth" "AcceptedCmp3"
## [22] "AcceptedCmp4" "AcceptedCmp5" "AcceptedCmp1"
## [25] "AcceptedCmp2" "Complain" "Z_CostContact"
## [28] "Z_Revenue" "Response" "TotalSpend"
## [31] "TotalKids"
Αφαιρούμε τις γραμμές που έχουν κενές τιμές (NA) στο εισόδημα και εξαιρούμε τις ακραίες τιμές (outliers), κρατώντας μόνο όσους πελάτες έχουν εισόδημα μικρότερο από 120.000.
df_clean <- df %>%
drop_na(Income) %>%
filter(Income < 120000)
Κρατάμε μόνο ένα συγκεκριμένο υποσύνολο μεταβλητών που μας ενδιαφέρουν για την ομαδοποίηση. Στη συνέχεια, κανονικοποιούμε τα δεδομένα ώστε όλες οι μεταβλητές (π.χ. το εισόδημα και ο αριθμός παιδιών) να είναι στην ίδια κλίμακα και να μην επηρεάζουν δυσανάλογα τον αλγόριθμο. Αυτό σημαίνει πως οι μεταβλητές μας έχουν μέση τιμή ‘0’ και απόκλιση ‘1’.
cluster_vars <- df_clean %>%
select(Income, Recency, MntWines, MntMeatProducts,
NumDealsPurchases, NumWebPurchases, NumStorePurchases, TotalKids)
scaled_df <- cluster_vars %>%
scale() %>%
as.data.frame()
Υπολογίζουμε τις Ευκλείδειες αποστάσεις μεταξύ των παρατηρήσεων και εφαρμόζουμε ιεραρχική ομαδοποίηση με τη μέθοδο ward.D2. Κόβουμε το “δέντρο” σε 6 ομάδες (clusters) και σχεδιάζουμε το δενδρόγραμμα.
distances <- dist(scaled_df, method = "euclidean")
clusterCustomers <- hclust(distances, method = "ward.D2")
clusterGroups <- cutree(clusterCustomers, k = 6)
# Σχεδιασμός Δενδρογράμματος
plot(clusterCustomers, main = "Δενδρόγραμμα Ομαδοποίησης Πελατών", xlab = "", sub = "")
rect.hclust(clusterCustomers, k = 6, border = "red")
Εφαρμόσαμε ιεραρχικό clustering και μπορούμε να δούμε με κόκκινο χρώμα τις 6 συστάδες μας.
Ενσωματώνουμε τον αριθμό της ομάδας (Segment) στο καθαρό σύνολο δεδομένων. Στη συνέχεια, υπολογίζουμε τους μέσους όρους των βασικών μεταβλητών για κάθε μία από τις 6 ομάδες, ώστε να κατανοήσουμε το “προφίλ” τους.
# Προσθήκη των ομάδων στο dataset
df_clean <- df_clean %>%
mutate(Segment = clusterGroups)
# Υπολογισμός μέσων όρων ανά ομάδα
segment_profile <- df_clean %>%
group_by(Segment) %>%
summarise(
Avg_Income = round(mean(Income), 0),
Avg_MeatProducts = round(mean(MntMeatProducts), 1),
Avg_Wines = round(mean(MntWines), 1),
Avg_SweetProducts = round(mean(MntSweetProducts), 1),
Avg_Fruits = round(mean(MntFruits), 1),
Avg_TotalKids = round(mean(TotalKids), 1)
)
# Εμφάνιση του πίνακα
#segment_profile
knitr::kable(segment_profile, caption = "Μέσοι Όροι Προφίλ ανά Ομάδα Πελατών")
| Segment | Avg_Income | Avg_MeatProducts | Avg_Wines | Avg_SweetProducts | Avg_Fruits | Avg_TotalKids |
|---|---|---|---|---|---|---|
| 1 | 66181 | 216.3 | 573.4 | 45.0 | 45.6 | 0.8 |
| 2 | 39437 | 20.1 | 51.4 | 3.3 | 3.1 | 2.1 |
| 3 | 29948 | 18.6 | 25.1 | 5.5 | 5.4 | 0.8 |
| 4 | 49607 | 113.3 | 302.5 | 19.4 | 15.4 | 1.6 |
| 5 | 78093 | 517.6 | 684.3 | 64.4 | 64.0 | 0.1 |
| 6 | 50849 | 90.9 | 192.0 | 23.0 | 19.9 | 0.8 |
Χωρίσαμε τους πελάτες σε 6 κατηγορίες (συστάδες):