En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes. La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.
Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo. La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
colnames(rotacion)
## [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"
En muchas organizaciones dependiendo del tipo de organizacion suele
haber mayor preferencia por personal femenino o masculino y tambien
dependiendo del tipo de trabajo hay generos que pueden tener mas ventaja
físicas para poder desarrollarlos, eso podría influir en la pemanencia o
no de la persona en la empresa.
Dependiendo del cargo y el área puede haber mayor estres lo que podría generar salidas prematuras del personal.
Las obligaciones familiares y personales podrían influir en la decisión de un empleado de quedarse o dejar una empresa.
Se espera que aquellos que viven más lejos de su lugar de trabajo tengan una mayor probabilidad de rotar para buscar empleo más cerca de casa.
Los ingresos influyen mucho en la estabilidad laboral de una persona, a mayor salario menor es la posibilidad de un empleado quiera dejar su trabajo.
Los empleados con menos edad al no tener responsabilidades suelen cambiar mas facilmente de trabajo dado que no tienen mayores complicaciones para hacerlo.
Genero: Las cualidades físicas de cada genero podrían influir en la rotacion del personal dependiendo de la exigencia del cargo.
Cargo: Cada uno de los cargos en una determianda organización maneja cierto tipo de estres por tanto el nivel de estres provocado por un determinado cargo podría influir en la rotación
Estado Civil: Se podría hipotetizar que aquellos que están casados o tienen dependientes podrían buscar una mayor estabilidad por tanto podrían tener una tasa de rotación más baja.
Distancia_Casa: Aquellas personas que viven más lejos de su lugar de trabajo tengan una mayor probabilidad de rotar para buscar empleo más cerca de casa.
Ingresos_Mensuales: Los empleados que tienen un buen ingreso salarial tienen menores intensiones de cambiar su trabajo.
Edad: Los empleados con menos edad tienen mayores posibilidades de cambiar de trabajo dado que por su edad tienden a buscar empresas que se ajusten a lo que quieren.
rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual", "Edad", "Cargo")]
rotacion_seleccionada<-as.data.frame(rotacion_seleccionada)
Validamos la cantidad de datos faltantes.
NAs<-colSums(is.na(rotacion_seleccionada))
as.data.frame(NAs)
## NAs
## Rotación 0
## Genero 0
## Estado_Civil 0
## Distancia_Casa 0
## Ingreso_Mensual 0
## Edad 0
## Cargo 0
No se tienen datos faltantes.
kable(head(rotacion_seleccionada))
| Rotación | Genero | Estado_Civil | Distancia_Casa | Ingreso_Mensual | Edad | Cargo |
|---|---|---|---|---|---|---|
| Si | F | Soltero | 1 | 5993 | 41 | Ejecutivo_Ventas |
| No | M | Casado | 8 | 5130 | 49 | Investigador_Cientifico |
| Si | M | Soltero | 2 | 2090 | 37 | Tecnico_Laboratorio |
| No | F | Casado | 3 | 2909 | 33 | Investigador_Cientifico |
| No | M | Casado | 2 | 3468 | 27 | Tecnico_Laboratorio |
| No | M | Soltero | 2 | 3068 | 32 | Tecnico_Laboratorio |
Sin novedades en nuestros datos
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
Visulizamos la cantidad de registros
kable(table(rotacion$Genero))
| Var1 | Freq |
|---|---|
| F | 588 |
| M | 882 |
p1 <- ggplot(rotacion, aes(x = Genero)) +
geom_bar(fill = "skyblue", color = "black", aes(y = ..count..)) +
geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
labs(title = "Gráfico de barras para Genero", x = "Genero", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p1)
En nuestra data tenemos que el 60% de los registros pertenecen a hombres y el 40% a mujeres.
Visulizamos la cantidad de registros
kable(table(rotacion$Cargo))
| Var1 | Freq |
|---|---|
| Director_Investigación | 80 |
| Director_Manofactura | 145 |
| Ejecutivo_Ventas | 326 |
| Gerente | 102 |
| Investigador_Cientifico | 292 |
| Recursos_Humanos | 52 |
| Representante_Salud | 131 |
| Representante_Ventas | 83 |
| Tecnico_Laboratorio | 259 |
p2 <- ggplot(rotacion, aes(x = Cargo)) +
geom_bar(fill = "skyblue", color = "black") +
geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
labs(title = "Gráfico de barras para Carg", x = "Cargo", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p2)
El cargo de ejecutivo de ventas es el cargo que predomina con un
22,18%, seguido de Investigador cientifico con 19,86% y Tecnico
LAboratorio con 17,62%, el cargo menos frecuente es el de Recursos
Humanos con un 3,54%
Visulizamos la cantidad de registros
kable(table(rotacion$Estado_Civil))
| Var1 | Freq |
|---|---|
| Casado | 673 |
| Divorciado | 327 |
| Soltero | 470 |
p3 <- ggplot(rotacion, aes(x = Estado_Civil)) +
geom_bar(fill = "skyblue", color = "black") +
geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
labs(title = "Gráfico de barras para Estado_Civil", x = "Estado_Civil", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p3)
La mayoria de las personas de nuestra data son casadas, en total un
45,8% son casadas, el 32% son soteras y el 22,2% son divorciadas
Obtenemos la información básica de la variable
kable(rotacion %>%
summarise(
Media = mean(Edad),
Mediana = median(Edad),
Desv_Estandar = sd(Edad),
Minimo = min(Edad),
Maximo = max(Edad)
))
| Media | Mediana | Desv_Estandar | Minimo | Maximo |
|---|---|---|---|---|
| 36.92449 | 36 | 9.135938 | 18 | 60 |
Graficamos el histograma de la variable.
median_val_hist <- median(rotacion$Edad)
mean_val_hist <- mean(rotacion$Edad)
p_edad <- ggplot(rotacion, aes(x = Edad)) +
geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) +
geom_density(alpha = 0.2, fill = "#006400") +
geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) +
geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
labs(title = "Histograma para Edad", x = "Edad", y = "Densidad") +
annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") +
annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "blue") +
theme_minimal()
print(p_edad)
Según el histograma podemos evidenciar graficamente que la mayoria
de las personas se ubican entre los 30 y 40 años, y segun las
estadistica el rango de edad va desde los 18 hasta los 60 años.
p_box_edad <- ggplot(rotacion, aes(y = Edad)) +
geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) +
geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
annotate("text", x = -0.5, y = median_val, label = paste(" Mediana:", round(median_val, 2))) +
annotate("text", x = -0.5, y = q1_val, label = paste(" Q1:", round(q1_val, 2))) +
annotate("text", x = -0.5, y = q3_val, label = paste(" Q3:", round(q3_val, 2))) +
annotate("text", x = -0.5, y = mean_val + 2, label = paste(" Media:", round(mean_val, 2)), col = "red") +
labs(
title = "Boxplot para Edad",
y = "Edad",
x = NULL
) +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
print(p_box_edad)
El 50% de nuestros datos se concentran entro los 30 y 43 años de
edad.
Obtenemos la información básica de la variable
kable(rotacion %>%
summarise(
Media = mean(Ingreso_Mensual),
Mediana = median(Ingreso_Mensual),
Desv_Estandar = sd(Ingreso_Mensual),
Minimo = min(Ingreso_Mensual),
Maximo = max(Ingreso_Mensual)
))
| Media | Mediana | Desv_Estandar | Minimo | Maximo |
|---|---|---|---|---|
| 6502.931 | 4919 | 4707.957 | 1009 | 19999 |
Graficamos el histograma de la variable.
median_val_hist <- median(rotacion$Ingreso_Mensual)
mean_val_hist <- mean(rotacion$Ingreso_Mensual)
p_ingreso <- ggplot(rotacion, aes(x = Ingreso_Mensual)) +
geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) +
geom_density(alpha = 0.2, fill = "#006400") +
geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) +
geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
labs(title = "Histograma para Ingreso_Mensual", x = "Ingreso_Mensual", y = "Densidad") +
annotate("text", x = mean_val_hist + 500, y = 0.00002, label = "Media", color = "red") +
annotate("text", x = median_val_hist - 500, y = 0.00002, label = "Mediana", color = "blue") +
theme_minimal()
print(p_ingreso)
Según el histograma podemos evidenciar graficamente que la mtiad de
las personas tiene un ingreso inferior a 5000.
p_box_ingreso <- ggplot(rotacion, aes(y = Ingreso_Mensual)) +
geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) +
geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
annotate("text", x = -0.5, y = median_val, label = paste(" Mediana:", round(median_val, 2))) +
annotate("text", x = -0.5, y = q1_val, label = paste(" Q1:", round(q1_val, 2))) +
annotate("text", x = -0.5, y = q3_val, label = paste(" Q3:", round(q3_val, 2))) +
annotate("text", x = -0.5, y = mean_val + 500, label = paste(" Media:", round(mean_val, 2)), col = "red") +
labs(
title = "Boxplot para Ingreso_Mensual",
y = "Ingresos Mensuales",
x = NULL
) +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
print(p_box_ingreso)
El 50% de las personas ganan entre 2911 y 8379, solo un 25% tiene
ingresos a los 8379, y la que mas ingresos tienen percibe un salario de
19999
Obtenemos la información básica de la variable
kable(rotacion %>%
summarise(
Media = mean(Distancia_Casa),
Mediana = median(Distancia_Casa),
Desv_Estandar = sd(Distancia_Casa),
Minimo = min(Distancia_Casa),
Maximo = max(Distancia_Casa)
))
| Media | Mediana | Desv_Estandar | Minimo | Maximo |
|---|---|---|---|---|
| 9.192517 | 7 | 8.106864 | 1 | 29 |
Graficamos el histograma de la variable.
median_val_hist <- median(rotacion$Distancia_Casa)
mean_val_hist <- mean(rotacion$Distancia_Casa)
p_distancia <- ggplot(rotacion, aes(x = Distancia_Casa)) +
geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) +
geom_density(alpha = 0.2, fill = "#006400") +
geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) +
geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
labs(title = "Histograma para Distancia_Casa", x = "Distancia_Casa", y = "Densidad") +
annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") +
annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "blue") +
theme_minimal()
print(p_distancia)
El 50% de las personas vive a una distancia inferior de los 7
kilometros.
p_box_distancia_casa <- ggplot(rotacion, aes(y = Distancia_Casa)) +
geom_boxplot(fill = "#FFB6C1", color = "black", width = 0.5, outlier.shape = NA) +
geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "#006400") +
annotate("text", x = -0.5, y = median_val, label = paste(" Mediana:", round(median_val, 2))) +
annotate("text", x = -0.5, y = q1_val, label = paste(" Q1:", round(q1_val, 2))) +
annotate("text", x = -0.5, y = q3_val, label = paste(" Q3:", round(q3_val, 2))) +
annotate("text", x = -0.5, y = mean_val + 2, label = paste(" Media:", round(mean_val, 2)), col = "red") +
labs(
title = "Boxplot para Distancia_Casa",
y = "Distancia Casa",
x = NULL
) +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
print(p_box_distancia_casa)
El 50% de las personas viven entres los 2 y los 14 kilometros, la
persona que vive mas lejos está a 29 kilometros
Realiza un análisis 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 hipotesis planteada en el punto 2.
Codificamos la variables asignando los 1 y 0.
rotacion_seleccionada$y<-ifelse(rotacion_seleccionada$Rotación=="Si",1,0)
Ahora procedemos a realizar el modelo para cada una de las
variables seleccionadas.
modelo_genero <- glm(y ~ Genero, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_genero)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.75 0.12 -15.07 0.00
## GeneroM 0.17 0.15 1.13 0.26
De los resultados obtenidos podemos concluir que la variable
genero no es un predictor fuerte dado que sus valores son cercanos a 0
modelo_cargo <- glm(y ~ Cargo, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_cargo)$coefficients, 2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.66 0.72 -5.12 0.00
## CargoDirector_Manofactura 1.06 0.79 1.35 0.18
## CargoEjecutivo_Ventas 2.11 0.73 2.89 0.00
## CargoGerente 0.70 0.85 0.82 0.41
## CargoInvestigador_Cientifico 2.01 0.73 2.74 0.01
## CargoRecursos_Humanos 2.46 0.79 3.12 0.00
## CargoRepresentante_Salud 1.06 0.80 1.33 0.18
## CargoRepresentante_Ventas 3.25 0.75 4.33 0.00
## CargoTecnico_Laboratorio 2.51 0.73 3.43 0.00
La variable cargo si influye significativamente en la rotación y
cargos como (como Ejecutivo de Ventas, Investigador Científico, Recursos
Humanos, Representante de Ventas y Técnico de Laboratorio) tienen unos
valores significativos
modelo_estado_civil <- glm(y ~ Estado_Civil, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_estado_civil)$coefficients, 2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.95 0.12 -16.70 0.00
## Estado_CivilDivorciado -0.24 0.22 -1.10 0.27
## Estado_CivilSoltero 0.88 0.16 5.57 0.00
El estado civil según los resultados obtenidos si influyen en la
rotación del personal y la variable que mas influye es estar Soltero la
cual esta 0,88 por encima de la variable de referencia que en este caso
es Casado.
modelo_distancia <- glm(y ~ Distancia_Casa, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_distancia)$coefficients, 2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.89 0.11 -16.97 0
## Distancia_Casa 0.02 0.01 2.97 0
Por cada unidad adicional de distancia (ya sea un kilómetro o
una milla) desde la casa al lugar de trabajo, la estimación aumenta en
0.02. Este resultado es estadísticamente significativo, lo que significa
que entre mas lejos se ubique la casa del empleado mayo es la
posibilidad de cambiar de trabajo.
modelo_ingreso_mensual <- glm(y ~ Ingreso_Mensual, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_ingreso_mensual)$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
La estimación base es de -0.93 y por cada unidad adicional de
ingreso se impacta un -0.0001, es decir se impacta negativamente, por
tanto a mayores ingresos la probabilidad de cambair de trabajo
disminuye.
modelo_Edad <- glm(y ~ Edad, data = rotacion_seleccionada, family = binomial)
round(summary(modelo_Edad)$coefficients, 2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.21 0.31 0.67 0.5
## Edad -0.05 0.01 -6.01 0.0
A medida que la edad aumenta el impacto en la variable base
disminuye un -0.05 por tanto a medida que la edad del empleado aumenta,
la posibilidad de cambiar de trabajo disminuye
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.
Definimos nuestro modelo
modelo_logistico <- glm(y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + Ingreso_Mensual + Edad , data = rotacion_seleccionada, family = binomial)
Visualizamos los resultados de la variable.
summary(modelo_logistico)
##
## Call:
## glm(formula = y ~ Genero + Estado_Civil + Cargo + Distancia_Casa +
## Ingreso_Mensual + Edad, family = binomial, data = rotacion_seleccionada)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.4989 -0.6285 -0.4600 -0.2700 2.7489
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.430e+00 1.014e+00 -3.384 0.000715 ***
## GeneroM 1.440e-01 1.559e-01 0.924 0.355659
## Estado_CivilDivorciado -2.060e-01 2.235e-01 -0.922 0.356660
## Estado_CivilSoltero 8.166e-01 1.654e-01 4.938 7.91e-07 ***
## CargoDirector_Manofactura 1.013e+00 8.682e-01 1.166 0.243502
## CargoEjecutivo_Ventas 2.006e+00 8.254e-01 2.430 0.015078 *
## CargoGerente 7.663e-01 8.561e-01 0.895 0.370729
## CargoInvestigador_Cientifico 1.874e+00 9.092e-01 2.061 0.039328 *
## CargoRecursos_Humanos 2.547e+00 9.336e-01 2.728 0.006368 **
## CargoRepresentante_Salud 1.039e+00 8.750e-01 1.187 0.235256
## CargoRepresentante_Ventas 3.027e+00 9.370e-01 3.230 0.001237 **
## CargoTecnico_Laboratorio 2.398e+00 9.066e-01 2.645 0.008178 **
## Distancia_Casa 2.908e-02 8.888e-03 3.272 0.001068 **
## Ingreso_Mensual 1.858e-05 4.378e-05 0.424 0.671352
## Edad -2.530e-02 9.850e-03 -2.569 0.010199 *
## ---
## 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: 1155.9 on 1455 degrees of freedom
## AIC: 1185.9
##
## Number of Fisher Scoring iterations: 6
Deviance Residuals:
Los valores dan idea de
cómo se ajusta el modelo a los datos, en este caso el modelo se ajusta
perfectamente, se espera que la mayoría de las deviance residuals fueran
cercanas a cero. El rango va de -1.4989 a 2.7489, con la mediana en
-0.4600.
(Intercept) -3.430:
Este es el log-odds
predicho cuando todas las variables predictoras son 0 o están en su
categoría de referencia la rotación de empleados es -3.430.
Estado_CivilDivorciado -0.206:
En
comparación con la categoría de referencia que es casado, estar
divorciado disminuye el log-odds de la respuesta en 0.206, manteniendo
todas las demás variables constantes, pero esta diferencia no es
estadísticamente significativa.
Estado_CivilSoltero 0.8166:
Estar soltero,
en comparación con estar casado, aumenta el log-odds de la respuesta en
0.8166, este efecto es estadísticamente significativo, lo que sugiere
que los empleados solteros tienen una mayor probabilidad de rotación en
comparación con los empleados casados.
Variables relacionadas con el Cargo:
Diferentes cargos tienen diferentes efectos sobre la respuesta. Algunos
como CargoEjecutivo_Ventas, CargoInvestigador_Cientifico,
CargoRecursos_Humanos, CargoRepresentante_Ventas, y
CargoTecnico_Laboratorio tienen coeficientes positivos y significativos,
lo que quiere decir que empleados en estos cargos tienen mayores
log-odds de rotación.
Distancia_Casa 0.02908:
Por cada unidad
adicional en la distancia desde la casa al trabajo, el log-odds de la
rotación de empleados aumenta en 0.02908, el coeficiente es
estadísticamente significativo, podemos decir que la distancia entre la
casa y el trabajo juega un papel importante en la decisión de un
empleado de abandonar la empresa.
Ingreso_Mensual 0.00001858:
Aunque el
coeficiente es cercano a cero y no es significativo, por cada unidad
adicional en el ingreso mensual, hay un ligero aumento en el log-odds de
la rotación de empleados pero no es significativo.
Edad -0.0253:
Por cada año adicional en la
edad del empleado, el log-odds de la rotación de empleados disminuye en
0.0253. Esto es significativo y sugiere que a medida que los empleados
envejecen, tienen menos probabilidades de abandonar la empresa.
En el modelo las variables como Estado_Civil= Soltero, varios cargos,
Distancia_Casa y Edad tienen coeficientes significativos, lo que sugiere
que son factores importantes a considerar al analizar la rotación de
empleados.
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.
Predicciones probabilísticas:
Obtemos las
predicciones probabilísticas del modelo modelo_logistico para la
variable de rotación.
pred_probabilidades <- predict(modelo_logistico, type = "response")
Calcular la Curva ROC:
Se usa la función roc del paquete pROC
para calcular la curva ROC.
library(pROC)
curva_roc <- roc(rotacion_seleccionada$y, pred_probabilidades)
Graficar la Curva ROC:
plot(curva_roc, main="Curva ROC", col="blue", lwd=2)
abline(h=0, v=1, col="gray")
auc(curva_roc)
## Area under the curve: 0.7332
AUC = 0.5: El modelo no tiene capacidad de discriminación para distinguir entre la clase positiva y la clase negativa. Es decir, el modelo no es mejor que una elección aleatoria.
0.5 < AUC < 1: El modelo tiene capacidad de discriminación. Cuanto más cerca esté el valor de AUC de 1, mejor será el modelo.
AUC = 1: El modelo tiene una capacidad de discriminación perfecta. Es capaz de distinguir perfectamente entre la clase positiva y la clase negativa sin errores..
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).
Para realizar una predicción sobre un individuo hipotético, se necesita definir los valores de las variables que tiene ese modelo.
Se debe Definir los valores de las covariables para el individuo hipotético,vamos a suponer que nuestro empleado hipotético tiene las siguientes características:
empleado_hipotetico <- data.frame(
`Genero` = "M", # Es de genero Masculino
`Cargo` = "Ejecutivo_Ventas", # Trabaja como ejecutivo de ventas
`Estado_Civil` = "Soltero", # Es un hombre soltero
`Ingreso_Mensual` = 7500, # tiene ingresos de 7500
`Distancia_Casa` = 5, # Vive a 5 kilometros del lugar de trabajo
`Edad` = 26 # Tiene 26 años
)
Una vez definidas las variables procedemos a ejecutar nuestro
modelo.
prediccion <- predict(modelo_logistico, newdata = empleado_hipotetico, type = "response")
print(prediccion)
## 1
## 0.3023459
El resultado indica que el individuo tiene una probabilidad de
30.2% de rotar, es decir las probabilidades son bajas.
empleado_hipotetico2 <- data.frame(
`Genero` = "F", # Es de genero Femenino
`Cargo` = "Tecnico_Laboratorio", # Trabaja como ténico de laboratorio
`Estado_Civil` = "Soltero", # Es una mujer soltera
`Ingreso_Mensual` = 2500, # tiene ingresos de 2500
`Distancia_Casa` = 35, # Vive a 35 kilometros del lugar de trabajo
`Edad` = 20 # Tiene 20 años
)
Ejecución del modelo.
prediccion <- predict(modelo_logistico, newdata = empleado_hipotetico2, type = "response")
print(prediccion)
## 1
## 0.5848386
En nuestro segundo ejemplo obtenemos que las posibilidades de
rotar son de 58.4% por tanto se podría considerar que son altas, alguna
de las estrategías que puede implementar la empresa sería incentivar a
los empleados a adquirir viviendas cerca al lugar de trabajo, para ello
se pueden establecer alianzas en conjunto con las cajas de compensación
para así brindar el apoyo necesario a los empleados de adquirir su
propia vivienda.
Desarrollemos el ejemplo 2 pero esta vez
suponiendo una vivienda mas cercana.
En este caso la distancia de la casa al trabajo se disminuye a 5 kilometros.
empleado_hipotetico3 <- data.frame(
`Genero` = "F", # Es de genero Femenino
`Cargo` = "Tecnico_Laboratorio", # Trabaja como ténico de laboratorio
`Estado_Civil` = "Soltero", # Es una mujer soltera
`Ingreso_Mensual` = 2500, # tiene ingresos de 2500
`Distancia_Casa` = 5, # Vive a 5 kilometros del lugar de trabajo
`Edad` = 20 # Tiene 20 años
)
prediccion <- predict(modelo_logistico, newdata = empleado_hipotetico3, type = "response")
print(prediccion)
## 1
## 0.3705732
Con el plan de vivienda para empleados cerca de la empresa la probabilidad de rotación baja desde 58,4% al 37.05%, es decir una reducción en la probabilidad de rotación del 36%.
___
Finalmente nn nuestra análisis, encontramos que varias de las
variables seleccionadas tienen un impacto considerable en la rotación de
empleados, por ejemplo, la variable “Cargo” que tiene un impacto
dignificativo en nuestro modelo es dificil de intervenir dado que las
empresas operan dentro de un organigrama establecido y las oportunidades
para ascensos o cambios de roles son limitadas.
La “Edad” es otra variable con un impacto significativo en la rotación, pero, al igual que con el “Cargo”, la empresa tiene un margen limitado de acción sobre esta variable, no obstante, se podría considerar adaptar sus políticas de contratación, favoreciendo a candidatos que se encuentren por encima del promedio de edad del actual personal, si el objetivo es reducir la rotación.
Por otro lado, las variables “Ingreso_Mensual” y “Distancia_Casa” son variables donde la empresa podría tener un impacto directo, ajustar los salarios o icentivar la compra de vivienda cerca al trabajo podría ser para los empleados r estrategias efectivas para disminuir la rotación, aunque implementar estas estrategias podría suponer una inversión inicial, es esencial que la empresa evalúe los beneficios a largo plazo. La rotación de empleados conlleva costos asociados, como la pérdida de conocimiento experto, la disminución en la productividad durante el período de adaptación de los nuevos empleados y el tiempo necesario para que alcancen su máxima eficiencia. Por lo tanto, cualquier estrategia que reduzca la rotación podría ser rentable para la organización.