Το Bank Marketing Dataset περιέχει δεδομένα από τηλεφωνικές καμπάνιες άμεσου μάρκετινγκ πορτογαλικής τράπεζας, με στόχο την πρόβλεψη αν ένας πελάτης θα εγγραφεί σε μια κατάθεση προθεσμίας (term deposit).
📌 Γενικά χαρακτηριστικά
Περιλαμβάνει 45.211 εγγραφές και 17 μεταβλητές.
Οι μεταβλητές καλύπτουν δημογραφικά στοιχεία (π.χ. ηλικία, επάγγελμα, μορφωτικό επίπεδο, οικογενειακή κατάσταση), οικονομικές πληροφορίες (π.χ. υπόλοιπο λογαριασμού), συνθήκες δανεισμού (στεγαστικά/καταναλωτικά δάνεια), καθώς και πληροφορίες σχετικά με την καμπάνια μάρκετινγκ (π.χ. αριθμός επαφών, μέσο επικοινωνίας, ημέρα/μήνας επαφής).
Η μεταβλητή στόχος είναι αν ο πελάτης είπε “ναι” ή “όχι” σε μια προσφορά τραπεζικής κατάθεσης (binary classification).
📌 Τι μπορούμε να μελετήσουμε με αυτό το dataset
Πώς διάφοροι κοινωνικοοικονομικοί παράγοντες επηρεάζουν την απόφαση του πελάτη.
Ποια χαρακτηριστικά έχουν μεγαλύτερη προγνωστική αξία στην αποδοχή ή απόρριψη μιας τραπεζικής προσφοράς.
Την αποτελεσματικότητα διαφορετικών αλγορίθμων μηχανικής μάθησης (όπως δέντρα απόφασης, random forests, logistic regression) στην πρόβλεψη της απόκρισης των πελατών.
Τον καθορισμό στόχων για μελλοντικές καμπάνιες μάρκετινγκ, εντοπίζοντας δημογραφικά ή συμπεριφορικά μοτίβα υψηλής απόκρισης.
Στο σημείο αυτό υπάρχει μια γενική εικόνα των δεδομένων μας, όπως τα ονόματα των στηλών/μεταβλητών του dataset ενώ στην συνέχεια ακολουθεί η περιγραφή τους.
data <- read.csv("bank-full.csv", sep = ";", header = TRUE)
# Γενική εικόνα των δεδομένων
dim(data)
## [1] 45211 17
colnames(data)
## [1] "age" "job" "marital" "education" "default" "balance"
## [7] "housing" "loan" "contact" "day" "month" "duration"
## [13] "campaign" "pdays" "previous" "poutcome" "y"
df <- na.omit(data)
library(knitr)
df_bank <- data.frame(
Variable = c(
"age",
"job",
"marital",
"education",
"default",
"balance",
"housing",
"loan",
"contact",
"day",
"month",
"duration",
"campaign",
"pdays",
"previous",
"poutcome",
"y"
),
Description = c(
"Ηλικία πελάτη (σε έτη)",
"Επάγγελμα",
"Οικογενειακή κατάσταση",
"Μορφωτικό επίπεδο",
"Αθετημένο δάνειο (yes/no)",
"Μέσος μηνιαίος τραπεζικός λογαριασμός (σε €)",
"Στεγαστικό δάνειο (yes/no)",
"Καταναλωτικό δάνειο (yes/no)",
"Τύπος επικοινωνίας (π.χ. cellular, telephone)",
"Ημέρα τελευταίας επαφής",
"Μήνας τελευταίας επαφής",
"Διάρκεια τελευταίας επικοινωνίας (δευτ.)",
"Αριθμός επαφών κατά την καμπάνια",
"Ημέρες από προηγούμενη επαφή (999 = καμία)",
"Πλήθος προηγούμενων επαφών",
"Αποτέλεσμα προηγούμενης καμπάνιας",
"Απάντηση στην καμπάνια (yes/no)"
)
)
library(knitr)
kable(df_bank, caption = "Περιγραφή Μεταβλητών του Dataset: Bank Marketing")
| Variable | Description |
|---|---|
| age | Ηλικία πελάτη (σε έτη) |
| job | Επάγγελμα |
| marital | Οικογενειακή κατάσταση |
| education | Μορφωτικό επίπεδο |
| default | Αθετημένο δάνειο (yes/no) |
| balance | Μέσος μηνιαίος τραπεζικός λογαριασμός (σε €) |
| housing | Στεγαστικό δάνειο (yes/no) |
| loan | Καταναλωτικό δάνειο (yes/no) |
| contact | Τύπος επικοινωνίας (π.χ. cellular, telephone) |
| day | Ημέρα τελευταίας επαφής |
| month | Μήνας τελευταίας επαφής |
| duration | Διάρκεια τελευταίας επικοινωνίας (δευτ.) |
| campaign | Αριθμός επαφών κατά την καμπάνια |
| pdays | Ημέρες από προηγούμενη επαφή (999 = καμία) |
| previous | Πλήθος προηγούμενων επαφών |
| poutcome | Αποτέλεσμα προηγούμενης καμπάνιας |
| y | Απάντηση στην καμπάνια (yes/no) |
Πριν την πραγματοποίση οποιασδήποτε ενέργειας στο dataset είναι σημαντικό να ελέγξουμε αν υπάρχουν ελλιπείς τιμές, οι οποίες θα δυσκόλευαν την επεξεργασία του.
colSums(is.na(data))
## age job marital education default balance housing loan
## 0 0 0 0 0 0 0 0
## contact day month duration campaign pdays previous poutcome
## 0 0 0 0 0 0 0 0
## y
## 0
Παρατηρούμε ότι δεν υπάρχουν ελλιπείς τιμές στο dataset μας.
Παρακάτω παρουσιάζονται κάποια στατιστικά στοιχεία για κάθε μεταβλητή/στήλη του δείγματος μας, μερικά εξ’ αυτών η ελάχιστη τιμή, η μέγιστη τιμή και η μέση τιμή.
summary(data)
## age job marital education
## Min. :18.00 Length:45211 Length:45211 Length:45211
## 1st Qu.:33.00 Class :character Class :character Class :character
## Median :39.00 Mode :character Mode :character Mode :character
## Mean :40.94
## 3rd Qu.:48.00
## Max. :95.00
## default balance housing loan
## Length:45211 Min. : -8019 Length:45211 Length:45211
## Class :character 1st Qu.: 72 Class :character Class :character
## Mode :character Median : 448 Mode :character Mode :character
## Mean : 1362
## 3rd Qu.: 1428
## Max. :102127
## contact day month duration
## Length:45211 Min. : 1.00 Length:45211 Min. : 0.0
## Class :character 1st Qu.: 8.00 Class :character 1st Qu.: 103.0
## Mode :character Median :16.00 Mode :character Median : 180.0
## Mean :15.81 Mean : 258.2
## 3rd Qu.:21.00 3rd Qu.: 319.0
## Max. :31.00 Max. :4918.0
## campaign pdays previous poutcome
## Min. : 1.000 Min. : -1.0 Min. : 0.0000 Length:45211
## 1st Qu.: 1.000 1st Qu.: -1.0 1st Qu.: 0.0000 Class :character
## Median : 2.000 Median : -1.0 Median : 0.0000 Mode :character
## Mean : 2.764 Mean : 40.2 Mean : 0.5803
## 3rd Qu.: 3.000 3rd Qu.: -1.0 3rd Qu.: 0.0000
## Max. :63.000 Max. :871.0 Max. :275.0000
## y
## Length:45211
## Class :character
## Mode :character
##
##
##
ggplot(data, aes(x = job)) +
geom_bar(fill = "steelblue") +
theme_minimal() +
labs(title = "Κατανομή Επαγγελμάτων",
x = "Επάγγελμα", y = "Συχνότητα") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Σχολιασμός: Παρατηρούμε πως τα πιο συχνά επαγγέλματα είναι blue-collar, management και technician. Υπάρχουν επίσης σημαντικές κατηγορίες όπως admin, ενώ επαγγέλματα όπως student, unemployed και housemaid εμφανίζονται πιο σπάνια. Επομένως, αντιλαμβανόμαστε πως το δείγμα μας αποτελείται κυρίως από εργαζόμενους μεσαίας τάξης και λιγότερο από ομάδες εκτός αγοράς εργασίας.
ggplot(data, aes(x = age)) +
geom_histogram(bins = 20, fill = "orange", color = "black") +
theme_minimal() +
labs(title = "Κατανομή Ηλικιών",
x = "Ηλικία", y = "Συχνότητα")
Σχολιασμός: Ιδιαίτερη συγκέντρωση εμφανίζεται στις ηλικίες 30–40 ετών και μια φθίνουσα πορεία μετά τα 50. Υπάρχουν και αρκετές παρατηρήσεις πάνω από 60, αλλά σπανιότερες, γεγονός που δηλώνει πως οι περισσότερες καμπάνιες στοχεύουν σε πελάτες οικονομικά ενεργούς, με μικρότερο ποσοστό συνταξιούχων.
ggplot(data, aes(x = y)) +
geom_bar(fill = "darkgreen") +
theme_minimal() +
labs(title = "Απάντηση στην Καμπάνια",
x = "Απάντηση", y = "Συχνότητα")
Σχολιασμός: Όπως φαίνεται, η πλειονότητα των πελατών απαντά αρνητικά (“no”), γεγονός που υποδηλώνει τη χαμηλή αποτελεσματικότητα της καμπάνιας στην προσέλκυση θετικών αποκρίσεων.
Το training set είναι το 65% της βάσης και το υπόλοιπο 35% είναι για το testing set.
Πριν διαχωρίσω το dataset ορίζω το ίδιο seed για να εξασφαλιστεί ότι όλα τα sets θα είναι ίδια.
library(caTools)
## Warning: package 'caTools' was built under R version 4.4.3
set.seed(060)
Και στην συνέχεια δημιουργώ τα δύο καινούργια datasets.
# Μετατροπή της μεταβλητής στόχου σε δυαδική (0/1)
data$y <- ifelse(data$y == "yes", 1, 0)
split <- sample.split(data$y,SplitRatio=0.65)
Ονομάζω τα sets ως train και test.
Train = subset(data, split==TRUE) #Το σύνολο δοκιμής πριν την εφαρμογή της τεχνικής SMOTE
Test = subset(data, split==FALSE)
Και καταγράφω το πόσες είναι οι καταχωρήσεις σε κάθε set.
nrow(Train)
## [1] 29387
nrow(Test)
## [1] 15824
Παρακάτω δημιουργώ το Μοντέλο Λογιστικής Παλινδρόμησης στο train set στο οποίο περιλαμβάνονται όλες οι ανεξάρτητες μεταβλητές.
DataLog <- glm(y ~ ., data=Train , family = binomial)
summary(DataLog)
##
## Call:
## glm(formula = y ~ ., family = binomial, data = Train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.606e+00 2.289e-01 -11.386 < 2e-16 ***
## age -8.705e-04 2.749e-03 -0.317 0.75151
## jobblue-collar -3.738e-01 9.046e-02 -4.132 3.59e-05 ***
## jobentrepreneur -3.348e-01 1.541e-01 -2.173 0.02981 *
## jobhousemaid -5.113e-01 1.687e-01 -3.030 0.00244 **
## jobmanagement -2.668e-01 9.128e-02 -2.923 0.00346 **
## jobretired 2.696e-01 1.201e-01 2.244 0.02483 *
## jobself-employed -3.954e-01 1.385e-01 -2.855 0.00430 **
## jobservices -3.392e-01 1.070e-01 -3.170 0.00153 **
## jobstudent 2.647e-01 1.338e-01 1.979 0.04782 *
## jobtechnician -1.769e-01 8.524e-02 -2.075 0.03801 *
## jobunemployed -1.237e-01 1.367e-01 -0.905 0.36551
## jobunknown -6.734e-01 3.157e-01 -2.133 0.03293 *
## maritalmarried -1.848e-01 7.327e-02 -2.523 0.01164 *
## maritalsingle 1.006e-01 8.394e-02 1.198 0.23093
## educationsecondary 1.911e-01 8.039e-02 2.377 0.01746 *
## educationtertiary 4.318e-01 9.342e-02 4.623 3.79e-06 ***
## educationunknown 2.972e-01 1.282e-01 2.318 0.02044 *
## defaultyes -6.907e-02 2.067e-01 -0.334 0.73824
## balance 2.037e-05 6.984e-06 2.917 0.00353 **
## housingyes -6.694e-01 5.467e-02 -12.245 < 2e-16 ***
## loanyes -4.684e-01 7.505e-02 -6.241 4.36e-10 ***
## contacttelephone -2.263e-01 9.455e-02 -2.393 0.01670 *
## contactunknown -1.584e+00 9.029e-02 -17.539 < 2e-16 ***
## day 1.218e-02 3.090e-03 3.942 8.07e-05 ***
## monthaug -7.082e-01 9.745e-02 -7.268 3.66e-13 ***
## monthdec 9.092e-01 2.165e-01 4.199 2.68e-05 ***
## monthfeb -2.046e-01 1.129e-01 -1.812 0.06999 .
## monthjan -1.336e+00 1.556e-01 -8.583 < 2e-16 ***
## monthjul -8.261e-01 9.594e-02 -8.611 < 2e-16 ***
## monthjun 4.576e-01 1.169e-01 3.914 9.07e-05 ***
## monthmar 1.533e+00 1.497e-01 10.239 < 2e-16 ***
## monthmay -3.780e-01 8.954e-02 -4.221 2.43e-05 ***
## monthnov -8.399e-01 1.042e-01 -8.058 7.75e-16 ***
## monthoct 8.673e-01 1.361e-01 6.372 1.86e-10 ***
## monthsep 9.224e-01 1.444e-01 6.388 1.68e-10 ***
## duration 4.225e-03 8.083e-05 52.269 < 2e-16 ***
## campaign -9.607e-02 1.281e-02 -7.498 6.48e-14 ***
## pdays 3.658e-05 3.864e-04 0.095 0.92458
## previous 9.872e-03 6.827e-03 1.446 0.14816
## poutcomeother 2.857e-01 1.111e-01 2.571 0.01015 *
## poutcomesuccess 2.396e+00 1.034e-01 23.166 < 2e-16 ***
## poutcomeunknown 5.538e-03 1.168e-01 0.047 0.96220
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 21211 on 29386 degrees of freedom
## Residual deviance: 13927 on 29344 degrees of freedom
## AIC: 14013
##
## Number of Fisher Scoring iterations: 6
Οι μεταβλητές που έχουν ισχυρή στατιστική συσχέτιση με την πιθανότητα θετικής απόκρισης (y = yes) είναι οι εξής:
Ισχυρή θετική συσχέτιση: όσο μεγαλύτερη η διάρκεια της τελευταίας επικοινωνίας (σε δευτερόλεπτα), τόσο αυξάνεται η πιθανότητα να πει ο πελάτης “ναι”.
Θετική συσχέτιση: μεγαλύτερη ηλικία συνδέεται με αυξημένη πιθανότητα θετικής απόκρισης.
Ορισμένα επαγγέλματα (π.χ. retired, student) έχουν θετική και στατιστικά σημαντική συσχέτιση.
Άλλα επαγγέλματα (π.χ. blue-collar) συνδέονται με χαμηλότερη πιθανότητα θετικής απόκρισης.
Υψηλότερο μορφωτικό επίπεδο σχετίζεται με αυξημένη πιθανότητα “ναι”.
Άτομα με υφιστάμενα δάνεια (στεγαστικά ή καταναλωτικά) τείνουν να έχουν χαμηλότερη πιθανότητα θετικής απόκρισης.
Πελάτες που είχαν επιτυχημένο αποτέλεσμα σε προηγούμενη καμπάνια εμφανίζουν πολύ υψηλότερη πιθανότητα να πουν “ναι”.
Σημαντικές παρατηρήσεις
Η duration είναι ο πιο ισχυρός προγνωστικός παράγοντας, αλλά είναι διαθέσιμος μόνο μετά την επικοινωνία με τον πελάτη.
Ορισμένες κατηγορίες μεταβλητών (π.χ. default) δεν είναι στατιστικά σημαντικές (υψηλό p-value).
Πραγματοποιούνται προβλέψεις στο test set με την εντολή predict.
predictTrain <- predict(DataLog, type='response')
predictTest <- predict(DataLog, type='response', newdata = Test)
head(predictTrain)
## 2 5 6 7 9 11
## 0.010436564 0.016866940 0.008790141 0.010269852 0.006567731 0.015244735
head(predictTest)
## 1 3 4 8 10 13
## 0.014906808 0.003105513 0.005766414 0.024843157 0.007067304 0.035595020
summary(predictTest)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000731 0.0194837 0.0434007 0.1174240 0.1090741 0.9999950
Παρατηρούμε ότι όλες οι προβλεπόμενες πιθανότητες βρίσκονται εντός του διαστήματος [0, 1], όπως αναμενόταν.
predictTrain: Αυτές οι τιμές είναι οι πιθανότητες για κάθε παρατήρηση στο σετ εκπαίδευσης.
Για παράδειγμα, τιμές όπως 0.99 ή 0.99 υποδεικνύουν πολύ υψηλή πιθανότητα (99%) για θετική κλάση (π.χ. y = yes). Αντίθετα, τιμές όπως 0.0000000002 ή 0.11 δείχνουν πολύ χαμηλή πιθανότητα για τη θετική κλάση. Αυτό σημαίνει ότι το μοντέλο διαχωρίζει καλά τις περιπτώσεις στο εκπαιδευτικό σετ.
predictTest: Αυτές οι τιμές είναι οι πιθανότητες για κάθε παρατήρηση στο σετ δοκιμής.
Η παρατήρηση 1 και 3 παρουσιάζουν υψηλή πιθανότητα για θετική απόκριση.
Η παρατήρηση 7 έχει μέση τιμή (~0.0248), που δείχνει σχετική αβεβαιότητα.
Η παρατήρηση 16 έχει τιμή σχεδόν 0, υποδεικνύοντας μεγάλη βεβαιότητα για αρνητική απόκριση.
Η παρατήρηση 17 έχει επίσης χαμηλή πιθανότητα για θετική απόκριση.
Η παρατήρηση 19 έχει υψηλή πιθανότητα (~0.80), άρα είναι πιθανό να ανήκει στην θετική κατηγορία.
Αρχικά επιλέγω το κατώφλι να είναι ίσο με 0.5.
predictedClass <- ifelse(predictTest > 0.5, 1, 0)
conf_matrix <- table(Actual = Test$y, Predicted = predictedClass)
cat("\nConfusion Matrix:\n")
##
## Confusion Matrix:
print(conf_matrix)
## Predicted
## Actual 0 1
## 0 13615 358
## 1 1203 648
Αναλυτικά, στον παρακάτω πίνακα σύγχυσης ισχύει ότι:
11497 (True Negatives - TN): Το μοντέλο προέβλεψε αρνητική κλάση (FALSE) και η πραγματική τιμή ήταν επίσης αρνητική (FALSE).
753 (False Positives - FP): Το μοντέλο προέβλεψε θετική κλάση (TRUE) ενώ η πραγματική τιμή ήταν αρνητική (FALSE), δηλαδή λάθος συναγερμός.
895 (False Negatives - FN): Το μοντέλο προέβλεψε αρνητική κλάση (FALSE) ενώ η πραγματική τιμή ήταν θετική (TRUE), δηλαδή παράλειψη.
2605 (True Positives - TP): Το μοντέλο προέβλεψε θετική κλάση (TRUE) και η πραγματική τιμή ήταν επίσης θετική (TRUE).
Σχολιασμός:
Το μοντέλο φαίνεται να έχει καλή ικανότητα να διαχωρίζει τις αρνητικές περιπτώσεις (υψηλός αριθμός TN) και παράλληλα καταφέρνει να εντοπίσει μεγάλο μέρος των θετικών (2605 TP).
Ωστόσο, οι 753 False Positives και 895 False Negatives δείχνουν ότι υπάρχουν ακόμα περιθώρια βελτίωσης, ειδικά όσον αφορά την ελαχιστοποίηση των λανθασμένων προειδοποιήσεων (FP) και των παραλείψεων (FN), οι οποίες μπορεί να έχουν διαφορετικές επιπτώσεις ανάλογα με το πεδίο εφαρμογής.
##
## Performance Metrics:
## Metric Value
## 1 Model Accuracy 0.9014
## 2 Baseline Accuracy 0.8830
## 3 Sensitivity (Ευαισθησία) 0.3501
## 4 Specificity (Ειδικότητα) 0.9744
📌 Συμπεράσματα:
Το μοντέλο παρουσιάζει ακρίβεια 90.14%, σημαντικά υψηλότερη από το baseline μοντέλο (88.30%), κάτι που υποδεικνύει ότι έχει μάθει να λαμβάνει πιο ενημερωμένες και ισορροπημένες αποφάσεις σε σχέση με έναν απλό κανόνα πρόβλεψης.
Η ευαισθησία (sensitivity) του μοντέλου είναι 35.01%, δηλαδή αναγνωρίζει σωστά μόνο περίπου το 35% των πελατών που τελικά ανταποκρίνονται θετικά στην καμπάνια. Αυτό σημαίνει ότι το υπόλοιπο 64.99% των θετικών περιπτώσεων απορρίπτεται εσφαλμένα (false negatives), γεγονός που μπορεί να οδηγήσει σε απώλεια σημαντικών ευκαιριών πώλησης.
Αντίθετα, η ειδικότητα (specificity) είναι πολύ υψηλή (97.44%), γεγονός που δείχνει ότι το μοντέλο απορρίπτει με ακρίβεια τις περιπτώσεις που είναι πράγματι αρνητικές, περιορίζοντας έτσι τον πιστωτικό και εμπορικό κίνδυνο για την τράπεζα.
Συνολικά, το μοντέλο εμφανίζεται συντηρητικό, δίνοντας έμφαση στην αποφυγή λανθασμένων εγκρίσεων (false positives), σε βάρος όμως της δυνατότητας να εντοπίσει όλους τους πιθανούς πελάτες που θα μπορούσαν να ανταποκριθούν θετικά.
Στη συνέχεια, επιλέγω να θέσω το κατώφλι πρόβλεψης (threshold) ίσο με 0.6 προκειμένου να αυξήσω την αυστηρότητα στην αποδοχή αιτήσεων.
predictedClass <- ifelse(predictTest > 0.6, 1, 0)
conf_matrix <- table(Actual = Test$y, Predicted = predictedClass)
cat("\nConfusion Matrix:\n")
##
## Confusion Matrix:
print(conf_matrix)
## Predicted
## Actual 0 1
## 0 13717 256
## 1 1353 498
13717 (True Negatives - TN): Το μοντέλο προέβλεψε αρνητική απόκριση (FALSE) και η πραγματική τιμή ήταν επίσης αρνητική.
256 (False Positives - FP): Το μοντέλο προέβλεψε θετική απόκριση (TRUE) ενώ η πραγματική τιμή ήταν αρνητική.
1353 (False Negatives - FN): Το μοντέλο προέβλεψε αρνητική απόκριση (FALSE) ενώ η πραγματική τιμή ήταν θετική.
498 (True Positives - TP): Το μοντέλο προέβλεψε θετική απόκριση (TRUE) και η πραγματική τιμή ήταν επίσης θετική.
Σχολιασμός:
Το μοντέλο παρουσιάζει πολύ υψηλή ειδικότητα, δηλαδή απορρίπτει με μεγάλη ακρίβεια τις περιπτώσεις που δεν αναμένεται να ανταποκριθούν θετικά. Αυτό σημαίνει ότι τα ψευδώς θετικά (False Positives) είναι ελάχιστα, κάτι που ενισχύει την προστασία της τράπεζας από επισφαλείς αιτούντες.
Ωστόσο, η ευαισθησία παραμένει χαμηλή, καθώς σημαντικός αριθμός αξιόπιστων πελατών απορρίπτεται (FN = 1353). Με άλλα λόγια, το μοντέλο αποτυγχάνει να εντοπίσει αρκετές θετικές περιπτώσεις, στερώντας από την καμπάνια την ευκαιρία να προσεγγίσει πελάτες που ενδεχομένως θα είχαν ανταποκριθεί θετικά.
Αυτό υποδηλώνει ότι το μοντέλο λειτουργεί με συντηρητική στρατηγική, δίνοντας προτεραιότητα στη μείωση του ρίσκου, ακόμα και αν αυτό συνεπάγεται απώλεια ευκαιριών.
##
## Performance Metrics:
## Metric Value
## 1 Model Accuracy 0.8983
## 2 Baseline Accuracy 0.8830
## 3 Sensitivity (Ευαισθησία) 0.2690
## 4 Specificity (Ειδικότητα) 0.9817
📌 Συμπεράσματα:
Το μοντέλο εμφανίζει ακρίβεια 89.83%, ελαφρώς υψηλότερη από το baseline (88.30%). Αν και η διαφορά δεν είναι εντυπωσιακή, δείχνει ότι το μοντέλο ξεπερνά έναν απλό κανόνα πρόβλεψης.
Η ειδικότητα είναι εξαιρετικά υψηλή (98.17%), γεγονός που υποδεικνύει ότι το μοντέλο εντοπίζει με ακρίβεια τους πελάτες που δεν ανταποκρίνονται θετικά στην καμπάνια, προστατεύοντας έτσι αποτελεσματικά την τράπεζα από περιττές ή επισφαλείς προσεγγίσεις.
Αντίθετα, η ευαισθησία είναι χαμηλή (26.90%), δηλαδή ένα μεγάλο ποσοστό δυνητικά θετικών περιπτώσεων απορρίπτεται. Αυτό σημαίνει ότι υπάρχουν σημαντικές χαμένες ευκαιρίες για επιτυχημένες προσεγγίσεις.
Σύγκριση των δύο threshold:
Στο threshold = 0.5, η ευαισθησία ήταν υψηλότερη (35.01%), ενώ η ειδικότητα ήταν ελαφρώς χαμηλότερη (97.44%).
Με το threshold στο 0.6, το μοντέλο γίνεται πιο αυστηρό, μειώνοντας τα false positives, αλλά παράλληλα θυσιάζει περισσότερα true positives.
library(ROCR)
## Warning: package 'ROCR' was built under R version 4.4.3
ROCRpred <- prediction(predictTest,Test$y)
ROCRpred
## A prediction instance
## with 15824 data points
Σχόλιο
Το αντικείμενο ROCRpred περιέχει τις προβλέψεις του μοντέλου (predictTest) σε σύγκριση με τις πραγματικές τιμές (loanTest$loan_status) για 15.750 παρατηρήσεις.
ROCRperf <- performance(ROCRpred, "tpr", "fpr")
plot(ROCRperf)
plot(ROCRperf,colorize = TRUE)
Σχολιασμός διαγράμματος ROC
Η καμπύλη ROC (Receiver Operating Characteristic) που παρουσιάζεται δείχνει τη σχέση ανάμεσα στο True Positive Rate (ευαισθησία) και στο False Positive Rate (ποσοστό ψευδώς θετικών) για διαφορετικά κατώφλια ταξινόμησης του μοντέλου.
Η γενική μορφή της καμπύλης είναι ανερχόμενη και βρίσκεται ξεκάθαρα πάνω από τη διαγώνιο της τυχαίας πρόβλεψης, γεγονός που σημαίνει ότι το μοντέλο διαθέτει διαχωριστική ικανότητα και αποδίδει καλύτερα από μια τυχαία ταξινόμηση. Ωστόσο, η καμπύλη δεν πλησιάζει απόλυτα το άνω αριστερό άκρο του διαγράμματος, όπως θα συνέβαινε σε έναν ιδανικό ταξινομητή. Αντίθετα, η άνοδος είναι σταδιακή, κάτι που δείχνει πως, για να επιτευχθεί υψηλή ανίχνευση των θετικών περιστατικών, το μοντέλο επιτρέπει και την εμφάνιση αρκετών ψευδώς θετικών.
Με βάση το σχήμα της καμπύλης, το AUC (Area Under the Curve) εκτιμάται σε σχετικά υψηλό επίπεδο (0.90), υποδηλώνοντας ότι το μοντέλο έχει καλή αλλά όχι άριστη ικανότητα διάκρισης. Συνεπώς, μπορεί να θεωρηθεί ικανοποιητικό εργαλείο για πρόβλεψη, αλλά σε εφαρμογές που απαιτούν εξαιρετικά υψηλή ακρίβεια ίσως χρειάζεται περαιτέρω βελτίωση.