Το dataset προέρχεται από το Kaggle και αφορά πελάτες τραπεζών. Περιλαμβάνει 10000 εγγραφές/πελάτες τράπεζας το οποίο αποτελείται από 12 ανεξάρτητες μεταβλητές (χαρακτηριστικά πελατών) και 1 εξαρτημένη μεταβλητή, που δείχνει αν ένας πελάτης αποχωρεί (churn) ή παραμένει.
Περιλαμβάνει δημογραφικά, οικονομικά και τραπεζικά δεδομένα, όπως η ηλικία, το φύλο, το υπόλοιπο του λογαριασμού και ο αριθμός των προϊόντων του. Σκοπός είναι να αναλυθούν οι παράγοντες που επηρεάζουν την αποχώρηση των πελατών, κάτι που είναι ζωτικής σημασίας για τον χρηματοοικονομικό τομέα.
Παρακάτω περιγράφονται οι μεταβλητές του dataset, μαζί με τους τύπους τους:
library(ggplot2)
#Εισαγωγή dataset
Churn_Modeling <-read.csv("C:/Users/dadak/Documents/sxoli/Business_Analytics/Assignment2/Churn_Modelling.csv")## 'data.frame': 10002 obs. of 14 variables:
## $ RowNumber : int 1 2 3 4 5 6 7 8 9 10 ...
## $ CustomerId : int 15634602 15647311 15619304 15701354 15737888 15574012 15592531 15656148 15792365 15592389 ...
## $ Surname : chr "Hargrave" "Hill" "Onio" "Boni" ...
## $ CreditScore : int 619 608 502 699 850 645 822 376 501 684 ...
## $ Geography : chr "France" "Spain" "France" "France" ...
## $ Gender : chr "Female" "Female" "Female" "Female" ...
## $ Age : num 42 41 42 39 43 44 50 29 44 NA ...
## $ Tenure : int 2 1 8 1 2 8 7 4 4 2 ...
## $ Balance : num 0 83808 159661 0 125511 ...
## $ NumOfProducts : int 1 1 3 2 1 2 2 4 2 1 ...
## $ HasCrCard : int 1 0 1 0 NA 1 1 1 0 1 ...
## $ IsActiveMember : int 1 1 0 0 1 0 1 0 NA 1 ...
## $ EstimatedSalary: num 101349 112543 113932 93827 79084 ...
## $ Exited : int 1 0 1 0 0 1 0 1 0 0 ...
## [1] 10002 14
Σε αυτό το στάδιο πραγματοποιήθηκε έλεγχος για ελλιπείς τιμές και διπλότυπες εγγραφές στο dataset. Αρχικά, μέσω του παρακάτω διαγράμματος, εντοπίζονται οι μεταβλητές με κενά πεδία.
Figure1: Εμφάνιση ελλιπών τιμών ανά μεταβλητή
# Εύρεση και αφαίρεση διπλότυπων
# Πλήθος συνολικών γραμμών πριν
nrow_before <- nrow(Churn_Modeling)
# Πόσες διπλότυπες γραμμές υπάρχουν;
duplicates_found <- sum(duplicated(Churn_Modeling))
# Αφαίρεση διπλότυπων
Churn_Modeling <- Churn_Modeling[!duplicated(Churn_Modeling), ]
# Πλήθος συνολικών γραμμών μετά
nrow_after <- nrow(Churn_Modeling)
# Εκτύπωση αποτελεσμάτων
cat("Διπλότυπες εγγραφές που εντοπίστηκαν και αφαιρέθηκαν:", duplicates_found, "\n")## Διπλότυπες εγγραφές που εντοπίστηκαν και αφαιρέθηκαν: 2
## Γραμμές πριν: 10002 - Γραμμές μετά: 10000
Για να διευκολυνθεί η οπτικοποίηση και η ερμηνεία των αποτελεσμάτων, επιλέγουμε μόνο δύο αριθμητικές μεταβλητές. Το ερώτημα που προκύπτει είναι: ποιες από αυτές είναι οι πιο κατάλληλες για χρήση στη συσταδοποίηση; Για να το απαντήσουμε αυτό, βασιζόμαστε στην ανάλυση της διασποράς και του βαθμού συσχέτισης μεταξύ των μεταβλητών.
# Επιλογή αριθμητικών στηλών
numeric_vars <- Churn_Modeling[, sapply(Churn_Modeling, is.numeric)]
# Υπολογισμός διασποράς κάθε μεταβλητής
variances <- sapply(numeric_vars, var, na.rm = TRUE)
# Εμφάνιση διασποράς σε φθήνουσα σειρά
variances_sorted <- sort(variances, decreasing = TRUE)
print(variances_sorted)## CustomerId Balance EstimatedSalary RowNumber CreditScore
## 5.174815e+09 3.893436e+09 3.307457e+09 8.334167e+06 9.341860e+03
## Age Tenure NumOfProducts IsActiveMember HasCrCard
## 1.099905e+02 8.364673e+00 3.383218e-01 2.497984e-01 2.078026e-01
## Exited
## 1.622225e-01
# bar plot
barplot(variances_sorted, las = 2, col = "skyblue",
main = "Διασπορά μεταβλητών", ylab = "Variance")Παρατηρούμε ότι οι μεταβλητές CustomerId, Balance και EstimatedSalary έχουν εξαιρετικά υψηλή διασπορά σε σχέση με όλες τις υπόλοιπες, οι οποίες εμφανίζουν σχεδόν μηδενική διακύμανση. Αυτό σημαίνει ότι οι πρώτες μεταβλητές παρουσιάζουν μεγάλη διαφοροποίηση στις τιμές τους και περιέχουν περισσότερη πληροφορία για τον διαχωρισμό των παρατηρήσεων, άρα είναι πιο κατάλληλες υποψήφιες για χρήση clustering. Ωστόσο, η μεταβλητή CustomerId δεν πρέπει να χρησιμοποιηθεί, καθώς είναι απλά ένας μοναδικός αναγνωριστικός αριθμός πελάτη και δεν περιέχει καμία ουσιαστική πληροφορία για τη συμπεριφορά του πελάτη. Αντιθέτως, μεταβλητές όπως το Balance και το EstimatedSalary έχουν οικονομική σημασία και μπορούν να οδηγήσουν σε ουσιαστικό διαχωρισμό των πελατών σε ομάδες.
Άρα, με βάση τη διασπορά, κατάλληλες υποψήφιες μεταβλητές για clustering είναι οι Balance και EstimatedSalary.
Αφού εντοπίσαμε τις μεταβλητές με τη μεγαλύτερη διασπορά, στη συνέχεια προχωρήσαμε στην ανάλυση της συσχέτισης μεταξύ τους. Η συσχέτιση μάς επιτρέπει να διαπιστώσουμε αν δύο μεταβλητές μεταφέρουν παρόμοια πληροφορία, κάτι που είναι ανεπιθύμητο στη συσταδοποίηση.
# Επιλογή μόνο αριθμητικών μεταβλητών
numeric_vars <- Churn_Modeling[, sapply(Churn_Modeling, is.numeric)]
# Υπολογισμός πίνακα συσχέτισης (χωρίς NAs)
cor_matrix <- cor(numeric_vars, use = "complete.obs")
# Προβολή πίνακα
print(round(cor_matrix, 2))## RowNumber CustomerId CreditScore Age Tenure Balance
## RowNumber 1.00 0.00 0.01 0.00 -0.01 -0.01
## CustomerId 0.00 1.00 0.01 0.01 -0.01 -0.01
## CreditScore 0.01 0.01 1.00 0.00 0.00 0.01
## Age 0.00 0.01 0.00 1.00 -0.01 0.03
## Tenure -0.01 -0.01 0.00 -0.01 1.00 -0.01
## Balance -0.01 -0.01 0.01 0.03 -0.01 1.00
## NumOfProducts 0.01 0.02 0.01 -0.03 0.01 -0.30
## HasCrCard 0.00 -0.01 -0.01 -0.01 0.02 -0.01
## IsActiveMember 0.01 0.00 0.03 0.09 -0.03 -0.01
## EstimatedSalary -0.01 0.02 0.00 -0.01 0.01 0.01
## Exited -0.02 -0.01 -0.03 0.29 -0.01 0.12
## NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited
## RowNumber 0.01 0.00 0.01 -0.01 -0.02
## CustomerId 0.02 -0.01 0.00 0.02 -0.01
## CreditScore 0.01 -0.01 0.03 0.00 -0.03
## Age -0.03 -0.01 0.09 -0.01 0.29
## Tenure 0.01 0.02 -0.03 0.01 -0.01
## Balance -0.30 -0.01 -0.01 0.01 0.12
## NumOfProducts 1.00 0.00 0.01 0.01 -0.05
## HasCrCard 0.00 1.00 -0.01 -0.01 -0.01
## IsActiveMember 0.01 -0.01 1.00 -0.01 -0.16
## EstimatedSalary 0.01 -0.01 -0.01 1.00 0.01
## Exited -0.05 -0.01 -0.16 0.01 1.00
## corrplot 0.95 loaded
corrplot(cor_matrix, method = "color", type = "upper",
tl.col = "black", tl.cex = 0.8, order = "hclust",
title = "Πίνακας Συσχέτισης Αριθμητικών Μεταβλητών")Εξετάζοντας τον πίνακα συσχέτισης των αριθμητικών μεταβλητών, διαπιστώθηκε ότι η μεταβλητή Balance εμφανίζει πολύ χαμηλή ή μηδενική συσχέτιση με τις περισσότερες άλλες μεταβλητές, γεγονός που την καθιστά ιδιαίτερα κατάλληλη ως βάση για την επιλογή μιας δεύτερης ανεξάρτητης μεταβλητής. Μεταξύ των υπολοίπων, η EstimatedSalary παρουσίασε επίσης αμελητέα συσχέτιση με την Balance, κάτι που την καθιστά ιδανική υποψήφια για να συνδυαστεί μαζί της, καθώς προσφέρει συμπληρωματική πληροφορία χωρίς επικάλυψη και αποτελεί επίσης μεταβλητή με υψηλή διασπορά.
cluster_data <- Churn_Modeling %>%
select(Balance, EstimatedSalary)
# Κανονικοποίηση
scaled_data <- scale(cluster_data)Έπειτα, κάνουμε κανονικοποίηση για να φέρουμε όλες τις αριθμητικές μεταβλητές στην ίδια κλίμακα, ώστε καμία να μη κυριαρχεί στους υπολογισμούς αποστάσεων που χρησιμοποιούνται στη συσταδοποίηση. Αυτό διασφαλίζει ότι η ανάλυση λαμβάνει υπόψη ισότιμα όλες τις μεταβλητές.
# Υπολογισμός αποστάσεων και ιεραρχική συσταδοποίηση σε όλο το dataset
dist_matrix <- dist(scaled_data, method = "euclidean")
hc_model <- hclust(dist_matrix, method = "ward.D2")
# Σχεδίαση δενδρογράμματος
plot(hc_model, labels = FALSE, main = "Ιεραρχική Συσταδοποίηση")Το δενδρόγραμμα εμφανίζει 4 διακριτές ομάδες που σχηματίζονται σε σχετικά υψηλό ύψος συγχώνευσης. Η ύπαρξη τέτοιων σαφών κλαδιών δικαιολογεί την επιλογή του αριθμού 4 για τη διαίρεση του συνόλου. Κάθε ομάδα αντιπροσωπεύει υποσύνολα πελατών με παρόμοια χαρακτηριστικά ως προς το υπόλοιπο και τον εκτιμώμενο μισθό. Το χωρίζουμε λοιπόν στα 4.
## clusters_hc
## 1 2 3 4
## 2062 3110 3268 1560
Η διάσπαση του συνόλου δεδομένων σε τέσσερις συστάδες μέσω της ιεραρχικής συσταδοποίησης αποκαλύπτει μια σχετικά ισορροπημένη κατανομή παρατηρήσεων στις ομάδες. Οι συστάδες 2 και 3 περιέχουν το μεγαλύτερο ποσοστό των παρατηρήσεων, γεγονός που υποδηλώνει την ύπαρξη δύο βασικών προφίλ πελατών με παρόμοια οικονομικά χαρακτηριστικά. Αντίθετα, η συστάδα 4 είναι η μικρότερη, και πιθανώς συγκεντρώνει πιο ακραίες ή εξειδικευμένες περιπτώσεις, π.χ. πελάτες με πολύ υψηλό υπόλοιπο ή μισθό.
Επιλέγουμε k=4, καθώς από την ιεραρχική συσταδοποίηση φάνηκε να γίνεται ένας καλός διαχωρισμός.
# Εκπαίδευση K-means με 4 συστάδες
set.seed(123)
kmeans_model_4 <- kmeans(scaled_data, centers = 4, nstart = 25)
# Προσθήκη cluster labels
cluster_data$cluster4 <- factor(kmeans_model_4$cluster)
# Μέγεθος συστάδων
table(cluster_data$cluster4)##
## 1 2 3 4
## 3066 3131 1913 1890
ggplot(cluster_data, aes(x = Balance, y = EstimatedSalary, color = cluster4)) +
geom_point(alpha = 0.6) +
labs(title = "K-Means με 4 Συστάδες",
x = "Balance", y = "Estimated Salary",
color = "Συστάδα") +
theme_minimal()Η απεικόνιση της συσταδοποίησης με τη μέθοδο K-Means για k = 4 δείχνει καθαρό διαχωρισμό του πληθυσμού σε τέσσερις ομάδες με βάση τις μεταβλητές Balance και Estimated Salary. Οι συστάδες 1 και 2 καταλαμβάνουν το μεγαλύτερο ποσοστό και διαφοροποιούνται κυρίως ως προς το επίπεδο του εισοδήματος. Οι συστάδες 3 και 4 φαίνεται να αποτελούνται κυρίως από πελάτες με μηδενικό ή πολύ χαμηλό υπόλοιπο αλλά διαφορετικά επίπεδα μισθού, κάτι που ενδέχεται να σχετίζεται με διαφορετική οικονομική συμπεριφορά, όπως πελάτες που διατηρούν μηδενικά υπόλοιπα ανεξαρτήτως εισοδήματος. Ο διαχωρισμός αυτός παρέχει σημαντική ερμηνευτική αξία για τμηματοποίηση πελατών και ανάπτυξη στοχευμένων στρατηγικών marketing ή αξιολόγησης ρίσκου.
Ας βεβαιωθούμε πως ο διαχωρισμός σε 4 συστάδες είναι ο βέλτιστος.
# Elbow Method για εύρεση βέλτιστου αριθμού συστάδων
set.seed(123)
# Υπολογισμός WCSS (Within Cluster Sum of Squares) για 1 έως 10 συστάδες
wcss <- numeric(10)
for (k in 1:10) {
kmeans_model <- kmeans(scaled_data, centers = k, nstart = 20)
wcss[k] <- kmeans_model$tot.withinss
}
# Διάγραμμα Elbow
plot(1:10, wcss, type = "b", pch = 19, col = "steelblue",
xlab = "Αριθμός Συστάδων (k)",
ylab = "WCSS (Συνολικό Σφάλμα Εντός Συστάδων)",
main = "Elbow Method για Επιλογή k")Η μέθοδος Elbow μάς βοηθά να προσδιορίσουμε τον ιδανικό αριθμό συστάδων παρακολουθώντας πώς μειώνεται το συνολικό σφάλμα εντός συστάδων (WCSS) καθώς αυξάνουμε το k. Παρατηρούμε ότι μέχρι και το k = 4 η μείωση του σφάλματος είναι έντονη, ενώ μετά από αυτό το σημείο η καμπύλη επιπεδώνεται, δηλαδή, η βελτίωση που προσφέρουν επιπλέον συστάδες γίνεται οριακή. Αυτό το φαινόμενο υποδηλώνει ότι το k = 4 είναι ένα καλό trade-off μεταξύ απλότητας μοντέλου και ποιότητας συσταδοποίησης.