El siguiente informe se ejecuta un análisis de los factores que influyen en la rotación de empleados, con el objetivo de responder pro activamente a la retención de talento y fomentar un mejor ambiente laboral. Este documento se divide en las secciones: Introducción, objetivos, métodos, conclusiones.
Este informe realiza un análisis de la información suministrada por una compañía, para lo cual se realizan los siguientes pasos: 1) Selección de variables, 2) Análisis Univariado, 3) Análisis bivariado, 4) Estimación del modelo, 5) Evaluación del modelo, 6) predicciones, 7) Conclusiones.
library(paqueteMODELOS)
data("rotacion")
head(rotacion)
str(rotacion,vec.len=2, digits.d=2, give.attr=FALSE)
## tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
## $ Rotación : chr [1:1470] "Si" "No" ...
## $ Edad : num [1:1470] 41 49 37 33 27 ...
## $ Viaje de Negocios : chr [1:1470] "Raramente" "Frecuentemente" ...
## $ Departamento : chr [1:1470] "Ventas" "IyD" ...
## $ Distancia_Casa : num [1:1470] 1 8 2 3 2 ...
## $ Educación : num [1:1470] 2 1 2 4 1 ...
## $ Campo_Educación : chr [1:1470] "Ciencias" "Ciencias" ...
## $ Satisfacción_Ambiental : num [1:1470] 2 3 4 4 1 ...
## $ Genero : chr [1:1470] "F" "M" ...
## $ Cargo : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" ...
## $ Satisfación_Laboral : num [1:1470] 4 2 3 3 2 ...
## $ Estado_Civil : chr [1:1470] "Soltero" "Casado" ...
## $ Ingreso_Mensual : num [1:1470] 5993 5130 ...
## $ Trabajos_Anteriores : num [1:1470] 8 1 6 1 9 ...
## $ Horas_Extra : chr [1:1470] "Si" "No" ...
## $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 ...
## $ Rendimiento_Laboral : num [1:1470] 3 4 3 3 3 ...
## $ Años_Experiencia : num [1:1470] 8 10 7 8 6 ...
## $ Capacitaciones : num [1:1470] 0 3 3 3 3 ...
## $ Equilibrio_Trabajo_Vida : num [1:1470] 1 3 3 3 3 ...
## $ Antigüedad : num [1:1470] 6 10 0 8 2 ...
## $ Antigüedad_Cargo : num [1:1470] 4 7 0 7 2 ...
## $ Años_ultima_promoción : num [1:1470] 0 1 0 3 2 ...
## $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 ...
require(mice)
require(VIM)
md.pattern(rotacion, plot=TRUE, rotate.names=TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## Rotación Edad Viaje de Negocios Departamento Distancia_Casa Educación
## 1470 1 1 1 1 1 1
## 0 0 0 0 0 0
## Campo_Educación Satisfacción_Ambiental Genero Cargo Satisfación_Laboral
## 1470 1 1 1 1 1
## 0 0 0 0 0
## Estado_Civil Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## 1470 1 1 1 1
## 0 0 0 0
## Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1470 1 1 1
## 0 0 0
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1470 1 1 1 1
## 0 0 0 0
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 1470 1 1 0
## 0 0 0
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
Variables Categoricas:
Horas_extra: Variable categorica Nominal
Estado_Civil: Variable Categórica Nominal
Viaje de Negocios: Variable Categórica Nominal
Hipótesis Variables Categóricas:
Horas_extra: Las personas que realizan horas extras se espera busque una rotación con el objetivo de no seguir reduciendo su tiempo libre con el laboral. Hipótesis: Las personas que no laboran horas extras tienen una menor posibilidad de rotar que los que si ejecutan horas extras.
Estado_Civil: Los trabajadores que se encuentran solteros tienen mayor libertad en su vida personal para buscar rotaciones que las personas que se encuentran casadas. Hipótesis: Las personas casadas presentan una mayor posibilidad de no rotar comparado con las personas solteras.
Viaje de Negocios: los empleados que viajan por solicitud de la compañía a pesar de obtener beneficios económicos y sociales por los viajes buscan con mayor frecuencia una rotación ya que no compensa con el agotamiento físico/mental. Hipótesis: Las personas que realizan viajes de negocios presentan una mayor posibilidad de rotación que las personas que no presentan viajes de negocio.
Variables Cuantitativas
Edad: Variable cuantitativa discreta
Satisfacción_Laboral: Variable Cuantitativa discreta
Ingreso_mensual: Variable Cuantitativa continua
Hipótesis Variables Cuantitativas:
Edad: Las personas con mayor edad pueden presentar una menor rotación por que hay una mayor aversión al riesgo e incertidumbre que nuevos empleos generan. Hipótesis: los trabajadores con mayor edad tienen una menor probabilidad de realizar una rotación.
Satisfacción_Laboral: Los empleados con mayores calificaciones de satisfacción laboral encuentran menos razones para realizar una rotación que una persona con satisfacción baja. Hipótesis: Las personas con mejores calificaciones de satisfacción laboral presentan una menor posibilidad de rotación que los que tienen una calificación de satisfacción baja.
Ingreso_mensual: Se espera que las personas con mayores salarios no deseen realizar cambios de empleo que puedan desmejorar sus condicionales salariales actuales. Hipótesis: las personas con ingresos salariales más altos tiene una menor posibilidad de realizar una rotación que las personas con salarios más bajos.
nombres <- names(rotacion)
print(nombres)
## [1] "Rotación" "Edad"
## [3] "Viaje de Negocios" "Departamento"
## [5] "Distancia_Casa" "Educación"
## [7] "Campo_Educación" "Satisfacción_Ambiental"
## [9] "Genero" "Cargo"
## [11] "Satisfación_Laboral" "Estado_Civil"
## [13] "Ingreso_Mensual" "Trabajos_Anteriores"
## [15] "Horas_Extra" "Porcentaje_aumento_salarial"
## [17] "Rendimiento_Laboral" "Años_Experiencia"
## [19] "Capacitaciones" "Equilibrio_Trabajo_Vida"
## [21] "Antigüedad" "Antigüedad_Cargo"
## [23] "Años_ultima_promoción" "Años_acargo_con_mismo_jefe"
df_rotacion <- subset(rotacion, select= c(Rotación, Edad, `Viaje de Negocios`, Horas_Extra, Satisfación_Laboral, Estado_Civil, Ingreso_Mensual))
head(df_rotacion)
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
Se observa un total de 1470 registros donde la mayoria de ellos son de empleados sin rotación de cargo con 1233, 83.9%, mientras que personas con rotación son 237, equivalente a 16.1%.
library(ggplot2)
library(ggpubr)
library(table1)
library(knitr)
library(tidyverse)
library(ggmosaic)
library(plotly)
df_r <- df_rotacion %>%
group_by(Rotación) %>%
summarise(Total=n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1))
ggplot(df_r, aes(x=`Rotación`, y=Total,fill=Rotación) ) +
theme(axis.text.x = element_blank(),axis.ticks.x = element_blank())+
geom_bar(width = 0.9, stat="identity", position = position_dodge())+
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")),
vjust=2,
color="black",
hjust=0.5,
position = position_dodge(0.9),
angle=0,
size=4.0
)
Se observa en primera instancia que de la población de empleados la mayoría de ellos no realiza Horas extra con un porcentaje de 71.7% equivalente a 1054 de personas, frente a 416 que si realizan horas extra (28.3%)
df_horas <- df_rotacion %>%
group_by(Horas_Extra) %>%
summarise(Total=n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1))
ggplot(df_horas, aes(x=`Horas_Extra`, y=Total,fill=Horas_Extra) ) +
theme(axis.text.x = element_blank(),axis.ticks.x = element_blank())+
geom_bar(width = 0.9, stat="identity", position = position_dodge())+
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")),
vjust=2,
color="black",
hjust=0.5,
position = position_dodge(0.9),
angle=0,
size=4.0
)
Se observa a continuación que el grupo población con mayor presencia son las personas casadas con 45.8%, seguido por solteros con 32% y por ultimo divorciados, 22.2%.
df_estado <- df_rotacion %>%
group_by(Estado_Civil) %>%
summarise(Total=n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1))
ggplot(df_estado, aes(x=`Estado_Civil`, y=Total,fill=Estado_Civil) ) +
theme(axis.text.x = element_blank(),axis.ticks.x = element_blank())+
geom_bar(width = 0.9, stat="identity", position = position_dodge())+
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")),
vjust=2,
color="black",
hjust=0.5,
position = position_dodge(0.9),
angle=0,
size=4.0
)
Al observar la información se distingue que el porcentaje más alto de empleados raramente viaja por razones laborales, con un 71% de los registros.
df_viaje <- df_rotacion %>%
group_by(`Viaje de Negocios`) %>%
summarise(Total=n()) %>%
dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1))
ggplot(df_viaje, aes(x=`Viaje de Negocios`, y=Total,fill=`Viaje de Negocios`) ) +
theme(axis.text.x = element_blank(),axis.ticks.x = element_blank())+
geom_bar(width = 0.9, stat="identity", position = position_dodge())+
geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%",")")),
vjust=2,
color="black",
hjust=0.5,
position = position_dodge(0.9),
angle=0,
size=4.0
)
Para las variables cuantitativas, inicialmente se evalúa su resumen de estadísticos principales y unos histogramas.
summary(df_rotacion[, c("Edad","Satisfación_Laboral","Ingreso_Mensual")])
## Edad Satisfación_Laboral Ingreso_Mensual
## Min. :18.00 Min. :1.000 Min. : 1009
## 1st Qu.:30.00 1st Qu.:2.000 1st Qu.: 2911
## Median :36.00 Median :3.000 Median : 4919
## Mean :36.92 Mean :2.729 Mean : 6503
## 3rd Qu.:43.00 3rd Qu.:4.000 3rd Qu.: 8379
## Max. :60.00 Max. :4.000 Max. :19999
vcn1=ggplot(df_rotacion,aes(x=Edad))+geom_bar()
vcn2=ggplot(df_rotacion,aes(x=Ingreso_Mensual))+geom_histogram()
vcn3=ggplot(df_rotacion,aes(x=Satisfación_Laboral))+geom_bar()+geom_text(stat='count', aes(x=Satisfación_Laboral,label=..count..),vjust=2, col="white")+theme_bw()
ggarrange(vcn1, vcn2, vcn3,ncol = 2, nrow = 2)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Encontrando los siguientes mensajes:
Realiza un análisis de bivariado en donde la variable respuesta sea rotacion codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación). Con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipótesis planteada en el punto 2.
Se realiza la codificación requerida de 1 y 0:
df_rotacion$Rotación <- ifelse(df_rotacion$Rotación == "Si", 1, 0)
head(df_rotacion)
A continuación se realiza el análisis bivariado de cada una de las variables seleccionadas junto a la rotación:
Evaluando la información se encuentra que hay una mayor rotación de personas en el grupo que realizan horas extras con un 31% frente al 10% de las personas que no hacen horas extras. Esto soporta la hipótesis previamente planteada.
library(CGPfunctions)
## Warning: package 'CGPfunctions' was built under R version 4.3.3
Hextra = PlotXTabs2(data = df_rotacion,x = Horas_Extra, y = Rotación)
Hextra
horasE <- table1::table1(~ Horas_Extra | Rotación, data = df_rotacion)
## Warning in table1.formula(~Horas_Extra | Rotación, data = df_rotacion): Terms
## to the right of '|' in formula 'x' define table columns and are expected to be
## factors with meaningful labels.
horasE
| 0 (N=1233) |
1 (N=237) |
Overall (N=1470) |
|
|---|---|---|---|
| Horas_Extra | |||
| No | 944 (76.6%) | 110 (46.4%) | 1054 (71.7%) |
| Si | 289 (23.4%) | 127 (53.6%) | 416 (28.3%) |
Se elabora un modelo de regresión lineal de la rotacion y si trabaja o no horas extra:
mod_horas = glm(Rotación ~ Horas_Extra, data= df_rotacion, family="binomial")
summary(mod_horas)
##
## Call:
## glm(formula = Rotación ~ Horas_Extra, family = "binomial", data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.1496 0.1007 -21.338 <2e-16 ***
## Horas_ExtraSi 1.3274 0.1466 9.056 <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: 1298.6 on 1469 degrees of freedom
## Residual deviance: 1217.2 on 1468 degrees of freedom
## AIC: 1221.2
##
## Number of Fisher Scoring iterations: 4
Encontrando que el modelo posee un coeficiente de ~ 1.33 para cuando el empleado SI realiza Horas extra, indicando que esta variable y respuesta afirmativa incrementa la posibilidad de rotación, alineado con la hipótesis inicial.
Evaluando la información se encuentra que hay una mayor rotación de personas en el grupo de solteros con un 26% frente al 10% del grupo de divorciados y un 12% de los casados. Adicionalmente, se observa que el grupo de personas solteras tiene el 50.6% de la totalidad de las personas que realizaron rotación frente un 35.4% de personas casadas y por ultimo 13.9% de divorciados. Estos mensajes soporta la hipótesis previamente planteada.
En el modelo de regresión lineal se encuentra un intercepto negativo para la categoría de divorciados -0.239 indicando que esta característica al tomar este valor tiende a reducir la probabilidad de rotación sin embargo para los casos de solteros el coeficiente es positivo de 0.787 indicando que incrementa la probabilidad de rotacion, adicionalmente presenta un P-value de 2.5e-08 < 0.05, indicando que es estadisticamente significativo mientras que si es divorciado No lo es.
estadoC = PlotXTabs2(data = df_rotacion,x = Estado_Civil, y = Rotación)
estadoC
Ecivil <- table1::table1(~ Estado_Civil | Rotación, data = df_rotacion)
print(Ecivil)
## <table class="Rtable1">
## <thead>
## <tr>
## <th class='rowlabel firstrow lastrow'></th>
## <th class='firstrow lastrow'><span class='stratlabel'>0<br><span class='stratn'>(N=1233)</span></span></th>
## <th class='firstrow lastrow'><span class='stratlabel'>1<br><span class='stratn'>(N=237)</span></span></th>
## <th class='firstrow lastrow'><span class='stratlabel'>Overall<br><span class='stratn'>(N=1470)</span></span></th>
## </tr>
## </thead>
## <tbody>
## <tr>
## <td class='rowlabel firstrow'>Estado_Civil</td>
## <td class='firstrow'></td>
## <td class='firstrow'></td>
## <td class='firstrow'></td>
## </tr>
## <tr>
## <td class='rowlabel'>Casado</td>
## <td>589 (47.8%)</td>
## <td>84 (35.4%)</td>
## <td>673 (45.8%)</td>
## </tr>
## <tr>
## <td class='rowlabel'>Divorciado</td>
## <td>294 (23.8%)</td>
## <td>33 (13.9%)</td>
## <td>327 (22.2%)</td>
## </tr>
## <tr>
## <td class='rowlabel lastrow'>Soltero</td>
## <td class='lastrow'>350 (28.4%)</td>
## <td class='lastrow'>120 (50.6%)</td>
## <td class='lastrow'>470 (32.0%)</td>
## </tr>
## </tbody>
## </table>
mod_estadoC = glm(Rotación ~ Estado_Civil, data= df_rotacion, family="binomial")
summary(mod_estadoC)
##
## Call:
## glm(formula = Rotación ~ Estado_Civil, family = "binomial",
## data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.9476 0.1166 -16.699 < 2e-16 ***
## Estado_CivilDivorciado -0.2395 0.2175 -1.101 0.271
## Estado_CivilSoltero 0.8772 0.1575 5.571 2.54e-08 ***
## ---
## 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: 1254.6 on 1467 degrees of freedom
## AIC: 1260.6
##
## Number of Fisher Scoring iterations: 4
Evaluando la información se encuentra que hay una mayor rotación de personas en el grupo que viaja frecuentemente por negocios con un 25% frente al 15% del grupo que viaja raramente y un 8% de los que no viajan. Adicionalmente, se logra visualizar que del total de personas en la categoría de rotacion = 1, la mayor proporción de personas se encuentra en los trabajadores que viajan raramente con un 65.8%, mientras que los que lo hacen frecuentemente tienen de esta categoría de rotación = 1, un porcentaje de 29.1%, este valor no es bajo pero es contra intuitivo ya que se pensaría que esta iba a ser quien tuviera el mayor porcentaje, mientras que si se puede confirmar que los que no viajan representan solo el 5.1%. Estos mensajes soporta la hipótesis previamente planteada.
Para el caso de la regresión binominal viajar raramente o no viajar presentan coeficientes negativos indicando una reducción de la posibilidad de que suceda una rotación.
PlotXTabs2(data = df_rotacion,x = `Viaje de Negocios`,y = Rotación)
viajeN <- table1::table1(~ `Viaje de Negocios` | Rotación, data = df_rotacion)
print(viajeN)
## <table class="Rtable1">
## <thead>
## <tr>
## <th class='rowlabel firstrow lastrow'></th>
## <th class='firstrow lastrow'><span class='stratlabel'>0<br><span class='stratn'>(N=1233)</span></span></th>
## <th class='firstrow lastrow'><span class='stratlabel'>1<br><span class='stratn'>(N=237)</span></span></th>
## <th class='firstrow lastrow'><span class='stratlabel'>Overall<br><span class='stratn'>(N=1470)</span></span></th>
## </tr>
## </thead>
## <tbody>
## <tr>
## <td class='rowlabel firstrow'>Viaje de Negocios</td>
## <td class='firstrow'></td>
## <td class='firstrow'></td>
## <td class='firstrow'></td>
## </tr>
## <tr>
## <td class='rowlabel'>Frecuentemente</td>
## <td>208 (16.9%)</td>
## <td>69 (29.1%)</td>
## <td>277 (18.8%)</td>
## </tr>
## <tr>
## <td class='rowlabel'>No_Viaja</td>
## <td>138 (11.2%)</td>
## <td>12 (5.1%)</td>
## <td>150 (10.2%)</td>
## </tr>
## <tr>
## <td class='rowlabel lastrow'>Raramente</td>
## <td class='lastrow'>887 (71.9%)</td>
## <td class='lastrow'>156 (65.8%)</td>
## <td class='lastrow'>1043 (71.0%)</td>
## </tr>
## </tbody>
## </table>
mod_viajeN = glm(Rotación ~ `Viaje de Negocios`, data= df_rotacion, family="binomial")
summary(mod_viajeN)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios`, family = "binomial",
## data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.1034 0.1389 -7.943 1.98e-15 ***
## `Viaje de Negocios`No_Viaja -1.3389 0.3315 -4.039 5.36e-05 ***
## `Viaje de Negocios`Raramente -0.6346 0.1638 -3.873 0.000107 ***
## ---
## 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: 1274.8 on 1467 degrees of freedom
## AIC: 1280.8
##
## Number of Fisher Scoring iterations: 5
Evaluando el gráfico se encuentra una tendencia a que a menor edad hay un mayor porcentaje de rotacion de cargos y conforme la edad es mayor este porcentaje se reduce hasta llegar a edades cercanas a los 54 año o más donde aumenta ligeramente la rotación de cargos. También se observa que Las personas con o sin rotación de cargo, pueden encontrarse en todo el rango de edades de los empleados sin embargo si se logra apreciar que las personas que rotan tienen a tener un promedio de edad menor, 33.6 años, comparado con la edad promedio de las personas que no rotan, 37.6 años. Fortaleciendo la hipótesis previamente planteada en numerales anteriores.
En el modelo lineal se observa que el coeficiente de la edad es negativo con -0.05 indicando que es inverso a la decisión de realizar rotacion.
df_rotacion$Edad_agrup=cut(df_rotacion$Edad,breaks = c(18,24,30,36,42,48,54,60))
PlotXTabs2(data = df_rotacion,x = Edad_agrup,y = Rotación)
cualit <- table1::table1(~ Edad | Rotación, data = df_rotacion)
## Warning in table1.formula(~Edad | Rotación, data = df_rotacion): Terms to the
## right of '|' in formula 'x' define table columns and are expected to be factors
## with meaningful labels.
cualit
| 0 (N=1233) |
1 (N=237) |
Overall (N=1470) |
|
|---|---|---|---|
| Edad | |||
| Mean (SD) | 37.6 (8.89) | 33.6 (9.69) | 36.9 (9.14) |
| Median [Min, Max] | 36.0 [18.0, 60.0] | 32.0 [18.0, 58.0] | 36.0 [18.0, 60.0] |
mod_edad = glm(Rotación ~ Edad, data= df_rotacion, family="binomial")
summary(mod_edad)
##
## Call:
## glm(formula = Rotación ~ Edad, family = "binomial", data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.20637 0.30597 0.674 0.5
## Edad -0.05225 0.00870 -6.006 1.9e-09 ***
## ---
## 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: 1259.1 on 1468 degrees of freedom
## AIC: 1263.1
##
## Number of Fisher Scoring iterations: 4
Evaluando el gráfico se observa que personas con calificaciones de satisfacción laboral más bajas, de 1, tienden a tener un mayor porcentaje de rotacion que las personas con calificación más alta en este caso de 4, y que las personas con calificaciones intermedias de 2 o 3 tienen un porcentaje similar entre ellos, lo cual podría enunciar que este es un grupo intermedio de rotacion. Adicionalmente, las personas con o sin rotacion pueden tener calificaciones de 1 a 4, sin embargo las personas que rotan tienden a tener una calificación promedio ligeramente menor frente a los que no lo hacen, 2.47 vs 2.78 respectivamente. En el modelo de regresión el coeficiente para la satisfacción laboral presenta un valor negativo de -0.25 indicando que conforme aumenta la satisfacción laboral se reduce la posibilidad de rotacion.
PlotXTabs2(data = df_rotacion,x = Satisfación_Laboral,y = Rotación)
cualit <- table1::table1(~ Satisfación_Laboral | Rotación, data = df_rotacion)
## Warning in table1.formula(~Satisfación_Laboral | Rotación, data = df_rotacion):
## Terms to the right of '|' in formula 'x' define table columns and are expected
## to be factors with meaningful labels.
cualit
| 0 (N=1233) |
1 (N=237) |
Overall (N=1470) |
|
|---|---|---|---|
| Satisfación_Laboral | |||
| Mean (SD) | 2.78 (1.09) | 2.47 (1.12) | 2.73 (1.10) |
| Median [Min, Max] | 3.00 [1.00, 4.00] | 3.00 [1.00, 4.00] | 3.00 [1.00, 4.00] |
mod_satisL = glm(Rotación ~ Satisfación_Laboral, data= df_rotacion, family="binomial")
summary(mod_satisL)
##
## Call:
## glm(formula = Rotación ~ Satisfación_Laboral, family = "binomial",
## data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.9903 0.1757 -5.635 1.75e-08 ***
## Satisfación_Laboral -0.2510 0.0637 -3.940 8.16e-05 ***
## ---
## 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: 1283.1 on 1468 degrees of freedom
## AIC: 1287.1
##
## Number of Fisher Scoring iterations: 4
En el modelo de regresión el coeficiente para el ingreso mensual es negativo con un valor de -1.27e-04, indicando que conforme aumenta el salario existe una menor posibilidad de rotacion del empleado.
df_rotacion$Ingr_agrup=cut(df_rotacion$Ingreso_Mensual,breaks = c(1000,4000,7000,10000,13000,15000,18000,21000))
PlotXTabs2(data = df_rotacion,x = Ingr_agrup,y = Rotación)
cualit <- table1::table1(~ Ingreso_Mensual | Rotación, data = df_rotacion)
## Warning in table1.formula(~Ingreso_Mensual | Rotación, data = df_rotacion):
## Terms to the right of '|' in formula 'x' define table columns and are expected
## to be factors with meaningful labels.
cualit
| 0 (N=1233) |
1 (N=237) |
Overall (N=1470) |
|
|---|---|---|---|
| Ingreso_Mensual | |||
| Mean (SD) | 6830 (4820) | 4790 (3640) | 6500 (4710) |
| Median [Min, Max] | 5200 [1050, 20000] | 3200 [1010, 19900] | 4920 [1010, 20000] |
mod_ingresos = glm(Rotación ~ Ingreso_Mensual, data= df_rotacion, family="binomial")
summary(mod_ingresos)
##
## Call:
## glm(formula = Rotación ~ Ingreso_Mensual, family = "binomial",
## data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -9.291e-01 1.292e-01 -7.191 6.43e-13 ***
## Ingreso_Mensual -1.271e-04 2.162e-05 -5.879 4.12e-09 ***
## ---
## 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: 1253.1 on 1468 degrees of freedom
## AIC: 1257.1
##
## Number of Fisher Scoring iterations: 5
Realiza la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotacion (y=1 es si rotación, y=0 es no rotación) y las covariables las 6 seleccionadas en el punto 1. Interprete los coeficientes del modelo y la significancia de los parámetros.
modelo1 <-
glm(Rotación ~ Horas_Extra + Estado_Civil + `Viaje de Negocios` + Edad + Satisfación_Laboral + Ingreso_Mensual, family = binomial(link = "logit"), data = df_rotacion)
summary(modelo1)
##
## Call:
## glm(formula = Rotación ~ Horas_Extra + Estado_Civil + `Viaje de Negocios` +
## Edad + Satisfación_Laboral + Ingreso_Mensual, family = binomial(link = "logit"),
## data = df_rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 6.171e-01 4.250e-01 1.452 0.146536
## Horas_ExtraSi 1.508e+00 1.597e-01 9.443 < 2e-16 ***
## Estado_CivilDivorciado -3.182e-01 2.307e-01 -1.379 0.167840
## Estado_CivilSoltero 8.414e-01 1.718e-01 4.896 9.76e-07 ***
## `Viaje de Negocios`No_Viaja -1.304e+00 3.542e-01 -3.683 0.000230 ***
## `Viaje de Negocios`Raramente -6.663e-01 1.815e-01 -3.671 0.000241 ***
## Edad -3.120e-02 1.022e-02 -3.053 0.002267 **
## Satisfación_Laboral -3.317e-01 6.970e-02 -4.759 1.94e-06 ***
## Ingreso_Mensual -9.856e-05 2.507e-05 -3.931 8.44e-05 ***
## ---
## 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: 1075.0 on 1461 degrees of freedom
## AIC: 1093
##
## Number of Fisher Scoring iterations: 5
ratio_Odds=exp(modelo1$coefficients)
ratio_Odds
## (Intercept) Horas_ExtraSi
## 1.8534648 4.5165259
## Estado_CivilDivorciado Estado_CivilSoltero
## 0.7274502 2.3196229
## `Viaje de Negocios`No_Viaja `Viaje de Negocios`Raramente
## 0.2713281 0.5136093
## Edad Satisfación_Laboral
## 0.9692803 0.7176972
## Ingreso_Mensual
## 0.9999014
Se realiza la estimación del modelo y los ratios de Odds, evaluando esta información se observa que:
Viaje de NegociosNo_Viaja y
Viaje de NegociosRaramente, poseen coeficientes de -1.3 y
-6.66, con razón de Odds de 0.27 y 0.51, indicando relaciones negativas
y reducciones de probabilidad multiplicadas por factores de 0.27 y 0.51,
indicando que los empleados que no viajan o lo hacen raramente por
negocios disminuyen su posibilidad de rotacion.Se puede apreciar que las variables significativas son:Horas_Extra, Estado civil específicamente si es soltero, Viajes de Negocio, Satisfacción laboral, ingresos mensuales y edad.
Las variables que no son significativas fue Estado_CivilDivorciado, lo cual podría evaluarse si debe ser eliminada del modelo y si esto traería una mejora en predicción.
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.
##Horas_Extra + Estado_Civil + `Viaje de Negocios` + Edad + Satisfación_Laboral + Ingreso_Mensual
library(pROC)
prediccion1= predict(modelo1,list( Horas_Extra=df_rotacion$Horas_Extra, Estado_Civil=df_rotacion$Estado_Civil, `Viaje de Negocios` = df_rotacion$`Viaje de Negocios`, Edad = df_rotacion$Edad, Satisfación_Laboral = df_rotacion$Satisfación_Laboral, Ingreso_Mensual = df_rotacion$Ingreso_Mensual ),type = "response")
ROC_rotacion= roc(rotacion$Rotación~prediccion1, percent = F, ci=T)
ROC_rotacion
##
## Call:
## roc.formula(formula = rotacion$Rotación ~ prediccion1, percent = F, ci = T)
##
## Data: prediccion1 in 1233 controls (rotacion$Rotación No) < 237 cases (rotacion$Rotación Si).
## Area under the curve: 0.7808
## 95% CI: 0.7459-0.8157 (DeLong)
plot(ROC_rotacion,print.auc=T,print.thres = "best",col="red"
,xlab = "Specificity", ylab = "Sensitivity")
El Área bajo la Curva (AUC), muestra un rendimiento adecuado al
presentar un valor de 0.781 > 0.5 y al presentar una curva cercana al
punto (0,1) indicando que logra predecir si los empleados tienen
probabilidad de rotacion o no, adicionalmente el intervalo de confianza
del 95% indica que existe una alta probabilidad de que el AUC este entre
74.6 y 81.6%.
Realiza una predicción la probabilidad de que un individuo (hipotético) rote y defina un corte para decidir si se debe intervenir a este empleado o no (posible estrategia para motivar al empleado).
El caso hipotético planteado es el siguiente: un empleado que no trabaja horas extra, se encuentra soltero, raramente viaja por negocios,tiene una edad de 32 años, su satisfacción laboral es 4 y sus ingresos mensuales son de 12500. Teniendo en cuenta esta información se realiza la predicción:
(predict(modelo1,list(Horas_Extra="Si",Estado_Civil="Soltero",`Viaje de Negocios`="Raramente",Edad=32,Satisfación_Laboral=3, Ingreso_Mensual=12500),type="response"))
## 1
## 0.2838103
Teniendo una corte de 20%, y con esta información se obtiene una probabilidad de 28% de rotación para este empleado, lo cual es relativamente alto para una corte, recomendando por ende la intervención y definición de una estrategia de motivación la cual consistirá en:
(predict(modelo1,list(Horas_Extra="No",Estado_Civil="Soltero",`Viaje de Negocios`="No_Viaja",Edad=32,Satisfación_Laboral=3, Ingreso_Mensual=12500),type="response"))
## 1
## 0.04429758
Con esta estrategia se espera una reducción en la probabilidad a un 4% y por ende una retención del empleado en el cargo actual y compañía.
En las conclusiones adicione una discusión sobre cuál sería la estrategia para disminuir la rotación en la empresa (con base en las variables que resultaron significativas en el punto 3).
Teniendo en cuenta cada una de las 6 variables evaluadas para la construcción del modelo y la revisión univariada, bivariada y su impacto en el modelo de regresión se plantea lo siguiente: