CASO: BANCO “PERUBANK”

“PERUBANK” Es una institución financiera que cuenta con miles de clientes en todo el territorio nacional, esta organización brinda un conjunto de servicios a personas o empresas. En uno de sus servicios sobre préstamos personales en su cartera de clientes se registra y se hace seguimiento de los prestamos ofrecidos a tales clientes. Para la institución es importante evaluar la morosidad de los prestamos brindados, por lo que registra los datos y el seguimiento que se realiza durante un periodo. Los datos de “Ejemplo_banco_missing.csv” corresponden a los registros de los clientes que solicitaron un préstamo y si este fue cancelado o terminó en mora, en este ejemplo las variables que se toman en cuenta son: • Sexo: El género del cliente • Fono: Si el cliente tiene teléfono personal • Edad: Edad del cliente • Hijos: Número de hijos del cliente • Garante: Si el cliente cuenta con garante • Aval: Si el cliente avala algún préstamo • Meses: Meses que el cliente registra en la institución • Renta: Renta del cliente • Mora: Resultado del prestamos (si fue mora o no)

Cargamos Datos

#Cargar
banco<-read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Estadistica-R/master/Ejemplo_banco_missing.csv", 
                    sep = ";" , stringsAsFactors = TRUE)
head(banco)
##        sexo fono edad hijos garante aval meses renta mora
## 1 Masculino   Si   44     3      Si   Si    63  Fija   No
## 2 Masculino   Si   77     4      Si   No    62  Fija   Si
## 3 Masculino   No   59     5      No   Si    59  Fija   Si
## 4 Masculino   No   35     5      Si   Si    58  Fija   Si
## 5 Masculino   Si   65     0      No   Si    56  Fija   No
## 6  Femenino   Si   66     1      No   No    54  Fija   No

Verficamos

which(colSums(is.na(banco))!=0)
##  edad hijos meses 
##     3     4     7

Realizar el analisis utilizando librerias

library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
## 
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
## 
##     sleep
library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
missingraf=aggr(banco,numbers=T)

summary(missingraf)
## 
##  Missings per variable: 
##  Variable Count
##      sexo     0
##      fono     0
##      edad     5
##     hijos     2
##   garante     0
##      aval     0
##     meses     2
##     renta     0
##      mora     0
## 
##  Missings in combinations of variables: 
##       Combinations Count Percent
##  0:0:0:0:0:0:0:0:0    91      91
##  0:0:0:0:0:0:1:0:0     2       2
##  0:0:0:1:0:0:0:0:0     2       2
##  0:0:1:0:0:0:0:0:0     5       5

Para determinar mejor los patrones de comportamiento de missing se puede utilizar la siguiente fución:

matrixplot(banco)

banco[38:4,]
##         sexo fono edad hijos garante aval meses    renta mora
## 38  Femenino   No   57     5      Si   Si    43     Fija   Si
## 37             No   NA     0      Si   Si    44     Fija   No
## 36 Masculino   No   67     2      No   Si    45     Fija   No
## 35 Masculino   No   65     5      Si   Si    45     Fija   Si
## 34 Masculino   Si   68     1      No   No    46     Fija   No
## 33 Masculino   No   66     0      No   Si    46     Fija   No
## 32 Masculino   No   66     0      Si   Si    46     Fija   No
## 31 Masculino   Si   64     4      No   Si    46     Fija   Si
## 30 Masculino   Si   66     0      No   Si    47     Fija   No
## 29 Masculino   Si   61     1      Si   Si    47     Fija   No
## 28  Femenino   Si   69     1      Si   No    48     Fija   No
## 27 Masculino   Si   69     3      No   No    48     Fija   No
## 26 Masculino   No   68     3      No   Si    48     Fija   No
## 25 Masculino   Si   75     1      No   No    49            No
## 24 Masculino   No   74     0      Si   Si    49     Fija   No
## 23 Masculino   Si   61     0      No   Si    49     Fija   No
## 22 Masculino   No   61     0      Si   Si    49     Fija   No
## 21  Femenino   No   76     0      No   Si    50     Fija   No
## 20 Masculino   No   NA     1      Si   No    50     Fija   No
## 19 Masculino   Si   68     1      No   Si    50     Fija   No
## 18 Masculino   Si   73     0      Si   Si    51     Fija   No
## 17 Masculino   No   73     4      Si   Si    51     Fija   Si
## 16 Masculino   Si   72     5      Si         51     Fija   Si
## 15             Si   69     0      No   No    51     Fija   No
## 14 Masculino   Si   61     0      Si   Si    51     Fija   No
## 13 Masculino   Si   60     0      No   Si    51     Fija   No
## 12  Femenino   Si   76     0      Si   No    52     Fija   No
## 11  Femenino   Si   52     0      Si   Si    52 Variable   No
## 10 Masculino   No   75     1      Si   Si    53     Fija   Si
## 9  Masculino   Si   74     0      No   Si    53     Fija   No
## 8  Masculino   No   73     0      No   No    53     Fija   No
## 7   Femenino   Si   73     5      Si   Si    53     Fija   Si
## 6   Femenino   Si   66     1      No   No    54     Fija   No
## 5  Masculino   Si   65     0      No   Si    56     Fija   No
## 4  Masculino   No   35     5      Si   Si    58     Fija   Si

otra representación

#con libreria mice
library(mice)
md.pattern(banco, rotate.names =TRUE)

##    sexo fono garante aval renta mora hijos meses edad  
## 91    1    1       1    1     1    1     1     1    1 0
## 5     1    1       1    1     1    1     1     1    0 1
## 2     1    1       1    1     1    1     1     0    1 1
## 2     1    1       1    1     1    1     0     1    1 1
##       0    0       0    0     0    0     2     2    5 9

La libreria visdat permite visualizar missing pero los ordena por tipo

library(visdat)
## Warning: package 'visdat' was built under R version 4.3.2
vis_dat(banco)

porcetajes missing

vis_miss(banco)

##2.1 Eliminar filas o columnas co missing(es recomendale optar por eliminar columnas si el % de missing esta por arriba del 15 % <para alguns expertos 30%>) solo para este ejemplo se va a eliminar filas:

banco_corregido1  <- na.omit(banco)
str(banco_corregido1)
## 'data.frame':    91 obs. of  9 variables:
##  $ sexo   : Factor w/ 3 levels "","Femenino",..: 3 3 3 3 3 2 2 3 3 3 ...
##  $ fono   : Factor w/ 2 levels "No","Si": 2 2 1 1 2 2 2 1 2 1 ...
##  $ edad   : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ hijos  : int  3 4 5 5 0 1 5 0 0 1 ...
##  $ garante: Factor w/ 2 levels "No","Si": 2 2 1 2 1 1 2 1 1 2 ...
##  $ aval   : Factor w/ 3 levels "","No","Si": 3 2 3 3 3 2 3 2 3 3 ...
##  $ meses  : int  63 62 59 58 56 54 53 53 53 53 ...
##  $ renta  : Factor w/ 3 levels "","Fija","Variable": 2 2 2 2 2 2 2 2 2 2 ...
##  $ mora   : Factor w/ 2 levels "No","Si": 1 2 2 2 1 1 2 1 1 2 ...
##  - attr(*, "na.action")= 'omit' Named int [1:9] 20 37 42 43 58 62 84 87 97
##   ..- attr(*, "names")= chr [1:9] "20" "37" "42" "43" ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido1))!= 0)
## named integer(0)

#2.2 Aplicando técnicas de imputación Imputación por medidas de tendencia central

library(DMwR2)
## Warning: package 'DMwR2' was built under R version 4.3.2
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## 
## Attaching package: 'DMwR2'
## The following object is masked from 'package:VIM':
## 
##     kNN
library(DMwR2)
banco_corregido2<-centralImputation(banco) #DMwR, mediana (númerico), moda(no númerico)
str(banco_corregido2)
## 'data.frame':    100 obs. of  9 variables:
##  $ sexo   : Factor w/ 3 levels "","Femenino",..: 3 3 3 3 3 2 2 3 3 3 ...
##  $ fono   : Factor w/ 2 levels "No","Si": 2 2 1 1 2 2 2 1 2 1 ...
##  $ edad   : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ hijos  : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ garante: Factor w/ 2 levels "No","Si": 2 2 1 2 1 1 2 1 1 2 ...
##  $ aval   : Factor w/ 3 levels "","No","Si": 3 2 3 3 3 2 3 2 3 3 ...
##  $ meses  : num  63 62 59 58 56 54 53 53 53 53 ...
##  $ renta  : Factor w/ 3 levels "","Fija","Variable": 2 2 2 2 2 2 2 2 2 2 ...
##  $ mora   : Factor w/ 2 levels "No","Si": 1 2 2 2 1 1 2 1 1 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido2))!= 0)
## named integer(0)

##Utilizando otra librería para imputar datos

library(VIM)
banco_corregido3 <- initialise(banco, method = "median") #media (continuos) mediana (discretos),moda(no númerico)

str(banco_corregido3)
## 'data.frame':    100 obs. of  9 variables:
##  $ sexo   : Factor w/ 3 levels "","Femenino",..: 3 3 3 3 3 2 2 3 3 3 ...
##  $ fono   : Factor w/ 2 levels "No","Si": 2 2 1 1 2 2 2 1 2 1 ...
##  $ edad   : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ hijos  : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ garante: Factor w/ 2 levels "No","Si": 2 2 1 2 1 1 2 1 1 2 ...
##  $ aval   : Factor w/ 3 levels "","No","Si": 3 2 3 3 3 2 3 2 3 3 ...
##  $ meses  : num  63 62 59 58 56 54 53 53 53 53 ...
##  $ renta  : Factor w/ 3 levels "","Fija","Variable": 2 2 2 2 2 2 2 2 2 2 ...
##  $ mora   : Factor w/ 2 levels "No","Si": 1 2 2 2 1 1 2 1 1 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido3))!= 0)
## named integer(0)

##Utilizando otra librería para imputar datos

library(VIM)
banco_corregido3 <- initialise(banco, method ="median") #media (continuos) mediana (discretos),moda(no númerico)
str(banco_corregido3)
## 'data.frame':    100 obs. of  9 variables:
##  $ sexo   : Factor w/ 3 levels "","Femenino",..: 3 3 3 3 3 2 2 3 3 3 ...
##  $ fono   : Factor w/ 2 levels "No","Si": 2 2 1 1 2 2 2 1 2 1 ...
##  $ edad   : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ hijos  : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ garante: Factor w/ 2 levels "No","Si": 2 2 1 2 1 1 2 1 1 2 ...
##  $ aval   : Factor w/ 3 levels "","No","Si": 3 2 3 3 3 2 3 2 3 3 ...
##  $ meses  : num  63 62 59 58 56 54 53 53 53 53 ...
##  $ renta  : Factor w/ 3 levels "","Fija","Variable": 2 2 2 2 2 2 2 2 2 2 ...
##  $ mora   : Factor w/ 2 levels "No","Si": 1 2 2 2 1 1 2 1 1 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido3))!= 0)
## named integer(0)

##Imputación utilizando vecinos más cercanos

library(DMwR2)
banco_corregido4<-knnImputation(banco, k=10)
str(banco_corregido4)
## 'data.frame':    100 obs. of  9 variables:
##  $ sexo   : Factor w/ 3 levels "","Femenino",..: 3 3 3 3 3 2 2 3 3 3 ...
##  $ fono   : Factor w/ 2 levels "No","Si": 2 2 1 1 2 2 2 1 2 1 ...
##  $ edad   : num  44 77 59 35 65 66 73 73 74 75 ...
##  $ hijos  : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ garante: Factor w/ 2 levels "No","Si": 2 2 1 2 1 1 2 1 1 2 ...
##  $ aval   : Factor w/ 3 levels "","No","Si": 3 2 3 3 3 2 3 2 3 3 ...
##  $ meses  : num  63 62 59 58 56 54 53 53 53 53 ...
##  $ renta  : Factor w/ 3 levels "","Fija","Variable": 2 2 2 2 2 2 2 2 2 2 ...
##  $ mora   : Factor w/ 2 levels "No","Si": 1 2 2 2 1 1 2 1 1 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido4))!= 0)
## named integer(0)