Το επιλεγμένο dataset είναι ένα απλό και ευρέως χρησιμοποιούμενο σύνολο δεδομένων που περιλαμβάνει βασικά δημογραφικά και συμπεριφορικά χαρακτηριστικά πελατών ενός εμπορικού κέντρου. Σκοπός του είναι η κατανόηση των καταναλωτικών προτύπων, η τμηματοποίηση πελατών και η εξαγωγή επιχειρηματικών συμπερασμάτων για τη βελτίωση της εμπειρίας των πελατών και της στρατηγικής μάρκετινγκ.
Πηγή δεδομένων:https://www.kaggle.com/datasets/vjchoudhary7/customer-segmentation-tutorial-in-python
Η συγκεκριμένη βάση δεδομένων συγκεντρώνει μεταβλητές που σχετίζονται με:
✅ Δημογραφικά χαρακτηριστικά (π.χ. φύλο, ηλικία)
✅ Οικονομικά στοιχεία (π.χ. ετήσιο εισόδημα)
✅ Καταναλωτική συμπεριφορά (π.χ. σκορ δαπανών – Spending Score)
Το dataset περιλαμβάνει 5 μεταβλητές.
Αναλυτικά παρουσιάζονται στον παρακάτω πίνακα.
| Variable | Description | Variable_Type |
|---|---|---|
| CustomerID | Αναγνωριστικός αριθμός πελάτη | Κατηγορική |
| Gender | Φύλο (Male/Female) | Κατηγορική |
| Age | Ηλικία πελάτη | Αριθμητική |
| Annual Income (k$) | Ετήσιο εισόδημα σε χιλιάδες δολάρια | Αριθμητική |
| Spending Score (1-100) | Βαθμολογία δαπανών (υπολογίζεται βάσει εισοδήματος και συμπεριφοράς) | Αριθμητική |
Εισάγω τα δεδομένα του dataset για επεξεργασία.
library(readr)
mall <- read.csv("Mall_Customers.csv")
Για να διευκολυνθούμε θα πρέπει να ορίσουμε περιγραφικά ονόματα στις στήλες του dataset.
colnames(mall) = c("CustomerID", "Gender", "Age", "Annual_Income", "Spending_Score")
Δεν θα χρησιμοποιήσουμε τις μεταβλητές CustomerID και Gender.
mall$CustomerID = NULL
mall$Gender = NULL
mall
## Age Annual_Income Spending_Score
## 1 19 15 39
## 2 21 15 81
## 3 20 16 6
## 4 23 16 77
## 5 31 17 40
## 6 22 17 76
## 7 35 18 6
## 8 23 18 94
## 9 64 19 3
## 10 30 19 72
## 11 67 19 14
## 12 35 19 99
## 13 58 20 15
## 14 24 20 77
## 15 37 20 13
## 16 22 20 79
## 17 35 21 35
## 18 20 21 66
## 19 52 23 29
## 20 35 23 98
## 21 35 24 35
## 22 25 24 73
## 23 46 25 5
## 24 31 25 73
## 25 54 28 14
## 26 29 28 82
## 27 45 28 32
## 28 35 28 61
## 29 40 29 31
## 30 23 29 87
## 31 60 30 4
## 32 21 30 73
## 33 53 33 4
## 34 18 33 92
## 35 49 33 14
## 36 21 33 81
## 37 42 34 17
## 38 30 34 73
## 39 36 37 26
## 40 20 37 75
## 41 65 38 35
## 42 24 38 92
## 43 48 39 36
## 44 31 39 61
## 45 49 39 28
## 46 24 39 65
## 47 50 40 55
## 48 27 40 47
## 49 29 40 42
## 50 31 40 42
## 51 49 42 52
## 52 33 42 60
## 53 31 43 54
## 54 59 43 60
## 55 50 43 45
## 56 47 43 41
## 57 51 44 50
## 58 69 44 46
## 59 27 46 51
## 60 53 46 46
## 61 70 46 56
## 62 19 46 55
## 63 67 47 52
## 64 54 47 59
## 65 63 48 51
## 66 18 48 59
## 67 43 48 50
## 68 68 48 48
## 69 19 48 59
## 70 32 48 47
## 71 70 49 55
## 72 47 49 42
## 73 60 50 49
## 74 60 50 56
## 75 59 54 47
## 76 26 54 54
## 77 45 54 53
## 78 40 54 48
## 79 23 54 52
## 80 49 54 42
## 81 57 54 51
## 82 38 54 55
## 83 67 54 41
## 84 46 54 44
## 85 21 54 57
## 86 48 54 46
## 87 55 57 58
## 88 22 57 55
## 89 34 58 60
## 90 50 58 46
## 91 68 59 55
## 92 18 59 41
## 93 48 60 49
## 94 40 60 40
## 95 32 60 42
## 96 24 60 52
## 97 47 60 47
## 98 27 60 50
## 99 48 61 42
## 100 20 61 49
## 101 23 62 41
## 102 49 62 48
## 103 67 62 59
## 104 26 62 55
## 105 49 62 56
## 106 21 62 42
## 107 66 63 50
## 108 54 63 46
## 109 68 63 43
## 110 66 63 48
## 111 65 63 52
## 112 19 63 54
## 113 38 64 42
## 114 19 64 46
## 115 18 65 48
## 116 19 65 50
## 117 63 65 43
## 118 49 65 59
## 119 51 67 43
## 120 50 67 57
## 121 27 67 56
## 122 38 67 40
## 123 40 69 58
## 124 39 69 91
## 125 23 70 29
## 126 31 70 77
## 127 43 71 35
## 128 40 71 95
## 129 59 71 11
## 130 38 71 75
## 131 47 71 9
## 132 39 71 75
## 133 25 72 34
## 134 31 72 71
## 135 20 73 5
## 136 29 73 88
## 137 44 73 7
## 138 32 73 73
## 139 19 74 10
## 140 35 74 72
## 141 57 75 5
## 142 32 75 93
## 143 28 76 40
## 144 32 76 87
## 145 25 77 12
## 146 28 77 97
## 147 48 77 36
## 148 32 77 74
## 149 34 78 22
## 150 34 78 90
## 151 43 78 17
## 152 39 78 88
## 153 44 78 20
## 154 38 78 76
## 155 47 78 16
## 156 27 78 89
## 157 37 78 1
## 158 30 78 78
## 159 34 78 1
## 160 30 78 73
## 161 56 79 35
## 162 29 79 83
## 163 19 81 5
## 164 31 81 93
## 165 50 85 26
## 166 36 85 75
## 167 42 86 20
## 168 33 86 95
## 169 36 87 27
## 170 32 87 63
## 171 40 87 13
## 172 28 87 75
## 173 36 87 10
## 174 36 87 92
## 175 52 88 13
## 176 30 88 86
## 177 58 88 15
## 178 27 88 69
## 179 59 93 14
## 180 35 93 90
## 181 37 97 32
## 182 32 97 86
## 183 46 98 15
## 184 29 98 88
## 185 41 99 39
## 186 30 99 97
## 187 54 101 24
## 188 28 101 68
## 189 41 103 17
## 190 36 103 85
## 191 34 103 23
## 192 32 103 69
## 193 33 113 8
## 194 38 113 91
## 195 47 120 16
## 196 35 120 79
## 197 45 126 28
## 198 32 126 74
## 199 32 137 18
## 200 30 137 83
Για να αφαιρέσουμε διπλές εγγραφές που τυχόν υπάρχουν στο dataset εκτελούμε την εξής εντολή:
mall = unique(mall)
nrow(mall)
## [1] 200
Αφού ο αριθμός των εγγραφών παραμένει ίδιος αυτό μας υποδεικνύει ότι δεν υπάρχουν διπλότυπες εγγραφές.
Πριν προχωρήσουμε στη συσταδοποίηση, πρέπει να υπολογίσουμε τις αποστάσεις μεταξύ όλων των παρατηρήσεων στο dataset. Επιλέγουμε ευκλείδεια απόσταση και γράφουμε:
distances = dist(mall[0:3], method = "euclidean")
Κάνουμε Ιεραρχική Συσταδοποίηση:
clusterCustomers = hclust(distances, method = "ward.D2")
Χρησιμοποιούμε την εντολή plot:
plot(clusterCustomers)
Συμπερασματικά,η ιεραρχική ομαδοποίηση με βάση την ηλικία, το ετήσιο εισόδημα και τη βαθμολογία δαπανών έδειξε ότι οι πελάτες μπορούν να χωριστούν σε περίπου 4–5 διακριτές ομάδες. Αυτές οι ομάδες παρουσιάζουν παρόμοια δημογραφικά και αγοραστικά χαρακτηριστικά, γεγονός που μπορεί να αξιοποιηθεί για την ανάπτυξη στοχευμένων στρατηγικών marketing και προσαρμοσμένων προσφορών. Το δενδρόγραμμα δείχνει σαφή δομή και επιβεβαιώνει την ύπαρξη υπο-ομάδων μέσα στο πελατολόγιο του καταστήματος.
Επιλέγουμε 4 clusters
clusterGroups = cutree(clusterCustomers, k = 4)
tapply(mall$Age, clusterGroups, mean)
## 1 2 3 4
## 42.82075 24.85000 32.69231 41.68571
tapply(mall$Annual_Income, clusterGroups, mean)
## 1 2 3 4
## 48.58491 24.95000 86.53846 88.22857
tapply(mall$Spending_Score, clusterGroups, mean)
## 1 2 3 4
## 43.50943 81.00000 82.12821 17.28571
✅ Τι δείχνουν τα clusters στο Mall_Customers
Η λογική είναι η εξής:
Συνδυάζεται ηλικία, εισόδημα και καταναλωτική δαπάνη για να βρεθεί προφίλ πελατών με παρόμοια αγοραστική συμπεριφορά.
Τα clusters συνήθως ξεχωρίζουν ομάδες που έχουν παρόμοια δημογραφικά & μοτίβα αγορών.
Με βάση παρόμοιες αναλύσεις, τα μοτίβα που εμφανίζονται είναι τα εξής:
| Cluster | Income | Spending | Interpretation |
|---|---|---|---|
| 1 | Μέτριο | Μέτριο | Κανονικοί πελάτες, με σταθερή μέση δαπάνη |
| 2 | Χαμηλό | Πολύ Υψηλό | Παρά το χαμηλό εισόδημα, ξοδεύουν πολύ — πιθανόν νεαροί που ξοδεύουν ό,τι έχουν |
| 3 | Υψηλό | Πολύ Υψηλό | Πολύτιμοι πελάτες: υψηλό εισόδημα & ξοδεύουν πολύ |
| 4 | Υψηλό | Πολύ Χαμηλό | Παρά το υψηλό εισόδημα, ξοδεύουν πολύ λίγο — διστακτικοί, πιθανόν συντηρητικοί ή πελάτες που δεν ενδιαφέρονται |
Αν πάρουμε την μέση τιμή της πρώτης στήλης για το cluster 1 θα έχουμε:
colMeans(subset(mall[0:3], clusterGroups == 1))
## Age Annual_Income Spending_Score
## 42.82075 48.58491 43.50943
Συμπερασματικά,το Cluster 1 αποτελείται κυρίως από πελάτες με μέση ηλικία περίπου 43 ετών, μέσο ετήσιο εισόδημα περίπου 49 χιλιάδες δολάρια και μέση βαθμολογία δαπανών γύρω στο 43. Αυτό υποδηλώνει μια ομάδα σταθερών, τυπικών πελατών, χωρίς ακραία αγοραστική συμπεριφορά, που πιθανότατα αντιπροσωπεύει τον «μέσο» πελάτη του καταστήματος.