El siguiente informe tiene como objetivo proporcionar a los usuarios una breve demostración del
lenguaje de programación R en calculos de medidas y creacion de graficas, que se utilizan comunmente en procesos de análisis de datos, se incluye el codigo R en diferentes apartados, para su observacion y replicacion al mismo tiempo la salidas de los resultados de dichos codigos.

El documento está elaborado en base a R y Rmarkdown, y su construcción esta en formato HTML, un formato que permite ser escalado a páginas web, y de alguna forma ser una alternativa a los informes clásicos elaborados tanto en pdf, Word o Excel entre otros formatos

Para más información no dudes en contactarme
mail:

Librerias y Datos

#Las siguientes librerias se utilizaran para el procesos de analisis de datos
library(ggplot2)
library(dplyr)
library(psych)
library(visdat)
library(gridExtra)
library(knitr)
library(plotly)
library(gt)

Introduccion Data Creditos

Para esta demostracion se utilizara un conjunto de observaciones de sujetos de credito que fueron dados seguimiento durante un tiempo determinado por una unidad de negocios, en este caso en particular se explora el comportamiento crediticio de varios sujetos ya aprabados sus solicitudes con productos financieros, es decir los sujetos ya han recibido los productos y se tiene informacion sobre sus proceder de sus obligaciones ante la institucion competente

Estos datos fueron recopilados, y son de dominio publico se los puede encontrar en el paquete datos::datos_credito de R, Para el proceso de analisis como comunmente se realiza se almacenara los datos en un objeto llamado credito

Estructura de los Datos

El conjunto de datos ya curado, es decir que ya es una informacion relativamente limpia con cada una de las variables ya transformada, contiene 14 variables y 4454 observaciones (n = 4.454), cada observacion (fila) corresponde aun sujeto de credito, puede obtener mayor informacion sobre el conjunto de variables y su estructura corriendo la siguiente comando en la consola de R glimpse(credito), la funcion permite observar su estructura para cada variable

#Estructura de datos
glimpse(credito)
## Rows: 4,454
## Columns: 14
## $ Estado      <fct> bueno, bueno, malo, bueno, bueno, bueno, bueno, bueno, bue…
## $ Antiguedad  <int> 9, 17, 10, 0, 0, 1, 29, 9, 0, 0, 6, 7, 8, 19, 0, 0, 15, 33…
## $ Vivienda    <fct> alquila, alquila, propietario, alquila, alquila, propietar…
## $ Plazo       <int> 60, 60, 36, 60, 36, 60, 60, 12, 60, 48, 48, 36, 60, 36, 18…
## $ Edad        <int> 30, 58, 46, 24, 26, 36, 44, 27, 32, 41, 34, 29, 30, 37, 21…
## $ EstadoCivil <fct> casado, viudo, casado, soltero, soltero, casado, casado, s…
## $ Registros   <fct> no, no, sí, no, no, no, no, no, no, no, no, no, no, no, sí…
## $ Trabajo     <fct> freelance, fijo, freelance, fijo, fijo, fijo, fijo, fijo, …
## $ Gastos      <int> 73, 48, 90, 63, 46, 75, 75, 35, 90, 90, 60, 60, 75, 75, 35…
## $ Ingresos    <int> 129, 131, 200, 182, 107, 214, 125, 80, 107, 80, 125, 121, …
## $ Activos     <int> 0, 0, 3000, 2500, 0, 3500, 10000, 0, 15000, 0, 4000, 3000,…
## $ Deuda       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2500, 260, 0, 0, 0, 20…
## $ Cantidad    <int> 800, 1000, 2000, 900, 310, 650, 1600, 200, 1200, 1200, 115…
## $ Precio      <int> 846, 1658, 2985, 1325, 910, 1645, 1800, 1093, 1957, 1468, …

Los datos presentan cinco variables de tipo factorial y nueve variables de tipo numerico, acontinuacion se presenta un grafico utilizando funciones del paquete visdat donde se marca aquellas variables de tipo numericas y de tipo factor, tambien se destaca la precencia de NA y la proporcion de ellos en el conjunto de datos por cada variable

visdat::vis_dat(credito,palette = "qual" )

#Visualización porcentual de valores perdidos y completos
visdat::vis_miss(credito,
         sort_miss = TRUE)

Observacion

La variable Ingreso tiende a tener la mayor cantidad de datos perdidos con un 9% en total de toda la variable, tambien se observa que el 99.3% de las observaciones de todo el conjunto de datos esta completo

Explorando Variables Factors

Los datos de credito presentas cinco variables de tipo factoriales

credito %>%
  dplyr::select(where(is.factor)) %>% 
  glimpse()
## Rows: 4,454
## Columns: 5
## $ Estado      <fct> bueno, bueno, malo, bueno, bueno, bueno, bueno, bueno, bue…
## $ Vivienda    <fct> alquila, alquila, propietario, alquila, alquila, propietar…
## $ EstadoCivil <fct> casado, viudo, casado, soltero, soltero, casado, casado, s…
## $ Registros   <fct> no, no, sí, no, no, no, no, no, no, no, no, no, no, no, sí…
## $ Trabajo     <fct> freelance, fijo, freelance, fijo, fijo, fijo, fijo, fijo, …

Analizaremos el comportamento de los sujetos entre variables factoriales, un proceso inicial del Analisis Bivariado

Se tomara como variable de interes a Estado (categorizacion del sujeto como bueno o malo) para ver su comportamiento frente a las otras variables

Tipo de Trabajo y Estado

#Numero de sujetos por trabajo / Estado
credito %>% 
  count(Trabajo,Estado) %>% 
  arrange(desc(n)) %>% 
  pivot_wider(names_from = Estado, values_from = n) %>% 
  as.data.table() %>% 
  gt() %>% 
  tab_header(title = "Estado del Sujeto con Relacion a su Trabajo",
             subtitle = "Estadisticas Resumen")
Estado del Sujeto con Relacion a su Trabajo
Estadisticas Resumen
Trabajo bueno malo
fijo 2225 580
freelance 691 333
tiempo parcial 181 271
otros 103 68
NA NA 2
#Codigo R para generacion de la grafica
ggplot(credito, aes(x = Trabajo, fill = Estado))+
  geom_bar(alpha = 0.8)+
  geom_text(aes(label = ..count..),stat = "count", size = 3, hjust = -0.05, color = "#838B8B")+
  scale_fill_manual(values = c("#FFD700", "#3281B5"), 
                    guide = F)+
  theme_minimal()+
  facet_wrap(~Estado, ncol = 1)+
  coord_flip()+
  labs(title = "Estado del Sujeto con Relacion a su Trabajo",
       x = "Tipos de trabajo",
       y = "Numero de sujetos"
  )+
  theme(plot.title.position = "plot", 
        plot.title = element_text(size = 13, color = "#838B8B", face = "bold"), 
        axis.text.y = element_text(size =  9, vjust = 1, color = "#838B8B"), 
        axis.title.x = element_text(size = 13,hjust = 0.05, color = "#838B8B"), 
        axis.title.y = element_text(size = 13,vjust = 1,hjust = 1,color = "#838B8B") 
  )

Estado Civil y Estado

#Numero de sujetos de credito por EstadoCivil / Estado
credito %>% 
  count(EstadoCivil,Estado) %>%
  arrange(desc(n)) %>% 
  pivot_wider(names_from = Estado, values_from = n) %>% 
  as.data.table() %>% 
  gt()
EstadoCivil bueno malo
casado 2412 829
soltero 649 328
separado 66 64
viudo 48 19
divorciado 24 14
NA 1 NA
ggplot(credito,aes(x = EstadoCivil, fill = Estado))+
  geom_bar(alpha = 0.8)+
  scale_fill_manual(values = c("#3281B5", "#FFD700"),
                    guide = F)+
  theme_minimal()+
  geom_text(aes(label = ..count..),stat = "count", size = 3, hjust = -0.05, color = "#838B8B")+
  labs(title = "Estado del Sujeto con Relacion a su Estado civil",
       x = "Estados Civil",
       y = "Numero de sujetos"
  )+
  theme(plot.title.position = "plot", 
        plot.title = element_text(size = 13, color = "#838B8B", face = "bold"), 
        axis.text.y = element_text(size =  9, vjust = 1, color = "#838B8B"), 
        axis.title.x = element_text(size = 13,hjust = 0.05, color = "#838B8B"), 
        axis.title.y = element_text(size = 13,vjust = 1,hjust = 1,color = "#838B8B") 
  )+
  facet_wrap(~Estado, ncol = 1)+
  coord_flip()

Tipo Vivienda y Estado

#Estado del sujeto de credito frente al tipo de vivienda
EV<-credito %>% 
  count(Estado,Vivienda) %>% 
  mutate("porcent"= paste( round( n/sum(n)*100, 2), "%")) %>% 
  arrange(desc(n))
 
 EV %>% 
  pivot_wider(id_cols =  Vivienda, names_from = Estado,  values_from = n)%>% 
  as.data.table() %>% 
   kable(width = "10%")
Vivienda bueno malo
propietario 1717 390
alquila 585 388
padres 550 233
otra 173 146
privado 162 84
ignorar 11 9
NA 2 4
#Observacion: Muestra los porcentajes globales en conjunto
#             y no por cada grupo

ggplot(EV,aes(x = Vivienda, y = n, fill = Estado))+
  geom_bar(stat = "identity", alpha = 0.8)+
  scale_y_continuous(limits = c(0, 2000))+
  scale_fill_manual(values = c("#FFD700", "#3281B5"), guide = FALSE)+
  theme_minimal()+
  facet_wrap(~Estado)+
  coord_flip()+
  geom_text(aes(label = porcent), size = 3, hjust = -0.05)+
  labs( title = "Estado y Tipo de Vivienda",x = "Tipo de Vivienda",y = "")+
  theme(plot.title = element_text(size = 15, color = "#838B8B", face = 'bold'),
        axis.title.y = element_text(vjust = 1, hjust = 0.98,color = "#838B8B", size = 12))

Plazo y Estado

Durante la exploracion de la estructura de datos se identificó a la variable plazo como una variable numerica, una ves inspecionandola se hallo que esta variable asume un aspecto mas bien categorico, es decir de tipo factorial, pese a tener características numéricas, esta variable se la trabajara como que fuera una variable categórica, identificando asi diez niveles de factor para dicha variable.

Estos niveles identifican el tiempo en meses que cada sujetos de crédito pactaron para devolver el crédito, a continuación se ilustra una tabla de contingencia que proporciona el plazo y la proporción para cada Estado de sujeto de credito, ademas se ilustra una grafica de barras.

#Trasformacion de la variable
credito$Plazo<-as.factor(credito$Plazo)
credito$Estado <- factor(credito$Estado, ordered = TRUE,
                         levels = c("bueno", "malo"))

x<-credito %>% 
  group_by(Plazo, Estado) %>% 
  summarise(n = n()) %>% 
  mutate(Propor = round( n/sum(n),2))
## `summarise()` has grouped output by 'Plazo'. You can override using the
## `.groups` argument.
x%>% 
  pivot_wider(id_cols = Plazo ,names_from = Estado, values_from = Propor)%>% 
  as.data.table() %>% 
  gt() %>% 
  tab_header(title = "Plazos de Creditos y Calificaciones",
             subtitle = "Estadisticas de Resumen")
Plazos de Creditos y Calificaciones
Estadisticas de Resumen
Plazo bueno malo
6 0.88 0.12
12 0.90 0.10
18 0.83 0.17
24 0.81 0.19
30 0.84 0.16
36 0.71 0.29
42 0.79 0.21
48 0.70 0.30
54 0.76 0.24
60 0.69 0.31
72 NA 1.00
Objeto1<- ggplot(x, aes(x = Plazo, y = Propor, fill = Estado))+
  geom_col(alpha = 0.8)+
  scale_fill_manual(values = c("#3281B5","#FFD700"), 
                    guide = F) +
  theme_minimal()+
  labs(title = "Plazo y Estado del sujeto")+
  theme(plot.title.position = "plot", 
        plot.title = element_text(size = 13, color = "#838B8B", face = "bold"))+
  geom_text(aes(label = Propor), size = 2,colour = "white", hjust = 0.5, vjust = -0.8)

Objeto2<- ggplot(credito, aes(Plazo, fill = Estado))+
  geom_bar(alpha = 0.8)+
  scale_fill_manual(values = c( "#3281B5", "#FFD700")) +
  facet_wrap(~Estado, ncol = 1)+
  theme_minimal()+
  geom_text(aes(label = ..count..),stat = "count", size = 2,position = position_stack(vjust = 1.07))

grid.arrange(Objeto1, Objeto2, nrow = 1, ncol = 2)

Un aspecto importante que se puede destacar de las gráficas construidas anteriormente en base a las variables, es que los sujetos tienden a escojer mayormente plazos entre 24, 36, 48, 60 meses para devolver los creditos, ademas observando en conjutno la grafica de barras apiladas porcentuales, se observa que a medida que el plazo aumenta existe una mayor proporción de sujetos que tiende a una calificación mala, para ser más precisos a partir del plazo 36, aproximadamente el 30% posee una calificacion mala, para los niveles de mayor tendencia que son 36, 48, 60 meses

Explorando Variables Numerics

Dentro del conjunto de datos poseemos nueve variables de carácter numérico, algunas de estas son de caracter discreto y otras de caracter continuo, estas permiten construir ciertas métricas y graficas interesantes dentro del analisis, además se había señalado la presencia de valores faltantes y esto se observa en la gráfica construida en el apartado Estructura de Datos

credito %>%
  dplyr::select(where(is.numeric)) %>% 
  glimpse() %>% 
  head() %>% 
  gt() %>% 
  tab_footnote("*Valores de las primeras 5 registros") %>% 
  tab_options(footnotes.font.size = 12,)
## Rows: 4,454
## Columns: 8
## $ Antiguedad <int> 9, 17, 10, 0, 0, 1, 29, 9, 0, 0, 6, 7, 8, 19, 0, 0, 15, 33,…
## $ Edad       <int> 30, 58, 46, 24, 26, 36, 44, 27, 32, 41, 34, 29, 30, 37, 21,…
## $ Gastos     <int> 73, 48, 90, 63, 46, 75, 75, 35, 90, 90, 60, 60, 75, 75, 35,…
## $ Ingresos   <int> 129, 131, 200, 182, 107, 214, 125, 80, 107, 80, 125, 121, 1…
## $ Activos    <int> 0, 0, 3000, 2500, 0, 3500, 10000, 0, 15000, 0, 4000, 3000, …
## $ Deuda      <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2500, 260, 0, 0, 0, 200…
## $ Cantidad   <int> 800, 1000, 2000, 900, 310, 650, 1600, 200, 1200, 1200, 1150…
## $ Precio     <int> 846, 1658, 2985, 1325, 910, 1645, 1800, 1093, 1957, 1468, 1…
Antiguedad Edad Gastos Ingresos Activos Deuda Cantidad Precio
9 30 73 129 0 0 800 846
17 58 48 131 0 0 1000 1658
10 46 90 200 3000 0 2000 2985
0 24 63 182 2500 0 900 1325
0 26 46 107 0 0 310 910
1 36 75 214 3500 0 650 1645
*Valores de las primeras 5 registros

Variable Ingreso

El ingreso es una variable continua, y señala el ingreso que percibe el sujeto de credito dentro del conjunto de datos

Esta variable registra la presencia de valores faltantes, se lo observo en la gráfica desarrollado en el apartado estructura de datos, en este caso el registro de valores faltantes en la variables es de 381 que representa un 8% frente al total de la información, para fines solo de demostración se procederá a excluirlos para los análisis posteriores.
Utilizaremos la función describe() del paquete psych, para obtener las estadísticas descriptivas de la variable ingreso, correspondiente a los sujetos de crédito de la data

Se obtuvo los siguientes resultados:

  • El Ingreso maximo en el conjunto de datos es de $959
  • El Ingreso minimo en el conjunto de datos es de $6 (descartando los faltantes)
  • El Ingreso medio en el conjunto de datos es de $141.69
  • La mediana en el cojunto de datos es de $125

Tambien en la grafica se destaca la media representada con linea de color roja y la mediana representada con color azul

#Registros con valores en blanco
sum(is.na(credito$Ingresos))
## [1] 381
#Medidas de localizacion y dispersion
Ingr<-psych::describe(credito$Ingresos)
row.names(Ingr)<-c("Ingr")

Ingr %>% 
  gt() %>% 
  tab_header(title = "Medidas de Localizacion y Dispersion",
             subtitle = "Estadisticas de Resumen")
Medidas de Localizacion y Dispersion
Estadisticas de Resumen
vars n mean sd median trimmed mad min max range skew kurtosis se
1 4073 141.6877 80.7484 125 130.5339 56.3388 6 959 953 2.598092 13.38599 1.265251
#Histrograma de frecuencias del ingreso
ggplot(credito, aes(Ingresos)) +
  geom_histogram(fill = "#009ACD",alpha = 0.8, color = "white", binwidth = 20) +
  theme_minimal()+
  geom_vline(xintercept = mean(credito$Ingresos, na.rm = T),
             color = "red",linetype = "dashed")+
  geom_vline(xintercept = median(credito$Ingresos, na.rm = T), 
             color = "blue", linetype = "dashed")+
  labs( title = " Histrograma de Ingresos",x = "",y = "Frecuencia")+
    theme(plot.title = element_text(size = 15,color = "#838B8B", face = 'bold'),
        axis.title.y = element_text(vjust = 1, hjust = 0.98,
                                    color = "#838B8B",size = 12))+
    annotate("text", x = 700, y = 200,
             label = "Se representa con linea roja la media,\n y linea azul la mediana",
             color = "black", size = 3)
## Warning: Removed 381 rows containing non-finite values (`stat_bin()`).

Variable Antiguedad

Dentro del conjunto de datos tenemos la variable antigüedad qué representa los años en que los sujetos de crédito han tenido vinculación con la institución financiera, a breves rasgos esta variable puede ser considerada de tipo continua poque podems llegar a tener valores no enteros, sin embargo se la tratara como de tipo discreta para fines de demostracion, al hacer una exploración de la variable, esta no asume valores no enteres es decir decimales y sólo existe la presencia de valores enteros.

El resumen de datos presenta algunas medidas de localizacion

Resum <- summary(credito$Antiguedad)
Resum <- as.array(Resum) %>% 
  as.data.frame() %>% 
  mutate_if(is.numeric, round, digits = 2) 
Resum %>% 
  gt() %>% 
  tab_header(title = "Variable Antiguedad",
             subtitle = "Resumen Estadisticos")
Variable Antiguedad
Resumen Estadisticos
Var1 Freq
Min. 0.00
1st Qu. 2.00
Median 5.00
Mean 7.99
3rd Qu. 12.00
Max. 48.00
cuartil<- as.data.table(credito)
cuartil<-cuartil[,.("Cuartiles" = c("Primer Q1","Segundo Q2","Tercer Q3"),
             "Estadisticos" = quantile(cuartil$Antiguedad, c(0.25,0.5,0.75))),]
cuartil %>% 
  gt()
Cuartiles Estadisticos
Primer Q1 2
Segundo Q2 5
Tercer Q3 12
# Utilizado para definir los valores de las leyendas grafico de Boxplot
cuartiles<- as.data.table(credito)
cuartiles<-cuartiles[,.("ejex" = 0.05,
             "Cuartil" = quantile(cuartiles$Antiguedad, c(0.25,0.5,0.75))),] #Leyendas


Anti1<- ggplot(credito, aes(Antiguedad))+
  geom_histogram(fill = "#EEC900",alpha = 0.8, color = "white", bins = 30)+
  theme_minimal()+
  geom_vline(xintercept = median(credito$Antiguedad, na.rm = T),
             color = "red",linetype = "dashed")+
  geom_vline(xintercept = mean(credito$Antiguedad, na.rm = T), 
             color = "blue")+
  labs(title = "Histrograma de Antiguedad")+
  theme(plot.title = element_text(size = 15, 
                                  color = "#838B8B", 
                                  face = 'bold'),
        axis.title.y = element_text(vjust = 1,
                                    hjust = 0.98,
                                    color = "#838B8B",
                                    size = 12),
        axis.title.x = element_text(vjust = 1,
                                   hjust = 0.005,
                                   color = "#838B8B"))
 
Anti2<-ggplot(credito, aes(y = Antiguedad))+
  geom_boxplot(fill = "#EEC900",alpha = 0.8, color = "Black", bins = 30)+
  theme_minimal()+
  geom_hline(yintercept = mean(credito$Antiguedad, na.rm = T), 
             color = "blue")+
  labs(title = "Box Plot")+
  theme(plot.title = element_text(size = 15, 
                                  color = "#838B8B", 
                                  face = 'bold'),
        axis.title.y = element_text(vjust = 1,
                                    hjust = 0.98,
                                    color = "#838B8B",
                                    size = 12),
        axis.title.x = element_text(vjust = 1,
                                    hjust = 0.005,
                                    color = "#838B8B"))+
  geom_text(data = cuartiles,
            aes(x = ejex, y = Cuartil, label = Cuartil),
            size = 4)
## Warning in geom_boxplot(fill = "#EEC900", alpha = 0.8, color = "Black", :
## Ignoring unknown parameters: `bins`
grid.arrange(Anti1, Anti2, nrow = 1, ncol = 2)

Variable Edad

La variable edad por su parte representan los años que posee actualmente el sujeto de crédito, en resumen, la media general de la edad de los sujetos es de 37 años, ademas se puede apreciar que existen sujetos cuya edad osilan entre 18 años y 68 años, acontinuacion se muestra estos resultados acompañados de un diagrama de dispersion, como linea continua se hace enfasis a la media y como linea entre cortada se señala a la mediana

resumen <- summary(credito$Edad)

resumen <- as.array(resumen) 
resumen<- as.data.frame(resumen)

resumen %>% 
  rename(Estadisticos = Var1,
         valores = Freq) %>% 
  mutate_if(is.numeric, round, digits = 2) %>% 
  gt() %>% 
  tab_header(title = "Variable Edad",
            subtitle = "Estadisticos de Resumen para Edad")
Variable Edad
Estadisticos de Resumen para Edad
Estadisticos valores
Min. 18.00
1st Qu. 28.00
Median 36.00
Mean 37.08
3rd Qu. 45.00
Max. 68.00
# Media de Edad es de 37 años
t<-ggplot(credito,aes(x = Edad))+
  geom_histogram(aes(y = ..density..), bins = 50, color = "white", fill = "#EEC900", alpha = 0.8)+
  geom_density()+
  theme_minimal()+
  geom_vline(xintercept = median(credito$Edad), linetype = "dashed" )+
  geom_vline(xintercept = mean(credito$Edad))+
  labs(title = "Histrograma de Edad")+
  theme(plot.title = element_text(size = 15, color = "#838B8B", face = 'bold'),
        axis.title.y = element_text(vjust = 1, hjust = 0.98, color = "#838B8B", size = 12),
        axis.title.x = element_text(vjust = 1, hjust = 0.005, color = "#838B8B"))
 
  ggplotly(t)

Diagramas de Dispersion

El siguiente diagrama de dispersion muestra la relacion entre el ingreso del cliente y el precio del producto financiero, para los diferentes calificaciones de credito obtenidas, tambien se puede apreciar la antiguedad como factor de clasificacion de color dentro de los puntos en la grafica, ademas se muestra uana grafica de corrleacion de las distintas variables numericas

g<-ggplot(credito,aes(Ingresos, Precio, color = Antiguedad))+
  geom_point(size = 2, alpha = 0.5)+
  facet_wrap(~Estado)+
  theme_minimal()+
  labs(title = "")
  ggplotly(g)