Φόρτωση βιβλιοθηκών

library(caTools)
## Warning: package 'caTools' was built under R version 4.5.3
library(ROCR)
## Warning: package 'ROCR' was built under R version 4.5.3


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

loan<-read.csv("loan_data.csv")
str(loan)
## 'data.frame':    45000 obs. of  14 variables:
##  $ person_age                    : num  22 21 25 23 24 21 26 24 24 21 ...
##  $ person_gender                 : chr  "female" "female" "female" "female" ...
##  $ person_education              : chr  "Master" "High School" "High School" "Bachelor" ...
##  $ person_income                 : num  71948 12282 12438 79753 66135 ...
##  $ person_emp_exp                : int  0 0 3 0 1 0 1 5 3 0 ...
##  $ person_home_ownership         : chr  "RENT" "OWN" "MORTGAGE" "RENT" ...
##  $ loan_amnt                     : num  35000 1000 5500 35000 35000 2500 35000 35000 35000 1600 ...
##  $ loan_intent                   : chr  "PERSONAL" "EDUCATION" "MEDICAL" "MEDICAL" ...
##  $ loan_int_rate                 : num  16 11.1 12.9 15.2 14.3 ...
##  $ loan_percent_income           : num  0.49 0.08 0.44 0.44 0.53 0.19 0.37 0.37 0.35 0.13 ...
##  $ cb_person_cred_hist_length    : num  3 2 3 2 4 2 3 4 2 3 ...
##  $ credit_score                  : int  561 504 635 675 586 532 701 585 544 640 ...
##  $ previous_loan_defaults_on_file: chr  "No" "Yes" "No" "No" ...
##  $ loan_status                   : int  1 0 1 1 1 1 1 1 1 1 ...
summary(loan)
##    person_age     person_gender      person_education   person_income    
##  Min.   : 20.00   Length:45000       Length:45000       Min.   :   8000  
##  1st Qu.: 24.00   Class :character   Class :character   1st Qu.:  47204  
##  Median : 26.00   Mode  :character   Mode  :character   Median :  67048  
##  Mean   : 27.76                                         Mean   :  80319  
##  3rd Qu.: 30.00                                         3rd Qu.:  95789  
##  Max.   :144.00                                         Max.   :7200766  
##  person_emp_exp   person_home_ownership   loan_amnt     loan_intent       
##  Min.   :  0.00   Length:45000          Min.   :  500   Length:45000      
##  1st Qu.:  1.00   Class :character      1st Qu.: 5000   Class :character  
##  Median :  4.00   Mode  :character      Median : 8000   Mode  :character  
##  Mean   :  5.41                         Mean   : 9583                     
##  3rd Qu.:  8.00                         3rd Qu.:12237                     
##  Max.   :125.00                         Max.   :35000                     
##  loan_int_rate   loan_percent_income cb_person_cred_hist_length  credit_score  
##  Min.   : 5.42   Min.   :0.0000      Min.   : 2.000             Min.   :390.0  
##  1st Qu.: 8.59   1st Qu.:0.0700      1st Qu.: 3.000             1st Qu.:601.0  
##  Median :11.01   Median :0.1200      Median : 4.000             Median :640.0  
##  Mean   :11.01   Mean   :0.1397      Mean   : 5.867             Mean   :632.6  
##  3rd Qu.:12.99   3rd Qu.:0.1900      3rd Qu.: 8.000             3rd Qu.:670.0  
##  Max.   :20.00   Max.   :0.6600      Max.   :30.000             Max.   :850.0  
##  previous_loan_defaults_on_file  loan_status    
##  Length:45000                   Min.   :0.0000  
##  Class :character               1st Qu.:0.0000  
##  Mode  :character               Median :0.0000  
##                                 Mean   :0.2222  
##                                 3rd Qu.:0.0000  
##                                 Max.   :1.0000


Διαχωρισμός δεδομένων σε Training και Testing set

set.seed(949)

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

train <- subset(loan, split == TRUE)
test <- subset(loan, split == FALSE)

Σε αυτό το βήμα γίνεται ο διαχωρισμός του dataset σε δύο σύνολα δεδομένων. Το training set χρησιμοποιείται για την εκπαίδευση του μοντέλου, ενώ το testing set χρησιμοποιείται για την αξιολόγηση της απόδοσής του. Με τη χρήση της συνάρτησης sample.split() το 65% των δεδομένων επιλέγεται για το training set και το υπόλοιπο 35% για το testing set. Η εντολή set.seed() χρησιμοποιείται ώστε ο διαχωρισμός να είναι αναπαραγώγιμος.

nrow(train)
## [1] 29250
nrow(test)
## [1] 15750

Με τη χρήση της συνάρτησης nrow() υπολογίζεται ο αριθμός των παρατηρήσεων που περιλαμβάνονται στο training και στο testing set. Στην περίπτωση αυτή το training set περιέχει 29.250 παρατηρήσεις, ενώ το testing set περιέχει 15.750 παρατηρήσεις.


Δημιουργία μοντέλου Logistic Regression

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 = train,
               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 = train)
## 
## Coefficients:
##                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                       -6.675e-01  4.473e-01  -1.492   0.1356    
## person_age                         2.933e-02  1.356e-02   2.163   0.0306 *  
## person_gendermale                  5.266e-02  4.407e-02   1.195   0.2321    
## person_educationBachelor           3.724e-02  5.851e-02   0.636   0.5245    
## person_educationDoctorate          1.846e-01  1.791e-01   1.031   0.3027    
## person_educationHigh School        1.145e-01  6.116e-02   1.872   0.0612 .  
## person_educationMaster             8.408e-02  6.989e-02   1.203   0.2290    
## person_income                      8.272e-07  3.264e-07   2.535   0.0113 *  
## person_emp_exp                    -2.511e-02  1.202e-02  -2.088   0.0368 *  
## person_home_ownershipOTHER         2.677e-01  3.786e-01   0.707   0.4795    
## person_home_ownershipOWN          -1.515e+00  1.275e-01 -11.883  < 2e-16 ***
## person_home_ownershipRENT          6.976e-01  4.989e-02  13.984  < 2e-16 ***
## loan_amnt                         -1.056e-04  5.108e-06 -20.668  < 2e-16 ***
## loan_intentEDUCATION              -9.318e-01  7.265e-02 -12.827  < 2e-16 ***
## loan_intentHOMEIMPROVEMENT        -3.676e-02  8.159e-02  -0.451   0.6523    
## loan_intentMEDICAL                -3.403e-01  7.004e-02  -4.859 1.18e-06 ***
## loan_intentPERSONAL               -7.347e-01  7.471e-02  -9.835  < 2e-16 ***
## loan_intentVENTURE                -1.233e+00  7.933e-02 -15.544  < 2e-16 ***
## loan_int_rate                      3.416e-01  8.228e-03  41.510  < 2e-16 ***
## loan_percent_income                1.621e+01  3.972e-01  40.808  < 2e-16 ***
## cb_person_cred_hist_length        -7.818e-03  1.124e-02  -0.696   0.4865    
## credit_score                      -8.808e-03  5.083e-04 -17.330  < 2e-16 ***
## previous_loan_defaults_on_fileYes -2.036e+01  1.272e+02  -0.160   0.8729    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 30988  on 29249  degrees of freedom
## Residual deviance: 12839  on 29227  degrees of freedom
## AIC: 12885
## 
## Number of Fisher Scoring iterations: 19

Το μοντέλο Logistic Regression δημιουργήθηκε χρησιμοποιώντας όλες τις ανεξάρτητες μεταβλητές. Από τα αποτελέσματα του summary() παρατηρούμε ότι αρκετές μεταβλητές είναι στατιστικά σημαντικές.

Οι μεταβλητές με πολύ ισχυρή στατιστική σημαντικότητα (p < 0.001) είναι:

person_home_ownershipOWN person_home_ownershipRENT loan_amnt loan_intentEDUCATION loan_intentMEDICAL loan_intentPERSONAL loan_intentVENTURE loan_int_rate loan_percent_income credit_score

Επίσης σημαντικές στο επίπεδο 5% είναι οι μεταβλητές:

person_age person_income person_emp_exp

Τέλος οριακή στατιστική σημαντικότητα εμφανίζει η μεταβλητή person_educationHigh School (p < 0.1)

Αντίθετα, μεταβλητές όπως person_gender, person_education και cb_person_cred_hist_length δεν εμφανίζουν στατιστικά σημαντική συσχέτιση με την εξαρτημένη μεταβλητή loan_status.


Προβλέψεις στο test set

predictTest <- predict(LoanLog, type = "response", newdata = test)
head(predictTest)
##          3          4          7          8         14         15 
## 0.99397228 0.95872063 0.57364954 0.79811817 0.69018186 0.09769908

Με τη χρήση της συνάρτησης predict() δημιουργήθηκαν προβλέψεις για το test set χρησιμοποιώντας το μοντέλο Logistic Regression που εκπαιδεύτηκε στο training set. Η εντολή επιστρέφει πιθανότητες μεταξύ 0 και 1, οι οποίες εκφράζουν την πιθανότητα η εξαρτημένη μεταβλητή loan_status να πάρει την τιμή 1 για κάθε παρατήρηση του test set.

Για παράδειγμα, μια τιμή όπως 0.9939 σημαίνει ότι το μοντέλο εκτιμά περίπου 99,39% πιθανότητα η συγκεκριμένη παρατήρηση να ανήκει στην κατηγορία loan_status = 1. Αντίστοιχα, μια τιμή όπως 0.0977 δείχνει πολύ μικρή πιθανότητα (περίπου 9,77%) για loan_status = 1, άρα η παρατήρηση είναι πιο πιθανό να ανήκει στην κατηγορία loan_status = 0.


Δημιουργία Confusion Matrix

cm <- table(test$loan_status, predictTest > 0.5)
cm
##    
##     FALSE  TRUE
##   0 11532   718
##   1   932  2568

True Negative (TN) = 11532: Το μοντέλο προέβλεψε ότι η κατηγορία είναι 0 (FALSE) και η πραγματική τιμή ήταν επίσης 0. Πρόκειται για σωστή πρόβλεψη αρνητικής περίπτωσης. False Positive (FP) = 718: Το μοντέλο προέβλεψε την κατηγορία 1 (TRUE), ενώ η πραγματική τιμή ήταν 0. Δηλαδή το μοντέλο θεώρησε ότι υπάρχει θετική περίπτωση ενώ στην πραγματικότητα δεν υπάρχει. False Negative (FN) = 932: Το μοντέλο προέβλεψε την κατηγορία 0 (FALSE), ενώ η πραγματική τιμή ήταν 1. Δηλαδή το μοντέλο δεν εντόπισε μια πραγματικά θετική περίπτωση. True Positive (TP) = 2568: Το μοντέλο προέβλεψε την κατηγορία 1 (TRUE) και η πραγματική τιμή ήταν επίσης 1. Πρόκειται για σωστή πρόβλεψη θετικής περίπτωσης.


Υπολογισμός μετρικών αξιολόγησης

TN <- cm[1,1]
FP <- cm[1,2]
FN <- cm[2,1]
TP <- cm[2,2]

accuracy <- (TP + TN) / sum(cm)

sensitivity <- TP / (TP + FN)

specificity <- TN / (TN + FP)

baseline <- max(table(test$loan_status)) / length(test$loan_status)

accuracy
## [1] 0.8952381
sensitivity
## [1] 0.7337143
specificity
## [1] 0.9413878
baseline
## [1] 0.7777778

Η accuracy του μοντέλου είναι 89.52%, γεγονός που σημαίνει ότι περίπου το 89.5% των παρατηρήσεων ταξινομούνται σωστά από το μοντέλο.

Η sensitivity είναι 73.37%, πράγμα που δείχνει ότι το μοντέλο αναγνωρίζει σωστά περίπου το 73% των θετικών περιπτώσεων της μεταβλητής loan_status.

Η specificity είναι 94.14%, γεγονός που σημαίνει ότι το μοντέλο έχει πολύ υψηλή ικανότητα να εντοπίζει σωστά τις αρνητικές περιπτώσεις.

Η baseline accuracy είναι 77.78%, η οποία αντιστοιχεί στην ακρίβεια που θα είχαμε αν προβλέπαμε πάντα την πιο συχνή κατηγορία της εξαρτημένης μεταβλητής.

Παρατηρούμε ότι η ακρίβεια του μοντέλου Logistic Regression (89.52%) είναι σημαντικά μεγαλύτερη από την baseline accuracy (77.78%), γεγονός που δείχνει ότι το μοντέλο έχει καλή προγνωστική ικανότητα και αποδίδει καλύτερα από μια απλή πρόβλεψη της πιο συχνής κατηγορίας. Επιπλέον, το μοντέλο παρουσιάζει ιδιαίτερα υψηλή specificity, ενώ η sensitivity είναι χαμηλότερη αλλά παραμένει σε ικανοποιητικό επίπεδο.


Δημιουργία νέου Logistic Regression μοντέλου

train2 <- na.omit(train)
test2 <- na.omit(test)

nrow(train2)
## [1] 29250
nrow(test2)
## [1] 15750

Αρχικά δημιουργήθηκαν δύο νέα σύνολα δεδομένων, train2 και test2, χρησιμοποιώντας τη συνάρτηση na.omit(). Η συνάρτηση αυτή αφαιρεί όλες τις παρατηρήσεις που περιέχουν ελλιπείς τιμές (NA), ώστε το μοντέλο να εκπαιδεύεται και να αξιολογείται μόνο με πλήρη δεδομένα.

Στη συνέχεια υπολογίστηκε το πλήθος των παρατηρήσεων σε κάθε νέο σύνολο δεδομένων με τη χρήση της εντολής nrow(). Τα αποτελέσματα έδειξαν ότι το train2 περιέχει 29.250 καταχωρήσεις, ενώ το test2 περιέχει 15.750 καταχωρήσεις.

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

LoanLog2 <- 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 = train2,
               family = binomial)

summary(LoanLog2)
## 
## 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 = train2)
## 
## Coefficients:
##                                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                       -6.675e-01  4.473e-01  -1.492   0.1356    
## person_age                         2.933e-02  1.356e-02   2.163   0.0306 *  
## person_gendermale                  5.266e-02  4.407e-02   1.195   0.2321    
## person_educationBachelor           3.724e-02  5.851e-02   0.636   0.5245    
## person_educationDoctorate          1.846e-01  1.791e-01   1.031   0.3027    
## person_educationHigh School        1.145e-01  6.116e-02   1.872   0.0612 .  
## person_educationMaster             8.408e-02  6.989e-02   1.203   0.2290    
## person_income                      8.272e-07  3.264e-07   2.535   0.0113 *  
## person_emp_exp                    -2.511e-02  1.202e-02  -2.088   0.0368 *  
## person_home_ownershipOTHER         2.677e-01  3.786e-01   0.707   0.4795    
## person_home_ownershipOWN          -1.515e+00  1.275e-01 -11.883  < 2e-16 ***
## person_home_ownershipRENT          6.976e-01  4.989e-02  13.984  < 2e-16 ***
## loan_amnt                         -1.056e-04  5.108e-06 -20.668  < 2e-16 ***
## loan_intentEDUCATION              -9.318e-01  7.265e-02 -12.827  < 2e-16 ***
## loan_intentHOMEIMPROVEMENT        -3.676e-02  8.159e-02  -0.451   0.6523    
## loan_intentMEDICAL                -3.403e-01  7.004e-02  -4.859 1.18e-06 ***
## loan_intentPERSONAL               -7.347e-01  7.471e-02  -9.835  < 2e-16 ***
## loan_intentVENTURE                -1.233e+00  7.933e-02 -15.544  < 2e-16 ***
## loan_int_rate                      3.416e-01  8.228e-03  41.510  < 2e-16 ***
## loan_percent_income                1.621e+01  3.972e-01  40.808  < 2e-16 ***
## cb_person_cred_hist_length        -7.818e-03  1.124e-02  -0.696   0.4865    
## credit_score                      -8.808e-03  5.083e-04 -17.330  < 2e-16 ***
## previous_loan_defaults_on_fileYes -2.036e+01  1.272e+02  -0.160   0.8729    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 30988  on 29249  degrees of freedom
## Residual deviance: 12839  on 29227  degrees of freedom
## AIC: 12885
## 
## Number of Fisher Scoring iterations: 19


Προβλέψεις στο νέο test set

predictTest2 <- predict(LoanLog2, type = "response", newdata = test2)


Δημιουργία αντικειμένου ROCR

ROCRpred <- prediction(predictTest2, test2$loan_status)


Δημιουργία ROC curve με color-coding

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

plot(ROCRperf, colorize = TRUE)


Υπολογισμός AUC

AUC <- performance(ROCRpred, "auc")
AUC@y.values[[1]]
## [1] 0.9530444

Η καμπύλη ROC παρουσιάζει τη σχέση μεταξύ του True Positive Rate (Sensitivity) και του False Positive Rate για διαφορετικές τιμές κατωφλίου. Η καμπύλη βρίσκεται κοντά στο πάνω αριστερό μέρος του διαγράμματος, γεγονός που υποδηλώνει καλή απόδοση του μοντέλου.

Η τιμή του AUC είναι 0.953, γεγονός που δείχνει ότι το μοντέλο Logistic Regression έχει πολύ υψηλή ικανότητα να διαχωρίζει σωστά τις δύο κατηγορίες της μεταβλητής loan_status. Όσο πιο κοντά είναι η τιμή του AUC στο 1, τόσο καλύτερη είναι η προγνωστική ικανότητα του μοντέλου.