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: jonatj@outlook.com
#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)
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 llamadocredito
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
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
#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")
)
#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()
#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))
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
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 |
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:
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()`).
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)
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)
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)