© 2020 TransUnion LLC
All Rights Reserved
No part of this publication may be reproduced or distributed in any form or by any means, electronic or otherwise, now known or hereafter developed, including, but not limited to, the Internet, without the explicit prior written consent from TransUnion LLC.
Requests for permission to reproduce or distribute any part of, or all of, this publication should be mailed to:
Law Department
TransUnion
555 West Adams
Chicago, Illinois 60661
The “T” logo, TransUnion, and other trademarks, service marks, and logos (the “Trademarks”) used in this publication are registered or unregistered Trademarks of TransUnion LLC or their respective owners. Trademarks may not be used for any purpose whatsoever without the express written permission of the Trademark owner.
Nuestras herramientas de modelado utilizan software de código abierto, incluidas en R. Las herramientas de código abierto tienen la ventaja de ser desarrolladas y examinadas por una comunidad de usuarios que abarca una amplia variedad de aplicaciones. El código abierto, proporciona una amplia biblioteca de paquetes y la disponibilidad de los últimos algoritmos y técnicas.
### Librerias
library(TUISG) # TU Core R Tools
library(stellar) # TU Tree building tools
library(pleiadis) # TU Binning tools
library(comet) # TU Constrained Regression Tools
library(eris) # TU Regect Inference Tools
library(shiny)
library(DT) # Table formatting
library(tidyverse) # basic data manipulation
library(reshape2) # more data manupulation
library(plotly) # interactive plots
library(ReporteRs) # Fancy formatting
library(cowplot) # Grid plots
library(xgboost) # for gbms
library(data.table)
library(breakDown) # explain stuff
library(dplyr)
library(readxl)
Una vez recibida la base de clientes a nivel cliente-fecha solicitud-estado aprobación (BI Ent), extraemos las cuentas originadas por estos clientes hasta tres meses despues de la fecha de solicitud del credito (Cuentas). Adicionalmete extraemos el puntaje del Score CV en el momento de la fecha de solicitud de estos clientes (Score).
BI_ent <- read_excel("/shared/nas/shape/bu_lam/persist/AnalyticsDR/BSC/AN_BCS_103_CM_201911/V3/BI_R_NODUPL.xlsx")
table(BI_ent$FECHASOL)
##
## 201601 201602 201604 201605 201606 201607 201608 201609 201610 201611 201612
## 802 861 1293 1316 801 1377 1379 1109 891 998 694
## 201701 201702 201703 201704 201705 201706 201707 201708 201709 201710 201711
## 770 817 785 744 1258 1056 1443 1192 676 988 1916
## 201712 201801 201802 201803 201804 201805 201806 201807 201808 201809
## 785 983 1006 1283 1357 1906 1758 2154 1343 1462
BI_vars <- read_excel("/shared/nas/shape/bu_lam/persist/AnalyticsDR/BSC/AN_BCS_103_CM_201911/V3/BI_VAR_NODUPL.xlsx")
Cuentas <- read_excel("/shared/nas/shape/bu_lam/persist/AnalyticsDR/BSC/AN_BCS_103_CM_201911/V3/R_CTAS_NODUP.xlsx")
score <- read_excel("/shared/nas/shape/bu_lam/persist/AnalyticsDR/BSC/AN_BCS_103_CM_201911/V3/ENTIDAD_SCORE.xlsx")
nrow(BI_ent)
## [1] 37203
#37203
str(BI_ent)
## tibble [37,203 × 84] (S3: tbl_df/tbl/data.frame)
## $ NUMERO_IDENTIFICACION : num [1:37203] 1e+08 1e+08 1e+08 1e+08 1e+08 ...
## $ EDAD : num [1:37203] 71 64 60 48 43 62 50 65 49 53 ...
## $ NACIONALIDAD : chr [1:37203] "DOMINICANA" "DOMINICANA" "DOMINICANA" "DOMINICANA" ...
## $ SEXO : chr [1:37203] "F" "M" "F" "F" ...
## $ PRODUCTO : chr [1:37203] "Tienda" "Consumo" "Tienda" "Tienda" ...
## $ NUMERO_SOLICITUD : num [1:37203] 13956813 12102993 12067605 15047364 16940291 ...
## $ SUCURSAL_O_STAND : chr [1:37203] "STAND - 100 X 100 OPORTUNIDADES" "SUCURSAL BONAIRE" "STAND - JOSXA, SRL" "STAND - LIVI ON TRADE, SRL" ...
## $ FECHA_SOLICITUD : POSIXct[1:37203], format: "2017-02-24" "2016-07-14" ...
## $ DECISION : chr [1:37203] "RECHAZADO POLITICAS" "RECHAZADO POLITICAS" "RECHAZADO POLITICAS" "RECHAZADO POLITICAS" ...
## $ OBSERVACIONES_SOBRE_SOLICITUD : chr [1:37203] "RECHAZADO" "RECHAZADO" "RECHAZADO" "RECHAZADO" ...
## $ INGRESOS_DECLARADOS : num [1:37203] 96376 72778 80000 26091 44153 ...
## $ TIPO_DE_INGRESO : chr [1:37203] NA NA NA NA ...
## $ INGRESO_VERIFICADO : chr [1:37203] "NO" "SI" "NO" "SI" ...
## $ MONTO_SOLICITADO : num [1:37203] 62000 200000 96000 25000 150000 ...
## $ PLAZO : num [1:37203] 36 36 36 12 36 36 36 6 36 12 ...
## $ TASA_INTERES : num [1:37203] 24 19.95 24 0.0001 28 ...
## $ CUOTA_CONSOLIDADA : chr [1:37203] "NO" "NO" "NO" "NO" ...
## $ CARGOS_X_CHEQUE : chr [1:37203] "NO" "NO" "SI" "SI" ...
## $ GASTO_CIERRE_PORC : num [1:37203] 0 0 0 0 0 0 0 6 0 5 ...
## $ NOMBRE_ASEGURADORA : chr [1:37203] "Mapfre" NA "Mapfre" "Mapfre" ...
## $ SCORE_2 : num [1:37203] 667 633 622 642 693 591 607 631 100 100 ...
## $ RAZON_SCORE_1 : chr [1:37203] "Cantidad de meses transcurridos desde que obtuvo la categoría de atraso mayor o igual a 90 días más reciente, e"| __truncated__ "Cantidad de indagaciones de Solicitud de Crédito en los últimos 12 meses, excluyendo las realizadas por el Sect"| __truncated__ "Cantidad de meses transcurridos desde que obtuvo la categoría de atraso mayor o igual a 90 días más reciente, e"| __truncated__ "Cantidad de cuentas con balance en atraso en los últimos 6 meses, excluyendo las cuentas del Sector Telecomunicaciones" ...
## $ RAZON_SCORE_2 : chr [1:37203] "Cantidad de meses transcurridos desde que obtuvo la categoría de atraso mayor o igual a 60 días más reciente, e"| __truncated__ "Cantidad de meses transcurridos desde que obtuvo la categoría de atraso mayor o igual a 90 días más reciente, e"| __truncated__ "Peor categoría de atraso ocurrido en los últimos 24 meses excluyendo las cuentas del Sector Telecomunicaciones" "Cantidad de cuentas actualizadas en los últimos 6 meses con utilización del límite mayor al 75%, excluyendo las"| __truncated__ ...
## $ RAZON_SCORE_3 : chr [1:37203] NA "Cantidad de cuentas del Sector Telecomunicaciones con balance en atraso en los últimos 12 meses" "Cantidad de cuentas actualizadas en los últimos 6 meses con utilización del límite mayor al 75%, excluyendo las"| __truncated__ "Peor categoría de atraso obtenido en cuentas activas que fueron actualizadas en los últimos 12 meses, excluyen"| __truncated__ ...
## $ INGRESO_ESTIMADO : num [1:37203] 96376 90690 80019 59879 44153 ...
## $ SUMATORIA_DE_CUOTAS_DE_BURO : chr [1:37203] NA "25893" "10686" "11247" ...
## $ PAGO_MINIMO_CALCULADO : num [1:37203] 2038 1347 9738 475 80 ...
## $ TOTAL_GASTOS_MENSUALES_UTILIZADO: num [1:37203] 2038 27240 20424 11722 1825 ...
## $ INGRESO_NETO : num [1:37203] 94338 45538 59576 14369 42328 ...
## $ NIVEL_DE_ENDEUDAMIENTO_ACTUAL_PO: num [1:37203] 0.02 37 26 0.45 0.04 54 0.29 0.33 6 0.66 ...
## $ NIVEL_DE_ENDEUDAMIENTO_FUTURO_PO: num [1:37203] 2.11 0 0 44.93 18.26 ...
## $ RELACION_CUOTA_VS_INGRESO_PORC : num [1:37203] 0 0 0 0 14 0 0 0 0 0 ...
## $ RESPUESTA_DEL_CLIENTE : chr [1:37203] NA NA NA NA ...
## $ MONTO_MAXIMO_A_FINANCIAR : num [1:37203] 0 0 0 0 380820 ...
## $ MONTO_APROBADO : chr [1:37203] NA NA NA NA ...
## $ CUOTA_MENSUAL : num [1:37203] 0 0 0 0 15836 ...
## $ SEGURO : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ SEGMENTO : chr [1:37203] NA NA NA NA ...
## $ LIMITE_MAXIMO_PRESTAMOS : chr [1:37203] NA "500000" "280000" "200000" ...
## $ CANTIDAD_PRODUCTOS_TOTAL : num [1:37203] 1 1 0 0 2 0 1 6 0 0 ...
## $ CANTIDAD_PRODUCTO_PC : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_FA : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_LE : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_LC : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_CF : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_CE : num [1:37203] 0 0 0 0 0 0 0 1 0 0 ...
## $ CANTIDAD_PRODUCTO_PH : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ CANTIDAD_PRODUCTO_PP : num [1:37203] 0 0 0 0 0 0 0 1 0 0 ...
## $ CANTIDAD_PRODUCTO_TC : num [1:37203] 1 1 0 0 2 0 1 2 0 0 ...
## $ CANTIDAD_PRODUCTO_PT : num [1:37203] 0 0 0 0 0 0 0 2 0 0 ...
## $ CANTIDAD_PRODUCTO_PV : num [1:37203] 0 0 0 0 0 0 0 0 0 0 ...
## $ MAX_ANTIGUDAD_TOTAL : num [1:37203] 55 30 -9999 -9999 48 ...
## $ MAX_ANTIGUEDAD_PC : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_FA : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_LE : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_LC : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_CF : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_CE : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_PH : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_PP : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_TC : num [1:37203] 55 30 -9999 -9999 48 ...
## $ MAX_ANTIGUEDAD_PT : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ MAX_ANTIGUEDAD_PV : num [1:37203] -9999 -9999 -9999 -9999 -9999 ...
## $ PRIMER_PRODUCTO_FECHA : chr [1:37203] "10Jul2012" "13Jan2014" NA NA ...
## $ PRIMER_PRODUCTO_DESCRIPCION : chr [1:37203] "TC" "TC" NA NA ...
## $ NUMERO_DEL_CREDITO : chr [1:37203] NA NA NA NA ...
## $ NIVEL_3 : chr [1:37203] NA NA NA NA ...
## $ NIVEL_4 : chr [1:37203] NA NA NA NA ...
## $ MONEDA : chr [1:37203] NA NA NA NA ...
## $ CODIGO_PROGRAMA_DE_NEGOCIO : chr [1:37203] NA NA NA NA ...
## $ PROGRAMA_DE_NEGOCIO : chr [1:37203] NA NA NA NA ...
## $ MONTO_CREDITO : chr [1:37203] NA NA NA NA ...
## $ MONTO_DESEMBOLSADO : chr [1:37203] NA NA NA NA ...
## $ F_PRIMER_DESEMBOLSO : chr [1:37203] NA NA NA NA ...
## $ PLAZO_PR_DIAS : chr [1:37203] NA NA NA NA ...
## $ FECHA_APROBACION : chr [1:37203] NA NA NA NA ...
## $ FECHA_CANCELACION : chr [1:37203] NA NA NA NA ...
## $ FECHA_CASTIGO : chr [1:37203] NA NA NA NA ...
## $ CANTIDAD_MESES_EN_CARTERA : chr [1:37203] NA NA NA NA ...
## $ ESTADO : chr [1:37203] NA NA NA NA ...
## $ EXCLUSIONES_RAZONES : chr [1:37203] NA NA NA NA ...
## $ FECHASOL : num [1:37203] 201702 201607 201607 201707 201802 ...
## $ ORDEN_SOL : num [1:37203] 3 3 3 3 2 3 3 3 3 3 ...
## $ CONTADOR : num [1:37203] 1 1 1 1 1 1 1 1 1 1 ...
class(BI_ent)
## [1] "tbl_df" "tbl" "data.frame"
colSums(is.na(BI_ent))[colSums(is.na(BI_ent))>0]
## SUCURSAL_O_STAND TIPO_DE_INGRESO
## 273 32244
## NOMBRE_ASEGURADORA RAZON_SCORE_1
## 13792 872
## RAZON_SCORE_2 RAZON_SCORE_3
## 5035 11602
## SUMATORIA_DE_CUOTAS_DE_BURO RESPUESTA_DEL_CLIENTE
## 9584 28442
## MONTO_APROBADO SEGMENTO
## 17111 16938
## LIMITE_MAXIMO_PRESTAMOS PRIMER_PRODUCTO_FECHA
## 5103 20360
## PRIMER_PRODUCTO_DESCRIPCION NUMERO_DEL_CREDITO
## 20360 24210
## NIVEL_3 NIVEL_4
## 24210 24210
## MONEDA CODIGO_PROGRAMA_DE_NEGOCIO
## 24210 27747
## PROGRAMA_DE_NEGOCIO MONTO_CREDITO
## 27747 24210
## MONTO_DESEMBOLSADO F_PRIMER_DESEMBOLSO
## 24210 24210
## PLAZO_PR_DIAS FECHA_APROBACION
## 24210 24210
## FECHA_CANCELACION FECHA_CASTIGO
## 26442 36363
## CANTIDAD_MESES_EN_CARTERA ESTADO
## 24210 24210
## EXCLUSIONES_RAZONES
## 33181
BI_ent_1 <- BI_ent%>%select(NUMERO_IDENTIFICACION, PRODUCTO, NUMERO_SOLICITUD, NUMERO_DEL_CREDITO, FECHA_SOLICITUD,FECHA_APROBACION, CANTIDAD_MESES_EN_CARTERA ,DECISION, OBSERVACIONES_SOBRE_SOLICITUD, MONTO_DESEMBOLSADO, F_PRIMER_DESEMBOLSO)
#37203
BI_ent_vars_vip <- BI_ent%>%select(NUMERO_IDENTIFICACION,FECHA_SOLICITUD,PRODUCTO,
SUCURSAL_O_STAND, NOMBRE_ASEGURADORA,CARGOS_X_CHEQUE, INGRESO_VERIFICADO, INGRESOS_DECLARADOS, EDAD)%>%
mutate(FECHA_SOL = (as.numeric(substr(FECHA_SOLICITUD, 1, 4))*100 + (as.numeric(substr(FECHA_SOLICITUD, 6, 7)))))
#37203
#HAGO MATCH ENTRE BASE ENTIDAD Y SU SCORE
BIDataEnt <- BI_ent_1%>%inner_join(score, by = c('NUMERO_IDENTIFICACION','NUMERO_SOLICITUD','FECHA_SOLICITUD'))
#37203
BIDataEnt_Seg <- BIDataEnt %>%mutate(FECHA_SOL = (as.numeric(substr(FECHA_SOLICITUD, 1, 4))*100 + (as.numeric(substr(FECHA_SOLICITUD, 6, 7)))))
#37203
table(BIDataEnt$DECISION)
##
## APROBADO RECHAZADO POLITICAS
## 19036 18167
table(BIDataEnt$OBSERVACIONES_SOBRE_SOLICITUD)
##
## APROBADA NO FORMALIZADA DESEMBOLSADO RECHAZADO
## 6043 12993 18167
table(BIDataEnt$PRODUCTO)
##
## Consumo Tienda Vehiculo
## 13519 23411 273
#CALIDAD BASE CUENTAS
nrow(Cuentas)
## [1] 67412
#67412
str(Cuentas)
## tibble [67,412 × 24] (S3: tbl_df/tbl/data.frame)
## $ FECHA_DE_APERTURA_CUENTA_NUEVA : POSIXct[1:67412], format: "2016-09-13" "2016-07-18" ...
## $ CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV: chr [1:67412] "F0453" "F0028" "F0120" "F1453" ...
## $ N_MERO_DE_CUENTA_CUENTA_NUEVA : chr [1:67412] "73518" "3477853" "5410123001216079" "5896251556223" ...
## $ TIPO_DE_CUENTA_NUEVA : chr [1:67412] "PR" "PR" "TC" "TC" ...
## $ MONEDA_CUENTA_NUEVA : chr [1:67412] "RD" "RD" "RD" "RD" ...
## $ CUENTA_NUEVA_CANCELADA : num [1:67412] 1 1 0 1 1 1 1 1 1 1 ...
## $ PEOR_MOP_CUENTA_NUEVA : num [1:67412] 0 0 0 NA NA 0 4 0 0 0 ...
## $ BALANCE_EN_MORA_PEOR_MOP_CUENTA : num [1:67412] 0 0 0 0 0 ...
## $ ESTATUS_ADVERSO_CUENTA_NUEVA : num [1:67412] 0 0 0 0 0 0 0 0 0 0 ...
## $ BALANCE_EN_MORA_ESTATUS_ADVERSO : num [1:67412] 0 0 0 0 0 0 0 0 0 0 ...
## $ BUENO_SCORE2__CUENTANUEVA : num [1:67412] 1 1 1 1 1 1 0 1 1 1 ...
## $ MALO_SCORE2_CUENTANUEVA : num [1:67412] 0 0 0 0 0 0 1 0 0 0 ...
## $ INDETERMINADO_SCORE2_CUENTANUEVA: num [1:67412] 0 0 0 0 0 0 0 0 0 0 ...
## $ BUENO_CVSCORE__CUENTANUEVA : num [1:67412] 1 1 1 1 1 1 0 1 1 1 ...
## $ MALO_CVSCORE_CUENTANUEVA : num [1:67412] 0 0 0 0 0 0 1 0 0 0 ...
## $ INDETERMINADO_CVSCORE_CUENTANUEV: num [1:67412] 0 0 0 0 0 0 0 0 0 0 ...
## $ LIMITE_CUENTA_NUEVA : num [1:67412] 50000 97416 103500 82800 90268 ...
## $ BALANCE_PROMEDIO_CUENTA_NUEVA : num [1:67412] 39618 84611 0 NA NA ...
## $ BALANCE_ULT__MES_DESEMPE_O : num [1:67412] NA 70848 0 NA NA ...
## $ BALANCE_AL_MOMENTO_DEL_MONTO_EN : num [1:67412] NA 84788 NA NA NA ...
## $ MONTO_EN_ATRASO_M_XIMO : num [1:67412] NA 3777 NA NA NA ...
## $ MONTO_EN_ATRASO_ULT__MES_DESEMPE: num [1:67412] NA 0 0 NA NA 0 NA 0 0 0 ...
## $ NUMERO_IDENTIFICACION : num [1:67412] 1e+08 1e+08 1e+08 1e+08 1e+08 ...
## $ CONTADOR : num [1:67412] 1 1 1 1 1 1 1 1 1 1 ...
class(Cuentas)
## [1] "tbl_df" "tbl" "data.frame"
colSums(is.na(Cuentas))[colSums(is.na(Cuentas))>0]
## PEOR_MOP_CUENTA_NUEVA LIMITE_CUENTA_NUEVA
## 2222 572
## BALANCE_PROMEDIO_CUENTA_NUEVA BALANCE_ULT__MES_DESEMPE_O
## 2102 20534
## BALANCE_AL_MOMENTO_DEL_MONTO_EN MONTO_EN_ATRASO_M_XIMO
## 48019 48019
## MONTO_EN_ATRASO_ULT__MES_DESEMPE
## 20534
#HAGO MATCH ENTRE CUENTAS Y BASE ENTIDAD
BIData <- BIDataEnt%>%left_join(Cuentas, by = c('NUMERO_IDENTIFICACION'))
#91922
# FILTRO LA BASE POR SOLO TARJETAS Y PRESTAMOS
BIData_1<- BIData%>% filter(TIPO_DE_CUENTA_NUEVA %in% c('PR'))
#39494
BIData_1 <- BIData_1 %>%
mutate(FECHA_APER=(as.numeric(substr(FECHA_DE_APERTURA_CUENTA_NUEVA, 1, 4))*100 + (as.numeric(substr(FECHA_DE_APERTURA_CUENTA_NUEVA, 6, 7)))),
FECHA_SOL = (as.numeric(substr(FECHA_SOLICITUD, 1, 4))*100 + (as.numeric(substr(FECHA_SOLICITUD, 6, 7)))))
#39494
#CALCULO LA DIFERENCIA ENTRE FECHAS
BIData_1 <- BIData_1 %>%
mutate (fecha_dif= ((as.numeric(substr(FECHA_APER, 1, 4)) - as.numeric(substr(FECHA_SOL, 1, 4)))*12) + (as.numeric(substr(FECHA_APER, 5, 6)) - as.numeric(substr(FECHA_SOL, 5, 6))))
BIData_2 <- BIData_1 %>% filter((fecha_dif < 4 & fecha_dif >= -1))
#26514
Filtro de clientes con marca de Rechazo en la entidad. Creamos el bad rate 90@12 meses para evaluar su distribucion y comportamiento inicial.
Brech_PR <- BIData_2 %>% filter(OBSERVACIONES_SOBRE_SOLICITUD =='RECHAZADO')
#7695
Brech_PR_1 <- Brech_PR %>% filter(!(CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV %in% c('F0194')))
#7220
#table(Brech_PR_1$DECISION)
#table(Brech_PR_1$OBSERVACIONES_SOBRE_SOLICITUD)
#table(Brech_PR_1$CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV)
# AGRUPO CLIENTE FECHA
Brech_CL_PR<- Brech_PR_1 %>% group_by(NUMERO_IDENTIFICACION,FECHA_SOL,TIPO_DE_CUENTA_NUEVA) %>% summarise(conteo=n(),
MMAX=max(PEOR_MOP_CUENTA_NUEVA),
BGI0=max(MALO_CVSCORE_CUENTANUEVA),
BGI2=ifelse(BGI0==1,0,max(INDETERMINADO_CVSCORE_CUENTANUEV)),
BGI1=ifelse(BGI0==1|BGI2==1,0,max(BUENO_CVSCORE__CUENTANUEVA)),
SCORE=max(IND0105),
BGI_G= (ifelse(max(MALO_CVSCORE_CUENTANUEVA)==1,0,
ifelse(max(INDETERMINADO_CVSCORE_CUENTANUEV)==1,2,
ifelse(max(BUENO_CVSCORE__CUENTANUEVA)==1,1,NA)))))
Brech_CL_PR<- Brech_CL_PR %>%mutate(marca="RECH")%>%mutate(BGI_F=(ifelse(MMAX<3|is.na(MMAX),1,0)))
table(Brech_CL_PR$MMAX)
##
## 0 1 2 3 4 5 6 7
## 3349 1211 391 164 151 45 39 127
#5672
# QUITO LOS CLIENTES FALLECIDOS
Brech_CL_PRexc <- Brech_CL_PR%>% filter(SCORE <=9)
table(Brech_CL_PRexc$SCORE)
##
## 1 9
## 3 23
#3 fallecidos
#23 sin exp
Brech_CL_PR <- Brech_CL_PR%>% filter(SCORE >9)
#5646
#table(Brech_CL_PR$BGI_G)
#write.csv(Brech_CL_PR , "Brech_CL_PR.csv" , row.names = FALSE, na='')
# TABLA DE DISTRIBUCION INICIAL
gt_Brech_CL_PR <- gainsTable(BGI_G ~ SCORE, data = Brech_CL_PR, numOfIntervals = 10)
table(Brech_PR_1$DECISION)
##
## RECHAZADO POLITICAS
## 7220
table(Brech_PR_1$OBSERVACIONES_SOBRE_SOLICITUD)
##
## RECHAZADO
## 7220
table(Brech_PR_1$CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV)
##
## F0006 F0017 F0020 F0028 F0034 F0043 F0048 F0053 F0056 F0078 F0080 F0082 F0104
## 11 52 1089 972 3 2 10 832 153 50 36 74 199
## F0108 F0131 F0136 F0174 F0202 F0207 F0210 F0216 F0252 F0289 F0329 F0336 F0350
## 200 8 304 43 200 29 62 54 81 387 9 356 16
## F0378 F0423 F0453 F0486 F0490 F0496 F0503 F0515 F0578 F0648 F0680 F0709 F0720
## 31 1 550 63 64 17 2 12 56 1 21 5 24
## F0737 F0745 F0755 F0769 F0816 F0887 F0906 F0966 F0972 F0981 F0984 F1035 F1045
## 3 4 1 1 2 2 1 31 15 2 5 6 6
## F1050 F1052 F1182 F1187 F1189 F1208 F1227 F1232 F1342 F1349 F1381 F1382 F1576
## 14 6 124 18 21 35 27 248 1 102 25 22 6
## F1579 F1583 F1650 F1735 F1745 F1764 F1793 F1817 F1956 F1959 F2094 F2096 F2216
## 5 6 5 14 2 2 12 10 12 1 9 170 68
## F2219 F2243 F2368 F2379 F2393 F2401 F2420 F2423 F2445 F2446 F2451 F2452 F2459
## 1 4 2 2 6 8 1 21 10 5 2 2 2
## F2461 F2521 F2525 F2557 F2587 F2609 F2637 S0335 S0356 S0369
## 8 1 2 2 5 1 1 2 8 1
table(Brech_CL_PR$BGI_G)
##
## 0 1 2
## 550 4704 392
gt_Brech_CL_PR %>% wrapGainsTable()
Al ser clientes sin comportamiento no podemos evaluar su distribucion de acuerdo a un bad rate. Tan solo los identificamos 12.521
# TOMO LA BASE INICIAL Q ENVIO EL CLIENTE
PT <- BIDataEnt%>%mutate(
FECHA_SOL = (as.numeric(substr(FECHA_SOLICITUD, 1, 4))*100 + (as.numeric(substr(FECHA_SOLICITUD, 6, 7)))))
#37203
table(PT$OBSERVACIONES_SOBRE_SOLICITUD)
##
## APROBADA NO FORMALIZADA DESEMBOLSADO RECHAZADO
## 6043 12993 18167
RECH_NO_COMP <- PT %>% left_join(Brech_CL_PR,by=c('NUMERO_IDENTIFICACION','FECHA_SOL','IND0105'='SCORE'))
RECH_NO_COMP <- RECH_NO_COMP %>%filter(is.na(marca))%>%filter(OBSERVACIONES_SOBRE_SOLICITUD =='RECHAZADO')
#12521
# EXPORTO LOS RECHAZADOS SIN COMP EN EL MDO PARA PUNTUARLOS CON CV SCORE
#write.csv(RECH_NO_COMP , "RECH_NO_COMPv2.csv" , row.names = FALSE, na='')
#RCV_RECH_NO_COMP<-ntile(RECH_NO_COMP$SCORE,5)
Filtro de clientes con marca de Aprobado. Creamos el bad rate 90@12 meses para evaluar su distribucion y comportamiento inicial.
Bapro_PR <- BIData_2 %>% filter(OBSERVACIONES_SOBRE_SOLICITUD =='DESEMBOLSADO')
#16543
Bapro_PR_1 <- Bapro_PR %>% filter(CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV %in% c('F0194'))%>% filter((fecha_dif < 4 & fecha_dif >= 0))
#13592
#table(Bapro_PR_1$DECISION)
#table(Bapro_PR_1$OBSERVACIONES_SOBRE_SOLICITUD)
#table(Bapro_PR_1$MALO_CVSCORE_CUENTANUEVA)
base_banco<- Bapro_PR_1 %>% select(NUMERO_IDENTIFICACION,FECHA_SOL, FECHA_DE_APERTURA_CUENTA_NUEVA, MALO_CVSCORE_CUENTANUEVA, N_MERO_DE_CUENTA_CUENTA_NUEVA,PEOR_MOP_CUENTA_NUEVA)
##AGRUPO CLIENTE FECHA
Bapro_CL_PR<- Bapro_PR_1 %>% group_by(NUMERO_IDENTIFICACION,FECHA_SOL,TIPO_DE_CUENTA_NUEVA) %>% summarise(conteo=n(),
MMAX=max(PEOR_MOP_CUENTA_NUEVA),
BGI0=max(MALO_CVSCORE_CUENTANUEVA),
BGI2=ifelse(BGI0==1,0,max(INDETERMINADO_CVSCORE_CUENTANUEV)),
BGI1=ifelse(BGI0==1|BGI2==1,0,max(BUENO_CVSCORE__CUENTANUEVA)),
SCORE=max(IND0105),
BGI_G= (ifelse(max(MALO_CVSCORE_CUENTANUEVA)==1,0,
ifelse(max(INDETERMINADO_CVSCORE_CUENTANUEV)==1,2,
ifelse(max(BUENO_CVSCORE__CUENTANUEVA)==1,1,NA)))))
Bapro_CL_PR<- Bapro_CL_PR %>%mutate(marca="DESM")%>%mutate(BGI_F=(ifelse(MMAX<3|is.na(MMAX),1,0)))
#12968
Bapro_CL_PR_exc <- Bapro_CL_PR%>% filter(SCORE <=9)
table(Bapro_CL_PR_exc$SCORE)
##
## 1 9
## 24 23
#24 fallecidos
#23 sin exp
Bapro_CL_PR <- Bapro_CL_PR%>% filter(SCORE >9)
#12921
#write.csv(Bapro_CL_PR , "Bapro_CL_PR.csv" , row.names = FALSE, na='')
gt_Bapro_CL_PR <- gainsTable(BGI_G ~ SCORE, data = Bapro_CL_PR, numOfIntervals = 10)
table(Bapro_PR_1$DECISION)
##
## APROBADO
## 13592
table(Bapro_PR_1$OBSERVACIONES_SOBRE_SOLICITUD)
##
## DESEMBOLSADO
## 13592
table(Bapro_PR_1$MALO_CVSCORE_CUENTANUEVA)
##
## 0 1
## 12676 916
gt_Bapro_CL_PR %>% wrapGainsTable()
Filtro de clientes con marca de Aprobada no Formalizada en la entidad. Creamos el bad rate 90@12 meses para evaluar su distribucion y comportamiento inicial.
Bapro_NF_MDO <- BIData_2 %>% filter(OBSERVACIONES_SOBRE_SOLICITUD =='APROBADA NO FORMALIZADA')
#2267
Bapro_NF_MDO_1 <- Bapro_NF_MDO %>% filter(!(CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV %in% c('F0194')))
#2128
#table(Bapro_NF_MDO_1$DECISION)
#table(Bapro_NF_MDO_1$OBSERVACIONES_SOBRE_SOLICITUD)
#table(Bapro_NF_MDO_1$CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV)
##AGRUPO CLIENTE FECHA
Bapro_CL_NF_MDO<- Bapro_NF_MDO_1 %>% group_by(NUMERO_IDENTIFICACION,FECHA_SOL,TIPO_DE_CUENTA_NUEVA) %>% summarise(conteo=n(),
MMAX=max(PEOR_MOP_CUENTA_NUEVA),
BGI0=max(MALO_CVSCORE_CUENTANUEVA),
BGI2=ifelse(BGI0==1,0,max(INDETERMINADO_CVSCORE_CUENTANUEV)),
BGI1=ifelse(BGI0==1|BGI2==1,0,max(BUENO_CVSCORE__CUENTANUEVA)),
SCORE=max(IND0105),
BGI_G= (ifelse(max(MALO_CVSCORE_CUENTANUEVA)==1,0,
ifelse(max(INDETERMINADO_CVSCORE_CUENTANUEV)==1,2,
ifelse(max(BUENO_CVSCORE__CUENTANUEVA)==1,1,NA)))))
Bapro_CL_NF_MDO<- Bapro_CL_NF_MDO %>%mutate(marca="NF_MDO")%>%mutate(BGI_F=(ifelse(MMAX<3|is.na(MMAX),1,0)))
#1747
Bapro_CL_NF_MDO <- Bapro_CL_NF_MDO%>% filter(SCORE >9)
#1733
#write.csv(Bapro_CL_NF_MDO , "Bapro_CL_NF_MDO.csv" , row.names = FALSE, na='')
gt_Bapro_CL_NF_MDO_1 <- gainsTable(BGI_F ~ SCORE, data = Bapro_CL_NF_MDO, numOfIntervals = 10)
table(Bapro_NF_MDO_1$DECISION)
##
## APROBADO
## 2128
table(Bapro_NF_MDO_1$OBSERVACIONES_SOBRE_SOLICITUD)
##
## APROBADA NO FORMALIZADA
## 2128
table(Bapro_NF_MDO_1$CODIGO_DE_SUSCRIPTOR_CUENTA_NUEV)
##
## F0006 F0020 F0028 F0034 F0043 F0048 F0053 F0056 F0078 F0080 F0082 F0104 F0108
## 1 423 408 1 1 4 225 74 10 8 35 69 55
## F0136 F0174 F0202 F0207 F0210 F0216 F0252 F0289 F0329 F0336 F0350 F0378 F0453
## 49 7 61 9 12 24 7 31 2 117 3 9 167
## F0486 F0490 F0515 F0578 F0680 F0720 F0745 F0966 F0972 F1050 F1182 F1187 F1189
## 16 19 2 21 3 2 1 6 5 2 49 3 5
## F1208 F1227 F1232 F1349 F1381 F1382 F1576 F1583 F1735 F1793 F1817 F1956 F2096
## 11 4 50 49 11 2 3 1 2 1 3 3 25
## F2216 F2401 F2423 F2445 F2609 F2620
## 6 1 3 5 1 1
gt_Bapro_CL_NF_MDO_1 %>% wrapGainsTable()
Descartamos este grupo de clientes, pues tan solo totalizan 64 clientes
Luego de un analisis con la entidad se decide seleccionar a los clientes aprobados por la entidad con comportamiento y los rechazados por la entidad con comportamiento en el mercado. Se decide realizar un “oversampling” por un factor de 3,2 veces a la base de rechazos. Descartamos el grupo de clientes no formalizados.
set.seed("1939") #set seed for reproducibility
seg_sample_INF <-Brech_CL_PR %>% ungroup %>% sample_n(., size = 1128)
BFT <-bind_rows(Brech_CL_PR,Brech_CL_PR,Brech_CL_PR,seg_sample_INF)
#18066
BFT <-bind_rows(Bapro_CL_PR,BFT)
#30987
#HAGO JOIN CON LAS VARIABLES
BFT1 <- BFT%>%inner_join(BI_vars, by = c('NUMERO_IDENTIFICACION','FECHA_SOL'='FECHASOL'))
#30987
BFT1 <- BFT1%>%inner_join(BI_ent_vars_vip, by = c('NUMERO_IDENTIFICACION','FECHA_SOL'))
#EXPORTO A SAS Y HAGO COMPLETITUD Y CORRELACION
#write.csv(BFT1 , "BFT1.csv" , row.names = FALSE, na='')
#--------------------------------------------------------------------------------------------------------------
#SALVAR IMAGEN
#save.image(file="image1.rData")