1. Περιγραφη Dataset

Το Bank Marketing Dataset περιέχει δεδομένα από τηλεφωνικές καμπάνιες άμεσου μάρκετινγκ πορτογαλικής τράπεζας, με στόχο την πρόβλεψη αν ένας πελάτης θα εγγραφεί σε μια κατάθεση προθεσμίας (term deposit).

📌 Γενικά χαρακτηριστικά

Περιλαμβάνει 45.211 εγγραφές και 17 μεταβλητές.

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

Η μεταβλητή στόχος είναι αν ο πελάτης είπε “ναι” ή “όχι” σε μια προσφορά τραπεζικής κατάθεσης (binary classification).

📌 Τι μπορούμε να μελετήσουμε με αυτό το dataset

  • Πώς διάφοροι κοινωνικοοικονομικοί παράγοντες επηρεάζουν την απόφαση του πελάτη.

  • Ποια χαρακτηριστικά έχουν μεγαλύτερη προγνωστική αξία στην αποδοχή ή απόρριψη μιας τραπεζικής προσφοράς.

  • Την αποτελεσματικότητα διαφορετικών αλγορίθμων μηχανικής μάθησης (όπως δέντρα απόφασης, random forests, logistic regression) στην πρόβλεψη της απόκρισης των πελατών.

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

2. Διερεύνηση Δεδομένων

Στο σημείο αυτό υπάρχει μια γενική εικόνα των δεδομένων μας, όπως τα ονόματα των στηλών/μεταβλητών του 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")
Περιγραφή Μεταβλητών του 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)

3. Έλεγχος Ελλιπών τιμών

Πριν την πραγματοποίση οποιασδήποτε ενέργειας στο 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 μας.

4. Υπολογισμός και παρουσίαση περιγραφικών στατιστικών

Παρακάτω παρουσιάζονται κάποια στατιστικά στοιχεία για κάθε μεταβλητή/στήλη του δείγματος μας, μερικά εξ’ αυτών η ελάχιστη τιμή, η μέγιστη τιμή και η μέση τιμή.

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  
##                    
##                    
## 

5. Διαγράμματα

5.1 Κατανομή Επαγγελμάτων Πελατών

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 εμφανίζονται πιο σπάνια. Επομένως, αντιλαμβανόμαστε πως το δείγμα μας αποτελείται κυρίως από εργαζόμενους μεσαίας τάξης και λιγότερο από ομάδες εκτός αγοράς εργασίας.

5.2 Κατανομή ηλικιών Πελάτων

ggplot(data, aes(x = age)) +
  geom_histogram(bins = 20, fill = "orange", color = "black") +
  theme_minimal() +
  labs(title = "Κατανομή Ηλικιών",
       x = "Ηλικία", y = "Συχνότητα")

Σχολιασμός: Ιδιαίτερη συγκέντρωση εμφανίζεται στις ηλικίες 30–40 ετών και μια φθίνουσα πορεία μετά τα 50. Υπάρχουν και αρκετές παρατηρήσεις πάνω από 60, αλλά σπανιότερες, γεγονός που δηλώνει πως οι περισσότερες καμπάνιες στοχεύουν σε πελάτες οικονομικά ενεργούς, με μικρότερο ποσοστό συνταξιούχων.

5.3 Απόκριση στην καμπάνια

ggplot(data, aes(x = y)) +
  geom_bar(fill = "darkgreen") +
  theme_minimal() +
  labs(title = "Απάντηση στην Καμπάνια",
       x = "Απάντηση", y = "Συχνότητα")

Σχολιασμός: Όπως φαίνεται, η πλειονότητα των πελατών απαντά αρνητικά (“no”), γεγονός που υποδηλώνει τη χαμηλή αποτελεσματικότητα της καμπάνιας στην προσέλκυση θετικών αποκρίσεων.

6. Διαχωρισμός του dataset σε training και testing sets

Το 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) είναι οι εξής:

  • duration: p-value: < 2e-16 (*)**

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

  • age: p-value: < 0.001 (*)**

Θετική συσχέτιση: μεγαλύτερη ηλικία συνδέεται με αυξημένη πιθανότητα θετικής απόκρισης.

  • job (επιμέρους κατηγορίες)

Ορισμένα επαγγέλματα (π.χ. retired, student) έχουν θετική και στατιστικά σημαντική συσχέτιση.

Άλλα επαγγέλματα (π.χ. blue-collar) συνδέονται με χαμηλότερη πιθανότητα θετικής απόκρισης.

  • education

Υψηλότερο μορφωτικό επίπεδο σχετίζεται με αυξημένη πιθανότητα “ναι”.

  • housing & loan: p-value: < 0.01

Άτομα με υφιστάμενα δάνεια (στεγαστικά ή καταναλωτικά) τείνουν να έχουν χαμηλότερη πιθανότητα θετικής απόκρισης.

  • previous / poutcome

Πελάτες που είχαν επιτυχημένο αποτέλεσμα σε προηγούμενη καμπάνια εμφανίζουν πολύ υψηλότερη πιθανότητα να πουν “ναι”.

Σημαντικές παρατηρήσεις

  • Η duration είναι ο πιο ισχυρός προγνωστικός παράγοντας, αλλά είναι διαθέσιμος μόνο μετά την επικοινωνία με τον πελάτη.

  • Ορισμένες κατηγορίες μεταβλητών (π.χ. default) δεν είναι στατιστικά σημαντικές (υψηλό p-value).

Εφαρμογή Πρόβλεψης στο Test Set

Πραγματοποιούνται προβλέψεις στο 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. Η παρατήρηση 1 και 3 παρουσιάζουν υψηλή πιθανότητα για θετική απόκριση.

  2. Η παρατήρηση 7 έχει μέση τιμή (~0.0248), που δείχνει σχετική αβεβαιότητα.

  3. Η παρατήρηση 16 έχει τιμή σχεδόν 0, υποδεικνύοντας μεγάλη βεβαιότητα για αρνητική απόκριση.

  4. Η παρατήρηση 17 έχει επίσης χαμηλή πιθανότητα για θετική απόκριση.

  5. Η παρατήρηση 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

📌 Συμπεράσματα:

  1. Το μοντέλο παρουσιάζει ακρίβεια 90.14%, σημαντικά υψηλότερη από το baseline μοντέλο (88.30%), κάτι που υποδεικνύει ότι έχει μάθει να λαμβάνει πιο ενημερωμένες και ισορροπημένες αποφάσεις σε σχέση με έναν απλό κανόνα πρόβλεψης.

  2. Η ευαισθησία (sensitivity) του μοντέλου είναι 35.01%, δηλαδή αναγνωρίζει σωστά μόνο περίπου το 35% των πελατών που τελικά ανταποκρίνονται θετικά στην καμπάνια. Αυτό σημαίνει ότι το υπόλοιπο 64.99% των θετικών περιπτώσεων απορρίπτεται εσφαλμένα (false negatives), γεγονός που μπορεί να οδηγήσει σε απώλεια σημαντικών ευκαιριών πώλησης.

  3. Αντίθετα, η ειδικότητα (specificity) είναι πολύ υψηλή (97.44%), γεγονός που δείχνει ότι το μοντέλο απορρίπτει με ακρίβεια τις περιπτώσεις που είναι πράγματι αρνητικές, περιορίζοντας έτσι τον πιστωτικό και εμπορικό κίνδυνο για την τράπεζα.

  4. Συνολικά, το μοντέλο εμφανίζεται συντηρητικό, δίνοντας έμφαση στην αποφυγή λανθασμένων εγκρίσεων (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

📌 Συμπεράσματα:

  1. Το μοντέλο εμφανίζει ακρίβεια 89.83%, ελαφρώς υψηλότερη από το baseline (88.30%). Αν και η διαφορά δεν είναι εντυπωσιακή, δείχνει ότι το μοντέλο ξεπερνά έναν απλό κανόνα πρόβλεψης.

  2. Η ειδικότητα είναι εξαιρετικά υψηλή (98.17%), γεγονός που υποδεικνύει ότι το μοντέλο εντοπίζει με ακρίβεια τους πελάτες που δεν ανταποκρίνονται θετικά στην καμπάνια, προστατεύοντας έτσι αποτελεσματικά την τράπεζα από περιττές ή επισφαλείς προσεγγίσεις.

  3. Αντίθετα, η ευαισθησία είναι χαμηλή (26.90%), δηλαδή ένα μεγάλο ποσοστό δυνητικά θετικών περιπτώσεων απορρίπτεται. Αυτό σημαίνει ότι υπάρχουν σημαντικές χαμένες ευκαιρίες για επιτυχημένες προσεγγίσεις.

Σύγκριση των δύο threshold:

  1. Στο threshold = 0.5, η ευαισθησία ήταν υψηλότερη (35.01%), ενώ η ειδικότητα ήταν ελαφρώς χαμηλότερη (97.44%).

  2. Με το threshold στο 0.6, το μοντέλο γίνεται πιο αυστηρό, μειώνοντας τα false positives, αλλά παράλληλα θυσιάζει περισσότερα true positives.

Area Under the Curve (AUC)

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), υποδηλώνοντας ότι το μοντέλο έχει καλή αλλά όχι άριστη ικανότητα διάκρισης. Συνεπώς, μπορεί να θεωρηθεί ικανοποιητικό εργαλείο για πρόβλεψη, αλλά σε εφαρμογές που απαιτούν εξαιρετικά υψηλή ακρίβεια ίσως χρειάζεται περαιτέρω βελτίωση.