This data is from a SPSS Dataset and used for demonstration. This is intended to illstrate the use of a R Markdown Notebook for presentation.

The data was exported to csv and used with R and Rattle. For more information visit www.thinkqlik.com

bank_loan_train<-read.csv("c:/efrayer/R_Projects/BankLoan/data/bankloan_train.csv")
summary(bank_loan_train)
  ï..record_id        age              ed            employ      
 Min.   :  1.0   Min.   :20.00   Min.   :1.000   Min.   : 0.000  
 1st Qu.:175.8   1st Qu.:29.00   1st Qu.:1.000   1st Qu.: 3.000  
 Median :350.5   Median :34.00   Median :1.000   Median : 7.000  
 Mean   :350.5   Mean   :34.86   Mean   :1.723   Mean   : 8.389  
 3rd Qu.:525.2   3rd Qu.:40.00   3rd Qu.:2.000   3rd Qu.:12.000  
 Max.   :700.0   Max.   :56.00   Max.   :5.000   Max.   :31.000  
    address           income         debtinc         creddebt     
 Min.   : 0.000   Min.   : 14.0   Min.   : 0.40   Min.   : 0.010  
 1st Qu.: 3.000   1st Qu.: 24.0   1st Qu.: 5.00   1st Qu.: 0.370  
 Median : 7.000   Median : 34.0   Median : 8.60   Median : 0.855  
 Mean   : 8.279   Mean   : 45.6   Mean   :10.26   Mean   : 1.553  
 3rd Qu.:12.000   3rd Qu.: 55.0   3rd Qu.:14.12   3rd Qu.: 1.905  
 Max.   :34.000   Max.   :446.0   Max.   :41.30   Max.   :20.560  
    othdebt          default          preddef1      
 Min.   : 0.050   Min.   :0.0000   Min.   :0.00052  
 1st Qu.: 1.048   1st Qu.:0.0000   1st Qu.:0.04890  
 Median : 1.985   Median :0.0000   Median :0.17574  
 Mean   : 3.058   Mean   :0.2614   Mean   :0.26143  
 3rd Qu.: 3.928   3rd Qu.:1.0000   3rd Qu.:0.41882  
 Max.   :27.030   Max.   :1.0000   Max.   :0.99940  
bank_loan_glm=glm(data=bank_loan_train,default~
                    address+
                    employ+ 
                    debtinc+
                    creddebt
            ,family=binomial())
summary(bank_loan_glm)

Call:
glm(formula = default ~ address + employ + debtinc + creddebt, 
    family = binomial(), data = bank_loan_train)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4483  -0.6396  -0.3108   0.2583   2.8496  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.79107    0.25154  -3.145  0.00166 ** 
address     -0.08122    0.01960  -4.144 3.41e-05 ***
employ      -0.24258    0.02806  -8.646  < 2e-16 ***
debtinc      0.08827    0.01854   4.760 1.93e-06 ***
creddebt     0.57290    0.08725   6.566 5.17e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 804.36  on 699  degrees of freedom
Residual deviance: 556.74  on 695  degrees of freedom
AIC: 566.74

Number of Fisher Scoring iterations: 6
anova(bank_loan_glm)
Analysis of Deviance Table

Model: binomial, link: logit

Response: default

Terms added sequentially (first to last)

         Df Deviance Resid. Df Resid. Dev
NULL                       699     804.36
address   1   20.452       698     783.91
employ    1   49.798       697     734.11
debtinc   1  111.762       696     622.35
creddebt  1   65.613       695     556.74
coefficients(bank_loan_glm)
(Intercept)     address      employ     debtinc    creddebt 
-0.79107079 -0.08122146 -0.24258492  0.08826530  0.57289682 

Evaluate model performance on the training dataset.

ROC Curve: requires the ROCR package.

library(ROCR)
# ROC Curve: requires the ggplot2 package.
library(ggplot2, quietly=TRUE)
RStudio Community is a great place to get help:
https://community.rstudio.com/c/tidyverse.
crs$input     <- c("employ", "address", "debtinc", "creddebt")
crs$numeric   <- c("employ", "address", "debtinc", "creddebt")
crs$categoric <- NULL
crs$target    <- "default"
crs$glm <- glm(default ~ .,
    data=crs$dataset[, c(crs$input, crs$target)],
    family=binomial(link="logit"))
crs$pr <- predict(crs$glm, 
   type    = "response",
   newdata = crs$dataset[,c(crs$input, crs$target)])
# Remove observations with missing target.
no.miss   <- na.omit(crs$dataset[,c(crs$input, crs$target)]$default)
miss.list <- attr(no.miss, "na.action")
attributes(no.miss) <- NULL
if (length(miss.list))
{
  pred <- prediction(crs$pr[-miss.list], no.miss)
} else
{
  pred <- prediction(crs$pr, no.miss)
}
pe <- performance(pred, "tpr", "fpr")
au <- performance(pred, "auc")@y.values[[1]]
pd <- data.frame(fpr=unlist(pe@x.values), tpr=unlist(pe@y.values))
p <- ggplot(pd, aes(x=fpr, y=tpr))
p <- p + geom_line(colour="red")
p <- p + xlab("False Positive Rate") + ylab("True Positive Rate")
p <- p + ggtitle("ROC Curve Linear bankloan_train.csv [**train**] default")
p <- p + theme(plot.title=element_text(size=10))
p <- p + geom_line(data=data.frame(), aes(x=c(0,1), y=c(0,1)), colour="grey")
p <- p + annotate("text", x=0.50, y=0.00, hjust=0, vjust=0, size=5,
                   label=paste("AUC =", round(au, 2)))
print(p)

# Calculate the area under the curve for the plot.
# Remove observations with missing target.
no.miss   <- na.omit(crs$dataset[,c(crs$input, crs$target)]$default)
miss.list <- attr(no.miss, "na.action")
attributes(no.miss) <- NULL
if (length(miss.list))
{
  pred <- prediction(crs$pr[-miss.list], no.miss)
} else
{
  pred <- prediction(crs$pr, no.miss)
}
performance(pred, "auc")
An object of class "performance"
Slot "x.name":
[1] "None"

Slot "y.name":
[1] "Area under the ROC curve"

Slot "alpha.name":
[1] "none"

Slot "x.values":
list()

Slot "y.values":
[[1]]
[1] 0.8556193


Slot "alpha.values":
list()
LS0tDQp0aXRsZTogIklCTS9TUFNTIEJhbmsgTG9hbiBEYXRhIC0gQmluYXJ5IExvZ2lzdGljIFJlZ3Jlc3Npb24iDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KDQpUaGlzIGRhdGEgaXMgZnJvbSBhIFNQU1MgRGF0YXNldCBhbmQgdXNlZCBmb3IgZGVtb25zdHJhdGlvbi4gVGhpcyBpcyBpbnRlbmRlZCB0byBpbGxzdHJhdGUgdGhlIHVzZSBvZiBhIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vayBmb3IgcHJlc2VudGF0aW9uLiANCg0KVGhlIGRhdGEgd2FzIGV4cG9ydGVkIHRvIGNzdiBhbmQgdXNlZCB3aXRoIFIgYW5kIFJhdHRsZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHZpc2l0IHd3dy50aGlua3FsaWsuY29tIA0KDQpgYGB7cn0NCmJhbmtfbG9hbl90cmFpbjwtcmVhZC5jc3YoImM6L2VmcmF5ZXIvUl9Qcm9qZWN0cy9CYW5rTG9hbi9kYXRhL2Jhbmtsb2FuX3RyYWluLmNzdiIpDQpzdW1tYXJ5KGJhbmtfbG9hbl90cmFpbikNCmBgYA0KDQoNCmBgYHtyfQ0KYmFua19sb2FuX2dsbT1nbG0oZGF0YT1iYW5rX2xvYW5fdHJhaW4sZGVmYXVsdH4NCiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcysNCiAgICAgICAgICAgICAgICAgICAgZW1wbG95KyANCiAgICAgICAgICAgICAgICAgICAgZGVidGluYysNCiAgICAgICAgICAgICAgICAgICAgY3JlZGRlYnQNCiAgICAgICAgICAgICxmYW1pbHk9Ymlub21pYWwoKSkNCg0Kc3VtbWFyeShiYW5rX2xvYW5fZ2xtKQ0KDQpgYGANCg0KYGBge3J9DQphbm92YShiYW5rX2xvYW5fZ2xtKQ0KY29lZmZpY2llbnRzKGJhbmtfbG9hbl9nbG0pDQpgYGANCg0KRXZhbHVhdGUgbW9kZWwgcGVyZm9ybWFuY2Ugb24gdGhlIHRyYWluaW5nIGRhdGFzZXQuDQoNClJPQyBDdXJ2ZTogcmVxdWlyZXMgdGhlIFJPQ1IgcGFja2FnZS4NCg0KDQpgYGB7cn0NCmxpYnJhcnkoUk9DUikNCg0KIyBST0MgQ3VydmU6IHJlcXVpcmVzIHRoZSBnZ3Bsb3QyIHBhY2thZ2UuDQoNCmxpYnJhcnkoZ2dwbG90MiwgcXVpZXRseT1UUlVFKQ0KDQoNCmNycyRpbnB1dCAgICAgPC0gYygiZW1wbG95IiwgImFkZHJlc3MiLCAiZGVidGluYyIsICJjcmVkZGVidCIpDQoNCmNycyRudW1lcmljICAgPC0gYygiZW1wbG95IiwgImFkZHJlc3MiLCAiZGVidGluYyIsICJjcmVkZGVidCIpDQoNCmNycyRjYXRlZ29yaWMgPC0gTlVMTA0KDQpjcnMkdGFyZ2V0ICAgIDwtICJkZWZhdWx0Ig0KDQpjcnMkZ2xtIDwtIGdsbShkZWZhdWx0IH4gLiwNCiAgICBkYXRhPWNycyRkYXRhc2V0WywgYyhjcnMkaW5wdXQsIGNycyR0YXJnZXQpXSwNCiAgICBmYW1pbHk9Ymlub21pYWwobGluaz0ibG9naXQiKSkNCg0KY3JzJHByIDwtIHByZWRpY3QoY3JzJGdsbSwgDQogICB0eXBlICAgID0gInJlc3BvbnNlIiwNCiAgIG5ld2RhdGEgPSBjcnMkZGF0YXNldFssYyhjcnMkaW5wdXQsIGNycyR0YXJnZXQpXSkNCg0KIyBSZW1vdmUgb2JzZXJ2YXRpb25zIHdpdGggbWlzc2luZyB0YXJnZXQuDQoNCm5vLm1pc3MgICA8LSBuYS5vbWl0KGNycyRkYXRhc2V0WyxjKGNycyRpbnB1dCwgY3JzJHRhcmdldCldJGRlZmF1bHQpDQptaXNzLmxpc3QgPC0gYXR0cihuby5taXNzLCAibmEuYWN0aW9uIikNCmF0dHJpYnV0ZXMobm8ubWlzcykgPC0gTlVMTA0KDQppZiAobGVuZ3RoKG1pc3MubGlzdCkpDQp7DQogIHByZWQgPC0gcHJlZGljdGlvbihjcnMkcHJbLW1pc3MubGlzdF0sIG5vLm1pc3MpDQp9IGVsc2UNCnsNCiAgcHJlZCA8LSBwcmVkaWN0aW9uKGNycyRwciwgbm8ubWlzcykNCn0NCg0KcGUgPC0gcGVyZm9ybWFuY2UocHJlZCwgInRwciIsICJmcHIiKQ0KYXUgPC0gcGVyZm9ybWFuY2UocHJlZCwgImF1YyIpQHkudmFsdWVzW1sxXV0NCnBkIDwtIGRhdGEuZnJhbWUoZnByPXVubGlzdChwZUB4LnZhbHVlcyksIHRwcj11bmxpc3QocGVAeS52YWx1ZXMpKQ0KcCA8LSBnZ3Bsb3QocGQsIGFlcyh4PWZwciwgeT10cHIpKQ0KcCA8LSBwICsgZ2VvbV9saW5lKGNvbG91cj0icmVkIikNCnAgPC0gcCArIHhsYWIoIkZhbHNlIFBvc2l0aXZlIFJhdGUiKSArIHlsYWIoIlRydWUgUG9zaXRpdmUgUmF0ZSIpDQpwIDwtIHAgKyBnZ3RpdGxlKCJST0MgQ3VydmUgTGluZWFyIGJhbmtsb2FuX3RyYWluLmNzdiBbKip0cmFpbioqXSBkZWZhdWx0IikNCnAgPC0gcCArIHRoZW1lKHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApKQ0KcCA8LSBwICsgZ2VvbV9saW5lKGRhdGE9ZGF0YS5mcmFtZSgpLCBhZXMoeD1jKDAsMSksIHk9YygwLDEpKSwgY29sb3VyPSJncmV5IikNCnAgPC0gcCArIGFubm90YXRlKCJ0ZXh0IiwgeD0wLjUwLCB5PTAuMDAsIGhqdXN0PTAsIHZqdXN0PTAsIHNpemU9NSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbD1wYXN0ZSgiQVVDID0iLCByb3VuZChhdSwgMikpKQ0KcHJpbnQocCkNCg0KIyBDYWxjdWxhdGUgdGhlIGFyZWEgdW5kZXIgdGhlIGN1cnZlIGZvciB0aGUgcGxvdC4NCg0KIyBSZW1vdmUgb2JzZXJ2YXRpb25zIHdpdGggbWlzc2luZyB0YXJnZXQuDQoNCm5vLm1pc3MgICA8LSBuYS5vbWl0KGNycyRkYXRhc2V0WyxjKGNycyRpbnB1dCwgY3JzJHRhcmdldCldJGRlZmF1bHQpDQptaXNzLmxpc3QgPC0gYXR0cihuby5taXNzLCAibmEuYWN0aW9uIikNCmF0dHJpYnV0ZXMobm8ubWlzcykgPC0gTlVMTA0KDQppZiAobGVuZ3RoKG1pc3MubGlzdCkpDQp7DQogIHByZWQgPC0gcHJlZGljdGlvbihjcnMkcHJbLW1pc3MubGlzdF0sIG5vLm1pc3MpDQp9IGVsc2UNCnsNCiAgcHJlZCA8LSBwcmVkaWN0aW9uKGNycyRwciwgbm8ubWlzcykNCn0NCnBlcmZvcm1hbmNlKHByZWQsICJhdWMiKQ0KDQoNCmBgYA0KDQo=