https://rpubs.com/sgcifuentes/950129
library(readxl)
datos_rotacion = read_excel("C:/Users/User/Downloads/Datos_Rotacion.xlsx")
attach(datos_rotacion)
Las Variables seleccionadas son:Edad, trabajos_anteriores, Ingreso_Mensual, Genero, Cargo, Estado_Civil
Se espera que la edad se relacione con la rotación ya que a menor edad (menor a 30) hay menos responsabilidades y menor miedo al cambio. La hipotesis es que las personas de menor edad rotan más que las de mayor edad.
Se espera que los trabajos anteriores se relacione con la rotación ya que cuando una persona tiene menos trabajos tiende a rotar. La hipotesis es que las personas con menor cantidad de trabajos tienden a rotar más.
Se espera que el ingreso mensual se relacione con la rotación ya que las personas con menor ingresos tienen a rotar más. La hipotesis es que las personas con menor ingreso rotan más que las de altos ingresos.
Se espera que el Genero se relacione con la rotación ya que los hombres tienden a rotar más. La hipotesis es que los hombres rotan más que las mujeres.
Se espera que el cargo se relacione con la rotación ya que las personas con cargos comercial rotan con frecuencia. La hipotesis es que las personas con comerciales rotan mas que las de cargos operativos.
Se espera que el estado civil se relacione con la rotación ya que las personas solteras tienden a rotar más: La hipotesis es que los solteros rotan más que los otros estados civiles.
datos_6_variables = datos_rotacion[,c(1,2,14,13,9,10,12)]
table(datos_6_variables$Rotación)
##
## No Si
## 1233 237
##Tabla de Indicadores Importantes variables cuantitativas
Edad_promedio=mean(datos_6_variables$Edad,na.rm = TRUE)
Edad_mediana=median(datos_6_variables$Edad,na.rm = TRUE)
Edad_promedio
## [1] 36.92381
Edad_mediana
## [1] 36
resultado_Edad=data.frame(Edad_promedio,Edad_mediana)
resultado_Edad
## Edad_promedio Edad_mediana
## 1 36.92381 36
require(ggplot2)
require(ggpubr)
require(plotly)
g1=ggplot(datos_6_variables,aes(x=Genero))+geom_bar()+theme_bw()
g2=ggplot(datos_6_variables,aes(x=Cargo))+geom_bar()+theme_bw()
g3=ggplot(datos_6_variables,aes(x=Estado_Civil))+geom_bar()+theme_bw()
ggarrange(g1, g3,labels = c("A", "B"),ncol = 2, nrow = 1)
De acuerdo al análisis univariado categórico que se representa en los gráficos A, B, y C, las caracteristicas de rotación de la compañía son: Hombres, casados en el cargo de Ejecutivo de ventas; es decir, continúa siendo el equipo comercial el que más rotación tiene en la compañía.
g4=ggplot(datos_6_variables,aes(x=Ingreso_Mensual))+geom_histogram()+theme_bw()
g5=ggplot(datos_6_variables,aes(x=Trabajos_Anteriores))+geom_histogram()+theme_bw()
g6=ggplot(datos_6_variables,aes(x=Edad))+geom_histogram()+theme_bw()
ggarrange(g4, g5, g6, labels = c("A", "B", "C"),ncol = 2, nrow = 3)
Validando este análisis se puede concluir que las personas que más tienen rotación en la compañía son: Los que tienen un ingreso mensual inferior a 2 Millones, han tenido menos de 2 trabajos y son menores de 40 años.
Se realiza un análisis bivariado de varias maneras, de acuerdo a la variable:
require(CGPfunctions)
require(ggplot2)
require(ggpubr)
require(plotly)
g7=ggplot(datos_6_variables,aes(x=Rotación,y=Edad,fill=Rotación))+geom_boxplot()+theme_bw()
ggplotly(g7)
b1 = table(datos_6_variables$Rotación, datos_6_variables$Trabajos_Anteriores)
mosaicplot(b1,
col=c('#faf0ca', '#0d3b66'),
las = 1)
b2 = table(datos_6_variables$Rotación, datos_6_variables$Genero)
mosaicplot(b2,
col=c('#faf0ca', '#0d3b66'),
las = 1)
b3 = table(datos_6_variables$Rotación, datos_6_variables$Cargo)
mosaicplot(b3,
col=c('#faf0ca', '#0d3b66'),
las = 1)
require(CGPfunctions)
require(ggplot2)
require(ggpubr)
require(plotly)
g8=PlotXTabs2(datos_6_variables, Rotación,Estado_Civil,plottype = "percent")
ggarrange(g8, labels = c("D", "E"),ncol = 2, nrow = 1)
La hipotesis consideraba que las personas que más rotan son los inferiores a 30 años, pero los datos reflejan que la mayoría de las personas que tienen mayor rotación son menores a 32 años.
Los datos respaldan la hipotesis que las personas con menor cantidad de trabajos rotan más y efectivamente son las personas con 1 trabajo las que rotan más.
La hipotesis consideraba que los hombres rotan más que las mujeres y efectivamente si.
Las personas con cargos comerciales rotán más.
El estado civil que más rota es el soltero.
datos_6_variables$Rota=0
datos_6_variables$Rota[datos_6_variables$Rotación=="Si"]=1
datos_6_variables$Genero=as.factor(datos_6_variables$Genero)
datos_6_variables$Cargo=as.factor(datos_6_variables$Cargo)
datos_6_variables$Estado_Civil=as.factor(datos_6_variables$Estado_Civil)
modelo_1_logit = glm(datos_6_variables$Rota ~ Edad +
Trabajos_Anteriores +
Ingreso_Mensual+
Genero +
Cargo +
Estado_Civil,
data = datos_6_variables,
family = "binomial")
summary(modelo_1_logit)
##
## Call:
## glm(formula = datos_6_variables$Rota ~ Edad + Trabajos_Anteriores +
## Ingreso_Mensual + Genero + Cargo + Estado_Civil, family = "binomial",
## data = datos_6_variables)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.3728 -0.6310 -0.4578 -0.2641 2.9029
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.219e+00 1.020e+00 -3.157 0.001594 **
## Edad -3.635e-02 1.033e-02 -3.519 0.000432 ***
## Trabajos_Anteriores 1.250e-01 3.019e-02 4.139 3.49e-05 ***
## Ingreso_Mensual 1.971e-05 4.414e-05 0.447 0.655130
## GeneroM 1.742e-01 1.565e-01 1.113 0.265776
## CargoDirector_Manofactura 1.116e+00 8.733e-01 1.278 0.201318
## CargoEjecutivo_Ventas 2.115e+00 8.292e-01 2.551 0.010739 *
## CargoGerente 8.796e-01 8.575e-01 1.026 0.304998
## CargoInvestigador_Cientifico 1.980e+00 9.142e-01 2.166 0.030347 *
## CargoRecursos_Humanos 2.592e+00 9.350e-01 2.772 0.005573 **
## CargoRepresentante_Salud 1.130e+00 8.785e-01 1.286 0.198340
## CargoRepresentante_Ventas 3.191e+00 9.431e-01 3.384 0.000715 ***
## CargoTecnico_Laboratorio 2.504e+00 9.118e-01 2.746 0.006024 **
## Estado_CivilDivorciado -2.350e-01 2.241e-01 -1.049 0.294171
## Estado_CivilSoltero 7.905e-01 1.656e-01 4.773 1.82e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1298.6 on 1469 degrees of freedom
## Residual deviance: 1149.7 on 1455 degrees of freedom
## AIC: 1179.7
##
## Number of Fisher Scoring iterations: 6
Se identifica que las variables significativas para el modelo son: Edad, Trabajos_Anteriores, CargoRepresentante_Ventas y Estado_CivilSoltero
Para interpretar los coeficientes se debe sacar el ratio de ODDS
exp(modelo_1_logit$coefficients)
## (Intercept) Edad
## 0.04001208 0.96430720
## Trabajos_Anteriores Ingreso_Mensual
## 1.13310032 1.00001971
## GeneroM CargoDirector_Manofactura
## 1.19023499 3.05225523
## CargoEjecutivo_Ventas CargoGerente
## 8.29335167 2.41001354
## CargoInvestigador_Cientifico CargoRecursos_Humanos
## 7.24144131 13.35394713
## CargoRepresentante_Salud CargoRepresentante_Ventas
## 3.09582510 24.32012967
## CargoTecnico_Laboratorio Estado_CivilDivorciado
## 12.23327815 0.79053902
## Estado_CivilSoltero
## 2.20441292
Esta razón de probabilidad lo que nos indica es lo siguiente:
Por cada unidad que aumenta la variable Edad, el odds de que se presente el evento de rotación aumenta 0.96 veces, es decir, que una persona menor de 30 años es 0.9 veces mas probable de rotar.
Por cada unidad que aumenta la variable Trabajos_Anteriores, el odds de que se presente el evento de rotación aumenta 1.13 veces, es decir, que una persona con trabajos anteriores tiene 1.13 veces mas de probabilidad de rotar.
Por cada unidad que aumenta la variable CargoRepresentante_Ventas, el odds de que se presente el evento de rotación aumenta 24.32 veces, es decir, que una persona en el cargo de comercial, es 24 veces más probable de que rote.
Por cada unidad que aumenta la variable Estado_CivilSoltero, el odds de que se presente el evento de rotación aumenta 2.20 veces, es decir, que una persona soltera es 2,2 veces mas probable que rote
pred1 = predict.glm(modelo_1_logit,newdata = datos_6_variables, type="response")
boxplot(pred1)
ypred = ifelse(pred1 >0.4,1,0)
yobser = datos_6_variables$Rota
matrizc = table (yobser,ypred)
matrizc
## ypred
## yobser 0 1
## 0 1200 33
## 1 197 40
sum(diag(matrizc))/sum(matrizc)
## [1] 0.8435374
library(ROCR)
pred = ROCR::prediction(pred1,datos_6_variables$Rota)
perf = performance(pred,"tpr","fpr")
plot(perf)
abline(a=0,b=1,col="red")
grid()
#AUC: Area bajo la curva
AUClog1=performance(pred, measure = "auc")@y.values[[1]]
cat("AUC:", AUClog1,"n")
## AUC: 0.7376403 n
El poder predictivo del modelo es del 82% con un intercepto en 0,3 Se observa que la curva tiene un área importante acercando el resultado al punto optimo que es x= 0, y=1.
Prueba_1 = data.frame(datos_6_variables$Rota,
Edad=25,
Trabajos_Anteriores=2,
Ingreso_Mensual=2000000,
Genero="M",
Cargo="Representante_Ventas",
Estado_Civil= "Soltero")
pred2 = predict.glm(modelo_1_logit,newdata = Prueba_1, type="response")
boxplot(pred2)
ypred = ifelse(pred2 >0.2,1,0)
yobser = Prueba_1$datos_6_variables.Rota
matrizc2 = table (yobser,ypred)
matrizc2
## ypred
## yobser 1
## 0 1233
## 1 237
sum(diag(matrizc))/sum(matrizc)
## [1] 0.8435374
Para esta data puntual de caracteristicas de una persona, hay 1233 observaciones clasificadas como 0 es decir que eran falsos positivos, el modelo está mostrando como 1 y habian 237 como 1 y el modelo los predice como 1, es decir, la empresa no debe intervenir a ningun empleado con estas caracteristicas aún.
Las variables que resultaron significativas son: Edad, trabajos anteriores, Representante de Ventas y Soltero.
Como estratégia la empresa debería implementar una política que para los cargos comerciales sólo se puede contratar personas mayores a 30 años, que hayan tenido 2 trabajos o más y que esté casado.
Segundo Punto
Con base en los datos de créditos proponga un modelo de regresión logístico múltiple que permita predecir el riesgo de default en función de las covariables que considere importantes y seleccionándolas de acuerdo con un proceso adecuado. Tenga en cuenta realizar una evaluación de la significancia de los parámetros, interpretación y proponga un método de evaluación por medio de validación cruzada. Presente métricas apropiadas como el AUC y la curva ROC.
library(readxl)
datos_creditos = read_excel("C:/Users/User/Downloads/Datos_Creditos.xlsx")
modelo_2_logit = glm(datos_creditos$DEFAULT ~ ANTIUEDAD +
EDAD +
CUOTA_TOTAL+
INGRESOS,
data = datos_creditos,
family = "binomial")
summary(modelo_2_logit)
##
## Call:
## glm(formula = datos_creditos$DEFAULT ~ ANTIUEDAD + EDAD + CUOTA_TOTAL +
## INGRESOS, family = "binomial", data = datos_creditos)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.9181 -0.3672 -0.2873 -0.1917 3.1332
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.193e+00 9.306e-01 -3.431 0.000601 ***
## ANTIUEDAD -4.616e-02 2.353e-02 -1.961 0.049849 *
## EDAD 2.229e-02 1.932e-02 1.154 0.248641
## CUOTA_TOTAL 1.013e-06 2.473e-07 4.098 4.16e-05 ***
## INGRESOS -2.615e-07 1.057e-07 -2.474 0.013348 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 309.68 on 779 degrees of freedom
## Residual deviance: 287.49 on 775 degrees of freedom
## AIC: 297.49
##
## Number of Fisher Scoring iterations: 6
Se identifica que las variables significativas para el modelo es la CUOTA_TOTAL
Para interpretar los coeficientes se debe sacar el ratio de ODDS
boxplot(datos_creditos$CUOTA_TOTAL)
exp(modelo_2_logit$coefficients)
## (Intercept) ANTIUEDAD EDAD CUOTA_TOTAL INGRESOS
## 0.04105509 0.95489160 1.02254364 1.00000101 0.99999974
Esta razón de probabilidad lo que nos indica es lo siguiente:
Por cada unidad que aumenta la variable CUOTA_TOTAL, el odds de que se presente el evento de riesgo aumenta en 1, es decir, que una persona con una cuota mayor a 2MM es 1 veces mas probable de riesgo, Es decir, no hay riesgo en estos clientes.
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.
pred3 = predict.glm(modelo_2_logit,newdata = datos_creditos, type="response")
boxplot(pred3)
ypred = ifelse(pred3 >0.4,1,0)
yobser = datos_creditos$DEFAULT
matrizc3 = table (yobser,ypred)
matrizc3
## ypred
## yobser 0 1
## 0 741 0
## 1 38 1
sum(diag(matrizc))/sum(matrizc)
## [1] 0.8435374
library(ROCR)
pred3 = ROCR::prediction(pred3,datos_creditos$DEFAULT)
perf = performance(pred3,"tpr","fpr")
plot(perf)
abline(a=0,b=1,col="red")
grid()
#AUC: Area bajo la curva
AUClog3=performance(pred, measure = "auc")@y.values[[1]]
cat("AUC:", AUClog1,"n")
## AUC: 0.7376403 n
Se identifica que hay 741 observaciones clasificadas como 0 es decir que eran positivos, el modelo está mostrando como 0 y habian 38 como 1 y el modelo los predice como 0, es decir, falsos negativos, la empresa tiene un riesgo con estos 38 empleados, sin embargo, como lo vimos anteriormente el riesgo es mínimo.
El poder predictivo del modelo es del 73% con un intercepto en 0,4 Se observa que la curva tiene un área importante acercando el resultado al punto optimo que es x= 0, y=1.