Το dataset προέρχεται από το Kaggle και αφορά πελάτες τραπεζών. Περιλαμβάνει 10000 εγγραφές/πελάτες τράπεζας το οποίο αποτελείται από 12 ανεξάρτητες μεταβλητές (χαρακτηριστικά πελατών) και 1 εξαρτημένη μεταβλητή, που δείχνει αν ένας πελάτης αποχωρεί (churn) ή παραμένει.
Περιλαμβάνει δημογραφικά, οικονομικά και τραπεζικά δεδομένα, όπως η ηλικία, το φύλο, το υπόλοιπο του λογαριασμού και ο αριθμός των προϊόντων του. Σκοπός είναι να αναλυθούν οι παράγοντες που επηρεάζουν την αποχώρηση των πελατών, κάτι που είναι ζωτικής σημασίας για τον χρηματοοικονομικό τομέα.
Παρακάτω περιγράφονται οι μεταβλητές του dataset, μαζί με τους τύπους τους:
#Εισαγωγή 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
Σε αυτό το στάδιο επιλέγονται όλες οι αριθμητικές μεταβλητές του
dataset, προκειμένου να υπολογιστεί ο συντελεστής συσχέτισης Pearson
μεταξύ της μεταβλητής στόχου EstimatedSalary και κάθε
ανεξάρτητης μεταβλητής. Ο στόχος είναι να εντοπιστούν οι μεταβλητές που
παρουσιάζουν τη μεγαλύτερη γραμμική συσχέτιση με τον εκτιμώμενο μισθό,
ώστε να χρησιμοποιηθούν στη δημιουργία κατάλληλων μοντέλων
παλινδρόμησης.
Τα αποτελέσματα δείχνουν ότι η EstimatedSalary εμφανίζει
πολύ χαμηλή συσχέτιση με τις περισσότερες μεταβλητές του συνόλου
δεδομένων, γεγονός που υποδηλώνει την απουσία ισχυρών γραμμικών σχέσεων.
Παρ’ όλα αυτά, μεταβλητές όπως το NumOfProducts και το
Balance παρουσιάζουν σχετικά υψηλότερες, αν και ασθενείς,
συσχετίσεις, και συνεπώς επιλέγονται για να χρησιμοποιηθούν στα επόμενα
μοντέλα γραμμικής παλινδρόμησης.
## ---- Ανάλυση Γραμμικής Παλινδρόμησης για EstimatedSalary ----
## Σκοπός: Να εξεταστεί αν το EstimatedSalary μπορεί να προβλεφθεί από άλλες μεταβλητές.
## ---- Correlation with EstimatedSalary (excluding CustomerId) ----
# Επιλογή μόνο αριθμητικών και έγκυρων μεταβλητών για ανάλυση
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
numeric_vars_clean <- Churn_Modeling %>%
select(CreditScore, Age, Tenure, Balance, NumOfProducts, HasCrCard,
IsActiveMember, Exited, EstimatedSalary)
# Υπολογισμός συσχέτισης
cor_matrix <- cor(numeric_vars_clean, use = "complete.obs")
# Συσχέτιση των μεταβλητών με τον EstimatedSalary
cor_salary <- cor_matrix[, "EstimatedSalary"] %>%
sort(decreasing = TRUE)
# Εμφάνιση συσχετίσεων (εκτός του ίδιου του EstimatedSalary)
cor_salary[-1]## NumOfProducts Balance Exited Tenure CreditScore
## 0.014163288 0.012920171 0.012032105 0.007680142 -0.001359972
## Age HasCrCard IsActiveMember
## -0.007212858 -0.009947528 -0.011297582
## ---- Γραμμικό Μοντέλο με NumOfProducts ----
# Δημιουργία μοντέλου με την πιο σχετική μεταβλητή (NumOfProducts)
model_salary_numprod <- lm(EstimatedSalary ~ NumOfProducts, data = Churn_Modeling)
# Αξιολόγηση
summary(model_salary_numprod)##
## Call:
## lm(formula = EstimatedSalary ~ NumOfProducts, data = Churn_Modeling)
##
## Residuals:
## Min 1Q Median 3Q Max
## -100660 -49047 17 49079 100625
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 97941.2 1618.6 60.51 <2e-16 ***
## NumOfProducts 1404.4 988.7 1.42 0.156
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57510 on 9998 degrees of freedom
## Multiple R-squared: 0.0002018, Adjusted R-squared: 0.0001018
## F-statistic: 2.018 on 1 and 9998 DF, p-value: 0.1555
Για την πρόβλεψη της μεταβλητής EstimatedSalary,
εφαρμόστηκε η μεθοδολογία της γραμμικής παλινδρόμησης. Αρχικά,
πραγματοποιήθηκε ανάλυση συσχέτισης μεταξύ όλων των αριθμητικών
μεταβλητών του dataset και της εξαρτημένης μεταβλητής
EstimatedSalary, με στόχο την επιλογή των σημαντικότερων
προβλεπτικών παραγόντων. Από τη συσχέτιση, διαπιστώθηκε ότι η μεταβλητή
NumOfProducts είχε τη σχετικά υψηλότερη (αν και ασθενή)
γραμμική συσχέτιση με τον εκτιμώμενο μισθό.
Βάσει αυτής της συσχέτισης, δημιουργήθηκε ένα απλό γραμμικό μοντέλο
με τη μορφή EstimatedSalary ~ NumOfProducts, προκειμένου να
διερευνηθεί η προβλεπτική ικανότητα του πλήθους των προϊόντων για το
εισόδημα του πελάτη. Το μοντέλο αξιολογήθηκε χρησιμοποιώντας τον
συντελεστή προσδιορισμού (R²) και το μέσο τετραγωνικό
σφάλμα (RMSE). Το R² μετρά την ικανότητα του μοντέλου
να εξηγεί τη διακύμανση της εξαρτημένης μεταβλητής, ενώ το RMSE εκφράζει
το μέσο σφάλμα των προβλέψεων.
Η διαδικασία αυτή αποτελεί το πρώτο βήμα της μεθοδολογίας που
ακολουθείται, με σκοπό να προσδιοριστεί αν απαιτείται η ενίσχυση του
μοντέλου με επιπλέον μεταβλητές ή αν η προβλεπτική δύναμη της
NumOfProducts είναι επαρκής.
# Υπολογισμός προβλέψεων και μετρικών
pred_salary_np <- predict(model_salary_numprod)
rmse_np <- sqrt(mean((Churn_Modeling$EstimatedSalary - pred_salary_np)^2))
r2_np <- summary(model_salary_numprod)$r.squared
cat("📈 RMSE:", rmse_np, "\n")## 📈 RMSE: 57501.82
## 📊 R²: 0.0002017592
Τα αποτελέσματα του αρχικού μοντέλου
EstimatedSalary ~ NumOfProducts δείχνουν ότι η προβλεπτική
του ικανότητα είναι εξαιρετικά περιορισμένη. Ο συντελεστής προσδιορισμού
R² = 0.0002 υποδηλώνει ότι το μοντέλο εξηγεί μόλις το
0.02% της διακύμανσης του εκτιμώμενου μισθού, ενώ η τιμή του
RMSE ≈ 57,502 δείχνει μεγάλο μέσο σφάλμα πρόβλεψης σε
απόλυτες μονάδες. Αυτό επιβεβαιώνει ότι η μεταβλητή
NumOfProducts, από μόνη της, δεν επαρκεί για την ακριβή
πρόβλεψη του EstimatedSalary και απαιτείται η ενίσχυση του
μοντέλου με επιπλέον σχετικές μεταβλητές.
Στο δεύτερο μοντέλο γραμμικής παλινδρόμησης χρησιμοποιήθηκαν δύο
ανεξάρτητες μεταβλητές: NumOfProducts και
Balance, με στόχο τη βελτίωση της ακρίβειας πρόβλεψης του
EstimatedSalary. Η επιλογή της μεταβλητής
Balance βασίστηκε στη σχετική συσχέτισή της με τον
εκτιμώμενο μισθό, όπως προέκυψε από την ανάλυση Pearson. Η προσθήκη
αυτής της μεταβλητής επιτρέπει στο μοντέλο να ενσωματώσει
χρηματοοικονομικές πληροφορίες που δεν καλύπτονται από το πλήθος των
προϊόντων, αυξάνοντας δυνητικά την ερμηνευτική του ικανότητα. Το μοντέλο
αξιολογήθηκε ξανά με τα ίδια κριτήρια (R² και RMSE) για να διαπιστωθεί
αν παρατηρείται ουσιαστική βελτίωση ως προς την προβλεπτική του
απόδοση.
## ---- Νέο Μοντέλο: EstimatedSalary ~ NumOfProducts + Balance ----
# Δημιουργία δεύτερου μοντέλου με προσθήκη της μεταβλητής Balance
model_salary_2 <- lm(EstimatedSalary ~ NumOfProducts + Balance, data = Churn_Modeling)
# Αξιολόγηση
summary(model_salary_2)##
## Call:
## lm(formula = EstimatedSalary ~ NumOfProducts + Balance, data = Churn_Modeling)
##
## Residuals:
## Min 1Q Median 3Q Max
## -102208 -49123 -11 49063 101576
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.574e+04 2.029e+03 47.198 <2e-16 ***
## NumOfProducts 1.972e+03 1.038e+03 1.900 0.0575 .
## Balance 1.739e-02 9.674e-03 1.797 0.0723 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57500 on 9997 degrees of freedom
## Multiple R-squared: 0.0005247, Adjusted R-squared: 0.0003247
## F-statistic: 2.624 on 2 and 9997 DF, p-value: 0.07257
# Προβλέψεις και μετρικά
pred_salary_2 <- predict(model_salary_2)
rmse_2 <- sqrt(mean((Churn_Modeling$EstimatedSalary - pred_salary_2)^2))
r2_2 <- summary(model_salary_2)$r.squared
cat("📈 RMSE Model 2:", rmse_2, "\n")## 📈 RMSE Model 2: 57492.53
## 📊 R² Model 2: 0.0005246665
Η προσθήκη της μεταβλητής Balance στο δεύτερο μοντέλο
οδήγησε σε ελαφρώς βελτιωμένα αποτελέσματα σε σχέση με το αρχικό
μοντέλο. Η τιμή του R² αυξήθηκε σε 0.00052,
υποδεικνύοντας ότι πλέον εξηγείται περίπου το 0.05% της διακύμανσης του
EstimatedSalary – μια μικρή αλλά υπαρκτή βελτίωση.
Αντίστοιχα, η τιμή του RMSE μειώθηκε οριακά σε 57,492,
γεγονός που σημαίνει ότι το μοντέλο εξακολουθεί να έχει υψηλό μέσο
σφάλμα πρόβλεψης. Παρά τη μικρή πρόοδο, τα αποτελέσματα παραμένουν
αδύναμα, κάτι που υποδεικνύει την ανάγκη ενίσχυσης του μοντέλου με
επιπλέον χαρακτηριστικά που ενδέχεται να σχετίζονται με τον μισθό.
Στο τρίτο μοντέλο γραμμικής παλινδρόμησης προστέθηκε η μεταβλητή
Age, η οποία αν και είχε αρνητική συσχέτιση με τον
EstimatedSalary, κρίθηκε κατάλληλη για διερεύνηση λόγω της
θεματικής της συνάφειας. Ο στόχος ήταν να εμπλουτιστεί το μοντέλο με
δημογραφική πληροφορία, ώστε να εξεταστεί κατά πόσο η ηλικία μπορεί να
ενισχύσει τη συνολική προβλεπτική ικανότητα σε συνδυασμό με τις
οικονομικές μεταβλητές Balance και
NumOfProducts. Το νέο μοντέλο αξιολογήθηκε, όπως και τα
προηγούμενα, με βάση το R² και το RMSE.
## ---- Τρίτο Μοντέλο: EstimatedSalary ~ NumOfProducts + Balance + Age ----
# Δημιουργία τρίτου μοντέλου με προσθήκη της μεταβλητής Age
model_salary_3 <- lm(EstimatedSalary ~ NumOfProducts + Balance + Age, data = Churn_Modeling)
# Αξιολόγηση
summary(model_salary_3)##
## Call:
## lm(formula = EstimatedSalary ~ NumOfProducts + Balance + Age,
## data = Churn_Modeling)
##
## Residuals:
## Min 1Q Median 3Q Max
## -102100 -49084 -42 49135 101995
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.730e+04 2.962e+03 32.850 <2e-16 ***
## NumOfProducts 1.951e+03 1.038e+03 1.879 0.0602 .
## Balance 1.756e-02 9.677e-03 1.814 0.0696 .
## Age -3.938e+01 5.487e+01 -0.718 0.4730
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57500 on 9995 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.0005761, Adjusted R-squared: 0.0002762
## F-statistic: 1.921 on 3 and 9995 DF, p-value: 0.1239
# Υπολογισμός RMSE & R²
pred_salary_3 <- predict(model_salary_3)
rmse_3 <- sqrt(mean((Churn_Modeling$EstimatedSalary - pred_salary_3)^2))## Warning in Churn_Modeling$EstimatedSalary - pred_salary_3: longer object length
## is not a multiple of shorter object length
## 📈 RMSE Model 3: 57516.45
## 📊 R² Model 3: 0.0005761297
Η προσθήκη της μεταβλητής Age στο μοντέλο οδήγησε σε
ελαφρώς υψηλότερο R² (0.000576) σε σύγκριση με το
δεύτερο μοντέλο, υποδηλώνοντας ότι εξηγείται ένα οριακά μεγαλύτερο
ποσοστό της διακύμανσης του EstimatedSalary. Ωστόσο, η τιμή
του RMSE αυξήθηκε σε 57,516, γεγονός που υποδεικνύει
επιδείνωση της ακρίβειας των προβλέψεων. Αυτό δείχνει ότι η μεταβλητή
Age ενδέχεται να εισήγαγε θόρυβο αντί για χρήσιμη
πληροφορία. Το μοντέλο δεν παρουσιάζει ουσιαστική βελτίωση και επομένως
απαιτείται προσοχή στην επιλογή των επόμενων μεταβλητών.
Στο τέταρτο μοντέλο γραμμικής παλινδρόμησης προστέθηκε η μεταβλητή
Tenure, η οποία αντιπροσωπεύει τον αριθμό ετών που ένας
πελάτης παραμένει στην τράπεζα. Στόχος της προσθήκης αυτής ήταν να
ενσωματωθεί πληροφορία που σχετίζεται με τη διάρκεια της πελατειακής
σχέσης, προκειμένου να ενισχυθεί η ερμηνευτική ικανότητα του μοντέλου.
Το νέο μοντέλο περιλαμβάνει πλέον τέσσερις μεταβλητές:
NumOfProducts, Balance, Age και
Tenure.
## ---- Τέταρτο Μοντέλο: EstimatedSalary ~ NumOfProducts + Balance + Age + Tenure ----
# Προσθήκη της μεταβλητής Tenure (χρόνια ως πελάτης)
model_salary_4 <- lm(EstimatedSalary ~ NumOfProducts + Balance + Age + Tenure, data = Churn_Modeling)
# Αξιολόγηση του νέου μοντέλου
summary(model_salary_4)##
## Call:
## lm(formula = EstimatedSalary ~ NumOfProducts + Balance + Age +
## Tenure, data = Churn_Modeling)
##
## Residuals:
## Min 1Q Median 3Q Max
## -102558 -49081 -290 49135 101529
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.653e+04 3.129e+03 30.853 <2e-16 ***
## NumOfProducts 1.943e+03 1.038e+03 1.872 0.0613 .
## Balance 1.762e-02 9.677e-03 1.821 0.0687 .
## Age -3.898e+01 5.488e+01 -0.710 0.4775
## Tenure 1.517e+02 1.989e+02 0.763 0.4455
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57510 on 9994 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.0006343, Adjusted R-squared: 0.0002344
## F-statistic: 1.586 on 4 and 9994 DF, p-value: 0.175
# Προβλέψεις και μέτρα απόδοσης
pred_salary_4 <- predict(model_salary_4)
rmse_4 <- sqrt(mean((Churn_Modeling$EstimatedSalary - pred_salary_4)^2))## Warning in Churn_Modeling$EstimatedSalary - pred_salary_4: longer object length
## is not a multiple of shorter object length
## 📈 RMSE Model 4: 57526.86
## 📊 R² Model 4: 0.0006343432
Το τέταρτο μοντέλο παρουσιάζει ελάχιστη βελτίωση στον
συντελεστή R², ο οποίος ανέρχεται πλέον σε
0.00063, δείχνοντας ότι το μοντέλο εξηγεί ένα ελάχιστα
μεγαλύτερο ποσοστό της διακύμανσης του EstimatedSalary.
Παράλληλα, η τιμή του RMSE αυξήθηκε περαιτέρω στα
57,527, υποδεικνύοντας ότι η ακρίβεια των προβλέψεων
χειροτέρεψε σε σχέση με τα προηγούμενα μοντέλα. Η μεταβλητή
Tenure, αν και εννοιολογικά σχετική, φαίνεται να μην
προσφέρει ουσιαστική προβλεπτική δύναμη και πιθανώς ενισχύει το πρόβλημα
υπερπροσαρμογής (overfitting).
Το πέμπτο μοντέλο γραμμικής παλινδρόμησης επεκτάθηκε με την προσθήκη
της μεταβλητής CreditScore, η οποία σχετίζεται με την
πιστοληπτική ικανότητα του πελάτη. Σκοπός της προσθήκης ήταν να
εξεταστεί εάν η χρηματοοικονομική φερεγγυότητα επηρεάζει την εκτιμώμενη
τιμή του μισθού. Το μοντέλο πλέον περιλαμβάνει πέντε μεταβλητές:
NumOfProducts, Balance, Age,
Tenure και CreditScore.
## ---- Πέμπτο Μοντέλο: EstimatedSalary ~ NumOfProducts + Balance + Age + Tenure + CreditScore ----
# Προσθήκη της μεταβλητής CreditScore
model_salary_5 <- lm(EstimatedSalary ~ NumOfProducts + Balance + Age + Tenure + CreditScore, data = Churn_Modeling)
# Αξιολόγηση μοντέλου
summary(model_salary_5)##
## Call:
## lm(formula = EstimatedSalary ~ NumOfProducts + Balance + Age +
## Tenure + CreditScore, data = Churn_Modeling)
##
## Residuals:
## Min 1Q Median 3Q Max
## -102501 -49082 -306 49047 101613
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.721e+04 4.959e+03 19.602 <2e-16 ***
## NumOfProducts 1.946e+03 1.038e+03 1.874 0.0610 .
## Balance 1.764e-02 9.678e-03 1.822 0.0684 .
## Age -3.902e+01 5.488e+01 -0.711 0.4771
## Tenure 1.518e+02 1.989e+02 0.763 0.4454
## CreditScore -1.049e+00 5.951e+00 -0.176 0.8601
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 57510 on 9993 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.0006374, Adjusted R-squared: 0.0001374
## F-statistic: 1.275 on 5 and 9993 DF, p-value: 0.2716
# Υπολογισμός προβλέψεων και δεικτών
pred_salary_5 <- predict(model_salary_5)
rmse_5 <- sqrt(mean((Churn_Modeling$EstimatedSalary - pred_salary_5)^2))## Warning in Churn_Modeling$EstimatedSalary - pred_salary_5: longer object length
## is not a multiple of shorter object length
## 📈 RMSE Model 5: 57526.09
## 📊 R² Model 5: 0.0006374493
Η προσθήκη της μεταβλητής CreditScore δεν
οδήγησε σε ουσιαστική βελτίωση της απόδοσης του μοντέλου. Ο
συντελεστής προσδιορισμού R² παρέμεινε σχεδόν στάσιμος
στο 0.00064, ενώ και το RMSE διατηρήθηκε
ουσιαστικά αμετάβλητο στα 57,526. Αυτό
καταδεικνύει ότι η νέα μεταβλητή δεν συνέβαλε ουσιαστικά στην εξήγηση
της διακύμανσης του EstimatedSalary, ενισχύοντας την
παρατήρηση ότι τα διαθέσιμα χαρακτηριστικά του dataset δεν έχουν ισχυρή
γραμμική σχέση με τον εκτιμώμενο μισθό. Το μοντέλο εμφανίζει στασιμότητα
στην απόδοση, γεγονός που αποτελεί ένδειξη ότι περαιτέρω προσθήκες
μεταβλητών δεν αναμένεται να βελτιώσουν ουσιαστικά τα αποτελέσματα.