Predicción para Aprobación de Prestámos
Un banco requiere predecir si un cliente obtendrá la aprobación de un prestámo en base a una data histórica.
Data
Base de datos de 3 mil clientes detalla edad, el ingreso, monto préstamo, el historial de crédito y estado del crédito.
Installar Paquetes Necesarios:
install.packages(tidyverse”), # Manipulación y visualización
“caret”, # Modelado y machine learning
“readr”, # Lectura de datos
“ggplot2”, # Visualización
“corrplot”, # Correlaciones
“rpart”, # Árboles de decisión “rpart.plot”, # Graficar árboles
“cluster”, # Clustering
“factoextra”)) # Visualización de clustering
Cargar paquetes
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.2 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Cargando paquete requerido: lattice
Adjuntando el paquete: 'caret'
The following object is masked from 'package:purrr':
lift
library (rpart)
library (rpart.plot)
Instalar paquete para leer archivos Excel
install.packages(“readxl”)
Acceder a la Carpeta donde esta el archivo de excel
setwd(“X:/RStudio”)
Leer Archivo Excel (Cargar el dataset)
datos<- read_excel ("prestamos.xlsx" )
Ver la estructura de los datos
Rows: 3,000
Columns: 5
$ edad <dbl> 20, 45, 37, 41, 43, 38, 21, 31, 31, 30, 40, 39, 25, …
$ ingreso <dbl> 4708, 9763, 3635, 4885, 9177, 4984, 9466, 9533, 3060…
$ monto_prestamo <dbl> 41111, 60061, 50944, 26870, 66348, 43894, 29050, 268…
$ historial_credito <chr> "Bueno", "Bueno", "Bueno", "Malo", "Bueno", "Malo", …
$ aprobado <chr> "No", "Si", "Si", "Si", "No", "Si", "Si", "Si", "Si"…
Análisis Exploratorio
Estadisticos basicos
edad ingreso monto_prestamo historial_credito
Min. :20.0 Min. : 2504 Min. :10039 Length:3000
1st Qu.:26.0 1st Qu.: 4347 1st Qu.:24845 Class :character
Median :33.0 Median : 6190 Median :39437 Mode :character
Mean :32.7 Mean : 6200 Mean :39999
3rd Qu.:39.0 3rd Qu.: 8004 3rd Qu.:55711
Max. :45.0 Max. :10000 Max. :69997
aprobado
Length:3000
Class :character
Mode :character
Grafica de la distribucion de las variables Historial Credito y Estado
# Distribución por variable categórica
ggplot (datos, aes (x = historial_credito, fill = aprobado)) +
geom_bar (position = "fill" ) +
labs (title = "Relación entre historial y aprobación" )
Correlacion
corrplot (cor (datos %>% select (edad, ingreso, monto_prestamo)),
method = "circle" )
Preparación de Datos
Convertir a factores
datos$ historial_credito <- as.factor (datos$ historial_credito)
datos$ aprobado<- as.factor (datos$ aprobado)
Dividir datos para entrenamiento y prueba
set.seed (123 )
trainIndex <- createDataPartition (datos$ aprobado, p = 0.7 , list = FALSE )
trainData <- datos[trainIndex, ]
testData <- datos[- trainIndex, ]
Modelado con Arbol de Decision
modelo_arbol<- rpart (aprobado ~ ., data = trainData, method = "class" )
rpart.plot (modelo_arbol)
Evaluacion del modelo
predicciones <- predict (modelo_arbol, testData, type = "class" )
confusionMatrix (predicciones, testData$ aprobado)
Confusion Matrix and Statistics
Reference
Prediction No Si
No 226 217
Si 231 225
Accuracy : 0.5017
95% CI : (0.4685, 0.5349)
No Information Rate : 0.5083
P-Value [Acc > NIR] : 0.6678
Kappa : 0.0036
Mcnemar's Test P-Value : 0.5391
Sensitivity : 0.4945
Specificity : 0.5090
Pos Pred Value : 0.5102
Neg Pred Value : 0.4934
Prevalence : 0.5083
Detection Rate : 0.2514
Detection Prevalence : 0.4928
Balanced Accuracy : 0.5018
'Positive' Class : No
Interpretación
Matriz de confusión : muestra aciertos y errores del modelo.
Precisión (Accuracy) : proporción de casos correctamente clasificados.
Árbol de decisión : fácil de interpretar, muestra reglas de clasificación.
En este ejemplo, si el historial_credito es “Bueno” y el ingreso es alto, la probabilidad de aprobación aumenta.