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.