Modelos Lineales Generalizados

Pontificia Universidad Javeriana - Cali

John Jairo Bedoya Saenz y Liz Mary Gutiérrez Rendón

2023-03-21


Problema 1

1. Carga y depuración de base de datos

Este conjunto de datos contiene información acerca de la rotación de empleados de una empresa, las variables son las siguientes:

data("rotacion")
colnames(rotacion)
##  [1] "rotacion"                "edad"                   
##  [3] "viaje.negocios"          "departamento"           
##  [5] "Ddstancia.casa"          "educación"              
##  [7] "campo.educación"         "satisfaccion.ambiental" 
##  [9] "genero"                  "cargo"                  
## [11] "satisfación.laboral"     "estado.civil"           
## [13] "ingreso.mensual"         "trabajos.anteriores"    
## [15] "horas.extra"             "aumento.salarial"       
## [17] "rendimiento.laboral"     "experiencia"            
## [19] "capacitaciones"          "equilibrio.trabajo.vida"
## [21] "antiguedad"              "antigüedad.cargo"       
## [23] "ultima_promoción"        "tiempo.mismo.jefe"

La idea es construir un modelo que permita predecir la rotación en función de otras variables, para esto, se van a elegir 3 variables categóricas y 3 cuantitativas, a continuación se listan las variables de cada tipo y las variables seleccionadas con su justificación.

1.1 Variables categóricas

Estas son las variables categóricas de la base, de estás se eligen las variables “Viaje de Negocios”, “Cargo” y “Horas_Extra”.

## Seleccion cat
cat <- c(1,3,4,6,7,9,10,12,15)
## Se seleccionan las variables "Viaje de Negocios", "Cargo", "Horas_Extra"  
colnames(rotacion)[cat]
## [1] "rotacion"        "viaje.negocios"  "departamento"    "educación"      
## [5] "campo.educación" "genero"          "cargo"           "estado.civil"   
## [9] "horas.extra"
  • Viajes de Negocios: Los viajes de negocios pueden ser estresantes y cansados, lo que podría afectar la satisfacción laboral y la calidad de vida de los empleados. Además, los viajes de negocios pueden separar a los empleados de sus familias y amigos, lo que podría afectar su compromiso y motivación en el trabajo. Se espera que los empleados que realizan muchos viajes de negocios tengan una mayor probabilidad de renunciar debido a estos factores.

  • Cargo: El cargo que ocupa un empleado puede estar relacionado con su nivel de responsabilidad, estrés y satisfacción laboral. Por ejemplo, un empleado que ocupa un cargo de ventas podría tener mayores responsabilidades y presiones, lo que podría afectar su satisfacción laboral y su deseo de permanecer en la empresa. Se espera que los empleados en cierto cargos de mayor responsabilidad tengan una mayor probabilidad de renunciar.

  • Horas Extra: Las horas extra pueden ser necesarias para cumplir con las demandas laborales, pero también pueden agotar a los empleados y afectar su calidad de vida. Los empleados que trabajan muchas horas extras podrían sentirse agotados y estresados, lo que podría afectar su motivación en el trabajo. Se espera que los empleados que trabajan horas extras tengan una mayor probabilidad de renunciar.

1.2 Variables cuantitativas

De las variables cuantitativas se eligen “Distancia_Casa”, “Satisfacción_Laboral” e “Ingreso_Mensual”.

## Variables numericas
num <- c(2,5,8,11,13,14,16:24)
## Se selecccionan las variables "Distancia_Casa", "Satisfacción_Laboral", "Ingreso_Mensual"
colnames(rotacion)[num]
##  [1] "edad"                    "Ddstancia.casa"         
##  [3] "satisfaccion.ambiental"  "satisfación.laboral"    
##  [5] "ingreso.mensual"         "trabajos.anteriores"    
##  [7] "aumento.salarial"        "rendimiento.laboral"    
##  [9] "experiencia"             "capacitaciones"         
## [11] "equilibrio.trabajo.vida" "antiguedad"             
## [13] "antigüedad.cargo"        "ultima_promoción"       
## [15] "tiempo.mismo.jefe"
  • Distancia Casa: La distancia que un empleado debe recorrer para llegar al trabajo podría afectar su calidad de vida y su compromiso con la empresa. Los empleados que tienen que viajar largas distancias podrían sentirse cansados y percibir que están perdiendo mucho tiempo, lo que podría disminuir su satisfacción laboral y aumentar su probabilidad de renunciar.

  • Satisfacción Laboral: La satisfacción laboral es un factor clave que puede influir en la rotación. Los empleados que están satisfechos con su trabajo y su entorno laboral son más propensos a permanecer en la empresa, mientras que aquellos que están insatisfechos podrían buscar nuevas oportunidades.

  • Ingreso Mensual: El nivel de ingresos que recibe un empleado podría influir en su motivación para permanecer en la empresa. Los empleados que se sienten bien remunerados y valorados por su trabajo tienden a permanecer en la empresa, mientras que aquellos que no sienten que están siendo compensados adecuadamente podrían tener una mayor probabilidad de renunciar.

1.3 Base final

Finalmente se consolida una base con las variables seleccionadas, a esta se le aplica un metodo para saber cuantos valores faltantes tiene cada variable. En la tabla de resultados se puede ver que ninguna variable presentó valores faltantes.

df <- rotacion[,c("rotacion", "viaje.negocios", "cargo", "horas.extra", "Ddstancia.casa",
                  "satisfación.laboral", "ingreso.mensual")]
df<-as.data.frame(df)
NAs<-colSums(is.na(df))
as.data.frame(NAs)
##                     NAs
## rotacion              0
## viaje.negocios        0
## cargo                 0
## horas.extra           0
## Ddstancia.casa        0
## satisfación.laboral   0
## ingreso.mensual       0

2. Análisis univariado

En esta sección se presenta el análisis univariado, en el caso de las variables categóricas se opto por representarlas mediante gráficos de barras y para las variables cuantitativas se hace uso de histogramas de frecuencia.

2.1 Variables categóricas

2.1.1 Rotación

## Loading required package: ggplot2

En el gráfico se puede ver que naturalmente en una empresa las personas tienden a no rotar, como resultado se tiene una distribución desbalanceada en ambas categorías. Esto en muchos problemas de clasificación puede resultar una dificultad, ya que se dice que la clase minoritaria no está bien representada.

2.1.2 Viaje de Negocios

Para los viajes de negocios se tiene que la mayoría de personas viajan raramente. Las personas que no viajan o que viajan frecuentemente son pocas.

2.1.3 Cargo

Para el cargo se puede ver que predominan los ejecutivos de venta, investigadores científicos y técnicos de laboratorio. Los cargos menos comunes son de representates, gerentes y directores.

2.1.4 Horas Extra

En el gráfico se ve que la mayoría de personas no trabajan horas extra.

2.2 Variables cuantitativas

2.2.1 Distancia a Casa

El gráfico de distancia tiene una forma asimétrica que tiende a distancias más cortas siendo que la mayoría de trabajadores viven a menos de 10 kilómetros de la empresa, lo cuan en tiempo de recorrido puede representar entre 20 a 40 minutos, si hay mucho trafico. Sin embargo se ve que hay personas que viven incluso a 30 kilómetros de distancia, lo cual duplica o triplica el tiempo de llegada a la empresa.

2.2.2 Satisfación Laboral

En este caso la variable de satisfacción también es asimétrica, ya que la mayoría de personas se encuentran en los niveles 3 y 4 de satisfacción, sin embargo no son pocas las personas que se encuentran inconformes, esto puede ser un llamado de atención a la empresa, ya que a simple vista se ven al rededor de 500 personas con satisfacción baja y no muchas de estás renuncian, ya que según la variable rotación máximo 237 personas habrían renunciado por esto.

2.2.3 Ingreso Mensual

Finalmente para el ingreso también se tiene una distribución asimétrica, donde los sueldos más bajos predominan, con valores entre los $1000 y $7500 aproximandamente

3. Análisis bivariado

Para el análisis bivariado se ajusta un modelo logístico por cada variable para conocer el efecto que estas tienen sobre la rotación y contrastar con lo supuesto en la selección.

## codificación variable respuesta
df$y<-ifelse(df$rotacion=="Si",1,0)

3.1 Viaje de negocios

## Viaje de negocios
mod_viaje <- glm(y ~ viaje.negocios, data = df, family = binomial)
round(summary(mod_viaje)$coefficients,4)
##                         Estimate Std. Error z value Pr(>|z|)
## (Intercept)              -1.1034     0.1389 -7.9426   0.0000
## viaje.negociosNo_Viaja   -1.3389     0.3315 -4.0392   0.0001
## viaje.negociosRaramente  -0.6346     0.1638 -3.8734   0.0001

En la variable viaje de negocios se tiene como categoría de referencia “Frecuentemente” y para las otras 2 categorías se obtiene un coeficiente en este caso negativo, esto significa que las categorías “No viaja” y “Raramente” disminuyen la probabilidad de rotación, esto concuerda con la hipótesis planteada.

3.2 Cargo

##  "Cargo"
mod_cargo <- glm(y ~  cargo, data = df, family = binomial)
round(summary(mod_cargo)$coefficients,4)
##                              Estimate Std. Error z value Pr(>|z|)
## (Intercept)                   -3.6636     0.7161 -5.1159   0.0000
## cargoDirector_Manofactura      1.0609     0.7875  1.3471   0.1780
## cargoEjecutivo_Ventas          2.1119     0.7308  2.8898   0.0039
## cargoGerente                   0.6983     0.8504  0.8212   0.4116
## cargoInvestigador_Cientifico   2.0125     0.7336  2.7433   0.0061
## cargoRecursos_Humanos          2.4596     0.7881  3.1208   0.0018
## cargoRepresentante_Salud       1.0568     0.7951  1.3292   0.1838
## cargoRepresentante_Ventas      3.2480     0.7504  4.3284   0.0000
## cargoTecnico_Laboratorio       2.5075     0.7308  3.4313   0.0006

En este caso la categoría de referencia es el cargo de director de investigación, en el resultado se ve que todos los coeficientes son positivos, por lo que con respecto la la categoría de referencia todas las demás presentan un riesgo de retiro igual o más alto, de estas las que mayor riesgo de retiro tienen son los cargos de “Representante_Ventas”, “Tecnico_Laboratorio” y “Recursos_Humanos”.

3.3 Horas Extra

##  Horas_Extra
mod_hextra <- glm(y ~  horas.extra, data = df, family = binomial)
round(summary(mod_hextra)$coefficients,4)
##               Estimate Std. Error  z value Pr(>|z|)
## (Intercept)    -2.1496     0.1007 -21.3379        0
## horas.extraSi   1.3274     0.1466   9.0563        0

En la variable Horas extra la categoría de referencia es “No”, para las persona que si tienen horas extras se obtiene un coeficiente positivo lo cual representa un aumento en la probabilidad de retiro. Se cumple la hipótesis planteada.

3.4 Distancia a Casa

##  Distancia_Casa
mod_dist <- glm(y ~  Ddstancia.casa, data = df, family = binomial)
round(summary(mod_dist)$coefficients,4)
##                Estimate Std. Error  z value Pr(>|z|)
## (Intercept)     -1.8901     0.1114 -16.9691    0.000
## Ddstancia.casa   0.0247     0.0083   2.9727    0.003

Para la variable Distancia a casa el coeficiente es positivo, esto indica que a medida que la distancia entre la casa y el trabajo aumenta, la probabilidad de renunciar también aumenta. La hipótesis planteada se cumple.

3.5 Satisfación Laboral

##  Satisfación_Laboral
mod_satis <- glm(y ~  satisfación.laboral, data = df, family = binomial)
round(summary(mod_satis)$coefficients,4)
##                     Estimate Std. Error z value Pr(>|z|)
## (Intercept)          -0.9904     0.1757 -5.6351   0.0000
## satisfación.laboral  -0.2510     0.0637 -3.9397   0.0001

Para la Satisfacción laboral se obtiene un coeficiente negativo, según esto, a medida que la satisfacción de una persona aumenta la probabilidad de retiro es menor. La hipótesis planteada se cumple.

3.6 Ingreso Mensual

##  Ingreso_Mensual
mod_ingr <- glm(y ~  ingreso.mensual, data = df, family = binomial)
round(summary(mod_ingr)$coefficients,4)
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)      -0.9291     0.1292 -7.1911        0
## ingreso.mensual  -0.0001     0.0000 -5.8793        0

Finalmente para el ingreso el coeficiente obtenido es negativo, este indica que a medida que el ingreso aumenta la probabilidad de renunciar es menor. En este caso se cumple con lo planteado en la justificación de la elección.

4. Modelo completo

## Modelo completo
mod_c<- glm(y ~  . , data = df[,-1], family = binomial)
round(summary(mod_c)$coefficients,4)
##                              Estimate Std. Error z value Pr(>|z|)
## (Intercept)                   -2.5665     1.0159 -2.5263   0.0115
## viaje.negociosNo_Viaja        -1.3380     0.3523 -3.7982   0.0001
## viaje.negociosRaramente       -0.6800     0.1814 -3.7483   0.0002
## cargoDirector_Manofactura      0.7471     0.8796  0.8494   0.3957
## cargoEjecutivo_Ventas          1.9254     0.8357  2.3038   0.0212
## cargoGerente                   0.9944     0.8740  1.1379   0.2552
## cargoInvestigador_Cientifico   1.5191     0.9147  1.6606   0.0968
## cargoRecursos_Humanos          2.1643     0.9494  2.2798   0.0226
## cargoRepresentante_Salud       0.7642     0.8865  0.8621   0.3886
## cargoRepresentante_Ventas      2.9420     0.9473  3.1056   0.0019
## cargoTecnico_Laboratorio       2.2307     0.9135  2.4419   0.0146
## horas.extraSi                  1.5218     0.1610  9.4498   0.0000
## Ddstancia.casa                 0.0307     0.0093  3.2888   0.0010
## satisfación.laboral           -0.3237     0.0698 -4.6393   0.0000
## ingreso.mensual                0.0000     0.0000 -1.1781   0.2388

Interpretación de coeficientes:

Para la interpretación de coeficientes se usan los odds de cada variable estos indican un cambio multiplicativo en la probabilidad de retiro y se calculan al hallar el exponencial de cada coeficiente asociado, aquí se tendrían 3 casos, si el coeficiente es negativo los odds serán menores a 1 por lo cual la probabilidad de retiro disminuye, si el coeficiente es igual a 0 los odds serán 1, por lo tanto, la probabilidad de retiro no cambia y finalmente si el coeficiente es positivo los odds serán mayores a 1 que indica un aumento en la probabilidad de retiro.

  • Viaje de Negocios: En este caso como las dos categorías tienen valor-p menor a 0.05 la variable es significativa

    • La probabilidad de renunciar de alguien que “No viaja” es exp(-1.3380) = 0.26 veces menor que La probabilidad de renunciar de alguien que viaja “Frecuentemente”.

    • La probabilidad de renunciar de alguien que “Raramente viaja” es exp(-0.68) = 0.51 veces menor que La probabilidad de renunciar de alguien que viaja “Frecuentemente”.

  • Cargo: Como al menos una categoría tiene valor-p menor a 0.05 la variable Cargo es significativa.

    • La probabilidad de renunciar de un Director de Manufactura es exp(0.7471) = 2.11 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Ejecutivo de Ventas es exp(1.9254) = 6.85 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Gerente es exp(0.9944) = 2.7 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Investigador Científico es exp(1.5191) = 4.57 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Recursos Humanos es exp(2.1643) = 8.71 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Representante de Salud es exp(0.7642) = 2.15 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Representante de Ventas es exp(2.9420) = 18.99 veces mayor que La probabilidad de renunciar de un Director de Investigación.

    • La probabilidad de renunciar de un Técnico de Laboratorio es exp(2.2307) = 9.3 veces mayor que La probabilidad de renunciar de un Director de Investigación.

  • Horas_Extra: La probabilidad de renunciar de alguien que “Si” hace horas extra es exp(1.5218) = 4.58 veces mayor que la odds de renunciar de alguien que “No” hace horas extra. El valor-p de esta variable es menor a 0.05, por lo tanto, es significativa.

  • Distancia_Casa: Por cada unidad de incremento en la Distancia_Casa, la probabilidad de renunciar se incrementa en exp(0.0307) = 1.03 veces. El valor-p de la variable es menor a 0.05, por lo tanto, es significativa.

  • Satisfacción_Laboral: Por cada unidad que aumenta la Satisfacción_Laboral, la probabilidad de renunciar disminuye en exp(-0.3237) = 0.72 veces. El valor-p de la variable es menor a 0.05, por lo tanto, es significativa.

  • Ingreso_Mensual: Por cada unidad que aumenta el Ingreso Mensual, la probabilidad de renunciar disminuye en exp(-0.0000499) = 0.99 veces. Como el valor-p es mayor a 0.05 esta variable no es significativa en el modelo.

5. Evaluación del modelo

El objetivo de la curva ROC es evaluar muchos umbrales de probabilidad que determinan si una persona renuncia o no, con esto se halla el punto de corte que optimiza la sensibilidad y especificidad del modelo. Se espera que la curva este lo más alejada posible de la linea diagonal ya que esta indica la eficiencia de un clasificador aleatorio. Otro indicador resultante de este método es el AUC (Area bajo la curva) que toma valores entre 0 y 1, donde lo ideal es tener un AUC cercano a 1.

objroc <- roc(df$y, mod_c$fitted.values,auc=T,ci=T)
plot.roc(objroc,print.auc=T,print.thres = "best",
         col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

Para el modelo se obtienen unos resultados aceptables teniendo en cuenta la posición de la curva y el AUC de 0.78.

6. Predicción

Para el ejercicio de predicción se simula una persona que no viaja con cargo de ejecutivo de ventas, que no trabaja horas extra, vive a 7 kilometros del trabajo, está satisfecho con su trabajo y tiene un ingreso de $2000.

new_dat <- data.frame(
  `viaje.negocios` = "No_Viaja",
  Cargo = "Ejecutivo_Ventas",
  Horas_Extra = "No",
  Distancia_Casa = 7,
  Satisfación_Laboral = 4,
  Ingreso_Mensual= 2000
)
colnames(new_dat)<-colnames(df[,-c(1,8)])
predict(mod_c, newdata = new_dat, type = "response")
##          1 
## 0.04074714

En este caso la probabilidad de retiro es de 0.04. Según la curva ROC ya se tiene un punto de corte optimo para la probabilidad para determinar si alguien se retira o no y es de 0.153, en este caso se define que el individuo hipotético no se retira, esto es debido a que en las variables tiene factores que contribuyen a que no se retire, por ejemplo no hacer horas extra y no viajar frecuentemente. A continuación se enseña como sólo cambiando los valores para estas dos variables (Viaje de negocios= “Raramente”, Horas_Extra=“Si”) la probabilidad de retiro aumenta considerablemente, sobrepasando el umbral definido.

new_dat <- data.frame(
  `viaje.negocios` = "Raramente",
  Cargo = "Ejecutivo_Ventas",
  Horas_Extra = "Si",
  Distancia_Casa = 7,
  Satisfación_Laboral = 4,
  Ingreso_Mensual= 2000
)
colnames(new_dat)<-colnames(df[,-c(1,8)])
predict(mod_c, newdata = new_dat, type = "response")
##         1 
## 0.2731113

7. Conclusiones

La rotación es un problema complejo en el cual se pueden identificar sus causas, pero es difícil tener un plan de acción ya que hay variables que directamente no se pueden intervenir, aquí se presentan algunas ideas para las variables elegidas en este caso:

  • Viaje de negocios: Esta es una de las más complicadas ya que viajar o no puede esta directamente ligado a las responsabilidades de la persona y no es que esta pueda elegir o no hacerlo y la empresa tampoco, más aun en este caso donde se ve que la mayoría de personas viajan. Para solventar esto un poco de podría aclarar el tema de los viajes desde el proceso de selección de personal, para saber si la persona a contratar igual está dispuesta a trabajar en el cargo.

  • Cargo: Nuevamente para esta variable es complicado por su naturaleza, ya que el cargo no es algo que se pueda cambiar fácilmente. Aquí también se podría tener un plan desde el proceso de selección, haciendo un análisis donde se obtenga un perfil de las personas que no renuncian en los cargos con más riesgo de renunciar, de este modo se procuraría contratar sólo a personas que cumplan con este perfil para disminuir la probabilidad de rotación.

  • Horas extra: Con respecto a las horas extra se debe evaluar si la compensación por la realización de estas es adecuada o no. También se puede optar por reducir la carga laboral de las personas que cumplen horas extra, con el fin de disminuir estas.

  • Distancia a casa: La distancia a casa es difícil de intervenir, ya que no siempre es posible que todas las personas vivan cerca de la empresa. Para el caso de las personas que viven muy lejos se puede optar por reubicarlas, esto solo funcionaria en caso de que la empresa tenga varias sedes. Otra opción es dar incentivos a quienes se tienen que transportar largas distancias.

  • Satisfacción laboral: Para la satisfacción laboral se debe hacer un estudio el cual determine que otras variables hacen que un trabajador este satisfecho o no, con esto trabajar en mejorar la satisfacción de todos los empleados y así disminuir la rotación.

  • Ingreso mensual: Evaluar si los empleados reciben un salario acorde a sus funciones, este puede aumentar o disminuir dependiendo de lo que hacen, también se pueden ofrecer planes de capacitación para que los empleados puedan mejorar su desempeño y puedan desarrollar otro tipo de funciones para aspirar incluso a cargos más altos.

Problema 2

1. Carga de datos y depuración

Este conjunto de datos tiene información sobre los prestamos que los clientes tienen en el banco y si han incumplido en el pago, este cuenta con las siguientes variables:

data("creditos")
df<-as.data.frame(creditos)
colnames(df)
## [1] "default"    "antiguedad" "edad"       "cuota"      "ingresos"
  • DEFAULT: Indica si el cliente ha incumplido en el pago de sus préstamos (1) o no (0).

  • ANTIUEDAD: Indica la antigüedad en años de la cuenta bancaria del cliente.

  • EDAD: Indica la edad del cliente en años.

  • CUOTA_TOTAL: Indica la cuota que el cliente debe pagar por sus préstamos.

  • INGRESOS: Indica los ingresos mensuales del cliente.

La base cuenta con 780 filas y en la inspección de NA’s se ve que no hay registros faltantes.

NAs<-colSums(is.na(df))
as.data.frame(NAs)
##            NAs
## default      0
## antiguedad   0
## edad         0
## cuota        0
## ingresos     0

2. Análisis Exploratorio de Datos

En el gráfico se ve como la variable default se encuentra desbalanceada ya que hay muy pocas personas que entran en incumplimiento de pago, igual es importante poder definir que características tienen estas personas para tener un plan al momento de captar nuevos clientes.

summary(df[,-1])
##    antiguedad           edad           cuota            ingresos       
##  Min.   : 0.2548   Min.   :26.61   Min.   :    387   Min.   :  633825  
##  1st Qu.: 7.3767   1st Qu.:48.18   1st Qu.: 328516   1st Qu.: 3583324  
##  Median :15.1192   Median :57.92   Median : 694460   Median : 5038962  
##  Mean   :18.0353   Mean   :56.99   Mean   : 885206   Mean   : 5366430  
##  3rd Qu.:30.6637   3rd Qu.:66.19   3rd Qu.:1244126   3rd Qu.: 6844098  
##  Max.   :37.3178   Max.   :92.43   Max.   :6664588   Max.   :22197021
  • ANTIUEDAD: Los valores oscilan entre 0.2548 y 37.3178, lo que sugiere que los clientes han estado utilizando los servicios bancarios durante un período de tiempo variado.

  • EDAD: Se refiere a la edad de los clientes. Los valores oscilan entre 26.61 y 92.43, con una media de 56.99. Esto sugiere que el banco tiene clientes de diferentes edades, pero la mayoría de ellos se encuentran en la franja de edad media.

  • CUOTA_TOTAL: Se refiere a la cantidad total de dinero que los clientes deben pagar al banco cada mes. Los valores oscilan entre 387 y 6,664,588. Esto sugiere que los clientes tienen diferentes niveles de deuda con el banco, desde pequeñas cuotas hasta grandes pagos.

  • INGRESOS: Se refiere a los ingresos anuales de los clientes. Los valores oscilan entre 633,825 y 22,197,021, con una media de 5,366,430. Esto sugiere que el banco tiene clientes con diferentes niveles de ingresos, sin embargo la distribución de ingresos es asimetrica siendo más común los ingresos medios.

A continuación se presentas diagramas de caja de cada variable con respecto a si ha incumplido con el pago o no, para tener una idea de si alguna de estas tiene un efecto sobre la variable respuesta.

En el gráfico se percibe que los clientes que incumplen con el pago tienen menos años de antigüedad con el banco.

Para la edad se ve que los clientes que no pagan pueden ser un poco más jovenes, pero puede que esta diferencia no sea muy significativa, ya que ambas cajas son muy similares en cuanto a su mediana.

Con respecto a la mediana de la cuota total se ve que los clientes que incumplen el pago tienen un valor mayor, por lo tanto se pensaria que a medida que la cuota de pago es más alta hay más probabilidad de entrar en default.

En el gráfico se ve que los clientes que no incumplen con el pago pueden llegar a tener ingresos muy altos superando incluso los 20 millones, mientras que los que incumplen el pago tienen máximo 8 millones aproximadamente.

3. Modelo de regresión logístico

Inicialmente se plantea un modelo con la variable respuesta “DEFAULT” en función de todas las demás variables para evaluar la significancia de cada una.

mod_c<- glm(default ~  . , data = df[,], family = binomial)

round(summary(mod_c)$coefficients,10)
##                  Estimate   Std. Error   z value     Pr(>|z|)
## (Intercept) -3.1928404435 0.9305999440 -3.430948 0.0006014749
## antiguedad  -0.0461574511 0.0235346211 -1.961257 0.0498489969
## edad         0.0222932891 0.0193240298  1.153656 0.2486410976
## cuota        0.0000010134 0.0000002473  4.098362 0.0000416084
## ingresos    -0.0000002615 0.0000001057 -2.474351 0.0133478510

Interpretación

  • ANTIUEDAD: Los odds para ANTIUEDAD es de exp(-0.0462) = 0.955, lo que significa que por cada aumento de un año en la antigüedad de la cuenta bancaria, la probabilidad de incumplimiento de pago se multiplica por 0.955 (es decir, disminuye en un 4.5%). Esta variable es significativa.

  • EDAD: Los odds para EDAD es de exp(0.0223) = 1.022, lo que indica que por cada aumento de un año en la edad del cliente, la probabilidad de incumplimiento de pago se multiplica por 1.022 (es decir, aumenta en un 2.2%). Esta variable no es significativa, sin embargo se incluye en el análisis ya que para incrementos de edad más altos la probabilidad puede aumentar más.

  • CUOTA_TOTAL: Los odds para CUOTA_TOTAL es de exp(0.0000010134) = 1.000001, lo que significa que por cada aumento de una unidad en la cuota total, la probabilidad de incumplimiento de pago se multiplica por 1.000001 (es decir, aumenta en un 0.0001%). Esta variable es significativa.

  • INGRESOS: Los odds para INGRESOS es de exp(-0.0000002615) = 0.9999997385, lo que significa que por cada aumento de una unidad en los ingresos mensuales del cliente, la probabilidad de incumplimiento de pago se multiplica por 0.9999997385 (es decir, disminuye en un 0.000026%). Según el valor-p la variable es significativa.

Según esto se podría excluir del modelo la variable edad, sin embargo, al retirar esta la variable antigüedad deja de ser significativa.

mod_c_2<- glm(default ~  . , data = df[,-3], family = binomial)

round(summary(mod_c_2)$coefficients,10)
##                  Estimate   Std. Error   z value     Pr(>|z|)
## (Intercept) -2.2440915219 0.3932514754 -5.706505 0.0000000115
## antiguedad  -0.0281653598 0.0180329025 -1.561887 0.1183145623
## cuota        0.0000009860 0.0000002456  4.014388 0.0000596002
## ingresos    -0.0000002542 0.0000001059 -2.399528 0.0164162431

Esto también implicaba una reducción en las métricas de evaluación del modelo por lo tanto se opta por dejar la variable incluida en el modelo, ya que esta igual aporta algo de información.

4. Evaluación del modelo

En el gráfico se puede ver que la curva ROC se encuentra medianamente alejada de la diagonal, el punto de corte de probabilidad optimo es de 0.054 con una sensibilidad de 0.628 y especificidad de 0.692, esto quiere decir que el modelo identifica mejor a las personas que no incumplen con el pago. El AUC es de 0.701 que indica un modelo aceptable.

objroc <- roc(df$default, mod_c$fitted.values,auc=T,ci=T)
plot.roc(objroc,print.auc=T,print.thres = "best",
         col="blue",xlab="1-ESpecificidad",ylab="Sensibilidad")

5. Conclusiones

El modelo tiene una buena capacidad y ayudaría a disminuir la cantidad de usuarios que incumplen en el pago sin embargo habría que tener en cuenta que al momento de clasificar también se puede incurrir en un error, por ejemplo, clasificar un cliente que no va a incumplir con el pagado como uno que sí, este error va a ser más común ya que no incumplir con el pago es lo que más ocurre actualmente. Para entender esto mejor se puede revisar la matriz de confusión en esta se ve que de 741 clientes que no incumplen con el pago el modelo clasificó mal a 270, si el modelo se hubiera aplicado antes de dar el crédito se hubiera perdido a todos estos, solo por asegurar que 25 de 39 clientes no iban a pagar. Aquí se debe evaluar que error es más costoso para la empresa y de ser necesario aplicar otras técnicas para mejorar el modelo.

pred<-as.factor(ifelse(mod_c$fitted.values>0.054,1,0))

caret::confusionMatrix(df$default,pred )$table
##           Reference
## Prediction   0   1
##          0 471 270
##          1  14  25