Clasificacion I
library(tidyverse)
library(rpart)
library(rpart.plot)
library(caret)
library(readxl)
library(rsample)
library(dplyr)
library(ROSE)
library(rattle)
library(randomForest)
library(plotly)
library(vcd)
source("funDT.R")
Arbol de decision
Lectura de los Datos
La variable Tarjet sera, MarcaMora_Tarjeta, dicha variable describe si un solicitante de trajeta de credito presenta o no un retraso en sus pagos.
Es de considerar que se dispone de un evento raro, pues notemos que:
0 1
0.96233399 0.03766601
se cuenta solo con 0.03 % de observaciones de una de las categorias, se abordara este problema mas adelante al balancear los datos.
datos.02 <- datos.01 %>% mutate(MarcaMora_Tarjeta=factor(MarcaMora_Tarjeta),
ORIGEN_APROBACION=factor(ORIGEN_APROBACION),
FORMA_PAGO=factor(FORMA_PAGO),
MARCA_CUENTA_CORRIENTE=factor(MARCA_CUENTA_CORRIENTE),
MARCA_CUENTA_AHORROS=factor(MARCA_CUENTA_AHORROS),
SEGMENTO_RIESGO=factor(SEGMENTO_RIESGO),
SUCURSAL=factor(SUCURSAL),
GENERO=factor(GENERO),
INSTRUCCION = factor(INSTRUCCION))
Rows: 22,965
Columns: 23
$ MarcaMora_Tarjeta <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
$ ORIGEN_APROBACION <fct> Proactivo, Demanda, Demanda, Proa~
$ FORMA_PAGO <fct> No, No, No, No, No, No, No, No, N~
$ SALDO_TOTAL_TARJETA <dbl> 1108.50, 601.56, 25.26, 12996.65,~
$ CUPO_PROMEDIO_TARJETA <dbl> 1400.0000, 3000.0000, 800.0000, 1~
$ SALDO_UTILIZ_PROM_CLIENTE <dbl> 1279.7483, 16.9700, 36.2250, 1759~
$ CANTIDAD_TOTAL_AVANCES <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
$ ANTIGUEDAD_TARJETA_ANIOS <dbl> 10, 7, 7, 7, 10, 10, 7, 7, 7, 7, ~
$ PROMEDIO_MENSUAL_CONSUMOS_LOCALES <dbl> 242.26, 0.00, 0.00, 404.59, 42.34~
$ MAXIMO_NUM_DIAS_VENCIDO <dbl> 21, 20, 31, 2, 2, 16, 7, 0, 19, 2~
$ NUMERO_OPERACIONES_TITULAR <dbl> 5, 2, 3, 7, 2, 2, 2, 2, 6, 7, 9, ~
$ PROMEDIO_DIAS_SOBREGIRO_CC <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0,~
$ PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO <dbl> 0.0000, 1627.4932, 4065.9979, 840~
$ MARCA_CUENTA_CORRIENTE <fct> No, Si, Si, Si, No, No, Si, Si, N~
$ MARCA_CUENTA_AHORROS <fct> No, Si, Si, Si, No, No, Si, Si, N~
$ RIESGO_CLIENTE_TOTAL_GFP <dbl> 1125.33, 601.56, 25.26, 16228.69,~
$ VALOR_DEPOSITO_A_PLAZO <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ~
$ SEGMENTO_RIESGO <fct> E, A, A, B, A, A, A, A, D, A, A, ~
$ SUCURSAL <fct> QUITO, QUITO, QUITO, AMBATO, QUIT~
$ EDAD <dbl> 27, 37, 46, 40, 29, 39, 44, 34, 3~
$ GENERO <fct> FEM, MAS, MAS, MAS, MAS, FEM, MAS~
$ INSTRUCCION <fct> PRI, UNI, SEC, UNI, UNI, UNI, SEC~
$ NUM_TC_SIST_FIM <dbl> 1, 0, 4, 2, 2, 3, 1, 0, 4, 5, 1, ~
Balanceo de los Datos.
set.seed(1727)
datos.02 <- ovun.sample(MarcaMora_Tarjeta ~ ., data = datos.02,
method = "both", p=0.5, N=5000, seed = 1)$data
0 1
0.5128 0.4872
Modelamiento
n= 3500
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 3500 1731 0 (0.5054286 0.4945714)
2) SEGMENTO_RIESGO=A 2700 1068 0 (0.6044444 0.3955556)
4) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO>=96.35285 1063 214 0 (0.7986830 0.2013170) *
5) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO< 96.35285 1637 783 1 (0.4783140 0.5216860)
10) ANTIGUEDAD_TARJETA_ANIOS>=3.5 426 115 0 (0.7300469 0.2699531) *
11) ANTIGUEDAD_TARJETA_ANIOS< 3.5 1211 472 1 (0.3897605 0.6102395)
22) CUPO_PROMEDIO_TARJETA>=975 848 371 1 (0.4375000 0.5625000)
44) MAXIMO_NUM_DIAS_VENCIDO< 3.5 213 82 0 (0.6150235 0.3849765) *
45) MAXIMO_NUM_DIAS_VENCIDO>=3.5 635 240 1 (0.3779528 0.6220472) *
23) CUPO_PROMEDIO_TARJETA< 975 363 101 1 (0.2782369 0.7217631) *
3) SEGMENTO_RIESGO=B,C,D,E 800 137 1 (0.1712500 0.8287500) *
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 527 17
1 186 41
Accuracy : 0.7367
95% CI : (0.7041, 0.7675)
No Information Rate : 0.9248
P-Value [Acc > NIR] : 1
Kappa : 0.1907
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.7391
Specificity : 0.7069
Pos Pred Value : 0.9688
Neg Pred Value : 0.1806
Prevalence : 0.9248
Detection Rate : 0.6835
Detection Prevalence : 0.7056
Balanced Accuracy : 0.7230
'Positive' Class : 0
n= 3500
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 3500 1710 0 (0.5114286 0.4885714)
2) SEGMENTO_RIESGO=A 2740 1079 0 (0.6062044 0.3937956)
4) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO>=82.9556 1121 232 0 (0.7930419 0.2069581)
8) CUPO_PROMEDIO_TARJETA>=275 953 153 0 (0.8394544 0.1605456) *
9) CUPO_PROMEDIO_TARJETA< 275 168 79 0 (0.5297619 0.4702381)
18) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO>=577.6946 53 4 0 (0.9245283 0.0754717) *
19) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO< 577.6946 115 40 1 (0.3478261 0.6521739) *
5) PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO< 82.9556 1619 772 1 (0.4768376 0.5231624)
10) ANTIGUEDAD_TARJETA_ANIOS>=4.5 390 103 0 (0.7358974 0.2641026) *
11) ANTIGUEDAD_TARJETA_ANIOS< 4.5 1229 485 1 (0.3946298 0.6053702)
22) CUPO_PROMEDIO_TARJETA>=2116.667 688 315 1 (0.4578488 0.5421512)
44) MAXIMO_NUM_DIAS_VENCIDO< 3.5 173 60 0 (0.6531792 0.3468208) *
45) MAXIMO_NUM_DIAS_VENCIDO>=3.5 515 202 1 (0.3922330 0.6077670) *
23) CUPO_PROMEDIO_TARJETA< 2116.667 541 170 1 (0.3142329 0.6857671) *
3) SEGMENTO_RIESGO=B,C,D,E 760 129 1 (0.1697368 0.8302632) *
prediccion_2 <- predict(arbol_2, newdata = test, type = "class")
cf.01 <- confusionMatrix(prediccion_2, test[["MarcaMora_Tarjeta"]])
cf.01
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 480 15
1 215 56
Accuracy : 0.6997
95% CI : (0.6659, 0.732)
No Information Rate : 0.9073
P-Value [Acc > NIR] : 1
Kappa : 0.2117
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.6906
Specificity : 0.7887
Pos Pred Value : 0.9697
Neg Pred Value : 0.2066
Prevalence : 0.9073
Detection Rate : 0.6266
Detection Prevalence : 0.6462
Balanced Accuracy : 0.7397
'Positive' Class : 0
mosaic(cf.01$table, shade = T, colorize = T,
gp = gpar(fill = matrix(c("green3", "red2", "red2", "green3"), 2, 2)))
#############Varios arboles
set.seed(1986)
unarbol <- crear_arbol(datos.02, "MarcaMora_Tarjeta", mi_cp = 0.005)
unarbol[["diagnostico"]]
$matriz
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 488 21
1 197 44
Accuracy : 0.7093
95% CI : (0.6754, 0.7416)
No Information Rate : 0.9133
P-Value [Acc > NIR] : 1
Kappa : 0.175
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.7124
Specificity : 0.6769
Pos Pred Value : 0.9587
Neg Pred Value : 0.1826
Prevalence : 0.9133
Detection Rate : 0.6507
Detection Prevalence : 0.6787
Balanced Accuracy : 0.6947
'Positive' Class : 0
$mincp
CP.mÃ.nimo CP.original Podar
1 0.005 0.005 NO
Random Forest
# Selección de una submuestra del 70% de los datos
set.seed(101)
train <- sample_frac(datos.02, .7)
test <- setdiff(datos.02, train)
Modelamiento
Call:
randomForest(formula = MarcaMora_Tarjeta ~ ., data = train)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 4
OOB estimate of error rate: 9.8%
Confusion matrix:
0 1 class.error
0 1537 245 0.13748597
1 98 1620 0.05704307
MeanDecreaseGini
ORIGEN_APROBACION 12.897667
FORMA_PAGO 19.323469
SALDO_TOTAL_TARJETA 132.920692
CUPO_PROMEDIO_TARJETA 129.155735
SALDO_UTILIZ_PROM_CLIENTE 115.868353
CANTIDAD_TOTAL_AVANCES 66.599204
ANTIGUEDAD_TARJETA_ANIOS 131.959091
PROMEDIO_MENSUAL_CONSUMOS_LOCALES 94.982697
MAXIMO_NUM_DIAS_VENCIDO 130.778519
NUMERO_OPERACIONES_TITULAR 70.639827
PROMEDIO_DIAS_SOBREGIRO_CC 14.640231
PROMEDIO_MENSUAL_SALDO_CUENTA_PASIVO 208.845349
MARCA_CUENTA_CORRIENTE 13.947627
MARCA_CUENTA_AHORROS 13.320979
RIESGO_CLIENTE_TOTAL_GFP 138.862920
VALOR_DEPOSITO_A_PLAZO 3.241731
SEGMENTO_RIESGO 141.998891
SUCURSAL 76.368071
EDAD 102.573090
GENERO 19.928940
INSTRUCCION 35.833435
NUM_TC_SIST_FIM 59.652757
MarcaMora_Tarjeta
predicciones 0 1
0 598 24
1 114 36
[1] 82.12435
mosaic(mc, shade = T, colorize = T,
gp = gpar(fill = matrix(c("green3", "red2", "red2", "green3"), 2, 2)))