theme: cosmo 
## Loading required package: lattice
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ purrr::lift()   masks caret::lift()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Περιγραφή Dataset

Το παρόν σύνολο δεδομένων χρησιμοποιείται για εκπαιδευτικούς και αναλυτικούς σκοπούς, με κύριο στόχο την τμηματοποίηση πελατών (customer segmentation) με βάση δημογραφικά και καταναλωτικά χαρακτηριστικά. Το σενάριο επικεντρώνεται σε έναν υπεύθυνο εμπορικού κέντρου, ο οποίος, μέσω συστήματος καρτών μέλους, έχει συλλέξει βασικές πληροφορίες για τους πελάτες του.

Οι διαθέσιμες μεταβλητές του dataset είναι οι εξής:

CustomerID: Ένας μοναδικός αριθμός ταυτοποίησης για κάθε πελάτη.

Genre: Το φύλο του πελάτη (Male ή Female).

Age: Η ηλικία του πελάτη, σε έτη.

Annual Income (k$): Το ετήσιο εισόδημα του πελάτη, σε χιλιάδες δολάρια.

Spending Score (1–100): Ένας δείκτης της καταναλωτικής του συμπεριφοράς, ο οποίος βασίζεται σε παράγοντες όπως η συχνότητα επισκέψεων και το ύψος των αγορών. Κυμαίνεται από 1 (χαμηλό) έως 100 (υψηλό).

Το dataset αυτό είναι κατάλληλο για εφαρμογή μεθόδων συσταδοποίησης (clustering) όπως η Ιεραρχική Συσταδοποίηση και το K-means, με σκοπό την κατηγοριοποίηση των πελατών σε ομάδες με παρόμοια χαρακτηριστικά και αγοραστικές συνήθειες.

data <- read.csv("C:/Users/poulios/Downloads/Mall_Customers.csv")
summary(data)
##    CustomerID        Genre                Age        Annual.Income..k..
##  Min.   :  1.00   Length:200         Min.   :18.00   Min.   : 15.00    
##  1st Qu.: 50.75   Class :character   1st Qu.:28.75   1st Qu.: 41.50    
##  Median :100.50   Mode  :character   Median :36.00   Median : 61.50    
##  Mean   :100.50                      Mean   :38.85   Mean   : 60.56    
##  3rd Qu.:150.25                      3rd Qu.:49.00   3rd Qu.: 78.00    
##  Max.   :200.00                      Max.   :70.00   Max.   :137.00    
##  Spending.Score..1.100.
##  Min.   : 1.00         
##  1st Qu.:34.75         
##  Median :50.00         
##  Mean   :50.20         
##  3rd Qu.:73.00         
##  Max.   :99.00

Boxplot για την ηλικία

# Boxplot για την ηλικία
ggplot(data, aes(y = Age)) +
  geom_boxplot(fill = "steelblue") +
  labs(title = "Boxplot - Age")

Σχόλια

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

Histogram εισοδήματος

# Histogram για εισόδημα
ggplot(data, aes(x = `Annual.Income..k..`)) +
  geom_histogram(binwidth = 5, fill = "darkgreen", color = "black") +
  geom_density(aes(y = ..count.. * 5), color = "green", size = 1) +
  labs(title = "Histogram - Annual Income (k$)")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

### Σχόλια

Το ιστόγραμμα του Spending Score παρουσιάζει διμορφική κατανομή, με κορυφές σε χαμηλές (10–30) και υψηλές (70–90) τιμές. Αυτό υποδεικνύει την ύπαρξη δύο διακριτών ομάδων πελατών – χαμηλής και υψηλής καταναλωτικής δραστηριότητας. Η μειωμένη πυκνότητα στη μεσαία περιοχή (40–60) υποδηλώνει έλλειψη ομοιογένειας

numeric_data <- data[sapply(data, is.numeric)]
scaled_data <- scale(numeric_data)

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

# Επιλογή αριθμητικών μεταβλητών
numeric_data <- data %>% select(Age, `Annual.Income..k..`, Spending.Score..1.100.)

# Κανονικοποίηση δεδομένων
scaled_data <- scale(numeric_data)

# Υπολογισμός ευκλείδειας απόστασης
dist_matrix <- dist(scaled_data, method = "euclidean")

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

# Δημιουργία δενδρογράμματος
plot(hc, hang = -1, labels = FALSE, main = "Hierarchical Clustering Dendrogram")

Σχόλια

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

Η παρατήρηση του ύψους των διακλαδώσεων (κάθετος άξονας) δείχνει πόσο διαφορετικές είναι οι ομάδες μεταξύ τους. Ένα αισθητό “άλμα” στις τελευταίες ενώσεις ενισχύει την ύπαρξη λίγων αλλά διακριτών συστάδων.

Μια οριζόντια τομή του δενδρογράμματος σε αυτό το ύψος οδηγεί σε 4 ή 5 ομάδες, οι οποίες φαίνεται να απομονώνονται ικανοποιητικά. Συνεπώς, ο ιδανικός αριθμός clusters εκτιμάται ότι κυμαίνεται μεταξύ 4 και 5.

Συσταδοποίηση K-means

# Μετονομασία στηλών για ευκολία (προαιρετικό)
colnames(data)[colnames(data) == "Annual.Income..k.."] <- "Income"
colnames(data)[colnames(data) == "Spending.Score..1.100."] <- "Score"

# Επιλογή αριθμητικών μεταβλητών για clustering
numeric_data <- data %>% select(Age, Income, Score)

# Κανονικοποίηση
scaled_data <- scale(numeric_data)

# Εκτέλεση K-means clustering για k = 5
set.seed(42)
kmeans_result <- kmeans(scaled_data, centers = 5, nstart = 25)

# Προσθήκη της συστάδας στο αρχικό dataset
data$Cluster <- as.factor(kmeans_result$cluster)

# Οπτικοποίηση συστάδων (με βάση τις 2 πιο διακριτές μεταβλητές)
fviz_cluster(kmeans_result, data = scaled_data,
             geom = "point",
             ellipse.type = "norm",
             palette = "Set1",
             main = "K-means Clustering (k = 5)")

Σχόλια

Το διάγραμμα δείχνει ότι οι 5 συστάδες του K-means είναι σαφώς διαχωρισμένες, χωρίς σημαντική επικάλυψη. Οι ομάδες διαφέρουν σε μέγεθος και σχήμα, γεγονός που αντανακλά ουσιαστικές διαφορές στα χαρακτηριστικά των πελατών. Η μείωση διαστάσεων μέσω PCA διευκολύνει την ερμηνεία, αποδεικνύοντας ότι το μοντέλο clustering είναι αποτελεσματικό για τμηματοποίηση πελατών.

Σχολιασμός κάθε cluster:
🔹 Cluster 1 (π.χ. κόκκινο) ➡️ Χαμηλό εισόδημα, χαμηλό spending score 📌 Πιθανώς μη ενεργοί πελάτες με περιορισμένη αγοραστική δυνατότητα.

🔹 Cluster 2 (π.χ. μπλε) ➡️ Μέσο εισόδημα, μέση καταναλωτική συμπεριφορά 📌 Ισορροπημένοι πελάτες, χωρίς ακραία χαρακτηριστικά.

🔹 Cluster 3 (π.χ. πράσινο) ➡️ Υψηλό εισόδημα, υψηλό spending score 📌 Ιδανικοί πελάτες, με αγοραστική δύναμη και υψηλή δραστηριότητα.

🔹 Cluster 4 (π.χ. μωβ) ➡️ Υψηλό εισόδημα, χαμηλό spending score 📌 Πελάτες με δυνατότητα αγορών αλλά χαμηλή εμπλοκή – πιθανώς δυσαρεστημένοι ή αδιάφοροι.

🔹 Cluster 5 (π.χ. πορτοκαλί) ➡️ Χαμηλό εισόδημα, υψηλό spending score 📌 Πιστοί ή παρορμητικοί πελάτες που ξοδεύουν δυσανάλογα με τα εισοδήματά τους.