Actividad 3 Modelos lineales generalizados
1. Objetivo
Aplicar el modelo de regresión logistica para analizar y determinar estrategias que ayuden a disminuir la rotación del personal apostando por un equipo comprometido y satisfecho en sus roles actuales
2. Problema: Rotación de cargo
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.
3. Entendimiento base de datos
La dimensión de la base de datos inicial es de 1470 registros y 24 variables relacionadas con la rotación de personal como se muestra a continuación.
[1] 1470 24
Rows: 1,470
Columns: 24
$ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
$ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
$ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente"…
$ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
$ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
$ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
$ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
$ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
$ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
$ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
$ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
$ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", …
$ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
$ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
$ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
$ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
$ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
$ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
$ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
$ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
$ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
$ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
$ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
$ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
Ahora los valores unicos que toma cada variable son los siguientes:
unique_values <- lapply(rotacion[ , !names(rotacion) %in% "Ingreso_Mensual"], unique)
print(unique_values)$Rotación
[1] "Si" "No"
$Edad
[1] 41 49 37 33 27 32 59 30 38 36 35 29 31 34 28 22 53 24 21 42 44 46 39 43 50
[26] 26 48 55 45 56 23 51 40 54 58 20 25 19 57 52 47 18 60
$`Viaje de Negocios`
[1] "Raramente" "Frecuentemente" "No_Viaja"
$Departamento
[1] "Ventas" "IyD" "RH"
$Distancia_Casa
[1] 1 8 2 3 24 23 27 16 15 26 19 21 5 11 9 7 6 10 4 25 12 18 29 22 14
[26] 20 28 17 13
$Educación
[1] 2 1 4 3 5
$Campo_Educación
[1] "Ciencias" "Otra" "Salud" "Mercadeo" "Tecnicos"
[6] "Humanidades"
$Satisfacción_Ambiental
[1] 2 3 4 1
$Genero
[1] "F" "M"
$Cargo
[1] "Ejecutivo_Ventas" "Investigador_Cientifico"
[3] "Tecnico_Laboratorio" "Director_Manofactura"
[5] "Representante_Salud" "Gerente"
[7] "Representante_Ventas" "Director_Investigación"
[9] "Recursos_Humanos"
$Satisfación_Laboral
[1] 4 2 3 1
$Estado_Civil
[1] "Soltero" "Casado" "Divorciado"
$Trabajos_Anteriores
[1] 8 1 6 9 0 4 5 2 7 3
$Horas_Extra
[1] "Si" "No"
$Porcentaje_aumento_salarial
[1] 11 23 15 12 13 20 22 21 17 14 16 18 19 24 25
$Rendimiento_Laboral
[1] 3 4
$Años_Experiencia
[1] 8 10 7 6 12 1 17 5 3 31 13 0 26 24 22 9 19 2 23 14 15 4 29 28 21
[26] 25 20 11 16 37 38 30 40 18 36 34 32 33 35 27
$Capacitaciones
[1] 0 3 2 5 1 4 6
$Equilibrio_Trabajo_Vida
[1] 1 3 2 4
$Antigüedad
[1] 6 10 0 8 2 7 1 9 5 4 25 3 12 14 22 15 27 21 17 11 13 37 16 20 40
[26] 24 33 19 36 18 29 31 32 34 26 30 23
$Antigüedad_Cargo
[1] 4 7 0 2 5 9 8 3 6 13 1 15 14 16 11 10 12 18 17
$Años_ultima_promoción
[1] 0 1 3 2 7 4 8 6 5 15 9 13 12 10 11 14
$Años_acargo_con_mismo_jefe
[1] 5 7 0 2 6 8 3 11 17 1 4 12 9 10 15 13 16 14
No se incluye el ingreso mensual ya que al ser una variable cuantitativa toma muchisimos valores
- Validación base de datos
Para evaluar el conjunto de datos iniciaremos validando si se cuenta con faltantes en alguna de las variables.
Rotación Edad
0 0
Viaje de Negocios Departamento
0 0
Distancia_Casa Educación
0 0
Campo_Educación Satisfacción_Ambiental
0 0
Genero Cargo
0 0
Satisfación_Laboral Estado_Civil
0 0
Ingreso_Mensual Trabajos_Anteriores
0 0
Horas_Extra Porcentaje_aumento_salarial
0 0
Rendimiento_Laboral Años_Experiencia
0 0
Capacitaciones Equilibrio_Trabajo_Vida
0 0
Antigüedad Antigüedad_Cargo
0 0
Años_ultima_promoción Años_acargo_con_mismo_jefe
0 0
Como se puede observar la base de datos no tiene faltantes en ninguna variable.
Por otro lado se valida si se tienen registros duplicados.
#Identificar duplicados:
duplicados <- duplicated(rotacion) #identificar registros duplicados
table(duplicados) #Conocer la cantidad de registros duplicadosduplicados
FALSE
1470
Como todos son FALSE se concluye que no se tienen registros duplicados.
4. Desarrollo puntos análisis
Punto 1 - Selección de 3 variables catégoricas y cuantitativas
Antes del analisis detallado de las variables, se seleccionaran 3 variables cualitativas y 3 cuantitativas que a manera de hipotesis vemos relacionadas con la rotación de personal.
Variables Cuantitativas:
Edad: La relación entre la edad y la rotación laboral suele variar. En personas más jóvenes, se esperaria que busquen nuevas oportunidades para desarrollar su carrera, lo que se traduce en una mayor tasa de rotación. Por otro lado, las personas de mediana y mayor edad suelen buscar mayor estabilidad laboral y podrían estar menos inclinadas a cambiar de empleo.
Ingreso Mensual: Un ingreso mensual bajo puede generar insatisfacción y motivar al empleado a buscar mejores oportunidades laborales, lo que influye directamente en la rotación. Por el contrario, aquellos que perciben un salario competitivo tienden a sentirse más estables económicamente, lo que reduce la probabilidad de que decidan cambiar de trabajo.
Años Experiencia: A medida que una persona acumula más años de experiencia, es probable que perciba mayores ingresos y que valore la estabilidad en su carrera. Esto puede disminuir la predisposición a buscar nuevas oportunidades laborales, ya que el riesgo de cambiar de empleo puede ser visto como mayor en comparación con los beneficios.
Variables Categóricas:
Horas Extras: Esta variable tiene una incidencia notable sobre la rotación laboral, ya que aquellas personas que realizan horas extras de manera frecuente podrían ser más propensas a buscar nuevas oportunidades o a experimentar agotamiento, lo que incrementaría la probabilidad de rotación en su puesto de trabajo.
Viaje de Negocios: Realizar viajes de negocios está relacionado con la rotación, y su efecto puede depender de otras variables, como la edad o el estado civil. Las personas que viajan con mayor frecuencia podrían experimentar mayor desgaste o insatisfacción, lo que incrementaría su predisposición a cambiar de empleo.
Satisfacción Laboral: Un nivel bajo de satisfacción laboral es un factor clave que puede aumentar la propensión a la rotación. Las personas con una calificación baja en este aspecto tienden a buscar nuevas oportunidades laborales.
Punto 2 - Análisis univariado de variables seleccionadas
Variables Cuantitativas:
- Edad
Edad
Min. :18.00
1st Qu.:30.00
Median :36.00
Mean :36.92
3rd Qu.:43.00
Max. :60.00
par(mfrow = c(1, 2))
boxplot(rotacion$Edad,
main = "Distribución de la variable edad",
ylab="Edad", las=1,
col= c("#FFFFFF","#63B8FF"))
grid()
hist(rotacion$Edad,, main = "Distribución de la variable edad",
xlab="Edad (Años)", col ="#B4EEB4")
grid()La mediana de la edad es de 36 años, con un promedio de aproximadamente 37 años. La distribución de esta variable muestra una ligera asimetría hacia la derecha, lo que sugiere que hay una mayor cantidad de personas de edad avanzada en el conjunto de datos. El rango de edad oscila entre los 18 y los 60 años, sin datos atípicos presentes. La mayor concentración de personas se encuentra en el rango de 30 a 35 años.
- Ingreso Mensual
Ingreso_Mensual
Min. : 1009
1st Qu.: 2911
Median : 4919
Mean : 6503
3rd Qu.: 8379
Max. :19999
par(mfrow = c(1, 2))
boxplot(rotacion$Ingreso_Mensual,
main = "Distribución Ingreso_Mensual",
ylab="Ingreso_Mensual", las=1,
col= c("#FFFFFF","#63B8FF"))
grid()
hist(rotacion$Ingreso_Mensual, main = "Distribución Ingreso_Mensual",
xlab="Ingreso_Mensual ($)", col ="#B4EEB4")
grid()La mediana de los ingresos mensuales es de aproximadamente COP 5,000, mientras que el promedio es de COP 6,503. La distribución es altamente sesgada hacia la derecha, lo que indica que la mayoría de los empleados tienen ingresos concentrados en los valores más bajos, especialmente entre COP 1,000 y 5,000. Los bigotes del gráfico se extienden hasta valores cercanos a los COP 15,000, lo que sugiere que la mayoría de los datos están dentro de este rango. Sin embargo, se observan algunos puntos fuera de este límite, considerados atípicos, que representan personas con ingresos significativamente superiores al promedio. El rango total de ingresos va desde COP 1,009 hasta 19,999.
- Años Experiencia
Años_Experiencia
Min. : 0.00
1st Qu.: 6.00
Median :10.00
Mean :11.28
3rd Qu.:15.00
Max. :40.00
par(mfrow = c(1, 2))
boxplot(rotacion$Años_Experiencia,
main = "Distribución Años_Experiencia",
ylab="Años_Experiencia", las=1,
col= c("#FFFFFF","#63B8FF"))
grid()
hist(rotacion$Años_Experiencia, main = "Distribución Años_Experiencia",
xlab="Años_Experiencia", col ="#B4EEB4")
grid()La mediana de los años de experiencia es de aproximadamente 10 años, con un promedio de 11.28 años. La distribución de esta variable también presenta una asimetría pronunciada hacia la derecha, lo que indica que la mayoría de los empleados tienen pocos años de experiencia entre 0 a 10 años. Los bigotes del gráfico se extienden hasta valores más altos, pero hay puntos atípicos que representan a empleados con una amplia experiencia. El rango de experiencia abarca desde 0 hasta 40 años.
Variables Categóricas:
- Horas Extra
par(mfrow = c(1, 2), mar = c(4, 4, 2, 1))
# Crear una tabla de frecuencias
conteo <- table(rotacion$Horas_Extra)
# Calcular los porcentajes
porcentajes <- round(conteo / sum(conteo) * 100, 1)
# Crear etiquetas con porcentajes
etiquetas <- paste(names(conteo), porcentajes, "%", sep = ": ")
# Gráfico de Pie con etiquetas de porcentajes
pie(conteo, labels = etiquetas,
main = "Distribución de Horas Extra",
col = c("#FF9999", "#63B8FF"), # Ajustar los colores
border = "white", # Eliminar los bordes del gráfico de pie
cex = 1.2) # Ajustar el tamaño de las etiquetas
# Gráfico de Barras con recuento (sin cambios)
barras <- barplot(conteo,
main = "Horas extra",
xlab = "Horas Extra",
ylab = "Frecuencia",
col = c("#FF9999", "#63B8FF"), # Ajustar colores
border = "black", # Borde de las barras
las = 1, # Rotación de las etiquetas
ylim = c(0, 1200)) # Ajustar el rango del eje y
# Agregar las etiquetas con los valores correspondientes encima de las barras
text(barras, conteo + 50, labels = conteo, cex = 1.2, pos = 3)
# Ajustar la leyenda si es necesario
legend("topright", legend = c("No", "Sí"),
fill = c("#FF9999", "#63B8FF"),
bty = "n", cex = 1.1)Esta variable está compuesta por dos categorias, las cuales son Si o No trabaja horas extras. La distribución de los datos indica que el 71,7% de los empleados no realiza horas extras, lo que equivale a 1054 empleados, lo que representa una proporción significativa de la fuerza laboral. El porcentaje restante 28.3% sí las realiza, que corresponde a 416 empleados.
- Viaje de Negocios
# Configuración para mostrar dos gráficos
par(mfrow = c(1, 2), mar = c(4, 4, 2, 1))
# Crear una tabla de frecuencias
conteo <- table(rotacion$`Viaje de Negocios`)
# Calcular los porcentajes
porcentajes <- round(conteo / sum(conteo) * 100, 1)
# Crear etiquetas con porcentajes
etiquetas <- paste(names(conteo), porcentajes, "%", sep = ": ")
# Ajustar las etiquetas largas para evitar problemas visuales
etiquetas[etiquetas == "Raramente"] <- "Raramente: "
etiquetas[etiquetas == "Frecuentemente"] <- "Frecuentemente: "
etiquetas[etiquetas == "No_Viaja"] <- "No Viaja: "
# Gráfico de Pie con etiquetas de porcentajes ajustadas
pie(conteo, labels = etiquetas,
main = "Distribución Viaje de Negocios",
col = c("#FF9999", "#63B8FF", "#ADD8E6"), # Ajustar los colores
border = "white", # Eliminar los bordes del gráfico de pie
cex = 0.9, # Reducir el tamaño de las etiquetas
radius = 0.8) # Reducir el tamaño del gráfico para dar más espacio
# Gráfico de Barras con recuento
barras <- barplot(conteo,
main = "Viaje de Negocios",
xlab = "Viaje de Negocios",
ylab = "Frecuencia",
col = c("#FF9999", "#63B8FF", "#ADD8E6"), # Ajustar colores
border = "black", # Borde de las barras
las = 1, # Colocar etiquetas del eje X en vertical
ylim = c(0, 1200)) # Ajustar el rango del eje y
# Agregar las etiquetas con los valores correspondientes encima de las barras
text(barras, conteo + 50, labels = conteo, cex = 1.2, pos = 3)
# Ajustar la leyenda para reflejar correctamente las categorías y evitar superposición
legend("topleft", legend = names(conteo),
fill = c("#FF9999", "#63B8FF", "#ADD8E6"),
bty = "n", cex = 1.1, inset = c(0.05, 0.05))
# Eliminar las líneas de la cuadrícula para mejorar el aspecto visual
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")Esta variable está compuesta por tres categorias, las cuales son Raramente, No viaja y frecuentemente. Los gráficos indican que la mayoría de los empleados viajan rara vez por trabajo (71%, correspondiente al 1.043 empleados), con una minoría significativa que viaja con frecuencia (18,8%, correspondiente a 277 empleados) y un pequeño porcentaje que no viaja en absoluto (10,2% correspondiente al 150 empleados).
- Satisfacción Laboral
# Configuración para mostrar dos gráficos
par(mfrow = c(1, 2), mar = c(4, 4, 2, 1))
# Crear una tabla de frecuencias
conteo <- table(rotacion$Satisfación_Laboral)
# Calcular los porcentajes
porcentajes <- round(conteo / sum(conteo) * 100, 1)
# Crear etiquetas con porcentajes
etiquetas <- paste(names(conteo), porcentajes, "%", sep = ": ")
# Gráfico de Pie con etiquetas de porcentajes ajustadas
pie(conteo, labels = etiquetas,
main = "Distribución Satisfacción laboral",
col = c("#FF9999", "#63B8FF", "#ADD8E6", "#66CDAA"), # Ajustar los colores
border = "white", # Eliminar los bordes del gráfico de pie
cex = 0.9, # Reducir el tamaño de las etiquetas
radius = 0.8) # Reducir el tamaño del gráfico para dar más espacio
# Gráfico de Barras con recuento
barras <- barplot(conteo,
main = "Satisfacción laboral",
xlab = "Satisfacción laboral",
ylab = "Frecuencia",
col = c("#FF9999", "#63B8FF", "#ADD8E6", "#66CDAA"), # Colores
border = "black", # Borde de las barras
las = 1, # Colocar etiquetas del eje X en vertical
ylim = c(0, 1200)) # Ajustar el rango del eje y
# Agregar las etiquetas con los valores correspondientes encima de las barras
text(barras, conteo + 50, labels = conteo, cex = 1.2, pos = 3)
# Ajustar la leyenda para reflejar correctamente las categorías y evitar superposición
legend("topleft", legend = names(conteo),
fill = c("#FF9999", "#63B8FF", "#ADD8E6", "#66CDAA"),
bty = "n", cex = 1.1, inset = c(0.05, 0.05))
# Eliminar las líneas de la cuadrícula para mejorar el aspecto visual
grid(nx = NA, ny = NULL, col = "gray", lty = "dotted")La mayor parte de los empleados (aproximadamente el 61%) reporta niveles de satisfacción laboral moderada o alta (niveles 3 y 4), lo cual es un indicador positivo para la empresa. Sin embargo, es relevante prestar atención a los empleados con baja satisfacción laboral (niveles 1 y 2), ya que representan más de un tercio del total de empleados. Dado que la satisfacción laboral se ha identificado como una variable categórica importante en el análisis de rotación, es probable que estos empleados sean más propensos a cambiar de puesto.
Este análisis sugiere que la empresa podría enfocarse en mejorar la satisfacción de los empleados que se encuentran en los niveles más bajos para mitigar su rotación potencial.
Punto 3 - Análisis bivariado de variables seleccionadas vs variable rotación
Variables cuantitativas
- Edad
Welch Two Sample t-test
data: rotacion$Edad by rotacion$Rotación
t = 5.8291, df = 316.94, p-value = 1.371e-08
alternative hypothesis: true difference in means between group No and group Si is not equal to 0
95 percent confidence interval:
2.619728 5.289170
sample estimates:
mean in group No mean in group Si
37.56204 33.60759
A partir de los resultados obtenidos se logra identificar que la edad promedio de los empleados que no rotan es mayor en alto nivel versus la de los empleados que rotan. En promedio, los empleados que no cambian de trabajo tienen una edad de 37.56 años, mientras que los que rotan tienen una edad promedio de 33.61 años.
El p-valor es notablemente bajo (1.371e-08) indicando que esta diferencia es estadísticamente significativa. Con lo atenrior, se puede afirmar que la edad es una variable relevante en la rotación de empleados.
#Grafico de barras cruzado
ggplot(rotacion, aes(Rotación, Edad, fill = Rotación)) +
geom_boxplot(width = 0.5, outlier.color = "red", outlier.shape = 16) +
scale_fill_brewer(palette = "Dark2") + # Cambiar la paleta de colores
labs(title = "Distribución de Edad por Rotación", # Añadir título
x = "Categoría de Rotación", # Etiqueta del eje X
y = "Edad", # Etiqueta del eje Y
fill = "Rotación") + # Título de la leyenda
theme_minimal() + # Tema limpio
theme(legend.position = "top", # Posicionar la leyenda
plot.title = element_text(hjust = 0.5, face = "bold", size = 14)) # Centrar y estilizar el títuloMedianas: El grupo que no rota tiene una mediana de 36 años, mientras que el grupo que sí rota es más joven, con una mediana de 32 años. Esto refuerza la hipótesis de que las personas más jóvenes tienden a rotar con mayor frecuencia.
Dispersión: El grupo que no rota presenta una mayor variabilidad en las edades, lo que indica que hay más diversidad en términos de edad, mientras que el grupo que rota tiene una distribución más concentrada.
Datos Atípicos: En el grupo que rota se observan dos valores atípicos, correspondientes a personas mayores de 55 años, lo que sugiere que, aunque menos común, algunos empleados de mayor edad también experimentan rotación.
- Ingreso Mensual
Welch Two Sample t-test
data: rotacion$Ingreso_Mensual by rotacion$Rotación
t = 7.4826, df = 412.74, p-value = 4.434e-13
alternative hypothesis: true difference in means between group No and group Si is not equal to 0
95 percent confidence interval:
1508.244 2583.050
sample estimates:
mean in group No mean in group Si
6832.740 4787.093
Los resultados permiten inferir que los empleados que no rotan tienen un ingreso mensual significativamente mayor que aquellos que rotan. En promedio, los empleados que no rotan ganan COP 6,832.74, mientras que los que rotan ganan COP 4,787.09. Esto podría deberse a que los empleados que reciben salarios más altos tienen menos incentivos para cambiar de trabajo, mientras que los empleados con salarios más bajos pueden estar buscando mejores oportunidades.
El p-valor es extremadamente bajo (4.434e-13) indicando que esta diferencia es estadísticamente significativa, por lo tanto, se podria afirmar que el Ingreso Mensual es una variable clave en la rotación laboral.
#Grafico de barras cruzado
ggplot(rotacion, aes(Rotación, Ingreso_Mensual, fill = Rotación)) +
geom_boxplot(width = 0.5, outlier.color = "red", outlier.shape = 16) +
scale_fill_brewer(palette = "Dark2") + # Cambiar la paleta de colores
labs(title = "Distribución del ingreso mensual por Rotación", # Añadir título
x = "Categoría de Rotación", # Etiqueta del eje X
y = "Ingreso Mensual", # Etiqueta del eje Y
fill = "Rotación") + # Título de la leyenda
theme_minimal() + # Tema limpio
theme(legend.position = "top", # Posicionar la leyenda
plot.title = element_text(hjust = 0.5, face = "bold", size = 14)) # Centrar y estilizar el títuloMedianas: Los ingresos medianos del grupo que no rota son mayores (COP 5,200) en comparación con el grupo que sí rota (COP 3,000), lo que sugiere que la rotación es más común cuando los ingresos son bajos.
Dispersión: El grupo que no rota presenta una mayor dispersión en los ingresos, mientras que el grupo que sí rota es más homogéneo.
Datos Atípicos: En el grupo que rota, se identifican alrededor de 10 puntos atípicos, con ingresos entre COP 10,000 y 15,000, y algunos mayores a COP 18,000. En el grupo que no rota, hay varios datos atípicos por encima de COP 17,000.
- Años Experiencia
Welch Two Sample t-test
data: rotacion$Años_Experiencia by rotacion$Rotación
t = 7.0192, df = 350.88, p-value = 1.16e-11
alternative hypothesis: true difference in means between group No and group Si is not equal to 0
95 percent confidence interval:
2.604401 4.632019
sample estimates:
mean in group No mean in group Si
11.862936 8.244726
Los empleados que no rotan tienen, en promedio, más años de experiencia (11.86 años) que los empleados que rotan (8.24 años). Estos resultados permite inferir que los empleados con menos años de experiencia tienen una mayor probabilidad de rotar, mientras que aquellos con más experiencia tienden a permanecer en sus puestos de trabajo. Esto podría deberse a que los empleados con más experiencia han alcanzado una mayor estabilidad en su carrera y prefieren permanecer en sus roles actuales.
El p-valor es extremadamente bajo (1.16e-11), lo que indica que esta diferencia es estadísticamente significativa, por lo que la diferencia en los años de experiencia entre los empleados que rotan y los que no rotan es relevante para el análisis realizado de la rotación laboral.
#Grafico de barras cruzado
ggplot(rotacion, aes(Rotación, Años_Experiencia, fill = Rotación)) +
geom_boxplot(width = 0.5, outlier.color = "red", outlier.shape = 16) +
scale_fill_brewer(palette = "Dark2") + # Cambiar la paleta de colores
labs(title = "Distribución del ingreso mensual por Rotación", # Añadir título
x = "Categoría de Rotación", # Etiqueta del eje X
y = "Años Experiencia", # Etiqueta del eje Y
fill = "Rotación") + # Título de la leyenda
theme_minimal() + # Tema limpio
theme(legend.position = "top", # Posicionar la leyenda
plot.title = element_text(hjust = 0.5, face = "bold", size = 14)) # Centrar y estilizar el títuloMedianas: El grupo que no rota tiene una mediana de 10 años de experiencia, mientras que el grupo que sí rota tiene una mediana de 8 años, lo que sugiere que menos experiencia está relacionada con mayor rotación.
Dispersión: El grupo que no rota muestra una dispersión ligeramente mayor en los años de experiencia en comparación con el grupo que sí rota.
Datos Atípicos: En el grupo que rota, hay puntos atípicos por encima de los 20 años de experiencia. En el grupo que no rota, se observan varios puntos atípicos con más de 30 años de experiencia.
Variables categoricas
Se realizan la prueba de Chi-cuadrado cómo método estadístico que permita evaluar la asociación entre variables categóricas de este análisis de rotación laboral.
- Horas Extras
Se crea tabla de contingencia y se aplica la prueba Chi cuadrado.
# Crear tabla de contingencia entre rotación y Horas_Extras
t_contHE <- table(rotacion$Rotación, rotacion$Horas_Extra)
# Mostrar la tabla de contingencia
print(t_contHE)
No Si
No 944 289
Si 110 127
Pearson's Chi-squared test with Yates' continuity correction
data: t_contHE
X-squared = 87.564, df = 1, p-value < 2.2e-16
El valor obtenido de de X-squared = 87.564, al ser elevado, permite asumir una fuerte asociación entre las dos variables. Adicionalmente el p-value < 2.2e-16 al ser extremadamente bajo (mucho menor que 0.05), confirma esta afirmación de asociación estadísticamente significativa entre las variables.
El gráfico muestra que en el grupo que rota, aquellos que realizan horas extras lo hacen con mayor frecuencia, lo que confirma la hipótesis de que las horas extras están relacionadas con una mayor rotación.
- Viaje de Negocios
# Crear tabla de contingencia entre rotación y Horas_Extras
t_contVN <- table(rotacion$Rotación, rotacion$'Viaje de Negocios')
# Mostrar la tabla de contingencia
print(t_contVN)
Frecuentemente No_Viaja Raramente
No 208 138 887
Si 69 12 156
Pearson's Chi-squared test
data: t_contVN
X-squared = 24.182, df = 2, p-value = 5.609e-06
El valor obtenido de de X-squared = 24.182 indica una diferncia notable en la distribución de las variables. Adicionalmente el p-value < 5.609e-06 al ser extremadamente bajo (mucho menor que 0.05), permite inferir la asociación estadísticamente significativa entre las variables.
La hipótesis se confirma, ya que las categorías “frecuentemente” y “raramente” viajar son las que presentan un mayor porcentaje de rotación laboral.
- Satisfaccion Laboral
# Crear tabla de contingencia entre rotación y Satisfacción laboral
t_contSL <- table(rotacion$Rotación, rotacion$'Satisfación_Laboral')
# Mostrar la tabla de contingencia
print(t_contSL)
1 2 3 4
No 223 234 369 407
Si 66 46 73 52
Pearson's Chi-squared test
data: t_contSL
X-squared = 17.505, df = 3, p-value = 0.0005563
El valor obtenido de de X-squared = 17.505 indica una diferncia significativa en la distribución de las variables. Adicionalmente el p-value < 0.0005563 al ser extremadamente bajo (mucho menor que 0.05), permite inferir la asociación estadísticamente significativa entre las variables.
Se evidencia que a menor calificación en la satisfacción laboral, mayor es la rotación, lo que corrobora la hipótesis planteada sobre la influencia de la satisfacción en la permanencia.
Punto 4 - Estimar el modelo logístico con la muestra del 70%
#Transformar la variable respuesta
rotacion$Rotación <- as.numeric(rotacion$Rotación == "Si", 1, 0)
# Semilla para reproducir
set.seed(50)
library(caret)
datos_divididos <- createDataPartition(rotacion$Rotación, p = 0.7, list = FALSE)
train_data <- rotacion[datos_divididos, ]
test_data <- rotacion[-datos_divididos, ]
mod = glm(Rotación ~ Horas_Extra + `Viaje de Negocios` + Satisfación_Laboral
+ Edad + Ingreso_Mensual + Años_Experiencia, data = train_data,
family = "binomial")
summary(mod)
Call:
glm(formula = Rotación ~ Horas_Extra + `Viaje de Negocios` +
Satisfación_Laboral + Edad + Ingreso_Mensual + Años_Experiencia,
family = "binomial", data = train_data)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.0799141 0.4866312 2.219 0.026476 *
Horas_ExtraSi 1.3454056 0.1864106 7.217 5.30e-13 ***
`Viaje de Negocios`No_Viaja -1.4382608 0.4056478 -3.546 0.000392 ***
`Viaje de Negocios`Raramente -0.8850550 0.2074463 -4.266 1.99e-05 ***
Satisfación_Laboral -0.3226973 0.0810433 -3.982 6.84e-05 ***
Edad -0.0280425 0.0137056 -2.046 0.040751 *
Ingreso_Mensual -0.0000765 0.0000357 -2.143 0.032147 *
Años_Experiencia -0.0206565 0.0230241 -0.897 0.369629
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 919.16 on 1028 degrees of freedom
Residual deviance: 798.44 on 1021 degrees of freedom
AIC: 814.44
Number of Fisher Scoring iterations: 5
Interpretación de los coeficientes
Intercepto (Intercept): El estimado del intercepto es de 1.07, esta es la oportunidad de rotación cuando todas las demas variables estan en cero. Este valor no es estadisticamente significativo.
Horas extrasSi: El estimado es de 1.3454, se puede interpetar que, los empleados que hacen horas extras tienen una mayor probabilidad de rotación que aquellos que no las hacen.
Viaje de NegociosNo_Viaja::El estimado es negativo -1.4383. Se podria interpretar que los empleados que no viajan tienen una menor probabilidad de rotación comparado con aquellos que sí viajan. El coeficiente negativo indica que, si no viajan, la probabilidad de rotación disminuye.Viaje de NegociosRaramente: El estimado también es negativo -0.8851. Se interpreta que los empleados que viajan raramente también tienen una menor probabilidad de rotación que aquellos que viajan frecuentemente.Satisfación_Laboral: Su estimado es -0.3227, se podria afirmar que un aumento en la satisfacción laboral está asociado con una disminución en la probabilidad de rotación. Esto teiene relación con la hipótesis esperada: es decir que empleados más satisfechos son menos propensos a rotar.
Edad Con el estimado de -0.0280, se podria afirmar que la edad tiene un efecto negativo en la probabilidad de rotación. Esto significa que a medida que aumenta la edad, la probabilidad de rotación disminuye ligeramente.
Ingreso_Mensual: El estimado es -0.0000765, por lo que un mayor ingreso mensual está asociado con una menor probabilidad de rotación. Aunque este coeficiente es pequeño puede ser debido a que está en dólares, tiene un efecto negativo en la rotación.
Años_Experiencia: El coeficiente es -0.0207, si embargo en este caso se puede afirmar que el coeficiente no es significativo ya que el p valor está cercano a 1 (p = 0.3696), lo que indica que los años de experiencia no tienen un efecto claro sobre la probabilidad de rotación en este modelo.
Punto 5 - Predecir el modelo con los datos de prueba del 30% con base en la curva ROC y el AUC
Para evaluar el modelo usaremos la curva ROC y la AUC
La curva ROC (Receiver Operating Characteristic) evalúa el rendimiento de un modelo de clasificación, mostrando la relación entre la tasa de verdaderos positivos (sensibilidad) y la tasa de falsos positivos (1 - especificidad) en diferentes umbrales de decisión. Un modelo ideal se acerca a la esquina superior izquierda de la gráfica.
El área bajo la curva (AUC) mide el desempeño general del modelo: un AUC de 1 indica un modelo perfecto, mientras que un AUC de 0.5 sugiere un modelo que no tiene capacidad de clasificación mejor que el azar.
# Cargar el paquete
library(pROC)
# Obtener las probabilidades predichas por el modelo
prob <- predict(mod, newdata = test_data, type = "response")
# Calcular la curva ROC
roc_datos <- roc(test_data$Rotación, prob)
# Graficar la curva ROC
plot(roc_datos, main = "Curva ROC", col = "cyan4", lwd = 2,
xlab = "Tasa de Falsos Positivos (FPR)",
ylab = "Tasa de Verdaderos Positivos (TPR)",
cex.main = 1.5, cex.lab = 1.3, cex.axis = 1.2)
# Añadir la línea diagonal de referencia (representa un clasificador aleatorio)
lines(x = c(0, 1), y = c(0, 1), col = "red", lty = 2, lwd = 2)
# Agregar texto en la parte superior indicando el AUC
auc_value <- auc(roc_datos)
text(0.5, 0.1, paste("AUC =", round(auc_value, 2)), col = "blue", cex = 1.5)[1] "AUC: 0.771999684592336"
Un AUC de 0.77 indica un que el modelo tiene una capacidad predictiva moderadamente buena y es capaz de discriminar entre empleados que rotan y los que no.
Por otra parte, teniendo en cuenta que la curva ROC haya sido generada con el set de prueba y se obtenga un AUC de 0.77 en este conjunto sugiere que el modelo generaliza bien y no está sobreajustado a los datos de entrenamiento.
Punto 6 - Estrategia para disminuir la rotación en la empresa
Para definir la estrategia primero, se debe retomar el efecto de las variables que resultaron estadísticamente significativas en el modelo y que afectan directamente la rotación:
Horas_Extra (efecto positivo): Los empleados que trabajan horas extras son más propensos a rotar.
Viaje de Negocios (efecto negativo): Los empleados que no viajan o viajan raramente tienen menos probabilidad de rotar.
Satisfacción Laboral (efecto negativo): Una mayor satisfacción laboral reduce la probabilidad de rotación.
Edad (efecto negativo): Empleados más jóvenes son más propensos a rotar.
Ingreso Mensual (efecto negativo): Empleados con ingresos más altos tienen menos probabilidades de rotar.
No se considera la variable “Años de experiencia”, ya que los resultados generados en el modelo de regeresión logística indicaban no ser estadísticamente significativos, por lo que no estaba claro su impacto en la probabilidad de rotación de empleados.
A partir de los anterior se pueden establecer algunas estrategias por variable y efecto:
Para la variable Horas Extras:
Mejorar la gestión de las horas extras, implementado políticas para limitar la cantidad de horas extras trabajadas por empleado, garantizando que no se excedan los límites razonables.
En caso de que las horas extras son inevitables para algunos roles particulares, implementar programas de incentivos representados en compensaciones monetarias adicionales o tiempo libre adicional para equilibrar el esfuerzo adicional.
Establecer un sistema de monitoreo y retroalimentación continua para monitorear el bienestar de los empleados que trabajan horas extras, asegurándose de que no estén sobrecargados.
Para la variable Viaje de negocios:
Se podria considerar ofrecer mayor flexibilidad en los viajes, teniendo en cuenta a los empleados que si desean viajar o si prefieren otras formas de trabajo. En este caso se podrian considerar la variable de edad dando la oportunidad a los jovenes talentos que pueden tener más interés en tener con frecuencia viajes de negocios.
De ser posible, mejorar las condiciones de viaje, asegurando que los empleados que viajan con frecuencia tengan beneficios como un mejor alojamiento, dietas adecuadas, compensación por tiempo de viaje, y mayor autonomía en la planificación de sus viajes.
Para la variable Satisfacción Laboral:
- Ejecutar planes de desarrollo y crecimiento con el fin de ofrecer oportunidades claras de desarrollo profesional, capacitación y planes de carrera personalizados que permitan a los empleados ver un futuro de crecimiento dentro de la empresa.
Esto tiene directa relación con los empleados jovénes, los cuales son más propensos a considerar nuevas oportunidades laborales si no identifican oportunidades claras de promoción, programas de mentoría o de entrenamiento (tipo Trainee) y capacitación continua.
- Introducir programas que se enfoquen en el bienestar emocional, físico y mental de los empleados, como actividades de team-building, sesiones de mindfulness o apoyo psicológico en el lugar de trabajo.
Para la variable Edad:
- Contar con mayores condiciones de flexibilidad en el trabajo, a menudo empleados jóvenes valoran la flexibilidad laboral. Esto está ligado a las políticas de trabajo remoto, horarios flexibles y un equilibrio entre vida laboral y personal puede reducir su deseo de buscar otras oportunidades.
Para la variable Ingreso Mensual:
Desde las áreas de Compensación y Talento Humano se podria realizar iniciativas que busquen la revisión de los rangos salariales conforme al cargo con el fin de que sean competitivos con respecto al mercado y que estén alineados con las responsabilidades y el desempeño de los empleados.
Se podria implementar incentivos adicionales, como bonos por desempeño, que estén directamente relacionados con el trabajo realizado y motiven a los empleados a quedarse en la empresa.
Para reducir la rotación en la empresa, las estrategias deben centrarse en abordar los factores que más influyen en la decisión de los empleados de quedarse o irse. Según lo identificado las horas extras y la satisfacción laboral son variables clave que deben ser monitoreadas y gestionadas con bastante detalle.
Además, garantizar que los empleados, especialmente los jóvenes y los que tienen ingresos más bajos a nivel salarial, sientan que tienen oportunidades de crecimiento y estabilidad dentro de la empresa será crucial para mantenerlos comprometidos.