Cargar Base

Limpiar Memoria

rm(list=ls())
source(list.files(pattern = "LIBRERIAS.R"))
## Warning: replacing previous import 'vctrs::data_frame' by 'tibble::data_frame'
## when loading 'dplyr'
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## Loading required package: lattice
## 
## Attaching package: 'BSDA'
## The following objects are masked from 'package:carData':
## 
##     Vocab, Wool
## The following object is masked from 'package:datasets':
## 
##     Orange
## Warning: package 'gmodels' was built under R version 4.0.4
df <- read.csv("Insumos/Dafault_Depurada.csv")
head(df)
##   ID LIMIT_BAL SEX EDUCATION MARRIAGE AGE PAY_0 PAY_2 PAY_3 PAY_4 PAY_5 PAY_6
## 1  1     20000   F  Pregrado   Casado  24     2     2    -1    -1    -2    -2
## 2  2    120000   F  Pregrado  Soltero  26    -1     2     0     0     0     2
## 3  3     90000   F  Pregrado  Soltero  34     0     0     0     0     0     0
## 4  4     50000   F  Pregrado   Casado  37     0     0     0     0     0     0
## 5  5     50000   M  Pregrado   Casado  57    -1     0    -1     0     0     0
## 6  6     50000   M  Posgrado  Soltero  37     0     0     0     0     0     0
##   BILL_AMT1 BILL_AMT2 BILL_AMT3 BILL_AMT4 BILL_AMT5 BILL_AMT6 PAY_AMT1 PAY_AMT2
## 1      3913      3102       689         0         0         0        0      689
## 2      2682      1725      2682      3272      3455      3261        0     1000
## 3     29239     14027     13559     14331     14948     15549     1518     1500
## 4     46990     48233     49291     28314     28959     29547     2000     2019
## 5      8617      5670     35835     20940     19146     19131     2000    36681
## 6     64400     57069     57608     19394     19619     20024     2500     1815
##   PAY_AMT3 PAY_AMT4 PAY_AMT5 PAY_AMT6 default
## 1        0        0        0        0       1
## 2     1000     1000        0     2000       1
## 3     1000     1000     1000     5000       0
## 4     1200     1100     1069     1000       0
## 5    10000     9000      689      679       0
## 6      657     1000     1000      800       0

Analisis de Variables Numericas Univariadas

df$SEX=as.factor(df$SEX)
df$EDUCATION=as.factor(df$EDUCATION)
df$MARRIAGE=as.factor(df$MARRIAGE)
summary(df)
##        ID          LIMIT_BAL       SEX           EDUCATION        MARRIAGE    
##  Min.   :    1   Min.   :  10000   F:17855   Bachiller: 4873   Casado :13477  
##  1st Qu.: 7474   1st Qu.:  50000   M:11746   Otros    :  123   Otros  :  318  
##  Median :14953   Median : 140000             Posgrado :10581   Soltero:15806  
##  Mean   :14972   Mean   : 167551             Pregrado :14024                  
##  3rd Qu.:22463   3rd Qu.: 240000                                              
##  Max.   :30000   Max.   :1000000                                              
##       AGE            PAY_0              PAY_2             PAY_3        
##  Min.   :21.00   Min.   :-2.00000   Min.   :-2.0000   Min.   :-2.0000  
##  1st Qu.:28.00   1st Qu.:-1.00000   1st Qu.:-1.0000   1st Qu.:-1.0000  
##  Median :34.00   Median : 0.00000   Median : 0.0000   Median : 0.0000  
##  Mean   :35.46   Mean   :-0.01493   Mean   :-0.1313   Mean   :-0.1634  
##  3rd Qu.:41.00   3rd Qu.: 0.00000   3rd Qu.: 0.0000   3rd Qu.: 0.0000  
##  Max.   :79.00   Max.   : 8.00000   Max.   : 8.0000   Max.   : 8.0000  
##      PAY_4             PAY_5            PAY_6           BILL_AMT1      
##  Min.   :-2.0000   Min.   :-2.000   Min.   :-2.0000   Min.   :-165580  
##  1st Qu.:-1.0000   1st Qu.:-1.000   1st Qu.:-1.0000   1st Qu.:   3528  
##  Median : 0.0000   Median : 0.000   Median : 0.0000   Median :  22259  
##  Mean   :-0.2183   Mean   :-0.264   Mean   :-0.2876   Mean   :  50957  
##  3rd Qu.: 0.0000   3rd Qu.: 0.000   3rd Qu.: 0.0000   3rd Qu.:  66623  
##  Max.   : 8.0000   Max.   : 8.000   Max.   : 8.0000   Max.   : 964511  
##    BILL_AMT2        BILL_AMT3         BILL_AMT4         BILL_AMT5     
##  Min.   :-69777   Min.   :-157264   Min.   :-170000   Min.   :-81334  
##  1st Qu.:  2970   1st Qu.:   2652   1st Qu.:   2329   1st Qu.:  1780  
##  Median : 21050   Median :  20035   Median :  19005   Median : 18091  
##  Mean   : 48942   Mean   :  46803   Mean   :  43123   Mean   : 40236  
##  3rd Qu.: 63497   3rd Qu.:  59830   3rd Qu.:  54271   3rd Qu.: 50072  
##  Max.   :983931   Max.   :1664089   Max.   : 891586   Max.   :927171  
##    BILL_AMT6          PAY_AMT1         PAY_AMT2          PAY_AMT3     
##  Min.   :-339603   Min.   :     0   Min.   :      0   Min.   :     0  
##  1st Qu.:   1278   1st Qu.:  1000   1st Qu.:    825   1st Qu.:   390  
##  Median :  17118   Median :  2100   Median :   2007   Median :  1800  
##  Mean   :  38858   Mean   :  5650   Mean   :   5895   Mean   :  5198  
##  3rd Qu.:  49121   3rd Qu.:  5005   3rd Qu.:   5000   3rd Qu.:  4500  
##  Max.   : 961664   Max.   :873552   Max.   :1684259   Max.   :896040  
##     PAY_AMT4         PAY_AMT5         PAY_AMT6         default      
##  Min.   :     0   Min.   :     0   Min.   :     0   Min.   :0.0000  
##  1st Qu.:   298   1st Qu.:   259   1st Qu.:   138   1st Qu.:0.0000  
##  Median :  1500   Median :  1500   Median :  1500   Median :0.0000  
##  Mean   :  4829   Mean   :  4795   Mean   :  5181   Mean   :0.2231  
##  3rd Qu.:  4014   3rd Qu.:  4042   3rd Qu.:  4000   3rd Qu.:0.0000  
##  Max.   :621000   Max.   :426529   Max.   :528666   Max.   :1.0000

Analisis de la Varaible Edad

Promedio_Edad=mean(df$AGE)
print(Promedio_Edad)
## [1] 35.46407

Histograma

En estadística, un histograma es una representación grÔfica de una variable en forma de barras, donde la superficie de cada barra es proporcional a la frecuencia de los valores representados

hist(x=df$AGE,main="Edad del cliente",col="green")

Deteccion de Datos Atipicos

Grafico de Puntos

plot(df$AGE,type = "b",col="darkred")

podemos ver que la mayor mayor concentracion de datos se da entre 20-65 aƱos. hay datos que se salen de esta concentracion, pueden ser datos atipicos.

Boxplot

Es un mĆ©todo estandarizado para representar grĆ”ficamente una serie de datos numĆ©ricos a travĆ©s de sus cuartiles. De esta manera, el diagrama de caja muestra a simple vista la mediana y los cuartiles de los datos,​ pudiendo tambiĆ©n representar los valores atĆ­picos de estos.

boxplot(df$AGE,horizontal = T,col = "darkblue")

Limites del Rango Intercuantil

Edades Atipicas

edad_Atipica=boxplot.stats(df$AGE)$out# Datos atipicos
edad_Atipica=as.data.frame(edad_Atipica)

proporcion

(nrow(edad_Atipica)/nrow(df))*100
## [1] 0.9087531

0.9% es el porcentaje de datos atipicos

Edad promedio de edades atipicas

mean(edad_Atipica$edad_Atipica)
## [1] 64.46468
hist(edad_Atipica$edad_Atipica)

min(edad_Atipica$edad_Atipica)
## [1] 61

Base sin edad Atipica

df_Sin_Edad_atipica=df[df$AGE< 61,]

Promedio sin Atipico

Promedio_Sin_edad_A=mean(df_Sin_Edad_atipica$AGE)
print(Promedio_Sin_edad_A) # No es normal
## [1] 35.19811
print(Promedio_Edad) # Datos Atipicos
## [1] 35.46407

Histograma sin Edad Atipicas

hist(df_Sin_Edad_atipica$AGE,col="green")

**Grafica de puntos

plot(df_Sin_Edad_atipica$AGE,col="red")

boxplot

boxplot(df_Sin_Edad_atipica$AGE,col="green")

Test de Normalidad

Test de Visual-qqplot*

qqnorm(df_Sin_Edad_atipica$AGE,pch=1)
qqline(df_Sin_Edad_atipica$AGE,col="steelblue",lwd=8)

Otra forma

podemos sospechar que la distribuccion de la edad no es normal

Test de Normalidad por Prueba de Hipotesis

comprobar:

Ho= Variable Edad proviene de una DIstribucion Normal Ha= Variable Edad No proviene de una DIstribucion Normal

Se evalua con un alfa de Significacia del 5%, en 95 de confinza estoy afirmando la Hipetesis

P valor de la Prueba (1-100%)

Si p valor > 5%, Se acepta la Normalidad o Ho si P>5%, los datos no son Normales.

Jarque Bera

options(scipen=999)
jb.norm.test(df_Sin_Edad_atipica$AGE,nrepl = 2000)
## 
##  Jarque-Bera test for normality
## 
## data:  df_Sin_Edad_atipica$AGE
## JB = 1978.3, p-value < 0.00000000000000022

Shapiro

sf.test(df_Sin_Edad_atipica$AGE[1:5000])
## 
##  Shapiro-Francia normality test
## 
## data:  df_Sin_Edad_atipica$AGE[1:5000]
## W = 0.95272, p-value < 0.00000000000000022

Prube de Kurtosis

kurtosis.norm.test(df_Sin_Edad_atipica$AGE,nrepl = 2000)
## 
##  Kurtosis test for normality
## 
## data:  df_Sin_Edad_atipica$AGE
## T = 2.5704, p-value < 0.00000000000000022

Conclusion: No existe Evidencia para AceptarH0, Vemos que el P valor en las tres prubeas es menor a 5%; es decir la variable edad no es Normal

Como llegar al Promedio

Prueba No Parametrico

SIGN.test(df_Sin_Edad_atipica$AGE,me=35.19,alternative = "two.side",conf.level = 0.95)
## 
##  One-sample Sign-Test
## 
## data:  df_Sin_Edad_atipica$AGE
## s = 29332, p-value = 0.0000000000000006661
## alternative hypothesis: true median is not equal to 0
## 95 percent confidence interval:
##  34 34
## sample estimates:
## median of x 
##          34 
## 
## Achieved and Interpolated Confidence Intervals: 
## 
##                   Conf.Level L.E.pt U.E.pt
## Lower Achieved CI     0.9495     34     34
## Interpolated CI       0.9500     34     34
## Upper Achieved CI     0.9509     34     34

Segun la Prueba No parametrica el verdadero promedio de la poblacion son 34 aƱos.

Remuestreo Estadistico

data=data.frame(df_Sin_Edad_atipica$AGE[1:1000])
names(data)[1]="x"
library(boot)
## 
## Attaching package: 'boot'
## The following object is masked from 'package:lattice':
## 
##     melanoma
## The following object is masked from 'package:car':
## 
##     logit
meanfun= function(data,i){
  d=data[i,]
  return(median(d))
}

bo = boot(data[,"x",drop=FALSE],statistic =
            meanfun,R=1000)

bo
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = data[, "x", drop = FALSE], statistic = meanfun, R = 1000)
## 
## 
## Bootstrap Statistics :
##     original  bias    std. error
## t1*       33   0.049   0.5453406
## Intervalo de confianza
boot.ci(bo,conf = 0.95,type = "bca")
## Warning in norm.inter(t, adj.alpha): extreme order statistics used as endpoints
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bo, conf = 0.95, type = "bca")
## 
## Intervals : 
## Level       BCa          
## 95%   (32, 33 )  
## Calculations and Intervals on Original Scale
## Warning : BCa Intervals used Extreme Quantiles
## Some BCa intervals may be unstable

Analisis de Variables Categoricas

glimpse(df)
## Rows: 29,601
## Columns: 25
## $ ID        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17...
## $ LIMIT_BAL <dbl> 20000, 120000, 90000, 50000, 50000, 50000, 500000, 100000...
## $ SEX       <fct> F, F, F, F, M, M, M, F, F, M, F, F, F, M, M, F, M, M, F, ...
## $ EDUCATION <fct> Pregrado, Pregrado, Pregrado, Pregrado, Pregrado, Posgrad...
## $ MARRIAGE  <fct> Casado, Soltero, Soltero, Casado, Casado, Soltero, Solter...
## $ AGE       <int> 24, 26, 34, 37, 57, 37, 29, 23, 28, 35, 34, 51, 41, 30, 2...
## $ PAY_0     <int> 2, -1, 0, 0, -1, 0, 0, 0, 0, -2, 0, -1, -1, 1, 0, 1, 0, 0...
## $ PAY_2     <int> 2, 2, 0, 0, 0, 0, 0, -1, 0, -2, 0, -1, 0, 2, 0, 2, 0, 0, ...
## $ PAY_3     <int> -1, 0, 0, 0, -1, 0, 0, -1, 2, -2, 2, -1, -1, 2, 0, 0, 2, ...
## $ PAY_4     <int> -1, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, -1, 0, 0, 0, 2, -1...
## $ PAY_5     <int> -2, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, -1, 0, 0, 0, 2, -1...
## $ PAY_6     <int> -2, 2, 0, 0, 0, 0, 0, -1, 0, -1, -1, 2, -1, 2, 0, 0, 2, -...
## $ BILL_AMT1 <dbl> 3913, 2682, 29239, 46990, 8617, 64400, 367965, 11876, 112...
## $ BILL_AMT2 <dbl> 3102, 1725, 14027, 48233, 5670, 57069, 412023, 380, 14096...
## $ BILL_AMT3 <dbl> 689, 2682, 13559, 49291, 35835, 57608, 445007, 601, 12108...
## $ BILL_AMT4 <dbl> 0, 3272, 14331, 28314, 20940, 19394, 542653, 221, 12211, ...
## $ BILL_AMT5 <dbl> 0, 3455, 14948, 28959, 19146, 19619, 483003, -159, 11793,...
## $ BILL_AMT6 <dbl> 0, 3261, 15549, 29547, 19131, 20024, 473944, 567, 3719, 1...
## $ PAY_AMT1  <dbl> 0, 0, 1518, 2000, 2000, 2500, 55000, 380, 3329, 0, 2306, ...
## $ PAY_AMT2  <dbl> 689, 1000, 1500, 2019, 36681, 1815, 40000, 601, 0, 0, 12,...
## $ PAY_AMT3  <dbl> 0, 1000, 1000, 1200, 10000, 657, 38000, 0, 432, 0, 50, 85...
## $ PAY_AMT4  <dbl> 0, 1000, 1000, 1100, 9000, 1000, 20239, 581, 1000, 13007,...
## $ PAY_AMT5  <dbl> 0, 0, 1000, 1069, 689, 1000, 13750, 1687, 1000, 1122, 373...
## $ PAY_AMT6  <dbl> 0, 2000, 5000, 1000, 679, 800, 13770, 1542, 1000, 0, 66, ...
## $ default   <int> 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, ...

Sexo

sex=table(df$SEX)
barplot(sex,main="Distribuccion por Sexo",col = "green")

(sex/nrow(df))*100
## 
##        F        M 
## 60.31891 39.68109

EDUCATION

edu=table(df$EDUCATION)
barplot(edu,main="Distribuccion por Nivel de Estudio",col = "green")

(edu/nrow(df))*100
## 
##  Bachiller      Otros   Posgrado   Pregrado 
## 16.4622817  0.4155265 35.7454140 47.3767778

Tablas de contingencia

(table(df$SEX,df$EDUCATION)/nrow(df))*100
##    
##      Bachiller      Otros   Posgrado   Pregrado
##   F  9.7800750  0.2736394 21.0398297 29.2253640
##   M  6.6822067  0.1418871 14.7055843 18.1514138

Pruebas de hipótesis: independencia de Chi-cuadrada

tabla_sex_edu=table(df$SEX,df$EDUCATION,useNA = "no")
tabla_sex_edu
##    
##     Bachiller Otros Posgrado Pregrado
##   F      2895    81     6228     8651
##   M      1978    42     4353     5373

Probar estadisticamente

H0= Las variables Sexo y Educacion son independientes Ha= Las variables Sexo y Educacion son dependientes

si Pvalor < 0.05 con un alfa =0.0, se rechaza H0

chisq.test(tabla_sex_edu)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_sex_edu
## X-squared = 23.634, df = 3, p-value = 0.00002978

De acuerdo a los resultados anteriores, se acepta Ha, la Hipotesis que plantea que ambas variables estan asiadas entre si, con un nivel de confianza del 95%

Pruebas de contigencia con respecto al default Categorico vs Categorico

df$default=as.factor(df$default)
default=table(df$default)
barplot(default,main="Distribuccion por Nivel de Estudio",col = "green")

default/nrow(df)
## 
##         0         1 
## 0.7768656 0.2231344
(prop.table(table(df$SEX,df$default),2))
##    
##             0         1
##   F 0.6136285 0.5668433
##   M 0.3863715 0.4331567
tabla_sex_de=table(df$SEX,df$default,useNA = "no")
tabla_sex_de
##    
##         0     1
##   F 14111  3744
##   M  8885  2861
chisq.test(tabla_sex_de)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_sex_de
## X-squared = 46.729, df = 1, p-value = 0.000000000008151

Otra Forma de Tablas

CrossTable(df$SEX,df$default,prop.chisq=TRUE)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## | Chi-square contribution |
## |           N / Row Total |
## |           N / Col Total |
## |         N / Table Total |
## |-------------------------|
## 
##  
## Total Observations in Table:  29601 
## 
##  
##              | df$default 
##       df$SEX |         0 |         1 | Row Total | 
## -------------|-----------|-----------|-----------|
##            F |     14111 |      3744 |     17855 | 
##              |     4.155 |    14.465 |           | 
##              |     0.790 |     0.210 |     0.603 | 
##              |     0.614 |     0.567 |           | 
##              |     0.477 |     0.126 |           | 
## -------------|-----------|-----------|-----------|
##            M |      8885 |      2861 |     11746 | 
##              |     6.316 |    21.989 |           | 
##              |     0.756 |     0.244 |     0.397 | 
##              |     0.386 |     0.433 |           | 
##              |     0.300 |     0.097 |           | 
## -------------|-----------|-----------|-----------|
## Column Total |     22996 |      6605 |     29601 | 
##              |     0.777 |     0.223 |           | 
## -------------|-----------|-----------|-----------|
## 
## 

Cuantitaviva VS Categorica

names(df)
##  [1] "ID"        "LIMIT_BAL" "SEX"       "EDUCATION" "MARRIAGE"  "AGE"      
##  [7] "PAY_0"     "PAY_2"     "PAY_3"     "PAY_4"     "PAY_5"     "PAY_6"    
## [13] "BILL_AMT1" "BILL_AMT2" "BILL_AMT3" "BILL_AMT4" "BILL_AMT5" "BILL_AMT6"
## [19] "PAY_AMT1"  "PAY_AMT2"  "PAY_AMT3"  "PAY_AMT4"  "PAY_AMT5"  "PAY_AMT6" 
## [25] "default"
# comparar si el promedio del Saldo en igual en ambos grupos
x_F=df[df$SEX=="F",]
Promedio_Saldo_F= mean(x_F$LIMIT_BAL)
print(Promedio_Saldo_F)
## [1] 170166.1
x_M=df[df$SEX=="M",]
Promedio_Saldo_M= mean(x_M$LIMIT_BAL)
print(Promedio_Saldo_M)
## [1] 163574.6

COMPARACION DE DOS MUESTRAS

test= t.test(x_F$LIMIT_BAL,x_M$LIMIT_BAL)
print(test)
## 
##  Welch Two Sample t-test
## 
## data:  x_F$LIMIT_BAL and x_M$LIMIT_BAL
## t = 4.1982, df = 23642, p-value = 0.00002701
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  3514.012 9668.947
## sample estimates:
## mean of x mean of y 
##  170166.1  163574.6

p-value es < 0.05 podemos afirmar que las muestras difieren en su media, es decir, los dos variables son diferentes

Grafico

boxplot(x_F$LIMIT_BAL,x_M$LIMIT_BAL)
medias = c(Promedio_Saldo_F,Promedio_Saldo_M)
points(medias,pch=18,col="red")

Mora vs Saldo

# comparar si el promedio del Saldo en igual en ambos grupos
x_F=df[df$default=="0",]
Promedio_Saldo_F= mean(x_F$LIMIT_BAL)
print(Promedio_Saldo_F)
## [1] 178300
x_M=df[df$default=="1",]
Promedio_Saldo_M= mean(x_M$LIMIT_BAL)
print(Promedio_Saldo_M)
## [1] 130125.3

Test

test= t.test(x_F$LIMIT_BAL,x_M$LIMIT_BAL)
print(test)
## 
##  Welch Two Sample t-test
## 
## data:  x_F$LIMIT_BAL and x_M$LIMIT_BAL
## t = 28.928, df = 12000, p-value < 0.00000000000000022
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  44910.32 51438.99
## sample estimates:
## mean of x mean of y 
##  178300.0  130125.3

p-value es < 0.05 podemos afirmar que las muestras difieren en su media, es decir, los dos variables son diferentes

boxplot(x_F$LIMIT_BAL,x_M$LIMIT_BAL,names = c("No Mora","Mora"))
medias = c(Promedio_Saldo_F,Promedio_Saldo_M)
points(medias,pch=18,col="red")