2 Introducción y Preparación de la Base de Datos

2.1 Configuración Inicial

2.1.1 Configuración del Entorno

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)

2.2 Bases de Datos

2.2.1 Carga Base de Datos del Cliente

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

2.2.2 Revisamos la calidad de la base con el fin de estrablecer controles iniciales.

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

2.2.3 Agrpamos la data a nivel cliente, fecha, solicitud y le pegamos el score en el momento de la solicitud

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

2.2.4 Hacemos la union de la base a nivel cliente con las cuentas de cada uno de ellos. Esta union es a nivel cliente, fecha. solicitud. Una vez unida la info de cuentas, volvermos a dejarla agrupada a nivel cliente

#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

3 Rechazados

Filtro de clientes con marca de Rechazo en la entidad. Creamos el bad rate meses para evaluar su distribucion y comportamiento inicial.

3.1 Base Clientes Rechazados

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

3.2 Base Clientes Rechazados pero sin comportamiento

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)

4 Aprobados

Filtro de clientes con marca de Aprobado. Creamos el bad rate 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()

5 Aprobados No formalizados

Filtro de clientes con marca de Aprobada no Formalizada en la entidad. Creamos el bad rate meses para evaluar su distribucion y comportamiento inicial.

5.1 Base Clientes Aprobados No formalizados, comportamiento en Mercado

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

5.1.1 Base Clientes Aprobados No Formalizados, con desembolso

Descartamos este grupo de clientes, pues tan solo totalizan 64 clientes

6 Base Total Consolidada

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.

6.1 Base Total consolidada

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

7 Documentacion

Documentacion_Base