Cargamos los datos, las librerías necesarias y verificamos su estructura.
Además, pude observar que los datos del archivo CSV deben limpiarse, ya que hay espacios al principio de algunos valores de texto, lo que puede producir resultados anormales.
library(dplyr)
datos <- read.csv(
"Loan_Approval_Dataset.csv",
check.names = FALSE,
stringsAsFactors = FALSE
)
names(datos) <- trimws(names(datos))
datos <- datos %>%
mutate(across(where(is.character), trimws))
str(datos)
## 'data.frame': 4269 obs. of 6 variables:
## $ Loan_Status : chr "Approved" "Rejected" "Rejected" "Rejected" ...
## $ Income : int 9600000 4100000 9100000 8200000 9800000 4800000 8700000 5700000 800000 1100000 ...
## $ Loan_Amount : int 29900000 12200000 29700000 30700000 24200000 13500000 33000000 15000000 2200000 4300000 ...
## $ Education : chr "Graduate" "Not Graduate" "Graduate" "Graduate" ...
## $ Self_Employed: chr "No" "Yes" "No" "No" ...
## $ Cibil_Score : int 778 417 506 467 382 319 678 382 782 388 ...
print(table(datos$Loan_Status, useNA = "ifany"))
##
## Approved Rejected
## 2656 1613
Arreglamos los valores de la variable dependiente, asignando Approved = 1 y Rejected = 0.
Además, convertimos el ingreso y el monto solicitado a millones, dividiendo ambas variables entre un millón. Esto no cambia el ajuste estadístico; simplemente trabajé con esta escala para facilitar la interpretación de los coeficientes.
Luego, ajustamos el modelo de regresión logística.
datos$Loan_Status <- ifelse(
datos$Loan_Status == "Approved", 1,
ifelse(datos$Loan_Status == "Rejected", 0, NA)
)
datos$Income_millions <- datos$Income / 1000000
datos$Loan_Amount_millions <- datos$Loan_Amount / 1000000
modelo <- glm(
Loan_Status ~ Income_millions +
Loan_Amount_millions +
Education +
Self_Employed +
Cibil_Score,
family = binomial(link = "logit"),
data = datos
)
summary(modelo)
##
## Call:
## glm(formula = Loan_Status ~ Income_millions + Loan_Amount_millions +
## Education + Self_Employed + Cibil_Score, family = binomial(link = "logit"),
## data = datos)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.163e+01 4.019e-01 -28.939 < 2e-16 ***
## Income_millions -4.036e-01 5.502e-02 -7.337 2.18e-13 ***
## Loan_Amount_millions 1.320e-01 1.706e-02 7.734 1.04e-14 ***
## EducationNot Graduate -7.118e-02 1.118e-01 -0.637 0.524
## Self_EmployedYes 5.635e-02 1.118e-01 0.504 0.614
## Cibil_Score 2.214e-02 7.137e-04 31.019 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 5660.7 on 4268 degrees of freedom
## Residual deviance: 2088.2 on 4263 degrees of freedom
## AIC: 2100.2
##
## Number of Fisher Scoring iterations: 7
coefs <- summary(modelo)$coefficients
tabla_mod <- data.frame(
Termino = rownames(coefs),
Logit = coefs[, "Estimate"],
Error_Estandar = coefs[, "Std. Error"],
Valor_p = coefs[, "Pr(>|z|)"],
Odds_Ratio = exp(coefs[, "Estimate"]),
row.names = NULL
)
tabla_mod <- tabla_mod %>%
mutate(
Logit = round(Logit, 4),
Error_Estandar = round(Error_Estandar, 4),
Valor_p = round(Valor_p, 4),
Odds_Ratio = round(Odds_Ratio, 4)
)
print(tabla_mod)
## Termino Logit Error_Estandar Valor_p Odds_Ratio
## 1 (Intercept) -11.6306 0.4019 0.0000 0.0000
## 2 Income_millions -0.4036 0.0550 0.0000 0.6679
## 3 Loan_Amount_millions 0.1320 0.0171 0.0000 1.1411
## 4 EducationNot Graduate -0.0712 0.1118 0.5243 0.9313
## 5 Self_EmployedYes 0.0564 0.1118 0.6142 1.0580
## 6 Cibil_Score 0.0221 0.0007 0.0000 1.0224
Intercepto: Representa los odds de aprobación cuando todas las variables numéricas valen 0 y las variables categóricas se encuentran en sus categorías de referencia.
Income_millions: El odds ratio de 0.67 indica que, por cada aumento de un millón de dólares en el ingreso mensual, los odds de aprobación disminuyen aproximadamente un 33 %, manteniendo las otras variables constantes. El resultado es estadísticamente significativo.
Monto_Solicitado: El odds ratio de 1.14 indica que, por cada aumento de un millón en el monto solicitado, los odds de aprobación aumentan aproximadamente un 14.1 %, manteniendo las demás variables constantes. El resultado es estadísticamente significativo.
Nivel educativo: El odds ratio de 0.93 indica que los solicitantes que no son graduados tienen unos odds de aprobación aproximadamente un 6.87 % menores que los graduados. El resultado no es estadísticamente significativo.
Trabajo por cuenta propia: El odds ratio de 1.058 indica que los solicitantes que trabajan por cuenta propia tienen unos odds de aprobación aproximadamente un 5.80 % mayores que quienes no trabajan por cuenta propia. El resultado no es estadísticamente significativo.
Puntaje crediticio: El odds ratio de 1.0224 indica que, por cada punto adicional en el puntaje crediticio, los odds de aprobación aumentan aproximadamente un 2.24 %. El resultado es estadísticamente significativo.