Περιγραφή του Dataset

Διερεύνηση του συνόλου δεδομένων

Γενική Περιγραφή

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

Πηγή δεδομένων:https://www.kaggle.com/datasets/taweilo/loan-approval-classification-data

Η συγκεκριμένη βάση δεδομένων συγκεντρώνει μεταβλητές που σχετίζονται με:

✅ Δημογραφικά χαρακτηριστικά (π.χ. ηλικία, φύλο, επίπεδο εκπαίδευσης)

✅ Οικονομικά στοιχεία (π.χ. ετήσιο εισόδημα, εμπειρία εργασίας, κατοχή κατοικίας)

✅ Στοιχεία δανείου (π.χ. ποσό δανείου, σκοπός, επιτόκιο, ποσοστό δανείου ως προς το εισόδημα)

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

✅ Κατάσταση αίτησης δανείου (εγκεκριμένο ή απορριφθέν)

Μεταβλητές του Dataset

Το dataset περιλαμβάνει 14 μεταβλητές.

Εξαρτημένη Μεταβλητή: loan_status

🔹Τύπος: Δυαδική (0 = απόρριψη, 1 = έγκριση)

🔹Είναι η μεταβλητή που θέλουμε να προβλέψουμε (αν το δάνειο θα εγκριθεί ή όχι).

Ανεξάρτητες Μεταβλητές: Οι υπόλοιπες 13 μεταβλητές είναι ανεξάρτητες, δηλαδή τα χαρακτηριστικά βάσει των οποίων προβλέπεται η loan_status.

Αναλυτικά παρουσιάζονται στον παρακάτω πίνακα.

Variable Description Variable_Type Variable_Range
person_age Ηλικία ατόμου Αριθμητική(Float) 18 – 100+
person_gender Φύλο Κατηγορική Male, Female
person_education Επίπεδο εκπαίδευσης Κατηγορική High School, College, Graduate
person_income Ετήσιο εισόδημα Αριθμητική(Float) 10,000 – 200,000+
person_emp_exp Έτη επαγγελματικής εμπειρίας Αριθμητική(Float) 0 – 50
person_home_ownership Κατοχή κατοικίας (ενοίκιο, ιδιόκτητο, υποθήκη) Κατηγορική Rent, Own, Mortgage
loan_amnt Ποσό αιτούμενου δανείου Αριθμητική(Float) 1,000 – 50,000+
loan_intent Σκοπός δανείου Κατηγορική Personal, Education, Home Improvement, Medical, etc.
loan_int_rate Επιτόκιο δανείου Αριθμητική(Float) 5.0 – 30.0%
loan_percent_income Ποσοστό δανείου σε σχέση με το εισόδημα Αριθμητική(Float) 0.01 – 1.0
cb_person_cred_hist_length Διάρκεια πιστωτικού ιστορικού (έτη) Αριθμητική(Float) 0 – 30+
credit_score Πιστωτική βαθμολογία Αριθμητική(Integer) 300 – 850
previous_loan_defaults_on_file Ένδειξη προηγούμενων αθετήσεων πληρωμών Κατηγορική Yes, No
loan_status Κατάσταση αίτησης Δυαδική (Integer) 1 = Εγκεκριμένο, 0 = Απορριφθέν



Επεξεργασία Dataset

Εισαγωγή του dataset

Εισάγω τα δεδομένα του dataset για επεξεργασία.

library(readr)
loan <- read.csv("loan_data.csv")

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

Το training set είναι το 65% της βάσης και το υπόλοιπο 35% είναι για το testing set.

Πριν διαχωρίσω το dataset ορίζω το ίδιο seed για να εξασφαλιστεί ότι όλα τα sets θα είναι ίδια.

library(caTools)
set.seed(906)

Και στην συνέχεια δημιουργώ τα δύο καινούργια datasets.

split <- sample.split(loan$loan_status,SplitRatio=0.65)

Ονομάζω τα sets ως train και test.

  loanTrain = subset(loan, split==TRUE)
  loanTest = subset(loan, split==FALSE)

Και καταγράφω το πόσες είναι οι καταχωρήσεις σε κάθε set.

  nrow(loanTrain)
## [1] 29250
  nrow(loanTest) 
## [1] 15750

Μοντέλο Λογιστικής Παλινδρόμησης

Παρακάτω δημιουργώ το Μοντέλο Λογιστικής Παλινδρόμησης στο train set στο οποίο περιλαμβάνονται όλες οι ανεξάρτητες μεταβλητές.

  LoanLog <- glm(loan_status ~ person_age + person_gender + person_education + person_income + person_emp_exp + person_home_ownership + loan_amnt + loan_intent + loan_int_rate + loan_percent_income + cb_person_cred_hist_length + credit_score + previous_loan_defaults_on_file, data=loan , family = binomial)
  summary(LoanLog)
## 
## Call:
## glm(formula = loan_status ~ person_age + person_gender + person_education + 
##     person_income + person_emp_exp + person_home_ownership + 
##     loan_amnt + loan_intent + loan_int_rate + loan_percent_income + 
##     cb_person_cred_hist_length + credit_score + previous_loan_defaults_on_file, 
##     family = binomial, data = loan)
## 
## Coefficients:
##                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                       -3.447e-01  3.594e-01  -0.959  0.33752    
## person_age                         2.476e-02  1.093e-02   2.267  0.02342 *  
## person_gendermale                  3.907e-02  3.540e-02   1.104  0.26979    
## person_educationBachelor          -3.915e-04  4.704e-02  -0.008  0.99336    
## person_educationDoctorate          1.460e-02  1.476e-01   0.099  0.92122    
## person_educationHigh School        1.332e-02  4.914e-02   0.271  0.78634    
## person_educationMaster             3.006e-02  5.624e-02   0.534  0.59303    
## person_income                      5.889e-07  1.969e-07   2.991  0.00278 ** 
## person_emp_exp                    -2.179e-02  9.710e-03  -2.244  0.02485 *  
## person_home_ownershipOTHER         3.383e-01  3.188e-01   1.061  0.28857    
## person_home_ownershipOWN          -1.457e+00  1.018e-01 -14.311  < 2e-16 ***
## person_home_ownershipRENT          7.217e-01  4.007e-02  18.009  < 2e-16 ***
## loan_amnt                         -1.010e-04  3.940e-06 -25.637  < 2e-16 ***
## loan_intentEDUCATION              -9.074e-01  5.851e-02 -15.508  < 2e-16 ***
## loan_intentHOMEIMPROVEMENT        -8.255e-03  6.581e-02  -0.125  0.90018    
## loan_intentMEDICAL                -2.910e-01  5.645e-02  -5.155 2.53e-07 ***
## loan_intentPERSONAL               -7.272e-01  5.994e-02 -12.133  < 2e-16 ***
## loan_intentVENTURE                -1.211e+00  6.359e-02 -19.044  < 2e-16 ***
## loan_int_rate                      3.340e-01  6.574e-03  50.803  < 2e-16 ***
## loan_percent_income                1.581e+01  3.072e-01  51.442  < 2e-16 ***
## cb_person_cred_hist_length        -5.179e-03  9.109e-03  -0.569  0.56967    
## credit_score                      -8.911e-03  4.100e-04 -21.732  < 2e-16 ***
## previous_loan_defaults_on_fileYes -2.037e+01  1.026e+02  -0.198  0.84268    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 47674  on 44999  degrees of freedom
## Residual deviance: 19879  on 44977  degrees of freedom
## AIC: 19925
## 
## Number of Fisher Scoring iterations: 19

Αξιολόγηση Μοντέλου Λογιστικής Παλινδρόμησης

Οι μεταβλητές που έχουν ισχυρή στατιστική συσχέτιση με την πιθανότητα έγκρισης δανείου (loan_status) είναι οι εξής:

  1. person_income

p-value: 0.0295

Όσο αυξάνεται το εισόδημα, αυξάνεται η πιθανότητα για loan_status = 1.

  1. person_home_ownershipOWN

p-value: < 2e-16

Αρνητική συσχέτιση: οι ιδιοκτήτες έχουν μικρότερη πιθανότητα για loan_status = 1.

  1. person_home_ownershipRENT

p-value: < 2e-16

Θετική συσχέτιση: οι ενοικιαστές έχουν μεγαλύτερη πιθανότητα για loan_status = 1.

  1. loan_amnt

p-value: < 2e-16

Αρνητική συσχέτιση: όσο μεγαλύτερο το ποσό, τόσο μικρότερη η πιθανότητα για loan_status = 1.

  1. loan_intentEDUCATION

p-value: < 2e-16

Αρνητική συσχέτιση: τα δάνεια για εκπαίδευση εγκρίνονται δυσκολότερα.

  1. loan_intentMEDICAL

p-value: 0.000183

Αρνητική συσχέτιση: τα ιατρικά δάνεια έχουν μικρότερη πιθανότητα έγκρισης.

  1. loan_intentPERSONAL

p-value: < 2e-16

Αρνητική συσχέτιση: τα προσωπικά δάνεια έχουν μειωμένη πιθανότητα έγκρισης.

  1. loan_intentVENTURE

p-value: < 2e-16

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

  1. loan_int_rate

p-value: < 2e-16

Θετική συσχέτιση: όσο μεγαλύτερο το επιτόκιο, τόσο μεγαλύτερη η πιθανότητα loan_status = 1.

  1. loan_percent_income

p-value: < 2e-16

Πολύ ισχυρή θετική συσχέτιση: όσο μεγαλύτερο το ποσοστό του δανείου σε σχέση με το εισόδημα, τόσο αυξάνεται η πιθανότητα loan_status = 1.

  1. credit_score

p-value: < 2e-16

Αρνητική συσχέτιση: όσο μεγαλύτερο το credit score, τόσο μειώνεται η πιθανότητα loan_status = 1.

🔸 Μεταβλητές με πολύ ισχυρή στατιστική σημαντικότητα (p < 0.001 → ***)

person_home_ownershipOWN — p < 2e-16

person_home_ownershipRENT — p < 2e-16

loan_amnt — p < 2e-16

loan_intentEDUCATION — p < 2e-16

loan_intentPERSONAL — p < 2e-16

loan_intentVENTURE — p < 2e-16

loan_int_rate — p < 2e-16

loan_percent_income — p < 2e-16

credit_score — p < 2e-16

🔸 Μεταβλητές με ισχυρή σημαντικότητα (0.001 < p < 0.01 → **)

loan_intentMEDICAL — p = 0.000183

🔸 Μεταβλητές με μέτρια σημαντικότητα (0.01 < p < 0.05 → *)

person_income — p = 0.0295

Σχόλιο

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

Ο συντελεστής κάθε κατηγορίας δείχνει πώς επηρεάζει την πιθανότητα σε σχέση με τη βασική κατηγορία.

Για παράδειγμα, για την τη μεταβλητή person_home_ownership, η οποία έχει τις εξής τιμές στο dataset:

RENT

OWN

MORTGAGE

OTHER

Στο μοντέλο εμφανίζονται:

person_home_ownershipOWN

person_home_ownershipRENT

person_home_ownershipOTHER

και δεν εμφανίζεται η MORTGAGE, άρα αυτή είναι η βασική κατηγορία.

🔹 Ερμηνεία με βάση το μοντέλο:

person_home_ownershipOWN = -1.385, p < 2e-16

➤ Άτομα που είναι ιδιοκτήτες έχουν σημαντικά μικρότερη πιθανότητα να ανήκουν στην κατηγορία loan_status = 1, σε σύγκριση με όσους έχουν υποθήκη (MORTGAGE).

person_home_ownershipRENT = +0.731, p < 2e-16

➤ Άτομα που νοικιάζουν έχουν μεγαλύτερη πιθανότητα να είναι στην κατηγορία loan_status = 1, σε σύγκριση με άτομα με υποθήκη (MORTGAGE).

person_home_ownershipOTHER = +0.192, p = 0.635 (όχι στατιστικά σημαντικό)

➤ Άτομα με “OTHER” κατηγορία στέγασης δεν διαφέρουν σημαντικά από όσους έχουν υποθήκη.

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

Πραγματοποιούνται προβλέψεις στο test set με την εντολή predict.

  predictTrain <- predict(LoanLog, type='response')
  predictTest <- predict(LoanLog, type='response', newdata = loanTest)
  head(predictTrain)
##            1            2            3            4            5            6 
## 9.919345e-01 2.393359e-10 9.930484e-01 9.601666e-01 9.941268e-01 1.103370e-01
  head(predictTest)
##            1            3            7           16           17           19 
## 9.919345e-01 9.930484e-01 5.853879e-01 2.208053e-11 5.370836e-02 8.015858e-01
  summary(predictTest)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.2206  0.3932  0.9992

Παρατητούμε ότι όλες οι πιθανότητες είναι από [0…1] όπως αναμέναμε.

Μερικά σχόλια για κάποια από τα αποτελέσματα:

PredictTrain

Αυτές οι τιμές είναι πιθανότητες για κάθε παρατήρηση στο σετ εκπαίδευσης.

Οι τιμές όπως 9.93e-01 και 9.94e-01 δείχνουν πολύ υψηλή πιθανότητα (99%) για loan_status=1.

Αντίθετα, τιμές όπως 2.39e-10 ή 1.10e-01 δείχνουν πολύ χαμηλή πιθανότητα για loan_status=1.

Αυτό δείχνει ότι το μοντέλο διαχωρίζει καλά τις περιπτώσεις στο σετ εκπαίδευσης.

PredictTest

Οι τιμές 1 και 3 δείχνουν πάλι υψηλή πιθανότητα για loan_status=1.

Η 7 (0.585) είναι μεσαία – αυτό δείχνει μία αβεβαιότητα.

Η 16 είναι πρακτικά 0 → σχεδόν βέβαιο ότι loan_status=0.

Η 17 είναι επίσης χαμηλή → πιθανό ότι loan_status=0.

Η 19 είναι υψηλή (0.80) → πιθανό ότι loan_status=1.

Επιλογή Τιμής Κατωφλιού - Υπολογισμός Μετρικών

Αρχικά επιλέγω το κατώφλι να είναι ίσο με 0.5.

table(loanTest$loan_status, predictTest > 0.5)
##    
##     FALSE  TRUE
##   0 11497   753
##   1   895  2605

Αναλυτικά, στον παραπάνω πίνακα ισχύει ότι:

  1. 11497 (True Negatives - TN): Το μοντέλο προέβλεψε FALSE και η πραγματική τιμή ήταν επίσης FALSE.

  2. 753 (False Positives - FP): Το μοντέλο προέβλεψε TRUE ενώ η πραγματική τιμή ήταν FALSE (λάθος συναγερμός).

  3. 895 (False Negatives - FN): Το μοντέλο προέβλεψε FALSE ενώ η πραγματική τιμή ήταν TRUE (παράλειψη).

  4. 2605 (True Positives - TP): Το μοντέλο προέβλεψε TRUE και η πραγματική τιμή ήταν επίσης TRUE.

Variables Model_R_squared
Accuracy (Ακρίβεια) 90.16%
Ευαισθησία (Sensitivity / True Positive Rate) 74.43%
Ειδικότητα (Specificity / True Negative Rate) 93.85%
Ακρίβεια του Baseline Model 78.3%

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

1)Το μοντέλο έχει ακρίβεια 90.16%, σημαντικά υψηλότερη από το baseline μοντέλο (78.3%). Αυτό δείχνει ότι το μοντέλο έχει μάθει να κάνει πιο έξυπνες και ισορροπημένες αποφάσεις.

2)Η ευαισθησία του μοντέλου είναι 74.4%, δηλαδή το 74.4% των ανθρώπων που θα έπρεπε να πάρουν δάνειο το παίρνουν πράγματι. Όμως, το υπόλοιπο 25.6% απορρίπτονται άδικα, κάτι που ενδέχεται να στερεί δάνεια από αξιόπιστους δανειολήπτες.

3)Η ειδικότητα είναι υψηλή (93.9%), που σημαίνει ότι το μοντέλο απορρίπτει με ακρίβεια τους αιτούντες που δεν πληρούν τα κριτήρια, προστατεύοντας έτσι την τράπεζα από επικίνδυνα δάνεια.

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

Στην συνέχεια επιλέγω το κατώφλι να είναι ίσο με 0.6.

table(loanTest$loan_status, predictTest > 0.6)
##    
##     FALSE  TRUE
##   0 11773   477
##   1  1177  2323

Αναλυτικά, στον παραπάνω πίνακα ισχύει ότι:

  1. 11773 (True Negatives - TN): Το μοντέλο προέβλεψε FALSE και η πραγματική τιμή ήταν επίσης FALSE.Δηλαδή, σωστά απορρίφθηκε η αίτηση δανείου από άτομο που δεν ήταν κατάλληλο.

  2. 477 (False Positives - FP): Το μοντέλο προέβλεψε TRUE ενώ η πραγματική τιμή ήταν FALSE (λάθος συναγερμός).Δηλαδή, εγκρίθηκε δάνειο σε άτομο που δεν έπρεπε να πάρει.

  3. 1177 (False Negatives - FN): Το μοντέλο προέβλεψε FALSE ενώ η πραγματική τιμή ήταν TRUE (παράλειψη).Δηλαδή, απορρίφθηκε αίτηση από άτομο που θα έπρεπε να πάρει δάνειο.

  4. 2323 (True Positives - TP): Το μοντέλο προέβλεψε TRUE και η πραγματική τιμή ήταν επίσης TRUE.Δηλαδή, σωστά εγκρίθηκε δάνειο σε άτομο που ήταν κατάλληλο.

Variables Model_R_squared
Accuracy (Ακρίβεια) 90.1%
Ευαισθησία (Sensitivity / True Positive Rate) 66.4%
Ειδικότητα (Specificity / True Negative Rate) 96.1%
Ακρίβεια του Baseline Model 77.8%

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

1)Το μοντέλο έχει πολύ καλύτερη ακρίβεια (90.1%) σε σχέση με το baseline (77.8%).

2)Έχει πολύ υψηλή ειδικότητα (96.1%), άρα είναι πολύ καλό στο να απορρίπτει πελάτες που δεν πρέπει να πάρουν δάνειο.

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

Επομένως, το συγκεκριμένο μοντέλο κάνει πολύ καλύτερη δουλειά από το baseline, ειδικά στην προστασία από επισφαλείς δανειολήπτες. Αν αυτός είναι ο στόχος, τότε η απόδοση του μοντέλου στο threshold = 0.6 είναι εξαιρετική.

Area Under the Curve (AUC)

library(ROCR)
ROCRpred <- prediction(predictTest,loanTest$loan_status)
ROCRpred
## A prediction instance
##   with 15750 data points

Σχόλιο

Το αντικείμενο ROCRpred περιέχει τις προβλέψεις του μοντέλου (predictTest) σε σύγκριση με τις πραγματικές τιμές (loanTest$loan_status) για 15.750 παρατηρήσεις.

ROCRperf <- performance(ROCRpred, "tpr", "fpr")
plot(ROCRperf)

plot(ROCRperf,colorize = TRUE)
plot(ROCRperf,colorize = TRUE, print.cutoffs.at=seq(0,1,0.1),text.adj=c(-0.2,1.7))

as.numeric(performance(ROCRpred, "auc")@y.values)
## [1] 0.9548908

Σχολιασμός για τα δύο διαγράμματα

🔹 Διάγραμμα 1:

Πρόκειται για τη βασική μορφή της ROC καμπύλης, χωρίς χρώμα ή σημειωμένα cutoffs. Παρατηρούμε ότι η καμπύλη ανέρχεται απότομα προς τα πάνω και στη συνέχεια πλησιάζει το σημείο (0,1), που είναι το ιδανικό σημείο (δηλ. TPR=1 και FPR=0). Αυτό δείχνει πολύ καλή επίδοση του μοντέλου, αφού μπορεί να διακρίνει σωστά τους πελάτες με υψηλό ποσοστό.

🔹 Διάγραμμα 2:

Το ίδιο διάγραμμα με επιπλέον πληροφορία:

1)Οι αριθμοί (π.χ. 0.1, 0.2, …, 0.9) δείχνουν τα cutoff thresholds.

2)Το χρώμα δείχνει την αλλαγή αυτών των thresholds (από κόκκινο σε μπλε όσο μεγαλώνει το threshold).

3)Βλέπουμε ότι για μικρά thresholds (π.χ. 0.1, 0.2), το μοντέλο είναι πολύ ευαίσθητο (υψηλό TPR) αλλά αυξάνεται και το FPR.

4)Καθώς ανεβαίνει το threshold (π.χ. 0.7–0.9), μειώνεται το FPR αλλά και το TPR, δηλαδή το μοντέλο γίνεται πιο αυστηρό.

Συμπέρασμα, με AUC = 0.95, το μοντέλο είναι εξαιρετικά καλό στην πρόβλεψη του loan status, και έχει πολύ καλή ικανότητα να διαχωρίσει ποιοι πελάτες μπορούν να πάρουν δάνειο και ποιοι όχι.