Βήμα 1: Περιγραφή Δεδομένων

Το datasheet που επιλέξαμε αφορά καταναλωτικές συμπεριφορές πελατών σε ένα κατάστημα Supermarket. Συγκεκριμένα γνωρίζουμε το εισόδημα τους, τα έξοδα που κάνανε σε διάφορες κατηγορίες τροφίμων (κρέας/γαλακτοκομικά/αλκολούχα ποτά) καθώς και εάν έχουν παιδιά ή όχι. Παράλληλα γνωρίζουμε εάν έχουν χρησιμοποιήσει την ιστοσελίδα του Supermarket για online ψώνια, καθώς και πότε ήταν η τελευταία αγορά και εάν χρησιμοποιούν κουπόνια έκπτωσης.

Σκοπός μας είναι η συσταδοποίηση των πελατών σε groups για να βελτιώσουμε και να έχουμε πιο στοχευμένο marketing.

Βήμα 2: Δημιουργία Νέων Μεταβλητών

Αφού φορτώσαμε το 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"

Βήμα 3: Καθαρισμός Δεδομένων

Αφαιρούμε τις γραμμές που έχουν κενές τιμές (NA) στο εισόδημα και εξαιρούμε τις ακραίες τιμές (outliers), κρατώντας μόνο όσους πελάτες έχουν εισόδημα μικρότερο από 120.000.

df_clean <- df %>%
  drop_na(Income) %>%
  filter(Income < 120000)

Βήμα 4: Επιλογή Μεταβλητών και Κανονικοποίηση (Scaling)

Κρατάμε μόνο ένα συγκεκριμένο υποσύνολο μεταβλητών που μας ενδιαφέρουν για την ομαδοποίηση. Στη συνέχεια, κανονικοποιούμε τα δεδομένα ώστε όλες οι μεταβλητές (π.χ. το εισόδημα και ο αριθμός παιδιών) να είναι στην ίδια κλίμακα και να μην επηρεάζουν δυσανάλογα τον αλγόριθμο. Αυτό σημαίνει πως οι μεταβλητές μας έχουν μέση τιμή ‘0’ και απόκλιση ‘1’.

cluster_vars <- df_clean %>%
  select(Income, Recency, MntWines, MntMeatProducts, 
         NumDealsPurchases, NumWebPurchases, NumStorePurchases, TotalKids)

scaled_df <- cluster_vars %>%
  scale() %>%
  as.data.frame()

Βήμα 5: Ιεραρχική Ομαδοποίηση (Hierarchical Clustering)

Υπολογίζουμε τις Ευκλείδειες αποστάσεις μεταξύ των παρατηρήσεων και εφαρμόζουμε ιεραρχική ομαδοποίηση με τη μέθοδο 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 συστάδες μας.

Βήμα 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

Συμπεράσματα και Αναλύσεις ανά Ομάδα (Segment Insights)

Χωρίσαμε τους πελάτες σε 6 κατηγορίες (συστάδες):

  • Ομάδα 5 (Οι Πλούσιοι Πελάτες χωρίς παιδιά): Πρόκειται για το πιο επικερδές κοινό. Έχουν το υψηλότερο εισόδημα (~78.000) και σχεδόν καθόλου παιδιά (0.1) κατά μέσο όρο. Ως αποτέλεσμα, έχουν μεγάλο διαθέσιμο εισόδημα, ξοδεύοντας μεγάλα ποσά σε όλες τις κατηγορίες, ιδιαίτερα στο κρασί και το κρέας.
  • Ομάδα 1 (Πελάτες Υψηλού Εισοδήματος): Είναι η δεύτερη πιο επικερδής ομάδα. Έχουν υψηλό εισόδημα (~66.000) και κατά μέσο όρο σχεδόν 1 παιδί (0.8). Συνεχίζουν να ξοδεύουν πολύ μεγάλα ποσά, με ιδιαίτερη προτίμηση στο κρασί.
  • Ομάδα 4 (Η Τυπική Μεσαία Οικογένεια): Πελάτες με μεσαίο εισόδημα (~49.000) αλλά με αυξημένο αριθμό παιδιών (1.6 κατά μέσο όρο). Παρόλα τα οικογενειακά βάρη, διατηρούν μια καλή αγοραστική δύναμη και ξοδεύουν ικανοποιητικά ποσά σε κρέας και κρασί.
  • Ομάδα 6 (Μεσαίο Εισόδημα, Μέτρια Έξοδα): Έχουν παρόμοιο εισόδημα με την Ομάδα 4 (~50.000) αλλά λιγότερα παιδιά (0.8). Ωστόσο, είναι πιο συγκρατημένοι καταναλωτές σε σχέση με την Ομάδα 4, παρουσιάζοντας μέτρια έξοδα.
  • Ομάδα 2 (Πολύ-τεκνοι με Περιορισμένο Προϋπολογισμό): Έχουν χαμηλό-μεσαίο εισόδημα (~39.000) αλλά τον μεγαλύτερο αριθμό παιδιών (2.1). Αυτό σημαίνει ότι ο προϋπολογισμός τους είναι πολύ σφιχτός, γι’ αυτό και καταγράφουν εξαιρετικά χαμηλές δαπάνες σε είδη όπως το κρασί, το κρέας και τα γλυκά.
  • Ομάδα 3 (Πελάτες Χαμηλού Εισοδήματος): Είναι η ομάδα με το χαμηλότερο εισόδημα (~30.000). Έχουν κατά μέσο όρο σχεδόν 1 παιδί (0.8) και κάνουν μακράν τις μικρότερες αγορές σε όλες σχεδόν τις κατηγορίες, εστιάζοντας πιθανώς μόνο σε απολύτως βασικά είδη.