Usted trabaja para una conocida aseguradora nacional al cual un Banco internacional le ha solicitado un presupuesto. Para ello su equipo debe entregar el precio base estimado de los seguros al crédito, el cual se ocupa como parámetro posteriormente para tarificar los distinto productos. El economista con el cual usted trabajada ha diseñado una fórmula para calcular este precio:
Precio base del seguro por persona= (3(1+0.03+p)) UF Donde p corresponde al factor de penalización por riesgo y su fórmula es: p=(0.1 score de riesgo) Donde el score de riesgo debe ir entre 0 y 1, y debe reflejar qué tan probable es que un cliente caiga en mora (en general y con los datos de hoy, no para un momento particular) Se le ha encargado calcular este score a partir de los datos que han sido entregados por el Banco y presentar en una reunión de 15 minutos sus resultados a la gerencia. (esta será realizada por Skype y “la gerencia” será el reclutador técnico).
El siguiente resumen tiene como finalidad mostrar análisis y detalle de los pasos realizados en la solución del problema. El desafio se encuentra establecido en los márgenes de un modelo de riesgo, para ello ha sido utilizado el modelo de regresión logística con la metodología de scorecard.
A continuación se indican los pasos en la resolución del problema:
#Variables continuas#
describe(data_desafio_seguros$var_2)
## data_desafio_seguros$var_2
## n missing distinct Info Mean Gmd .05 .10
## 900 0 32 0.985 21.09 13 6 9
## .25 .50 .75 .90 .95
## 12 18 24 36 48
##
## lowest : 4 6 7 8 9, highest: 47 48 54 60 72
ggplot(data_desafio_seguros, aes(x=var_2))+
geom_histogram(color="steelblue", fill="lightblue")+ggtitle("Histograma Duración en meses")
describe(data_desafio_seguros$var_5)
## data_desafio_seguros$var_5
## n missing distinct Info Mean Gmd .05 .10
## 900 0 836 1 3276 2738 707.9 957.3
## .25 .50 .75 .90 .95
## 1382.0 2328.0 3994.0 6970.2 9040.1
##
## lowest : 250 276 338 339 343, highest: 14896 15653 15672 15857 18424
ggplot(data_desafio_seguros, aes(x=var_5))+
geom_histogram(color="steelblue", fill="lightblue")+ggtitle("Histograma Monto del crédito ")
describe(data_desafio_seguros$var_13)
## data_desafio_seguros$var_13
## n missing distinct Info Mean Gmd .05 .10
## 900 0 53 0.999 35.57 12.45 22 23
## .25 .50 .75 .90 .95
## 27 33 42 52 60
##
## lowest : 19 20 21 22 23, highest: 67 68 70 74 75
ggplot(data_desafio_seguros, aes(x=var_13))+
geom_histogram(color="steelblue", fill="lightblue")+ggtitle("Histograma Edad en años")
#Variables cualitativas#
describe(data_desafio_seguros$var_1)
## data_desafio_seguros$var_1
## n missing distinct
## 900 0 4
##
## Value A11 A12 A13 A14
## Frequency 243 242 61 354
## Proportion 0.270 0.269 0.068 0.393
ggplot(data_desafio_seguros, aes(var_1)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_3)
## data_desafio_seguros$var_3
## n missing distinct
## 900 0 5
##
## Value A30 A31 A32 A33 A34
## Frequency 32 46 472 84 266
## Proportion 0.036 0.051 0.524 0.093 0.296
ggplot(data_desafio_seguros, aes(var_3)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_4)
## data_desafio_seguros$var_4
## n missing distinct
## 900 0 10
##
## Value A40 A41 A410 A42 A43 A44 A45 A46 A48 A49
## Frequency 214 93 11 169 246 9 18 45 8 87
## Proportion 0.238 0.103 0.012 0.188 0.273 0.010 0.020 0.050 0.009 0.097
ggplot(data_desafio_seguros, aes(var_4)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_6)
## data_desafio_seguros$var_6
## n missing distinct
## 900 0 5
##
## Value A61 A62 A63 A64 A65
## Frequency 538 94 60 43 165
## Proportion 0.598 0.104 0.067 0.048 0.183
ggplot(data_desafio_seguros, aes(var_6)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_7)
## data_desafio_seguros$var_7
## n missing distinct
## 900 0 5
##
## Value A71 A72 A73 A74 A75
## Frequency 57 151 309 155 228
## Proportion 0.063 0.168 0.343 0.172 0.253
ggplot(data_desafio_seguros, aes(var_7)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_8)
## data_desafio_seguros$var_8
## n missing distinct Info Mean Gmd
## 900 0 4 0.872 2.976 1.196
##
## Value 1 2 3 4
## Frequency 119 214 137 430
## Proportion 0.132 0.238 0.152 0.478
ggplot(data_desafio_seguros, aes(var_8)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_9)
## data_desafio_seguros$var_9
## n missing distinct
## 900 0 4
##
## Value A91 A92 A93 A94
## Frequency 47 273 494 86
## Proportion 0.052 0.303 0.549 0.096
ggplot(data_desafio_seguros, aes(var_9)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_10)
## data_desafio_seguros$var_10
## n missing distinct
## 900 0 3
##
## Value A101 A102 A103
## Frequency 820 37 43
## Proportion 0.911 0.041 0.048
ggplot(data_desafio_seguros, aes(var_10)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_11)
## data_desafio_seguros$var_11
## n missing distinct Info Mean Gmd
## 900 0 4 0.895 2.85 1.195
##
## Value 1 2 3 4
## Frequency 112 281 137 370
## Proportion 0.124 0.312 0.152 0.411
ggplot(data_desafio_seguros, aes(var_11)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_12)
## data_desafio_seguros$var_12
## n missing distinct
## 900 0 4
##
## Value A121 A122 A123 A124
## Frequency 251 214 298 137
## Proportion 0.279 0.238 0.331 0.152
ggplot(data_desafio_seguros, aes(var_12)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_14)
## data_desafio_seguros$var_14
## n missing distinct
## 900 0 3
##
## Value A141 A142 A143
## Frequency 128 42 730
## Proportion 0.142 0.047 0.811
ggplot(data_desafio_seguros, aes(var_14)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_15)
## data_desafio_seguros$var_15
## n missing distinct
## 900 0 3
##
## Value A151 A152 A153
## Frequency 162 640 98
## Proportion 0.180 0.711 0.109
ggplot(data_desafio_seguros, aes(var_15)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_16)
## data_desafio_seguros$var_16
## n missing distinct Info Mean Gmd
## 900 0 4 0.706 1.398 0.5273
##
## Value 1 2 3 4
## Frequency 571 304 21 4
## Proportion 0.634 0.338 0.023 0.004
ggplot(data_desafio_seguros, aes(var_16)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_17)
## data_desafio_seguros$var_17
## n missing distinct
## 900 0 4
##
## Value A171 A172 A173 A174
## Frequency 19 180 569 132
## Proportion 0.021 0.200 0.632 0.147
ggplot(data_desafio_seguros, aes(var_17)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_18)
## data_desafio_seguros$var_18
## n missing distinct Info Mean Gmd
## 900 0 2 0.378 1.148 0.2522
##
## Value 1 2
## Frequency 767 133
## Proportion 0.852 0.148
ggplot(data_desafio_seguros, aes(var_18)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_19)
## data_desafio_seguros$var_19
## n missing distinct
## 900 0 2
##
## Value A191 A192
## Frequency 531 369
## Proportion 0.59 0.41
ggplot(data_desafio_seguros, aes(var_19)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_20)
## data_desafio_seguros$var_20
## n missing distinct
## 900 0 2
##
## Value A201 A202
## Frequency 865 35
## Proportion 0.961 0.039
ggplot(data_desafio_seguros, aes(var_20)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
describe(data_desafio_seguros$var_21)
## data_desafio_seguros$var_21
## n missing distinct
## 900 0 2
##
## Value 1 2
## Frequency 632 268
## Proportion 0.702 0.298
ggplot(data_desafio_seguros, aes(var_21)) +
geom_bar(fill="steelblue", width = NULL) + theme_classic()
attach(data_desafio_seguros)
table(var_21,var_21)
## var_21
## var_21 1 2
## 1 632 0
## 2 0 268
prop.table(table(var_21,var_21))
## var_21
## var_21 1 2
## 1 0.7022222 0.0000000
## 2 0.0000000 0.2977778
ggplot(data=as.data.frame(table(var_21,var_21)), aes(x=var_21, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
detach(data_desafio_seguros)
group_by(data_desafio_seguros, var_21) %>%
summarise(n = n(), min_var2= min(var_2) , p10 = quantile(var_2, probs = 0.1), p25 = quantile(var_2, probs = 0.25),mean_var5=mean(var_2), median_var2=median(var_2), p75 = quantile(var_2, probs = 0.75), p90 = quantile(var_2, probs = 0.9), p99 = quantile(var_2, probs = 0.99), max_var2 = max(var_2),sd=sd(var_2))
ggplot(data_desafio_seguros, aes(x=var_2, fill=var_21, color=var_21)) +
geom_histogram(position="identity", alpha=0.5)
group_by(data_desafio_seguros, var_21) %>%
summarise(n = n(), min_var5= min(var_5) , p10 = quantile(var_5, probs = 0.1), p25 = quantile(var_5, probs = 0.25),mean_var5=mean(var_5), median_var5=median(var_5), p75 = quantile(var_5, probs = 0.75), p90 = quantile(var_5, probs = 0.9), p99 = quantile(var_5, probs = 0.99), max_var5 = max(var_5),sd=sd(var_5))
ggplot(data_desafio_seguros, aes(x=var_5, fill=var_21, color=var_21)) +
geom_histogram(position="identity", alpha=0.5)
group_by(data_desafio_seguros, var_21) %>%
summarise(n = n(), min_var13= min(var_13) , p10 = quantile(var_13, probs = 0.1), p25 = quantile(var_13, probs = 0.25),mean_var13=mean(var_13), median_var13=median(var_13), p75 = quantile(var_13, probs = 0.75), p90 = quantile(var_13, probs = 0.9), p99 = quantile(var_13, probs = 0.99), max_var13 = max(var_13),sd=sd(var_13))
ggplot(data_desafio_seguros, aes(x=var_13, fill=var_21, color=var_21)) +
geom_histogram(position="identity", alpha=0.5, binwidth=3)
table(var_21,var_1)
## var_1
## var_21 A11 A12 A13 A14
## 1 124 149 47 312
## 2 119 93 14 42
as.table(prop.table(table(var_21,var_1)))
## var_1
## var_21 A11 A12 A13 A14
## 1 0.13777778 0.16555556 0.05222222 0.34666667
## 2 0.13222222 0.10333333 0.01555556 0.04666667
ggplot(data=as.data.frame(table(var_21,var_1)), aes(x=var_1, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_3)
## var_3
## var_21 A30 A31 A32 A33 A34
## 1 11 20 323 57 221
## 2 21 26 149 27 45
prop.table(table(var_21,var_3))
## var_3
## var_21 A30 A31 A32 A33 A34
## 1 0.01222222 0.02222222 0.35888889 0.06333333 0.24555556
## 2 0.02333333 0.02888889 0.16555556 0.03000000 0.05000000
ggplot(data=as.data.frame(table(var_21,var_3)), aes(x=var_3, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_4)
## var_4
## var_21 A40 A41 A410 A42 A43 A44 A45 A46 A48 A49
## 1 133 78 7 114 192 6 13 24 8 57
## 2 81 15 4 55 54 3 5 21 0 30
prop.table(table(var_21,var_4))
## var_4
## var_21 A40 A41 A410 A42 A43
## 1 0.147777778 0.086666667 0.007777778 0.126666667 0.213333333
## 2 0.090000000 0.016666667 0.004444444 0.061111111 0.060000000
## var_4
## var_21 A44 A45 A46 A48 A49
## 1 0.006666667 0.014444444 0.026666667 0.008888889 0.063333333
## 2 0.003333333 0.005555556 0.023333333 0.000000000 0.033333333
ggplot(data=as.data.frame(table(var_21,var_4)), aes(x=var_4, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_7)
## var_7
## var_21 A71 A72 A73 A74 A75
## 1 37 90 214 121 170
## 2 20 61 95 34 58
prop.table(table(var_21,var_7))
## var_7
## var_21 A71 A72 A73 A74 A75
## 1 0.04111111 0.10000000 0.23777778 0.13444444 0.18888889
## 2 0.02222222 0.06777778 0.10555556 0.03777778 0.06444444
ggplot(data=as.data.frame(table(var_21,var_7)), aes(x=var_7, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_8)
## var_8
## var_21 1 2 3 4
## 1 91 157 95 289
## 2 28 57 42 141
prop.table(table(var_21,var_8))
## var_8
## var_21 1 2 3 4
## 1 0.10111111 0.17444444 0.10555556 0.32111111
## 2 0.03111111 0.06333333 0.04666667 0.15666667
ggplot(data=as.data.frame(table(var_21,var_8)), aes(x=var_8, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_9)
## var_9
## var_21 A91 A92 A93 A94
## 1 28 175 367 62
## 2 19 98 127 24
prop.table(table(var_21,var_9))
## var_9
## var_21 A91 A92 A93 A94
## 1 0.03111111 0.19444444 0.40777778 0.06888889
## 2 0.02111111 0.10888889 0.14111111 0.02666667
ggplot(data=as.data.frame(table(var_21,var_9)), aes(x=var_9, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_10)
## var_10
## var_21 A101 A102 A103
## 1 577 21 34
## 2 243 16 9
prop.table(table(var_21,var_10))
## var_10
## var_21 A101 A102 A103
## 1 0.64111111 0.02333333 0.03777778
## 2 0.27000000 0.01777778 0.01000000
ggplot(data=as.data.frame(table(var_21,var_10)), aes(x=var_10, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_11)
## var_11
## var_21 1 2 3 4
## 1 80 192 98 262
## 2 32 89 39 108
prop.table(table(var_21,var_11))
## var_11
## var_21 1 2 3 4
## 1 0.08888889 0.21333333 0.10888889 0.29111111
## 2 0.03555556 0.09888889 0.04333333 0.12000000
ggplot(data=as.data.frame(table(var_21,var_11)), aes(x=var_11, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_12)
## var_12
## var_21 A121 A122 A123 A124
## 1 197 146 210 79
## 2 54 68 88 58
prop.table(table(var_21,var_12))
## var_12
## var_21 A121 A122 A123 A124
## 1 0.21888889 0.16222222 0.23333333 0.08777778
## 2 0.06000000 0.07555556 0.09777778 0.06444444
ggplot(data=as.data.frame(table(var_21,var_12)), aes(x=var_12, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_14)
## var_14
## var_21 A141 A142 A143
## 1 75 25 532
## 2 53 17 198
prop.table(table(var_21,var_14))
## var_14
## var_21 A141 A142 A143
## 1 0.08333333 0.02777778 0.59111111
## 2 0.05888889 0.01888889 0.22000000
ggplot(data=as.data.frame(table(var_21,var_14)), aes(x=var_14, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_15)
## var_15
## var_21 A151 A152 A153
## 1 102 471 59
## 2 60 169 39
prop.table(table(var_21,var_15))
## var_15
## var_21 A151 A152 A153
## 1 0.11333333 0.52333333 0.06555556
## 2 0.06666667 0.18777778 0.04333333
ggplot(data=as.data.frame(table(var_21,var_15)), aes(x=var_15, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_16)
## var_16
## var_21 1 2 3 4
## 1 391 222 17 2
## 2 180 82 4 2
prop.table(table(var_21,var_16))
## var_16
## var_21 1 2 3 4
## 1 0.434444444 0.246666667 0.018888889 0.002222222
## 2 0.200000000 0.091111111 0.004444444 0.002222222
ggplot(data=as.data.frame(table(var_21,var_16)), aes(x=var_16, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_17)
## var_17
## var_21 A171 A172 A173 A174
## 1 13 130 401 88
## 2 6 50 168 44
prop.table(table(var_21,var_17))
## var_17
## var_21 A171 A172 A173 A174
## 1 0.014444444 0.144444444 0.445555556 0.097777778
## 2 0.006666667 0.055555556 0.186666667 0.048888889
ggplot(data=as.data.frame(table(var_21,var_17)), aes(x=var_17, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_18)
## var_18
## var_21 1 2
## 1 535 97
## 2 232 36
prop.table(table(var_21,var_18))
## var_18
## var_21 1 2
## 1 0.5944444 0.1077778
## 2 0.2577778 0.0400000
ggplot(data=as.data.frame(table(var_21,var_18)), aes(x=var_18, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_19)
## var_19
## var_21 A191 A192
## 1 365 267
## 2 166 102
prop.table(table(var_21,var_19))
## var_19
## var_21 A191 A192
## 1 0.4055556 0.2966667
## 2 0.1844444 0.1133333
ggplot(data=as.data.frame(table(var_21,var_19)), aes(x=var_19, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
table(var_21,var_20)
## var_20
## var_21 A201 A202
## 1 601 31
## 2 264 4
prop.table(table(var_21,var_20))
## var_20
## var_21 A201 A202
## 1 0.667777778 0.034444444
## 2 0.293333333 0.004444444
ggplot(data=as.data.frame(table(var_21,var_20)), aes(x=var_20, y=Freq, fill=var_21)) +
geom_bar(stat="identity", position=position_dodge())+
geom_text(aes(label=Freq), vjust=1.6, color="white", position = position_dodge(0.9),size=3.5)
## var_21
## var_21 1 2
## 1 474 0
## 2 0 201
## var_21
## var_21 1 2
## 1 0.7022222 0.0000000
## 2 0.0000000 0.2977778
## var_21
## var_21 1 2
## 1 158 0
## 2 0 67
## var_21
## var_21 1 2
## 1 0.7022222 0.0000000
## 2 0.0000000 0.2977778
## $var_1
## variable bin count count_distr good bad badprob woe
## 1: var_1 A14 258 0.38222222 230 28 0.1085271 -1.2479724
## 2: var_1 A13 46 0.06814815 35 11 0.2391304 -0.2995504
## 3: var_1 A12%,%A11 371 0.54962963 209 162 0.4366577 0.6031645
## bin_iv total_iv breaks is_special_values
## 1: 0.431709321 0.657615 A14 FALSE
## 2: 0.005725394 0.657615 A13 FALSE
## 3: 0.220180301 0.657615 A12%,%A11 FALSE
##
## $var_2
## variable bin count count_distr good bad badprob woe
## 1: var_2 [-Inf,8) 61 0.09037037 55 6 0.09836066 -1.35767130
## 2: var_2 [8,16) 238 0.35259259 180 58 0.24369748 -0.27461143
## 3: var_2 [16,30) 237 0.35111111 163 74 0.31223629 0.06821731
## 4: var_2 [30, Inf) 139 0.20592593 76 63 0.45323741 0.67030380
## bin_iv total_iv breaks is_special_values
## 1: 0.117008198 0.2463264 8 FALSE
## 2: 0.025041712 0.2463264 16 FALSE
## 3: 0.001656135 0.2463264 30 FALSE
## 4: 0.102620350 0.2463264 Inf FALSE
##
## $var_3
## variable bin count count_distr good bad badprob woe
## 1: var_3 A34 195 0.28888889 156 39 0.2000000 -0.52839195
## 2: var_3 A32 360 0.53333333 251 109 0.3027778 0.02379736
## 3: var_3 A33 62 0.09185185 43 19 0.3064516 0.04114128
## 4: var_3 A31%,%A30 58 0.08592593 24 34 0.5862069 1.20620911
## bin_iv total_iv breaks is_special_values
## 1: 0.0713773366 0.2147991 A34 FALSE
## 2: 0.0003034804 0.2147991 A32 FALSE
## 3: 0.0001567509 0.2147991 A33 FALSE
## 4: 0.1429614926 0.2147991 A31%,%A30 FALSE
##
## $var_4
## variable bin count count_distr good bad badprob
## 1: var_4 A48%,%A41 75 0.1111111 63 12 0.1600000
## 2: var_4 A44%,%A43 192 0.2844444 149 43 0.2239583
## 3: var_4 A45%,%A42 140 0.2074074 98 42 0.3000000
## 4: var_4 A40%,%A49%,%A410%,%A46 268 0.3970370 164 104 0.3880597
## woe bin_iv total_iv breaks
## 1: -0.80032566 5.859176e-02 0.166244 A48%,%A41
## 2: -0.38484378 3.864434e-02 0.166244 A44%,%A43
## 3: 0.01060455 2.337423e-05 0.166244 A45%,%A42
## 4: 0.40242688 6.898457e-02 0.166244 A40%,%A49%,%A410%,%A46
## is_special_values
## 1: FALSE
## 2: FALSE
## 3: FALSE
## 4: FALSE
##
## $var_5
## variable bin count count_distr good bad badprob woe
## 1: var_5 [-Inf,1400) 177 0.26222222 121 56 0.3163842 0.08746356
## 2: var_5 [1400,1800) 74 0.10962963 63 11 0.1486486 -0.88733704
## 3: var_5 [1800,3200) 181 0.26814815 130 51 0.2817680 -0.07780640
## 4: var_5 [3200,4000) 76 0.11259259 63 13 0.1710526 -0.72028296
## 5: var_5 [4000,5000) 42 0.06222222 24 18 0.4285714 0.57022034
## 6: var_5 [5000,7800) 70 0.10370370 48 22 0.3142857 0.07774386
## 7: var_5 [7800, Inf) 55 0.08148148 25 30 0.5454545 1.04022397
## bin_iv total_iv breaks is_special_values
## 1: 0.0020407613 0.2453852 1400 FALSE
## 2: 0.0693764680 0.2453852 1800 FALSE
## 3: 0.0015973857 0.2453852 3200 FALSE
## 4: 0.0491483457 0.2453852 4000 FALSE
## 5: 0.0221925922 0.2453852 5000 FALSE
## 6: 0.0006364822 0.2453852 7800 FALSE
## 7: 0.1003931756 0.2453852 Inf FALSE
##
## $var_6
## variable bin count count_distr good bad badprob woe
## 1: var_6 A63 44 0.06518519 38 6 0.1363636 -0.9879243
## 2: var_6 A64%,%A65 156 0.23111111 130 26 0.1666667 -0.7515355
## 3: var_6 A62%,%A61 475 0.70370370 306 169 0.3557895 0.2642160
## bin_iv total_iv breaks is_special_values
## 1: 0.04971040 0.2101961 A63 FALSE
## 2: 0.10890378 0.2101961 A64%,%A65 FALSE
## 3: 0.05158194 0.2101961 A62%,%A61 FALSE
##
## $var_7
## variable bin count count_distr good bad badprob woe
## 1: var_7 A74 124 0.18370370 95 29 0.2338710 -0.3286786
## 2: var_7 A75%,%A73 395 0.58518519 285 110 0.2784810 -0.0941064
## 3: var_7 A71 49 0.07259259 31 18 0.3673469 0.3142870
## 4: var_7 A72 107 0.15851852 63 44 0.4112150 0.4989573
## bin_iv total_iv breaks is_special_values
## 1: 0.018453115 0.07403291 A74 FALSE
## 2: 0.005081947 0.07403291 A75%,%A73 FALSE
## 3: 0.007590469 0.07403291 A71 FALSE
## 4: 0.042907376 0.07403291 A72 FALSE
##
## $var_8
## variable bin count count_distr good bad badprob woe
## 1: var_8 [-Inf,2) 87 0.1288889 70 17 0.1954023 -0.55737948
## 2: var_8 [2,3) 163 0.2414815 114 49 0.3006135 0.01352426
## 3: var_8 [3,4) 100 0.1481481 71 29 0.2900000 -0.03748163
## 4: var_8 [4, Inf) 325 0.4814815 219 106 0.3261538 0.13226978
## bin_iv total_iv breaks is_special_values
## 1: 3.517188e-02 0.04406493 2 FALSE
## 2: 4.428879e-05 0.04406493 3 FALSE
## 3: 2.065396e-04 0.04406493 4 FALSE
## 4: 8.642225e-03 0.04406493 Inf FALSE
##
## $var_9
## variable bin count count_distr good bad badprob woe
## 1: var_9 A93 365 0.54074074 273 92 0.2520548 -0.2297808
## 2: var_9 A94 63 0.09333333 46 17 0.2698413 -0.1375256
## 3: var_9 A92%,%A91 247 0.36592593 155 92 0.3724696 0.3362659
## bin_iv total_iv breaks is_special_values
## 1: 0.027168805 0.07283603 A93 FALSE
## 2: 0.001714848 0.07283603 A94 FALSE
## 3: 0.043952379 0.07283603 A92%,%A91 FALSE
##
## $var_10
## variable bin count count_distr good bad badprob woe
## 1: var_10 A103%,%A101%,%A102 675 1 474 201 0.2977778 0
## bin_iv total_iv breaks is_special_values
## 1: 0 0 A103%,%A101%,%A102 FALSE
##
## $var_11
## variable bin count count_distr good bad badprob woe
## 1: var_11 [-Inf,2) 85 0.1259259 62 23 0.2705882 -0.13373776
## 2: var_11 [2,3) 207 0.3066667 139 68 0.3285024 0.14293619
## 3: var_11 [3,4) 106 0.1570370 76 30 0.2830189 -0.07163354
## 4: var_11 [4, Inf) 277 0.4103704 197 80 0.2888087 -0.04327468
## bin_iv total_iv breaks is_special_values
## 1: 0.0021897989 0.01018612 2 FALSE
## 2: 0.0064406349 0.01018612 3 FALSE
## 3: 0.0007939734 0.01018612 4 FALSE
## 4: 0.0007617150 0.01018612 Inf FALSE
##
## $var_12
## variable bin count count_distr good bad badprob woe
## 1: var_12 A121 196 0.2903704 156 40 0.2040816 -0.50307414
## 2: var_12 A122 163 0.2414815 113 50 0.3067485 0.04253760
## 3: var_12 A123 217 0.3214815 148 69 0.3179724 0.09479664
## 4: var_12 A124 99 0.1466667 57 42 0.4242424 0.55252076
## bin_iv total_iv breaks is_special_values
## 1: 0.0654544475 0.117848 A121 FALSE
## 2: 0.0004406723 0.117848 A122 FALSE
## 3: 0.0029431794 0.117848 A123 FALSE
## 4: 0.0490097296 0.117848 A124 FALSE
##
## $var_13
## variable bin count count_distr good bad badprob woe
## 1: var_13 [-Inf,24) 67 0.09925926 45 22 0.3283582 0.14228238
## 2: var_13 [24,26) 62 0.09185185 32 30 0.4838710 0.79336389
## 3: var_13 [26,35) 238 0.35259259 162 76 0.3193277 0.10103942
## 4: var_13 [35,42) 131 0.19407407 101 30 0.2290076 -0.35602072
## 5: var_13 [42,45) 36 0.05333333 24 12 0.3333333 0.16475523
## 6: var_13 [45,53) 75 0.11111111 64 11 0.1466667 -0.90308540
## 7: var_13 [53, Inf) 66 0.09777778 46 20 0.3030303 0.02499329
## bin_iv total_iv breaks is_special_values
## 1: 2.065375e-03 0.167381 24 FALSE
## 2: 6.485209e-02 0.167381 26 FALSE
## 3: 3.671500e-03 0.167381 35 FALSE
## 4: 2.272353e-02 0.167381 42 FALSE
## 5: 1.494096e-03 0.167381 45 FALSE
## 6: 7.251300e-02 0.167381 53 FALSE
## 7: 6.138537e-05 0.167381 Inf FALSE
##
## $var_14
## variable bin count count_distr good bad badprob woe
## 1: var_14 A143 547 0.8103704 402 145 0.2650823 -0.1618159
## 2: var_14 A142%,%A141 128 0.1896296 72 56 0.4375000 0.6065880
## bin_iv total_iv breaks is_special_values
## 1: 0.02050341 0.0973631 A143 FALSE
## 2: 0.07685969 0.0973631 A142%,%A141 FALSE
##
## $var_15
## variable bin count count_distr good bad badprob woe
## 1: var_15 A152 479 0.7096296 354 125 0.2609603 -0.1830808
## 2: var_15 A151 127 0.1881481 80 47 0.3700787 0.3260234
## 3: var_15 A153 69 0.1022222 40 29 0.4202899 0.5363188
## bin_iv total_iv breaks is_special_values
## 1: 0.02287501 0.07620464 A152 FALSE
## 2: 0.02120928 0.07620464 A151 FALSE
## 3: 0.03212036 0.07620464 A153 FALSE
##
## $var_16
## variable bin count count_distr good bad badprob woe
## 1: var_16 [-Inf,2) 431 0.6385185 298 133 0.3085847 0.05115806
## 2: var_16 [2, Inf) 244 0.3614815 176 68 0.2786885 -0.09307388
## bin_iv total_iv breaks is_special_values
## 1: 0.001688193 0.00475959 2 FALSE
## 2: 0.003071397 0.00475959 Inf FALSE
##
## $var_17
## variable bin count count_distr good bad badprob woe
## 1: var_17 A172%,%A171 148 0.2192593 111 37 0.2500000 -0.240709875
## 2: var_17 A173 422 0.6251852 296 126 0.2985782 0.003824866
## 3: var_17 A174 105 0.1555556 67 38 0.3619048 0.290795954
## bin_iv total_iv breaks is_special_values
## 1: 1.205899e-02 0.02594042 A172%,%A171 FALSE
## 2: 9.153279e-06 0.02594042 A173 FALSE
## 3: 1.387228e-02 0.02594042 A174 FALSE
##
## $var_18
## variable bin count count_distr good bad badprob woe
## 1: var_18 [-Inf,2) 577 0.8548148 401 176 0.305026 0.03442498
## 2: var_18 [2, Inf) 98 0.1451852 73 25 0.255102 -0.21368120
## bin_iv total_iv breaks is_special_values
## 1: 0.001020024 0.007351468 2 FALSE
## 2: 0.006331444 0.007351468 Inf FALSE
##
## $var_19
## variable bin count count_distr good bad badprob woe
## 1: var_19 A192 277 0.4103704 199 78 0.2815884 -0.07869358
## 2: var_19 A191 398 0.5896296 275 123 0.3090452 0.05331567
## bin_iv total_iv breaks is_special_values
## 1: 0.002500215 0.004194135 A192 FALSE
## 2: 0.001693920 0.004194135 A191 FALSE
##
## $var_20
## variable bin count count_distr good bad badprob woe bin_iv
## 1: var_20 A202%,%A201 675 1 474 201 0.2977778 0 0
## total_iv breaks is_special_values
## 1: 0 A202%,%A201 FALSE
En la siguiente tabla se encuentra los valores para determinar que tan buen predictor es la variable:
| Information Value | Poder predictivo |
|---|---|
| < 0.02 | Sin poder predictivo |
| 0.02 to 0.1 | Bajo |
| 0.1 to 0.3 | Medio |
| > 0.3 | Alto |
Por lo tanto, las variables utilizadas para evaluar un modelo completo serán las primeras 13 variables
En las siguientes imagenes, se encuentran las variables con los cortes de WoEs modificados. Los criterios para modificar los WoEs fueron los siguientes:
A continuación, se encuentra el resumen de las 13 variables con mejor poder predictivo. Esto con las modificaciones realizadas.
## $var_1
## $var_2
## $var_5
## $var_3
## $var_6
## $var_13
## $var_4
## $var_12
## $var_14
## $var_15
## $var_7
## $var_9
## $var_8
##
## Call:
## glm(formula = var_21_recode ~ var_1_woe + var_2_woe + var_5_woe +
## var_3_woe + var_6_woe + var_13_woe + var_4_woe + var_12_woe +
## var_14_woe + var_15_woe + var_7_woe + var_9_woe + var_8_woe,
## family = binomial, data = df_train_woe)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.5488 -0.7661 0.3618 0.7327 2.1874
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.8853 0.1034 8.562 < 2e-16 ***
## var_1_woe 0.9246 0.1332 6.942 3.86e-12 ***
## var_2_woe 0.7051 0.2363 2.984 0.002847 **
## var_5_woe 0.9079 0.3080 2.947 0.003204 **
## var_3_woe 0.6989 0.2325 3.006 0.002644 **
## var_6_woe 1.0812 0.6047 1.788 0.073789 .
## var_13_woe 1.0060 0.3827 2.629 0.008565 **
## var_4_woe 1.1776 0.2524 4.665 3.08e-06 ***
## var_12_woe 0.5736 0.3358 1.708 0.087594 .
## var_14_woe 0.9246 0.3195 2.894 0.003803 **
## var_15_woe 0.4298 0.3847 1.117 0.263898
## var_7_woe 0.6219 0.3751 1.658 0.097280 .
## var_9_woe 1.1947 0.4542 2.630 0.008532 **
## var_8_woe 1.9501 0.5529 3.527 0.000421 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 822.11 on 674 degrees of freedom
## Residual deviance: 617.25 on 661 degrees of freedom
## AIC: 645.25
##
## Number of Fisher Scoring iterations: 5
Es posible observar que todas las variables del modelo son significativas utilizando el test de Wald, esto a excepción de la variable “var_15_woe”, por lo tanto es variable será retirada del modelo. Además se ha validado este resultado utilizando la técnica stepwise para elegir las variables del modelo y justamente el modelo entregado es el modelo completo sin variable “var_15_woe”.
modelo_ajustado <- glm(formula(step(modelo_completo,trace=0)),
family = binomial, data = df_train_woe)
summary(modelo_ajustado)
##
## Call:
## glm(formula = formula(step(modelo_completo, trace = 0)), family = binomial,
## data = df_train_woe)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.6088 -0.7827 0.3648 0.7312 2.2204
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.8825 0.1032 8.556 < 2e-16 ***
## var_1_woe 0.9292 0.1330 6.988 2.79e-12 ***
## var_2_woe 0.7038 0.2351 2.994 0.002756 **
## var_5_woe 0.9000 0.3077 2.925 0.003448 **
## var_3_woe 0.7090 0.2314 3.064 0.002183 **
## var_6_woe 1.0851 0.6043 1.796 0.072545 .
## var_13_woe 1.0184 0.3831 2.658 0.007855 **
## var_4_woe 1.1709 0.2523 4.641 3.46e-06 ***
## var_12_woe 0.7260 0.3086 2.352 0.018651 *
## var_14_woe 0.9162 0.3191 2.871 0.004093 **
## var_7_woe 0.6074 0.3747 1.621 0.105072
## var_9_woe 1.2236 0.4531 2.701 0.006923 **
## var_8_woe 1.9434 0.5522 3.519 0.000433 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 822.11 on 674 degrees of freedom
## Residual deviance: 618.50 on 662 degrees of freedom
## AIC: 644.5
##
## Number of Fisher Scoring iterations: 5
col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
corrplot(correlations, method="color", col=col(200),
type="upper", order="hclust",
addCoef.col = "black",
tl.col="black", tl.srt=45,
p.mat = p.mat, sig.level = 0.01, insig = "blank",
diag=FALSE )
El nivel de correlaciones entre los predictores es baja por lo tanto, todas las variables pueden estar dentro del modelo. Otra manera de validar esto es analizando el VIF.
vif(modelo_completo)
Todos los valores se encuentran dentro del intervalo tolerable.
La libreria utilizada nos entrega un puntaje que no se encuentra en la escala solicitada, sin embargo es posible hacer un rescalamiento de score, en el siguiente grafico de densidad es posible observar que la distribución del score no se ve afectada al hacer el cambio de escala.
ggplot(df_train, aes(x=score))+
geom_density(color="darkblue", fill="lightblue")
df_train$var_21 <- as.factor(df_train$var_21)
ggplot(df_train, aes(x=score, fill=var_21, color=var_21)) +
geom_density(position="identity", alpha=0.5)
ggplot(df_train, aes(x=score_recode))+
geom_density(color="darkblue", fill="lightblue")
ggplot(df_train, aes(x=score_recode, fill=var_21, color=var_21)) +
geom_density(position="identity", alpha=0.5)
| Intervalo Score | count | cum_count | good | cum_good | bad | cum_bad | count_distr | badprob | cum_badprob | approval_rate |
|---|---|---|---|---|---|---|---|---|---|---|
| [-Inf,0.2954924875) | 66 | 66 | 65 | 65 | 1 | 1 | 0.0977778 | 0.0151515 | 0.0151515 | 0.0977778 |
| [0.2954924875,0.3656093489) | 69 | 135 | 67 | 132 | 2 | 3 | 0.1022222 | 0.0289855 | 0.0222222 | 0.2000000 |
| [0.3656093489,0.4307178631) | 66 | 201 | 62 | 194 | 4 | 7 | 0.0977778 | 0.0606061 | 0.0348259 | 0.2977778 |
| [0.4307178631,0.489148581) | 69 | 270 | 57 | 251 | 12 | 19 | 0.1022222 | 0.1739130 | 0.0703704 | 0.4000000 |
| [0.489148581,0.5492487479) | 66 | 336 | 55 | 306 | 11 | 30 | 0.0977778 | 0.1666667 | 0.0892857 | 0.4977778 |
| [0.5492487479,0.6043405676) | 65 | 401 | 49 | 355 | 16 | 46 | 0.0962963 | 0.2461538 | 0.1147132 | 0.5940741 |
| [0.6043405676,0.6477462437) | 70 | 471 | 42 | 397 | 28 | 74 | 0.1037037 | 0.4000000 | 0.1571125 | 0.6977778 |
| [0.6477462437,0.6994991653) | 68 | 539 | 32 | 429 | 36 | 110 | 0.1007407 | 0.5294118 | 0.2040816 | 0.7985185 |
| [0.6994991653,0.7696160267) | 64 | 603 | 24 | 453 | 40 | 150 | 0.0948148 | 0.6250000 | 0.2487562 | 0.8933333 |
| [0.7696160267, Inf) | 72 | 675 | 21 | 474 | 51 | 201 | 0.1066667 | 0.7083333 | 0.2977778 | 1.0000000 |
| Intervalo Score | count | cum_count | good | cum_good | bad | cum_bad | count_distr | badprob | cum_badprob | approval_rate |
|---|---|---|---|---|---|---|---|---|---|---|
| [-Inf,0.2687813022) | 21 | 21 | 21 | 21 | 0 | 0 | 0.0933333 | 0.0000000 | 0.0000000 | 0.0933333 |
| [0.2687813022,0.3772954925) | 24 | 45 | 22 | 43 | 2 | 2 | 0.1066667 | 0.0833333 | 0.0444444 | 0.2000000 |
| [0.3772954925,0.4357262104) | 22 | 67 | 18 | 61 | 4 | 6 | 0.0977778 | 0.1818182 | 0.0895522 | 0.2977778 |
| [0.4357262104,0.4774624374) | 23 | 90 | 20 | 81 | 3 | 9 | 0.1022222 | 0.1304348 | 0.1000000 | 0.4000000 |
| [0.4774624374,0.5141903172) | 21 | 111 | 18 | 99 | 3 | 12 | 0.0933333 | 0.1428571 | 0.1081081 | 0.4933333 |
| [0.5141903172,0.5676126878) | 23 | 134 | 12 | 111 | 11 | 23 | 0.1022222 | 0.4782609 | 0.1716418 | 0.5955556 |
| [0.5676126878,0.6393989983) | 23 | 157 | 17 | 128 | 6 | 29 | 0.1022222 | 0.2608696 | 0.1847134 | 0.6977778 |
| [0.6393989983,0.7161936561) | 23 | 180 | 13 | 141 | 10 | 39 | 0.1022222 | 0.4347826 | 0.2166667 | 0.8000000 |
| [0.7161936561,0.774624374) | 22 | 202 | 12 | 153 | 10 | 49 | 0.0977778 | 0.4545455 | 0.2425743 | 0.8977778 |
| [0.774624374, Inf) | 23 | 225 | 5 | 158 | 18 | 67 | 0.1022222 | 0.7826087 | 0.2977778 | 1.0000000 |
Tanto para la base de entrenamiento y validación se logran buenos indicadores, esto hablando de indicadores clásicos para este tipo de modelos como K-s, ROC y GINI. Sin embargo es posible ver la inestabilidad de estos modelos, ya que varian en alrededor de 4% a 8% por indicador, esto podria explicarse por el tamaño de la muestra.
Por otra parte es posible ver la distribución del bad rate por los tramos del score y además la distribución del score.
group_by(df_train, var_21) %>%
summarise(n = n(), min_precio_base= min(precio_base) , p10 = quantile(precio_base, probs = 0.1), p25 = quantile(precio_base, probs = 0.25),mean_precio_base=mean(precio_base), median_precio_base=median(precio_base), p75 = quantile(precio_base, probs = 0.75), p90 = quantile(precio_base, probs = 0.9), p99 = quantile(precio_base, probs = 0.99), max_var5 = max(precio_base),sd=sd(precio_base))
group_by(df_test, var_21) %>%
summarise(n = n(), min_precio_base= min(precio_base) , p10 = quantile(precio_base, probs = 0.1), p25 = quantile(precio_base, probs = 0.25),mean_precio_base=mean(precio_base), median_precio_base=median(precio_base), p75 = quantile(precio_base, probs = 0.75), p90 = quantile(precio_base, probs = 0.9), p99 = quantile(precio_base, probs = 0.99), max_var5 = max(precio_base),sd=sd(precio_base))
En la siguiente imagen se encuentra un gain table donde se encuentran los indicadores del modelo, por otra parte la columna “ROI” indica el tramo de score donde se maximiza la ganancia en dinero, tomando en cuenta la información entregada por enunciado.
Por lo tanto, el puntaje de corte puede ser elegido de dos maneras:
El modelo presenta buenos indicadores en base a su clasficación, esto debido a variables predictoras con alto porcentaje de poblamiento, sin embargo el modelo presenta inestabilidad en el bad rate a lo largo de los tramos del score, por otra parte la inestabilidad del modelo no es abrupta, considerando que el tamaño de la base es de 900 registros donde además, esta base fue separada en 75% entrenamiento y 25% validación.
El modelo logra asignar valores de precios más altos para los personas que son mas riesgosas, por lo tanto el modelo logra aterrizar el sentido lógico del desafio.
Próximos pasos: