Descripción del desafío.

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).

Resumen.

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:

  1. Análisis descriptivo univariado.
  2. Análisis descriptivo bivariado respecto a la variable “Clasificación actual”.
  3. Binning de variables utilizando WoEs.
  4. Modificación cortes óptimos para los WoEs.
  5. Ranking information value.
  6. Evaluación modelo completo.
  7. Significancia de coeficientes del modelo.
  8. Reducción de variables.
  9. Análisis de correlaciones y VIF de variables predictoras.
  10. Validar distribución del score y bad rate.
  11. Cálculo de precio base con análisis de distribución.

Descriptivos univariados

Variable 2: Duración en meses

#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")

Variable 5: Monto del crédito (en moneda local)

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 ")

Variable 13: Edad en años

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")

Variable 1: Estado de cuenta corriente existente

#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()

Variable 3: Historia crediticia

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()

Variable 4: Propósito del crédito

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()

Variable 6: Ahorros en la cuenta

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()

Variable 7: Tiempo en el empleo actual

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()

Variable 8: Tasa a plazo en porcentaje de la renta disponible

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()

Variable 9: Estatus y sexo

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()

Variable 10: Otros deudores y garantes

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()

Variable 11: Tiempo desde el cual tiene residencia

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()

Variable 12: Posesiones a su nombre

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()

Variable 14: Otros pagos pendientes en cuotas

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()

Variable 15: Forma en la que vive

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()

Variable 16: Número de créditos existentes en este banco actualmente

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()

Variable 17: Tipo de trabajo

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()

Variable 18: Número de personas por las cuales es responsable de dar mantenimiento

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()

Variable 19: Si tiene teléfono

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()

Variable 20: Si es un trabajador extranjero

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()

Variable 21: Clasificación actual

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()

Estadística descriptiva bivariada.

Variable 21: Clasificación actual

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)

Variable 2: Duración en meses

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) 

Variable 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) 

Variable 13:

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)

Variable 1:

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)

Variable 3:

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)

Variable 4:

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)

Variable 7:

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)

Variable 8:

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)

Variable 9:

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)

Variable 10:

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)

Variable 11:

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)

Variable 12:

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)

Variable 14:

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)

Variable 15:

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)

Variable 16:

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)

Variable 17:

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)

Variable 18:

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)

Variable 19:

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)

Variable 20:

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)

Base entrenamiento y base testing

##       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

Modelamiento - Scorecard

Binning

## $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

Information Value

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

Modificación binning

En las siguientes imagenes, se encuentran las variables con los cortes de WoEs modificados. Los criterios para modificar los WoEs fueron los siguientes:

  1. Poblamiento de la categoría, es decir, esta debe tener un poblamiento mayor o igual al 5% respecto al total de la distribución.
  2. Bad Rate debe ser monotonamente creciente o decreciente.
  3. Realizar la menor cantidad de modificaciones para no el IV.

A continuación, se encuentra el resumen de las 13 variables con mejor poder predictivo. Esto con las modificaciones realizadas.

Variable 1:

## $var_1

Variable 2:

## $var_2

Variable 5:

## $var_5

Variable 3:

## $var_3

Variable 6:

## $var_6

Variable 13:

## $var_13

Variable 4:

## $var_4

Variable 12:

## $var_12

Variable 14:

## $var_14

Variable 15:

## $var_15

Variable 7:

## $var_7

Variable 9:

## $var_9

Variable 8:

## $var_8

Modelo Completo

## 
## 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

Analisis de correlaciones y VIF.

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.

Scorecard.

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.

Score original

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) 

Score en escala [0,1]

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) 

Performance del modelo

Gain-Table

Base Entrenamiento.

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

Base validación

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

Indicadores

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.

Precio del seguro por persona.

Base entrenamiento

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))

Base validación

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))

Puntaje de corte.

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:

  1. Tramo de score donde donde se maximiza el K-S

Conclusión.

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:

  1. Mayor recopilación de registros para el ajuste del modelo.
  2. Validación del modelo con una base mas grande.
  3. Poseer las fechas de evaluación de los clientes para evaluar la distribución del score en el tiempo, junto con sus indicadores.
  4. Al tener mayor cantidad de registros evaluar atributos segmentadores para tener posibilidad de generar un modelo segmentado, con la finalidad de aumentar la calidad del modelo.