Το επιλεγμένο dataset είναι ένα συνθετικό σύνολο δεδομένων που περιλαμβάνει προσωπικά, οικονομικά και πιστωτικά χαρακτηριστικά αιτούντων δανείου. Σκοπός του είναι η ανάλυση και πρόβλεψη της έγκρισης ή απόρριψης δανείων, καθώς και η αξιολόγηση της πιστοληπτικής ικανότητας των αιτούντων, βοηθώντας στη λήψη τεκμηριωμένων αποφάσεων από χρηματοπιστωτικούς οργανισμούς.
Πηγή δεδομένων:https://www.kaggle.com/datasets/taweilo/loan-approval-classification-data
Η συγκεκριμένη βάση δεδομένων συγκεντρώνει μεταβλητές που σχετίζονται με:
✅ Δημογραφικά χαρακτηριστικά (π.χ. ηλικία, φύλο, επίπεδο εκπαίδευσης)
✅ Οικονομικά στοιχεία (π.χ. ετήσιο εισόδημα, εμπειρία εργασίας, κατοχή κατοικίας)
✅ Στοιχεία δανείου (π.χ. ποσό δανείου, σκοπός, επιτόκιο, ποσοστό δανείου ως προς το εισόδημα)
✅ Πιστωτικό ιστορικό (π.χ. διάρκεια πιστωτικού ιστορικού, πιστωτική βαθμολογία, προηγούμενες αθετήσεις πληρωμών)
✅ Κατάσταση αίτησης δανείου (εγκεκριμένο ή απορριφθέν)
Το 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 για επεξεργασία.
library(readr)
loan <- read.csv("loan_data.csv")
Το 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) είναι οι εξής:
p-value: 0.0295
Όσο αυξάνεται το εισόδημα, αυξάνεται η πιθανότητα για loan_status = 1.
p-value: < 2e-16
Αρνητική συσχέτιση: οι ιδιοκτήτες έχουν μικρότερη πιθανότητα για loan_status = 1.
p-value: < 2e-16
Θετική συσχέτιση: οι ενοικιαστές έχουν μεγαλύτερη πιθανότητα για loan_status = 1.
p-value: < 2e-16
Αρνητική συσχέτιση: όσο μεγαλύτερο το ποσό, τόσο μικρότερη η πιθανότητα για loan_status = 1.
p-value: < 2e-16
Αρνητική συσχέτιση: τα δάνεια για εκπαίδευση εγκρίνονται δυσκολότερα.
p-value: 0.000183
Αρνητική συσχέτιση: τα ιατρικά δάνεια έχουν μικρότερη πιθανότητα έγκρισης.
p-value: < 2e-16
Αρνητική συσχέτιση: τα προσωπικά δάνεια έχουν μειωμένη πιθανότητα έγκρισης.
p-value: < 2e-16
Ισχυρά αρνητική συσχέτιση: τα επιχειρηματικά δάνεια έχουν πολύ χαμηλή πιθανότητα έγκρισης.
p-value: < 2e-16
Θετική συσχέτιση: όσο μεγαλύτερο το επιτόκιο, τόσο μεγαλύτερη η πιθανότητα loan_status = 1.
p-value: < 2e-16
Πολύ ισχυρή θετική συσχέτιση: όσο μεγαλύτερο το ποσοστό του δανείου σε σχέση με το εισόδημα, τόσο αυξάνεται η πιθανότητα loan_status = 1.
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 με την εντολή 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
Αναλυτικά, στον παραπάνω πίνακα ισχύει ότι:
11497 (True Negatives - TN): Το μοντέλο προέβλεψε FALSE και η πραγματική τιμή ήταν επίσης FALSE.
753 (False Positives - FP): Το μοντέλο προέβλεψε TRUE ενώ η πραγματική τιμή ήταν FALSE (λάθος συναγερμός).
895 (False Negatives - FN): Το μοντέλο προέβλεψε FALSE ενώ η πραγματική τιμή ήταν TRUE (παράλειψη).
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
Αναλυτικά, στον παραπάνω πίνακα ισχύει ότι:
11773 (True Negatives - TN): Το μοντέλο προέβλεψε FALSE και η πραγματική τιμή ήταν επίσης FALSE.Δηλαδή, σωστά απορρίφθηκε η αίτηση δανείου από άτομο που δεν ήταν κατάλληλο.
477 (False Positives - FP): Το μοντέλο προέβλεψε TRUE ενώ η πραγματική τιμή ήταν FALSE (λάθος συναγερμός).Δηλαδή, εγκρίθηκε δάνειο σε άτομο που δεν έπρεπε να πάρει.
1177 (False Negatives - FN): Το μοντέλο προέβλεψε FALSE ενώ η πραγματική τιμή ήταν TRUE (παράλειψη).Δηλαδή, απορρίφθηκε αίτηση από άτομο που θα έπρεπε να πάρει δάνειο.
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 είναι εξαιρετική.
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, και έχει πολύ καλή ικανότητα να διαχωρίσει ποιοι πελάτες μπορούν να πάρουν δάνειο και ποιοι όχι.