setwd("C:/Users/jvill/Documents/ESCUELA/Machine/tarea 4")
base<-read.csv("base_unam.csv",header = TRUE,stringsAsFactors = FALSE)
base<-base[rowSums(is.na(base)) == 0,]
str(base)
## 'data.frame': 1440 obs. of 16 variables:
## $ cuenta : int 1 2 4 5 6 7 8 9 10 11 ...
## $ incumplido : int 1 0 1 0 0 0 0 0 0 0 ...
## $ limite : int 26500 86500 11000 14000 19000 39000 31500 12500 10100 48200 ...
## $ saldo : int 11819 86679 4139 9257 17518 1138 11264 11681 11091 7401 ...
## $ exigible : int 250 3640 2235 250 706 250 444 514 250 610 ...
## $ tasa : num 45.4 45.4 45.4 44 45.4 44 45.4 45.4 45.4 45.4 ...
## $ ACT : int 0 0 3 0 0 0 0 0 0 0 ...
## $ HIST : int 0 3 3 0 0 0 0 2 1 0 ...
## $ ATDC : num 72.1 71.1 70.1 67.1 66.1 ...
## $ PJPAGO : num 0.22 0.0692 0 0.3252 0.1284 ...
## $ PULINEA : num 0.446 1.002 0.376 0.661 0.922 ...
## $ ANTBANCO : num 81 70 69 95 65 126 63 62 62 61 ...
## $ BKATR : int 13 13 0 13 13 13 9 13 0 13 ...
## $ SEGMENTO_RIESGO : chr "Medio" "Bajo" "Medio" "Medio" ...
## $ monto_pagar_R_banco: int 2855 3450 250 580 730 597 480 1648 2320 0 ...
## $ monto_pagar_R : int 2855 3450 45648 3215 2263 1896 1361 3323 12665 12072 ...
library(RSQLite)
## Warning: package 'RSQLite' was built under R version 3.4.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.4.4
library(ROCR)
## Warning: package 'ROCR' was built under R version 3.4.3
## Loading required package: gplots
## Warning: package 'gplots' was built under R version 3.4.3
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
library(boot)
# Mostraremos la descripción de las varables que trabajaremos:
# incumplido: vale 1 si el crédito fue uncumplido, y cero en caso contrario.
# limite: máxima cantidad de la que puede disponer el acreditado.
# saldo: cantidad que ha dispuesto el acreditado.
# exigible:monto mínimo que el acreditado debe cubrir para cumplir con su obligación contractual.
# HIST: núumero de impagos observados en los últimos 6 meses.
# ATDC: meses que el acreditado tiene con tarjeta de crédito.
# PJPAGO: porcentaje que representa el pago realizado respecto al saldo a pagar.
# ANTBANCO: antiguedad del acreditado con la institución.
# BKATR: meses transcurridos desde el últimoatraso mayor a un día del acreditado en sus
# compromisos crediticios registrados en la totalidad de las sociedades de información
# crediticia con instituciones en los últimos trece meses.
# monto pagar R: monto correspondiente a la suma de todas las obligaciones que el
# acreditado tiene con todos sus acredores.
# ACT: núumero de impagos en periodos consecutivos inmediatos anteriores a la fecha reportada.
# Obtendremos las consultas de la variable "incumplido" con el resto en las que tenga
# sentido, agruparemos de dos en dos y haremos el conteo de las condiciones de la consulta
######################## EJERCICIO 2 ###############################################
# Para empezar, realizo un análisis de colinealidad mediante la matriz
# de correlaciones, y VIF.
#Matriz de correlaciones.
Rho<-as.matrix(base[,c(3,4,5,6,7,8,9,10,11,12,13,15,16)])
Matriz<-cor(Rho)
Matriz
## limite saldo exigible tasa
## limite 1.00000000 0.65857133 0.25454109 -0.4243573427
## saldo 0.65857133 1.00000000 0.47408190 -0.2900704255
## exigible 0.25454109 0.47408190 1.00000000 -0.0644901861
## tasa -0.42435734 -0.29007043 -0.06449019 1.0000000000
## ACT -0.09723007 0.01201097 0.09095665 0.0954249994
## HIST -0.08115960 0.03545240 0.05385523 0.1463793728
## ATDC 0.30763622 0.14628255 0.05226569 -0.1191483104
## PJPAGO 0.07947756 -0.21940612 -0.04726486 -0.1021641818
## PULINEA -0.23729914 0.35493045 0.15194309 0.1305423325
## ANTBANCO 0.38521419 0.20932607 0.08019304 -0.1599626669
## BKATR 0.06599925 -0.05583892 -0.09570180 -0.1323241606
## monto_pagar_R_banco 0.18388733 0.37105544 0.68002420 -0.0407601165
## monto_pagar_R 0.13363098 0.31551221 0.72491987 -0.0001609481
## ACT HIST ATDC PJPAGO
## limite -0.09723007 -0.08115960 0.30763622 0.07947756
## saldo 0.01201097 0.03545240 0.14628255 -0.21940612
## exigible 0.09095665 0.05385523 0.05226569 -0.04726486
## tasa 0.09542500 0.14637937 -0.11914831 -0.10216418
## ACT 1.00000000 0.60695844 -0.06111835 -0.17613676
## HIST 0.60695844 1.00000000 -0.03186817 -0.16274572
## ATDC -0.06111835 -0.03186817 1.00000000 0.06295373
## PJPAGO -0.17613676 -0.16274572 0.06295373 1.00000000
## PULINEA 0.17862958 0.20227201 -0.14044808 -0.49476713
## ANTBANCO -0.05221226 -0.05584552 0.68758400 0.04247264
## BKATR -0.15795589 -0.24909827 0.04798181 0.10381894
## monto_pagar_R_banco 0.11010019 0.07261329 0.02080571 -0.05773460
## monto_pagar_R 0.15040415 0.10353365 0.05486577 -0.05757469
## PULINEA ANTBANCO BKATR monto_pagar_R_banco
## limite -0.2372991 0.38521419 0.06599925 0.18388733
## saldo 0.3549305 0.20932607 -0.05583892 0.37105544
## exigible 0.1519431 0.08019304 -0.09570180 0.68002420
## tasa 0.1305423 -0.15996267 -0.13232416 -0.04076012
## ACT 0.1786296 -0.05221226 -0.15795589 0.11010019
## HIST 0.2022720 -0.05584552 -0.24909827 0.07261329
## ATDC -0.1404481 0.68758400 0.04798181 0.02080571
## PJPAGO -0.4947671 0.04247264 0.10381894 -0.05773460
## PULINEA 1.0000000 -0.17495324 -0.23961528 0.13735698
## ANTBANCO -0.1749532 1.00000000 0.05879586 0.11702375
## BKATR -0.2396153 0.05879586 1.00000000 -0.14904527
## monto_pagar_R_banco 0.1373570 0.11702375 -0.14904527 1.00000000
## monto_pagar_R 0.1425360 0.11756572 -0.20293854 0.78579274
## monto_pagar_R
## limite 0.1336309828
## saldo 0.3155122063
## exigible 0.7249198727
## tasa -0.0001609481
## ACT 0.1504041482
## HIST 0.1035336453
## ATDC 0.0548657678
## PJPAGO -0.0575746899
## PULINEA 0.1425360136
## ANTBANCO 0.1175657229
## BKATR -0.2029385412
## monto_pagar_R_banco 0.7857927385
## monto_pagar_R 1.0000000000
#Aquí podemos ver que las variables casi no están correlacionadas.
#Todas las correlaciones son menores a 0.8.
#Las correlaciones más grandes están alrededor de 0.6, y se dan entre:
# límite y saldo,
# hist y act,
# antbanco y atdc,
# monto_pagar_R_banco y exigible.
#Y aún hay 2 correlaciones más altas de 0.7 entre:
# monto_pagar_R y exigible
# monto_pagar_R y monto_pagar_R_banco (la más alta)
#Factores de inflación de varianza
M1<-lm(base$ACT~base$BKATR+base$HIST+base$monto_pagar_R+base$saldo+base$limite)
M2<-lm(base$BKATR~base$ACT+base$HIST+base$monto_pagar_R+base$saldo+base$limite)
M3<-lm(base$HIST~base$ACT+base$BKATR+base$monto_pagar_R+base$saldo+base$limite)
M4<-lm(base$monto_pagar_R~base$BKATR+base$HIST+base$ACT+base$saldo+base$limite)
M5<-lm(base$saldo~base$BKATR+base$HIST+base$monto_pagar_R+base$ACT+base$limite)
M6<-lm(base$limite~base$BKATR+base$HIST+base$monto_pagar_R+base$ACT+base$saldo)
r1<-summary(M1)$r.squared
r2<-summary(M2)$r.squared
r3<-summary(M3)$r.squared
r4<-summary(M4)$r.squared
r5<-summary(M5)$r.squared
r6<-summary(M6)$r.squared
v1<-1/(1-r1)
v2<-1/(1-r2)
v3<-1/(1-r3)
v4<-1/(1-r4)
v5<-1/(1-r5)
v6<-1/(1-r6)
#Todos los factores vif son aceptables, ya que, están cerca del 1,
#por los tanto, los modelos de M1 a M6 casi no presentan colinealidad.
######################## EJERCICIO 3 ###############################################
#Creamos la conección
db <- dbConnect(SQLite(),"Base")
dbSendQuery(db,"DROP TABLE Mibase")
## <SQLiteResult>
## SQL DROP TABLE Mibase
## ROWS Fetched: 0 [complete]
## Changed: 0
#Leemos la tabla con la que trabajaremos
dbWriteTable(conn = db, name = "Mibase",
value = base, row.names = FALSE)
## Warning: Closing open result set, pending rows
#Vemos nuestras variables
dbListFields(db, "Mibase")
## [1] "cuenta" "incumplido" "limite"
## [4] "saldo" "exigible" "tasa"
## [7] "ACT" "HIST" "ATDC"
## [10] "PJPAGO" "PULINEA" "ANTBANCO"
## [13] "BKATR" "SEGMENTO_RIESGO" "monto_pagar_R_banco"
## [16] "monto_pagar_R"
# Agrupamiento de variables,
# Primero trabajaremos con las variables categóricas
#(para obtener el woe y la iv de las variables respecto las respuesta):
TACT<-dbGetQuery(conn = db,"select ACT,incumplido,count(incumplido) as conteo
from (select
case when ACT in (2,3) then 3 else ACT end as ACT,
incumplido from Mibase)group by ACT,incumplido;")
THIST<-dbGetQuery(conn = db,"select HIST,incumplido,count(incumplido) as conteo
from (select
case when HIST in (3,4,5) then 3 else HIST end as HIST,
incumplido from Mibase)group by HIST,incumplido;")
TBKATR<-dbGetQuery(conn = db,"select BKATR,incumplido,count(incumplido) as conteo
from (select
case when BKATR in (0,1,2) then 1 else (case when BKATR=13 then
3 else 2 end)end as BKATR,
incumplido from Mibase)group by BKATR,incumplido;")
dbDisconnect(db)
#Construimos la tabla para calcular woe e iv para la variable ACT.
TACT
## ACT incumplido conteo
## 1 0 0 1183
## 2 0 1 108
## 3 1 0 72
## 4 1 1 25
## 5 3 0 14
## 6 3 1 38
Mact<-as.data.frame(matrix(TACT$conteo,nrow=3,ncol=2,byrow = TRUE))
colnames(Mact)<-c("Buenos","Malos")
rownames(Mact)<-c("0","1","2:3")
Mact
## Buenos Malos
## 0 1183 108
## 1 72 25
## 2:3 14 38
Mact$TodDist<-(Mact$Buenos+Mact$Malos)/sum(Mact)
Mact$BuenosDistr<-Mact$Buenos/sum(Mact$Buenos)
Mact$MalosDistr<-Mact$Malos/sum(Mact$Malos)
Mact$Tincmp<-Mact$Malos/(Mact$Buenos+Mact$Malos)
Mact$WOE<-log(Mact$BuenosDistr/Mact$MalosDistr)
IVACT<-sum((Mact$BuenosDistr-Mact$MalosDistr)*Mact$WOE)
#Cálculo del IV
IVACT #0.8359099 Act tiene fuerte poder predictivo
## [1] 0.8359099
#IV< .02 no predictivo
#IV .02-.1 bajo poder predictivo
#IV .1-.3 medio poder predictivo
#IV>.3 fuerte poder predictivo
#Construimos la tabla para la variable HIST
THIST
## HIST incumplido conteo
## 1 0 0 919
## 2 0 1 66
## 3 1 0 244
## 4 1 1 41
## 5 2 0 75
## 6 2 1 29
## 7 3 0 31
## 8 3 1 35
Mhist<-as.data.frame(matrix(THIST$conteo,nrow=4,ncol=2,byrow = TRUE))
colnames(Mhist)<-c("Buenos","Malos")
rownames(Mhist)<-c("0","1","2","3:5")
Mhist
## Buenos Malos
## 0 919 66
## 1 244 41
## 2 75 29
## 3:5 31 35
Mhist$TodDist<-(Mhist$Buenos+Mhist$Malos)/sum(Mhist)
Mhist$BuenosDistr<-Mhist$Buenos/sum(Mhist$Buenos)
Mhist$MalosDistr<-Mhist$Malos/sum(Mhist$Malos)
Mhist$Tincmp<-Mhist$Malos/(Mhist$Buenos+Mhist$Malos)
Mhist$WOE<-log(Mhist$BuenosDistr/Mhist$MalosDistr)
IVHIST<-sum((Mhist$BuenosDistr-Mhist$MalosDistr)*Mhist$WOE)
#Cálculo del IV # 0.722955 es buena variable explicativa
IVHIST
## [1] 0.722955
#Construimos la tabla para la variable BKATR
TBKATR
## BKATR incumplido conteo
## 1 1 0 240
## 2 1 1 77
## 3 2 0 152
## 4 2 1 23
## 5 3 0 877
## 6 3 1 71
Mbkatr<-as.data.frame(matrix(TBKATR$conteo,nrow=3,ncol=2,byrow = TRUE))
colnames(Mbkatr)<-c("Buenos","Malos")
rownames(Mbkatr)<-c("0-2","3-12","13")
Mbkatr
## Buenos Malos
## 0-2 240 77
## 3-12 152 23
## 13 877 71
Mbkatr$TodDist<-(Mbkatr$Buenos+Mbkatr$Malos)/sum(Mbkatr)
Mbkatr$BuenosDistr<-Mbkatr$Buenos/sum(Mbkatr$Buenos)
Mbkatr$MalosDistr<-Mbkatr$Malos/sum(Mbkatr$Malos)
Mbkatr$Tincmp<-Mbkatr$Malos/(Mbkatr$Buenos+Mbkatr$Malos)
Mbkatr$WOE<-log(Mbkatr$BuenosDistr/Mbkatr$MalosDistr)
IVBKATR<-sum((Mbkatr$BuenosDistr-Mbkatr$MalosDistr)*Mbkatr$WOE)
#Cálculo del IV
IVBKATR # 0.3688342 bkatr tiene un poder predictivo medio
## [1] 0.3688342
# Función para graficar las distribuciones de buenos y malos (KS)
grfs<-function(x){
plot(tapply(base[,x],base$incumplido,quantile,c(.1,.2,.3,.4,.5,.6,.7,.8,.9,1))$`0`,
c(.1,.2,.3,.4,.5,.6,.7,.8,.9,1),type="l",xlab="",ylab="",col="blue")
lines(tapply(base[,x],base$incumplido,quantile,c(.1,.2,.3,.4,.5,.6,.7,.8,.9,1))$`1`,
c(.1,.2,.3,.4,.5,.6,.7,.8,.9,1),col="red")
}
# Gráficas de IV y WoE de la variable HIST
barplot(Mhist$WOE,space=0,main="WOE HIST",ylab="WOE")
lines(Mhist$WOE)
points(Mhist$WOE)

# El WOE esta decreciendo, así que la variable HIST es candidata a ser elegida en la regresión
# Gráfica KS de la variable HIST
grfs("HIST")

# Observemos que las distribuciones entre buenos y malos si se distinguen bien, por lo que
# si consideraríamos esta variable.
# Gráficas de IV y WoE de la variable ACT
barplot(Mact$WOE,space=0,main="WOE ACT",ylab="WOE")
lines(Mact$WOE)
points(Mact$WOE)

# El WOE esta decreciendo, así que la variable ACT es candidata a ser elegida en la regresión
# Gráfica KS de la variable ACT
# La gráfica nos muestra que si hay una buena distinción para separar los datos buenos y malos
grfs("ACT")

# Gráficas de IV y WoE de la variable BKATR
barplot(Mbkatr$WOE,space=0,main="WOE BKATR",ylab="WOE")
lines(Mbkatr$WOE)
points(Mbkatr$WOE)

# El WOE esta de forma creciente, así que la variable bkatr es candidata a ser elegida en la regresión
# Gráfica KS de la variable BKATR
grfs("BKATR")

# Obsevamos que la distribucion entre buenos y malos se separa muy bien en dicha variable.
# Ahora analizaremos las variables continuas, para ello haremos asignación por cuantiles
ptsc1<-quantile(base$limite0,c(.2,.5,.7))
ptsc2<-quantile(base$saldo0,c(.25,.5,.75))
ptsc3<-quantile(base$exigible0,c(.25,.5,.75))
ptsc4<-quantile(base$monto_pagar_R,c(.25,.5,.75))
ptsc5<-quantile(base$ANTBANCO,c(.25,.5,.75))
ptsc6<-quantile(base$ATDC,c(.25,.5,.75))
ptsc7<-quantile(base$PJPAGO,c(.3,.55,.75))
# Construimos la tabla para la variable PJPAGO
db <- dbConnect(SQLite(),"Base")
TPJPAGO<-dbGetQuery(conn = db,"select PJPAGO,incumplido,count(incumplido) as conteo
from (select
case when PJPAGO<=.083 then 1 else (case when PJPAGO<=.1887 then
2 else (case when PJPAGO<=.41 then 3 else 4 end)end)end as PJPAGO,
incumplido from Mibase)group by PJPAGO,incumplido;")
TPJPAGO
## PJPAGO incumplido conteo
## 1 1 0 337
## 2 1 1 96
## 3 2 0 326
## 4 2 1 33
## 5 3 0 264
## 6 3 1 24
## 7 4 0 342
## 8 4 1 18
MPJPAGO<-as.data.frame(matrix(TPJPAGO$conteo,nrow=4,ncol=2,byrow = TRUE))
colnames(MPJPAGO)<-c("Buenos","Malos")
rownames(MPJPAGO)<-c("q30","q30-55","q55-75","q75-100")
MPJPAGO
## Buenos Malos
## q30 337 96
## q30-55 326 33
## q55-75 264 24
## q75-100 342 18
MPJPAGO$TodDist<-(MPJPAGO$Buenos+MPJPAGO$Malos)/sum(MPJPAGO)
MPJPAGO$BuenosDistr<-MPJPAGO$Buenos/sum(MPJPAGO$Buenos)
MPJPAGO$MalosDistr<-MPJPAGO$Malos/sum(MPJPAGO$Malos)
MPJPAGO$Tincmp<-MPJPAGO$Malos/(MPJPAGO$Buenos+MPJPAGO$Malos)
MPJPAGO$WOE<-log(MPJPAGO$BuenosDistr/MPJPAGO$MalosDistr)
IVPJPAGO<-sum((MPJPAGO$BuenosDistr-MPJPAGO$MalosDistr)*MPJPAGO$WOE)
#Cálculo del IV
IVPJPAGO
## [1] 0.4207904
#¿Qué podemos decir de la gráfica?
barplot(MPJPAGO$WOE,space=0,main="WOE PJPAGO",ylab="WOE")
lines(MPJPAGO$WOE)
points(MPJPAGO$WOE)

# El WOE tiene un comportamiento regular, es creciente, sin embargo su crecimiento no es constante
# Gráfica KS de la variable BKATR
grfs("PJPAGO")

# Observemos que no hay tanta separación entre las distribuciones de buenos y malos de la variable
# "PJPAGO", por lo que es posible que esta variable no vaya a ser considerada en el modelo
# de regresión
# Construimos la tabla para la variable ATDC
TATDC<-dbGetQuery(conn = db,"select ATDC,incumplido,count(incumplido) as conteo
from (select
case when ATDC<=18 then 1 else (case when ATDC<=46 then
2 else (case when ATDC<=100 then 3 else 4 end)end)end as ATDC,
incumplido from Mibase)group by ATDC,incumplido;")
TATDC
## ATDC incumplido conteo
## 1 1 0 304
## 2 1 1 42
## 3 2 0 322
## 4 2 1 44
## 5 3 0 322
## 6 3 1 38
## 7 4 0 321
## 8 4 1 47
MATDC<-as.data.frame(matrix(TATDC$conteo,nrow=4,ncol=2,byrow = TRUE))
colnames(MATDC)<-c("Buenos","Malos")
rownames(MATDC)<-c("q25","q25-50","q50-75","q75-100")
MATDC
## Buenos Malos
## q25 304 42
## q25-50 322 44
## q50-75 322 38
## q75-100 321 47
MATDC$TodDist<-(MATDC$Buenos+MATDC$Malos)/sum(MATDC)
MATDC$BuenosDistr<-MATDC$Buenos/sum(MATDC$Buenos)
MATDC$MalosDistr<-MATDC$Malos/sum(MATDC$Malos)
MATDC$Tincmp<-MATDC$Malos/(MATDC$Buenos+MATDC$Malos)
MATDC$WOE<-log(MATDC$BuenosDistr/MATDC$MalosDistr)
IVATDC<-sum((MATDC$BuenosDistr-MATDC$MalosDistr)*MATDC$WOE)
#Cálculo del IV
IVATDC
## [1] 0.006200212
#¿Qué podemos decir de la gráfica?
barplot(MATDC$WOE,space=0,main="WOE ATDC",ylab="WOE")
lines(MATDC$WOE)
points(MATDC$WOE)

# Obsevemos que la gráfica WOE de la variable ATDC es muy mala, no es creciente ni decreciente
# Entonces haremos otra partición para ver si mejora el comportamiento.
# Gráfica KS de la variable ATDC
grfs("ATDC")

# Observemos que no hay una aceptable separación entre las distribuciones, por lo que esta
# variable no es candidata a anexar en el modelo de regresión.
# Intentaremos hacer un ajuste para mejorar su comportamiento
ptsc6<-quantile(base$ATDC,c(.3,.6))
TATDC<-dbGetQuery(conn = db,"select ATDC,incumplido,count(incumplido) as conteo
from (select
case when ATDC<=21.05 then 3 else (case when ATDC<=69.111 then
2 else 1 end)end as ATDC,
incumplido from Mibase)group by ATDC,incumplido;")
TATDC
## ATDC incumplido conteo
## 1 1 0 504
## 2 1 1 74
## 3 2 0 391
## 4 2 1 42
## 5 3 0 374
## 6 3 1 55
MATDC<-as.data.frame(matrix(TATDC$conteo,nrow=3,ncol=2,byrow = TRUE))
colnames(MATDC)<-c("Buenos","Malos")
rownames(MATDC)<-c("q30","q30-60","q60-100")
MATDC
## Buenos Malos
## q30 504 74
## q30-60 391 42
## q60-100 374 55
MATDC$TodDist<-(MATDC$Buenos+MATDC$Malos)/sum(MATDC)
MATDC$BuenosDistr<-MATDC$Buenos/sum(MATDC$Buenos)
MATDC$MalosDistr<-MATDC$Malos/sum(MATDC$Malos)
MATDC$Tincmp<-MATDC$Malos/(MATDC$Buenos+MATDC$Malos)
MATDC$WOE<-log(MATDC$BuenosDistr/MATDC$MalosDistr)
IVATDC<-sum((MATDC$BuenosDistr-MATDC$MalosDistr)*MATDC$WOE)
#Cálculo del IV
IVATDC
## [1] 0.01957649
#¿Qué podemos decir de la gráfica?
barplot(MATDC$WOE,space=0,main="WOE ATDC",ylab="WOE")
lines(MATDC$WOE)
points(MATDC$WOE)

# Obsevemos que el WOE sigue siendo malo
# Gráfica KS de la variable ATDC
grfs("ATDC")

# Y las distribuciones continuan muy pegadas, así que esta variable no se considerará en
# el modelo de regresión.
# Construimos la tabla para la variable ANTBANCO
TANTBANCO<-dbGetQuery(conn = db,"select ANTBANCO,incumplido,count(incumplido) as conteo
from (select
case when ANTBANCO<=43 then 3 else (case when ANTBANCO<=86.5 then
2 else (case when ANTBANCO<=151 then 1 else 0 end)end)end as ANTBANCO,
incumplido from Mibase)group by ANTBANCO,incumplido;")
TANTBANCO
## ANTBANCO incumplido conteo
## 1 0 0 321
## 2 0 1 38
## 3 1 0 319
## 4 1 1 42
## 5 2 0 316
## 6 2 1 43
## 7 3 0 313
## 8 3 1 48
MTANTBANCO<-as.data.frame(matrix(TANTBANCO$conteo,nrow=4,ncol=2,byrow = TRUE))
colnames(MTANTBANCO)<-c("Buenos","Malos")
rownames(MTANTBANCO)<-c("q25","q25-50","q50-75","q75-100")
MTANTBANCO
## Buenos Malos
## q25 321 38
## q25-50 319 42
## q50-75 316 43
## q75-100 313 48
MTANTBANCO$TodDist<-(MTANTBANCO$Buenos+MTANTBANCO$Malos)/sum(MTANTBANCO)
MTANTBANCO$BuenosDistr<-MTANTBANCO$Buenos/sum(MTANTBANCO$Buenos)
MTANTBANCO$MalosDistr<-MTANTBANCO$Malos/sum(MTANTBANCO$Malos)
MTANTBANCO$Tincmp<-MTANTBANCO$Malos/(MTANTBANCO$Buenos+MTANTBANCO$Malos)
MTANTBANCO$WOE<-log(MTANTBANCO$BuenosDistr/MTANTBANCO$MalosDistr)
IVANTBANCO<-sum((MTANTBANCO$BuenosDistr-MTANTBANCO$MalosDistr)*MTANTBANCO$WOE)
#Cálculo del IV
IVANTBANCO
## [1] 0.008542045
#¿Qué podemos decir de la gráfica?
barplot(MTANTBANCO$WOE,space=0,main="WOE ANTBANCO",ylab="WOE")
lines(MTANTBANCO$WOE)
points(MTANTBANCO$WOE)

# Observemos que el WOE de la variable ANTBANCO tiene un comportamiento aceptable,
# sin embargo, haremos un ajuste para mejorarlo.
# Ajuste a la variable ANTBANCO
ptsc5<-quantile(base$ANTBANCO,c(.3,.7))
TANTBANCO<-dbGetQuery(conn = db,"select ANTBANCO,incumplido,count(incumplido) as conteo
from (select
case when ANTBANCO<=55 then 3 else (case when ANTBANCO<=131.3 then
2 else 1 end)end as ANTBANCO,
incumplido from Mibase)group by ANTBANCO,incumplido;")
TANTBANCO
## ANTBANCO incumplido conteo
## 1 1 0 384
## 2 1 1 48
## 3 2 0 506
## 4 2 1 67
## 5 3 0 379
## 6 3 1 56
MTANTBANCO<-as.data.frame(matrix(TANTBANCO$conteo,nrow=3,ncol=2,byrow = TRUE))
colnames(MTANTBANCO)<-c("Buenos","Malos")
rownames(MTANTBANCO)<-c("q30","q30-70","q70-100")
MTANTBANCO
## Buenos Malos
## q30 384 48
## q30-70 506 67
## q70-100 379 56
MTANTBANCO$TodDist<-(MTANTBANCO$Buenos+MTANTBANCO$Malos)/sum(MTANTBANCO)
MTANTBANCO$BuenosDistr<-MTANTBANCO$Buenos/sum(MTANTBANCO$Buenos)
MTANTBANCO$MalosDistr<-MTANTBANCO$Malos/sum(MTANTBANCO$Malos)
MTANTBANCO$Tincmp<-MTANTBANCO$Malos/(MTANTBANCO$Buenos+MTANTBANCO$Malos)
MTANTBANCO$WOE<-log(MTANTBANCO$BuenosDistr/MTANTBANCO$MalosDistr)
IVANTBANCO<-sum((MTANTBANCO$BuenosDistr-MTANTBANCO$MalosDistr)*MTANTBANCO$WOE)
#Cálculo del IV
IVANTBANCO
## [1] 0.004422249
#¿Qué podemos decir de la gráfica?
barplot(MTANTBANCO$WOE,space=0,main="WOE ANTBANCO",ylab="WOE")
lines(MTANTBANCO$WOE)
points(MTANTBANCO$WOE)

# Mejoró el comportamiento, así que quizá esta variable pueda ser considerada en el modelo.
# Gráfica KS de la variable ATDC
grfs("ANTBANCO")

# Y las distribuciones están muy pegadas, así que esta variable no se considerará en
# el modelo de regresión.
# Construimos la tabla para la variable limite
Tlimite0<-dbGetQuery(conn = db,"select limite,incumplido,count(incumplido) as conteo
from (select
case when limite<=13600 then 0 else (case when limite<=34500 then
1 else (case when limite<=56150 then 2 else 3 end)end)end as limite,
incumplido from Mibase)group by limite,incumplido;")
Tlimite0
## limite incumplido conteo
## 1 0 0 250
## 2 0 1 40
## 3 1 0 364
## 4 1 1 70
## 5 2 0 264
## 6 2 1 20
## 7 3 0 391
## 8 3 1 41
Mlimite0<-as.data.frame(matrix(Tlimite0$conteo,nrow=4,ncol=2,byrow = TRUE))
colnames(Mlimite0)<-c("Buenos","Malos")
rownames(Mlimite0)<-c("q20","q20-50","q50-75","q75-100")
Mlimite0
## Buenos Malos
## q20 250 40
## q20-50 364 70
## q50-75 264 20
## q75-100 391 41
Mlimite0$TodDist<-(Mlimite0$Buenos+Mlimite0$Malos)/sum(Mlimite0)
Mlimite0$BuenosDistr<-Mlimite0$Buenos/sum(Mlimite0$Buenos)
Mlimite0$MalosDistr<-Mlimite0$Malos/sum(Mlimite0$Malos)
Mlimite0$Tincmp<-Mlimite0$Malos/(Mlimite0$Buenos+Mlimite0$Malos)
Mlimite0$WOE<-log(Mlimite0$BuenosDistr/Mlimite0$MalosDistr)
IVlimite0<-sum((Mlimite0$BuenosDistr-Mlimite0$MalosDistr)*Mlimite0$WOE)
#Cálculo del IV
IVlimite0
## [1] 0.1195091
#¿Qué podemos decir de la gráfica?
barplot(Mlimite0$WOE,space=0,main="WOE Limite 0",ylab="WOE")
lines(Mlimite0$WOE)
points(Mlimite0$WOE)

# Veamos que el comportamiento del WOE es malísimo, así que es no es una variable adecuada para el modelo
# Gráfica KS de la variable ATDC
grfs("limite")

# Y las distribuciones están algo pegadas, así que esta variable no se considerará en
# el modelo de regresión.
#Cálculo del IV
IVlimite0
## [1] 0.1195091
#¿Qué podemos decir de la gráfica?
barplot(Mlimite0$WOE,space=0,main="WOE Limite 0",ylab="WOE")
lines(Mlimite0$WOE)
points(Mlimite0$WOE)

# El comportamiento del WOE mejoró mucho, ahora tiene un comportamiento creciente.
# Gráfica KS de la variable limite
grfs("limite")

# Y las distribuciones están un poco pegadas, así que esta variable está en duda de ser
# considerada en el modelo
# Construimos la tabla para la variable saldo
quantile(base$saldo,c(.2,.4,.6,.8))
## 20% 40% 60% 80%
## 4962.8 10035.0 17595.0 34579.0
Tsaldo0<-dbGetQuery(conn = db,"select saldo,incumplido,count(incumplido) as conteo
from (select
case when saldo<=4962.8 then 0 else (case when saldo<=10035 then
1 else (case when saldo<=17595 then 3 else (case when saldo<34579
then 4 else 5 end) end) end) end as saldo,
incumplido from Mibase)group by saldo,incumplido;")
Tsaldo0
## saldo incumplido conteo
## 1 0 0 253
## 2 0 1 35
## 3 1 0 263
## 4 1 1 26
## 5 3 0 261
## 6 3 1 26
## 7 4 0 248
## 8 4 1 40
## 9 5 0 244
## 10 5 1 44
Msaldo0<-as.data.frame(matrix(Tsaldo0$conteo,nrow=5,ncol=2,byrow = TRUE))
colnames(Msaldo0)<-c("Buenos","Malos")
rownames(Msaldo0)<-c("q20","q20-40","q40-60","q60-q80","q80-q100")
Msaldo0
## Buenos Malos
## q20 253 35
## q20-40 263 26
## q40-60 261 26
## q60-q80 248 40
## q80-q100 244 44
Msaldo0$TodDist<-(Msaldo0$Buenos+Msaldo0$Malos)/sum(Msaldo0)
Msaldo0$BuenosDistr<-Msaldo0$Buenos/sum(Msaldo0$Buenos)
Msaldo0$MalosDistr<-Msaldo0$Malos/sum(Msaldo0$Malos)
Msaldo0$Tincmp<-Msaldo0$Malos/(Msaldo0$Buenos+Msaldo0$Malos)
Msaldo0$WOE<-log(Msaldo0$BuenosDistr/Msaldo0$MalosDistr)
IVsaldo0<-sum((Msaldo0$BuenosDistr-Msaldo0$MalosDistr)*Msaldo0$WOE)
#Cálculo del IV
IVsaldo0
## [1] 0.05930468
#¿Qué podemos decir de la gráfica?
barplot(Msaldo0$WOE,space=0,main="WOE saldo 0",ylab="WOE")
lines(Msaldo0$WOE)
points(Msaldo0$WOE)

# El WOE de la variable saldo es muy malo
# Gráfica KS de la variable saldo
grfs("saldo")

# Y las distribuciones están muy pegadas, así que esta variable no se considerará en
# el modelo de regresión.
# Construimos la tabla para la variable monto_pagar_R
quantile(base$monto_pagar_R,c(.5,.75))
## 50% 75%
## 2587.5 5714.5
Tmonto_pagar_R<-dbGetQuery(conn = db,"select monto_pagar_R,incumplido,count(incumplido) as conteo
from (select
case when monto_pagar_R<=2587.5 then 0 else (case when monto_pagar_R<=5714.5 then
1 else 2 end) end as monto_pagar_R,
incumplido from Mibase)group by monto_pagar_R,incumplido;")
dbDisconnect(db)
Tmonto_pagar_R
## monto_pagar_R incumplido conteo
## 1 0 0 656
## 2 0 1 64
## 3 1 0 321
## 4 1 1 39
## 5 2 0 292
## 6 2 1 68
Mmonto_pagar_R<-as.data.frame(matrix(Tmonto_pagar_R$conteo,nrow=3,ncol=2,byrow = TRUE))
colnames(Mmonto_pagar_R)<-c("Buenos","Malos")
rownames(Mmonto_pagar_R)<-c("q30","q30-60","q60-100")
Mmonto_pagar_R
## Buenos Malos
## q30 656 64
## q30-60 321 39
## q60-100 292 68
Mmonto_pagar_R$TodDist<-(Mmonto_pagar_R$Buenos+Mmonto_pagar_R$Malos)/sum(Mmonto_pagar_R)
Mmonto_pagar_R$BuenosDistr<-Mmonto_pagar_R$Buenos/sum(Mmonto_pagar_R$Buenos)
Mmonto_pagar_R$MalosDistr<-Mmonto_pagar_R$Malos/sum(Mmonto_pagar_R$Malos)
Mmonto_pagar_R$Tincmp<-Mmonto_pagar_R$Malos/(Mmonto_pagar_R$Buenos+Mmonto_pagar_R$Malos)
Mmonto_pagar_R$WOE<-log(Mmonto_pagar_R$BuenosDistr/Mmonto_pagar_R$MalosDistr)
IVACT<-sum((Mmonto_pagar_R$BuenosDistr-Mmonto_pagar_R$MalosDistr)*Mmonto_pagar_R$WOE)
#Cálculo del IV
IVACT
## [1] 0.1403214
#¿Qué podemos decir de la gráfica?
barplot(Mmonto_pagar_R$WOE,space=0,main="WOE monto_pagar_R",ylab="WOE")
lines(Mmonto_pagar_R$WOE)
points(Mmonto_pagar_R$WOE)

# El comportamiento del WOE es decreciente y es aceptable
# Gráfica KS de la variable monto_pagar_R
grfs("monto_pagar_R")

# Y las distribuciones están muy pegadas en algunas partes,
# así que esta variable está en duda para ser considerada en el modelo de regresión.
### En conclusión, por los criterios del WOE y la gráfica del KS, las variables que
### eliminaremos son las siguientes: Saldo, limite, ANTBANCO y ATDC
### Por lo que nos quedaríamos con las variables: PJPAGO, ACT, BKATR, HIST y MPR
############################# Ejercicio 4 ###########################################
MPJPAGO
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp
## q30 337 96 0.3006944 0.2655634 0.5614035 0.22170901
## q30-55 326 33 0.2493056 0.2568952 0.1929825 0.09192201
## q55-75 264 24 0.2000000 0.2080378 0.1403509 0.08333333
## q75-100 342 18 0.2500000 0.2695035 0.1052632 0.05000000
## WOE
## q30 -0.7485862
## q30-55 0.2860689
## q55-75 0.3935744
## q75-100 0.9401181
base$WPJPAGO<-ifelse(base$PJPAGO<=0.083,MPJPAGO$WOE[1],ifelse(base$PJPAGO<=0.19,MPJPAGO$WOE[2],ifelse(base$PJPAGO<=0.41,MPJPAGO$WOE[3],MPJPAGO$WOE[4])))
MATDC
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp
## q30 504 74 0.4013889 0.3971631 0.4327485 0.12802768
## q30-60 391 42 0.3006944 0.3081166 0.2456140 0.09699769
## q60-100 374 55 0.2979167 0.2947203 0.3216374 0.12820513
## WOE
## q30 -0.08580974
## q30-60 0.22671703
## q60-100 -0.08739830
base$WATDC<-ifelse(base$ATDC<=18,MATDC$WOE[1],ifelse(base$ATDC<=46,MATDC$WOE[2],MATDC$WOE[3]))
MTANTBANCO
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp
## q30 384 48 0.3000000 0.3026005 0.2807018 0.1111111
## q30-70 506 67 0.3979167 0.3987392 0.3918129 0.1169284
## q70-100 379 56 0.3020833 0.2986604 0.3274854 0.1287356
## WOE
## q30 0.07512063
## q30-70 0.01752314
## q70-100 -0.09213640
base$WANTBANCO<-ifelse(base$ANTBANCO<=55,MTANTBANCO$WOE[3],ifelse(base$ANTBANCO<=131.3,MTANTBANCO$WOE[2],MTANTBANCO$WOE[1]))
Mact
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp WOE
## 0 1183 108 0.89652778 0.93223010 0.6315789 0.08365608 0.3893567
## 1 72 25 0.06736111 0.05673759 0.1461988 0.25773196 -0.9465306
## 2:3 14 38 0.03611111 0.01103231 0.2222222 0.73076923 -3.0028497
base$WACT<-ifelse(base$ACT==0,Mact$WOE[1],ifelse(base$ACT==1,Mact$WOE[2],Mact$WOE[3]))
Mbkatr
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp WOE
## 0-2 240 77 0.2201389 0.1891253 0.4502924 0.24290221 -0.8674874
## 3-12 152 23 0.1215278 0.1197794 0.1345029 0.13142857 -0.1159346
## 13 877 71 0.6583333 0.6910954 0.4152047 0.07489451 0.5095062
base$WBKATR<-ifelse(base$BKATR %in% c(0,1,2),Mbkatr$WOE[1],ifelse(base$BKATR %in% c(3,4,5,6,7,8,9,10,11,12),Mbkatr$WOE[2],Mbkatr$WOE[3]))
Mhist
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp WOE
## 0 919 66 0.68402778 0.72419228 0.3859649 0.06700508 0.6293105
## 1 244 41 0.19791667 0.19227738 0.2397661 0.14385965 -0.2207248
## 2 75 29 0.07222222 0.05910165 0.1695906 0.27884615 -1.0541286
## 3:5 31 35 0.04583333 0.02442868 0.2046784 0.53030303 -2.1256818
base$WHIST<-ifelse(base$HIST==0,Mhist$WOE[1],ifelse(base$HIST==1,Mhist$WOE[2],ifelse(base$HIST==2,Mhist$WOE[3],Mhist$WOE[4])))
Mlimite0
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp
## q20 250 40 0.2013889 0.1970055 0.2339181 0.13793103
## q20-50 364 70 0.3013889 0.2868400 0.4093567 0.16129032
## q50-75 264 20 0.1972222 0.2080378 0.1169591 0.07042254
## q75-100 391 41 0.3000000 0.3081166 0.2397661 0.09490741
## WOE
## q20 -0.1717394
## q20-50 -0.3556623
## q50-75 0.5758959
## q75-100 0.2508146
base$Wlimite0<-ifelse(base$limite<18670,Mlimite0$WOE[1],ifelse(base$limite<43200,Mlimite0$WOE[2],Mlimite0$WOE[3]))
Mmonto_pagar_R
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp WOE
## q30 656 64 0.50 0.5169425 0.3742690 0.08888889 0.3229568
## q30-60 321 39 0.25 0.2529551 0.2280702 0.10833333 0.1035586
## q60-100 292 68 0.25 0.2301024 0.3976608 0.18888889 -0.5470748
base$WMPR<-ifelse(base$monto_pagar_R<=2587.5,Mmonto_pagar_R$WOE[1],ifelse(base$monto_pagar_R<=5714.5,Mmonto_pagar_R$WOE[2],Mmonto_pagar_R$WOE[3]))
Msaldo0
## Buenos Malos TodDist BuenosDistr MalosDistr Tincmp
## q20 253 35 0.2000000 0.1993696 0.2046784 0.12152778
## q20-40 263 26 0.2006944 0.2072498 0.1520468 0.08996540
## q40-60 261 26 0.1993056 0.2056738 0.1520468 0.09059233
## q60-q80 248 40 0.2000000 0.1954295 0.2339181 0.13888889
## q80-q100 244 44 0.2000000 0.1922774 0.2573099 0.15277778
## WOE
## q20 -0.02627948
## q20-40 0.30973658
## q40-60 0.30210296
## q60-q80 -0.17977162
## q80-q100 -0.29134232
base$Wsaldo0<-ifelse(base$saldo<=4962.8,Msaldo0$WOE[1],
ifelse(base$saldo<=10035,Msaldo0$WOE[2],
ifelse(base$saldo<=17595,Msaldo0$WOE[3],
ifelse(base$saldo<=34579,Msaldo0$WOE[4],
Msaldo0$WOE[5]))))
str(base)
## 'data.frame': 1440 obs. of 25 variables:
## $ cuenta : int 1 2 4 5 6 7 8 9 10 11 ...
## $ incumplido : int 1 0 1 0 0 0 0 0 0 0 ...
## $ limite : int 26500 86500 11000 14000 19000 39000 31500 12500 10100 48200 ...
## $ saldo : int 11819 86679 4139 9257 17518 1138 11264 11681 11091 7401 ...
## $ exigible : int 250 3640 2235 250 706 250 444 514 250 610 ...
## $ tasa : num 45.4 45.4 45.4 44 45.4 44 45.4 45.4 45.4 45.4 ...
## $ ACT : int 0 0 3 0 0 0 0 0 0 0 ...
## $ HIST : int 0 3 3 0 0 0 0 2 1 0 ...
## $ ATDC : num 72.1 71.1 70.1 67.1 66.1 ...
## $ PJPAGO : num 0.22 0.0692 0 0.3252 0.1284 ...
## $ PULINEA : num 0.446 1.002 0.376 0.661 0.922 ...
## $ ANTBANCO : num 81 70 69 95 65 126 63 62 62 61 ...
## $ BKATR : int 13 13 0 13 13 13 9 13 0 13 ...
## $ SEGMENTO_RIESGO : chr "Medio" "Bajo" "Medio" "Medio" ...
## $ monto_pagar_R_banco: int 2855 3450 250 580 730 597 480 1648 2320 0 ...
## $ monto_pagar_R : int 2855 3450 45648 3215 2263 1896 1361 3323 12665 12072 ...
## $ WPJPAGO : num 0.394 -0.749 -0.749 0.394 0.286 ...
## $ WATDC : num -0.0874 -0.0874 -0.0874 -0.0874 -0.0874 ...
## $ WANTBANCO : num 0.0175 0.0175 0.0175 0.0175 0.0175 ...
## $ WACT : num 0.389 0.389 -3.003 0.389 0.389 ...
## $ WBKATR : num 0.51 0.51 -0.867 0.51 0.51 ...
## $ WHIST : num 0.629 -2.126 -2.126 0.629 0.629 ...
## $ Wlimite0 : num -0.356 0.576 -0.172 -0.172 -0.356 ...
## $ WMPR : num 0.104 0.104 -0.547 0.104 0.323 ...
## $ Wsaldo0 : num 0.3021 -0.2913 -0.0263 0.3097 0.3021 ...
#Modelo de regresión
base.glm1<-glm(incumplido ~ WACT+WBKATR+WHIST+WMPR+Wsaldo0+Wlimite0+WANTBANCO+WPJPAGO+WATDC,
family = binomial, base)
summary(base.glm1)
##
## Call:
## glm(formula = incumplido ~ WACT + WBKATR + WHIST + WMPR + Wsaldo0 +
## Wlimite0 + WANTBANCO + WPJPAGO + WATDC, family = binomial,
## data = base)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0243 -0.4613 -0.3416 -0.2768 2.6823
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.96988 0.09312 -21.154 < 2e-16 ***
## WACT -0.59460 0.12318 -4.827 1.39e-06 ***
## WBKATR -0.60550 0.15288 -3.961 7.47e-05 ***
## WHIST -0.39643 0.12982 -3.054 0.00226 **
## WMPR -0.72130 0.26747 -2.697 0.00700 **
## Wsaldo0 -0.50168 0.40891 -1.227 0.21987
## Wlimite0 -0.39168 0.24947 -1.570 0.11640
## WANTBANCO -1.22679 1.52850 -0.803 0.42220
## WPJPAGO -0.32885 0.15766 -2.086 0.03700 *
## WATDC -0.53536 0.70195 -0.763 0.44566
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1049.55 on 1439 degrees of freedom
## Residual deviance: 851.34 on 1430 degrees of freedom
## AIC: 871.34
##
## Number of Fisher Scoring iterations: 5
# En efecto, debemos eliminar las variables Wsaldo, Wlimite0, WATDC y WANTBANCO ya que no cumplen
# el criterio del p value(metodo backwards), de entrada suponemos eso para el modelo.
# Ahora aplicamos el método backwards completo.
#Selección hacia atras
M1<-step(base.glm1,direction = c("backward"))
## Start: AIC=871.34
## incumplido ~ WACT + WBKATR + WHIST + WMPR + Wsaldo0 + Wlimite0 +
## WANTBANCO + WPJPAGO + WATDC
##
## Df Deviance AIC
## - WATDC 1 851.93 869.93
## - WANTBANCO 1 851.98 869.98
## - Wsaldo0 1 852.86 870.86
## <none> 851.34 871.34
## - Wlimite0 1 853.82 871.82
## - WPJPAGO 1 855.65 873.65
## - WMPR 1 858.48 876.48
## - WHIST 1 860.05 878.05
## - WBKATR 1 866.68 884.68
## - WACT 1 876.58 894.58
##
## Step: AIC=869.93
## incumplido ~ WACT + WBKATR + WHIST + WMPR + Wsaldo0 + Wlimite0 +
## WANTBANCO + WPJPAGO
##
## Df Deviance AIC
## - WANTBANCO 1 852.28 868.28
## - Wsaldo0 1 853.51 869.51
## <none> 851.93 869.93
## - Wlimite0 1 854.44 870.44
## - WPJPAGO 1 856.16 872.16
## - WMPR 1 858.75 874.75
## - WHIST 1 860.94 876.94
## - WBKATR 1 867.00 883.00
## - WACT 1 876.94 892.94
##
## Step: AIC=868.28
## incumplido ~ WACT + WBKATR + WHIST + WMPR + Wsaldo0 + Wlimite0 +
## WPJPAGO
##
## Df Deviance AIC
## - Wsaldo0 1 853.81 867.81
## <none> 852.28 868.28
## - Wlimite0 1 855.20 869.20
## - WPJPAGO 1 856.51 870.51
## - WMPR 1 858.75 872.75
## - WHIST 1 861.27 875.27
## - WBKATR 1 867.67 881.67
## - WACT 1 877.58 891.58
##
## Step: AIC=867.81
## incumplido ~ WACT + WBKATR + WHIST + WMPR + Wlimite0 + WPJPAGO
##
## Df Deviance AIC
## - Wlimite0 1 855.79 867.79
## <none> 853.81 867.81
## - WPJPAGO 1 858.43 870.43
## - WMPR 1 862.19 874.19
## - WHIST 1 863.16 875.16
## - WBKATR 1 869.01 881.01
## - WACT 1 879.28 891.28
##
## Step: AIC=867.79
## incumplido ~ WACT + WBKATR + WHIST + WMPR + WPJPAGO
##
## Df Deviance AIC
## <none> 855.79 867.79
## - WPJPAGO 1 860.70 870.70
## - WMPR 1 862.56 872.56
## - WHIST 1 865.59 875.59
## - WBKATR 1 872.90 882.90
## - WACT 1 881.37 891.37
#En efecto, mediante el método backward comprobamos que nuestra elección
#de variables coincidió con las que elegimos por el criterio del p-value
# Finalmente, nuestro modelo propuesto es el siguiente:
base.glm<-glm(incumplido ~ WACT+WBKATR+WHIST+WMPR+WPJPAGO,
family = binomial, base)
summary(base.glm)
##
## Call:
## glm(formula = incumplido ~ WACT + WBKATR + WHIST + WMPR + WPJPAGO,
## family = binomial, data = base)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0008 -0.4605 -0.3522 -0.2834 2.5961
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.98287 0.09254 -21.428 < 2e-16 ***
## WACT -0.59533 0.12247 -4.861 1.17e-06 ***
## WBKATR -0.63123 0.15065 -4.190 2.79e-05 ***
## WHIST -0.42042 0.12931 -3.251 0.00115 **
## WMPR -0.63849 0.24267 -2.631 0.00851 **
## WPJPAGO -0.34857 0.15644 -2.228 0.02587 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1049.55 on 1439 degrees of freedom
## Residual deviance: 855.79 on 1434 degrees of freedom
## AIC: 867.79
##
## Number of Fisher Scoring iterations: 5
# Se observa una devianza pequeña (diferencia entre la nula y la residual),
# un AIC pequeño y todas las variables significativas.
############################### Ejercicio 5#########################################
T1<-M1$model
T1$pi<-M2$fitted.values
ggplot(T1,aes(x=pi))+geom_density(aes(group=incumplido,colour=incumplido))

z<-M1$fitted.values
#Matriz de confusión:
CM<-table(base$incumplido,ifelse(z>.4,1,0))
#PP=positivos predichos, FP=Negativos predichos
#P=positivos, N=negativos
colnames(CM)<-c("PP","nP")
rownames(CM)<-c("P","n")
CM
##
## PP nP
## P 1243 26
## n 119 52
#Algunos indicadores de la matriz de confusión
#Especificidad
(CM[2,2])/(CM[2,2]+CM[2,1])
## [1] 0.3040936
#Exactitud
(CM[1,1]+CM[2,2])/sum(CM)
## [1] 0.8993056
#Tasa de error
(CM[1,2]+CM[2,1])/sum(CM)
## [1] 0.1006944
#Sensibilidad
(CM[1,1])/(CM[1,1]+CM[1,2])
## [1] 0.9795114
#Curvas ROC y CAP
r<-predict(M2,base)
r<-exp(r)/(1+exp(r))
pred<-prediction(r,base$incumplido)
perf<-performance(pred,"tpr","fpr")
plot(perf,main="Modelo prueba")
abline(a=0,b=1)

auc<-performance(pred,"auc")
#Area bajo curva CAP:
auc@y.values[[1]]
## [1] 0.240932
#Consideramos que arriba de 0.7 es una buena estimación.
#Por lo tanto el modelo nos satisface.
#Bootstrap
MSE<-function(X,index){
M2<-glm(incumplido~WACT+WBKATR+WHIST+WMPR,family = binomial,X,subset =index)
z<-M2$fitted.values
Ta<-table(X$incumplido,ifelse(z>.4,1,0))
return ((Ta[1,1]+Ta[2,2])/sum(Ta))
}
#Error cuadrático estimado
MSE(base,sample(1440,1440,replace =T))
## [1] 0.8423611
boot(base,MSE,R=1000)
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = base, statistic = MSE, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 0.9 -0.05885 0.007217964