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.
A continuación se describen los pasos que la gerencia ha propuesto para el análisis:
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
Se debe justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).
Variables categóricas
Viaje de Negocios: Los viajes frecuentes por trabajo pueden desgastar a los empleados y aumentar su probabilidad de buscar otro cargo donde haya menos desplazamientos.Se espera que a más viajes frecuentes por trabajo aumenten la rotación.
Horas_Extra: Trabajar horas extra aumenta el riesgo de rotación, ya que los empleados que trabajan más horas podrían sentirse más agotados o insatisfechos con el equilibrio entre la vida laboral y personal. Se espera que trabajar más horas extras incremente la probabilidad de rotación.
Cargo: Estar en un cargo más operativo genera más rotación que estar en un cargo directivo, porque siempre se va a buscar la opción de ascender.
Variables cuantitativas
Satisfación_Laboral: Una baja satisfacción laboral generalmente está relacionada con una mayor rotación. Se espera que empleados menos satisfechos sean más propensos a cambiar de cargo.
Ingreso_Mensual: Un menor salario podría estar asociado a una mayor rotación, ya que los empleados pueden buscar cargos mejor remunerados. Se espera que ingresos más bajos estén asociados a una mayor rotación.
Distancia_Casa: Se espera que una mayor distancia entre la casa y el trabajo pueda incrementar la rotación, ya que los empleados podrían buscar cargos más convenientes o cercanos.
#librerías
library(paqueteMODELOS)
library(dplyr)
library(psych)
library(pROC)
library(ggplot2)
library(egg)
# descargar la data
devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)
## Error in utils::download.file(url, path, method = method, quiet = quiet, :
## download from 'https://api.github.com/repos/centromagis/paqueteMODELOS/tarball/HEAD' failed
data("rotacion")
glimpse(rotacion)
## 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, …
# Ver un vistazo de los datos
head(rotacion)
## # A tibble: 6 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## # Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## # Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
## # Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
#copia de rotacion
rotacion_df <- rotacion
#Muestra que el dataframe rotación
dimension <- dim(rotacion_df)
dimension
## [1] 1470 24
# primeras líneas del dataset
head(rotacion_df)
## # A tibble: 6 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## # Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## # Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
## # Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
#Muestra que el dataframe rotación
str(rotacion_df)
## tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
## $ Rotación : chr [1:1470] "Si" "No" "Si" "No" ...
## $ Edad : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
## $ Viaje de Negocios : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
## $ Departamento : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
## $ Distancia_Casa : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
## $ Educación : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
## $ Campo_Educación : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
## $ Satisfacción_Ambiental : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
## $ Genero : chr [1:1470] "F" "M" "M" "F" ...
## $ Cargo : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
## $ Satisfación_Laboral : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
## $ Estado_Civil : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
## $ Ingreso_Mensual : num [1:1470] 5993 5130 2090 2909 3468 ...
## $ Trabajos_Anteriores : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
## $ Horas_Extra : chr [1:1470] "Si" "No" "Si" "Si" ...
## $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
## $ Rendimiento_Laboral : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
## $ Años_Experiencia : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
## $ Capacitaciones : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
## $ Equilibrio_Trabajo_Vida : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
## $ Antigüedad : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
## $ Antigüedad_Cargo : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
## $ Años_ultima_promoción : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
## $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...
#muestra un resumen estad´sitico básico
summary(rotacion_df)
## Rotación Edad Viaje de Negocios Departamento
## Length:1470 Min. :18.00 Length:1470 Length:1470
## Class :character 1st Qu.:30.00 Class :character Class :character
## Mode :character Median :36.00 Mode :character Mode :character
## Mean :36.92
## 3rd Qu.:43.00
## Max. :60.00
## Distancia_Casa Educación Campo_Educación Satisfacción_Ambiental
## Min. : 1.000 Min. :1.000 Length:1470 Min. :1.000
## 1st Qu.: 2.000 1st Qu.:2.000 Class :character 1st Qu.:2.000
## Median : 7.000 Median :3.000 Mode :character Median :3.000
## Mean : 9.193 Mean :2.913 Mean :2.722
## 3rd Qu.:14.000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :29.000 Max. :5.000 Max. :4.000
## Genero Cargo Satisfación_Laboral Estado_Civil
## Length:1470 Length:1470 Min. :1.000 Length:1470
## Class :character Class :character 1st Qu.:2.000 Class :character
## Mode :character Mode :character Median :3.000 Mode :character
## Mean :2.729
## 3rd Qu.:4.000
## Max. :4.000
## Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## Min. : 1009 Min. :0.000 Length:1470
## 1st Qu.: 2911 1st Qu.:1.000 Class :character
## Median : 4919 Median :2.000 Mode :character
## Mean : 6503 Mean :2.693
## 3rd Qu.: 8379 3rd Qu.:4.000
## Max. :19999 Max. :9.000
## Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## Min. :11.00 Min. :3.000 Min. : 0.00
## 1st Qu.:12.00 1st Qu.:3.000 1st Qu.: 6.00
## Median :14.00 Median :3.000 Median :10.00
## Mean :15.21 Mean :3.154 Mean :11.28
## 3rd Qu.:18.00 3rd Qu.:3.000 3rd Qu.:15.00
## Max. :25.00 Max. :4.000 Max. :40.00
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## Min. :0.000 Min. :1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.:2.000 1st Qu.:2.000 1st Qu.: 3.000 1st Qu.: 2.000
## Median :3.000 Median :3.000 Median : 5.000 Median : 3.000
## Mean :2.799 Mean :2.761 Mean : 7.008 Mean : 4.229
## 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.: 9.000 3rd Qu.: 7.000
## Max. :6.000 Max. :4.000 Max. :40.000 Max. :18.000
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## Min. : 0.000 Min. : 0.000
## 1st Qu.: 0.000 1st Qu.: 2.000
## Median : 1.000 Median : 3.000
## Mean : 2.188 Mean : 4.123
## 3rd Qu.: 3.000 3rd Qu.: 7.000
## Max. :15.000 Max. :17.000
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
# Variables categóricas
table(rotacion_df$`Viaje de Negocios`)
##
## Frecuentemente No_Viaja Raramente
## 277 150 1043
table(rotacion_df$`Horas_Extra`)
##
## No Si
## 1054 416
table(rotacion_df$`Cargo`)
##
## Director_Investigación Director_Manofactura Ejecutivo_Ventas
## 80 145 326
## Gerente Investigador_Cientifico Recursos_Humanos
## 102 292 52
## Representante_Salud Representante_Ventas Tecnico_Laboratorio
## 131 83 259
# Gráficos
#barplot(table(rotacion_df$`Viaje de Negocios`), main="Distribución de Viaje de Negocios")
#barplot(table(rotacion_df$`Horas_Extra`), main="Distribución de Horas Extra")
#barplot(table(rotacion_df$`Cargo`), main="Distribución de Cargo")
# Gráfico para Viaje de Negocios
barplot(table(rotacion_df$`Viaje de Negocios`),
main = "Distribución de Viajes de Negocios",
col = "steelblue", # Color de las barras
border = "black", # Borde de las barras
ylab = "Frecuencia", # Etiqueta del eje y
xlab = "Viaje de Negocios", # Etiqueta del eje x
las = 1, # Orientación horizontal de etiquetas
cex.names = 1.2, # Tamaño de las etiquetas de las categorías
cex.axis = 1.1, # Tamaño de las etiquetas de los ejes
cex.main = 1.5) # Tamaño del título
En esta gráfica y la tabla permite identificar que la mayoría de las personas raramente viaja lo que puede influir en que la rotación sea baja.
# Gráfico para Horas Extra
barplot(table(rotacion_df$`Horas_Extra`),
main = "Distribución de Horas Extra",
col = "tomato", # Color de las barras
border = "black", # Borde de las barras
ylab = "Frecuencia", # Etiqueta del eje y
xlab = "Horas Extra", # Etiqueta del eje x
las = 1, # Orientación horizontal de etiquetas
cex.names = 1.2, # Tamaño de las etiquetas de las categorías
cex.axis = 1.1, # Tamaño de las etiquetas de los ejes
cex.main = 1.5) # Tamaño del título
De acuerdo a la distribución de horas extras la gran mayoría no trabaja horas extra.
# Gráfico para Cargo
barplot(table(rotacion_df$`Cargo`),
main = "Distribución de Cargo",
col = "darkgreen", # Color de las barras
border = "black", # Borde de las barras
ylab = "Frecuencia", # Etiqueta del eje y
xlab = "Cargo", # Etiqueta del eje x
las = 2, # Orientación vertical de etiquetas (útil si hay muchas categorías)
cex.names = 0.9, # Tamaño de las etiquetas de las categorías
cex.axis = 1.1, # Tamaño de las etiquetas de los ejes
cex.main = 1.5) # Tamaño del título
Esta distribución nos indica que los cargos más representativos son ejecutivo de ventas, investigador científico y técnico de laboratorio.
# Variables cuantitativas
summary(rotacion_df$Ingreso_Mensual)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1009 2911 4919 6503 8379 19999
summary(rotacion_df$Distancia_Casa)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 7.000 9.193 14.000 29.000
summary(rotacion_df$Satisfación_Laboral)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.729 4.000 4.000
# Descripción detallada de todas las variables cuantitativas
describe(select(rotacion_df, Ingreso_Mensual, Satisfación_Laboral, Distancia_Casa))
## vars n mean sd median trimmed mad min max
## Ingreso_Mensual 1 1470 6502.93 4707.96 4919 5667.24 3260.24 1009 19999
## Satisfación_Laboral 2 1470 2.73 1.10 3 2.79 1.48 1 4
## Distancia_Casa 3 1470 9.19 8.11 7 8.08 7.41 1 29
## range skew kurtosis se
## Ingreso_Mensual 18990 1.37 0.99 122.79
## Satisfación_Laboral 3 -0.33 -1.22 0.03
## Distancia_Casa 28 0.96 -0.23 0.21
#hist(rotacion_df$Ingreso_Mensual, main="Distribución del Ingreso Mensual", xlab="Ingreso Mensual", col="lightblue")
#hist(rotacion_df$Distancia_Casa, main="Distribución de la distancia de la casa al trabajo", xlab="Distancia casa -trabajo", col="lightgreen")
#hist(rotacion_df$Satisfación_Laboral, main="Distribución de la Satisfacción Laboral", xlab="Satisfacción Laboral", col="lightcoral")
g_ingreso = ggplot(rotacion_df, aes(x = Ingreso_Mensual)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1) + # Línea de densidad
labs(title = "Distribución del Ingreso Mensual",
x = "Ingreso Mensual",
y = "Densidad") +
theme_minimal() + # Cambiar a un tema minimalista
theme(plot.title = element_text(hjust = 0.5), # Centrar el título
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"))
g_distancia = ggplot(rotacion_df, aes(x = Distancia_Casa)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1) + # Línea de densidad
labs(title = "Distribución de la distancia casa - trabajo",
x = "Distancia casa",
y = "Densidad") +
theme_minimal() + # Cambiar a un tema minimalista
theme(plot.title = element_text(hjust = 0.5), # Centrar el título
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"))
g_satisfacion = ggplot(rotacion_df, aes(x = Satisfación_Laboral)) + geom_histogram(fill="royalblue", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1) + # Línea de densidad
labs(title = "Distribución Satisfacción laboral",
x = "Satisfacción laboral",
y = "Densidad") +
theme_minimal() + # Cambiar a un tema minimalista
theme(plot.title = element_text(hjust = 0.5), # Centrar el título
axis.title.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold"))
# Crear el boxplot
b_ingreso <- ggplot(rotacion_df, aes(y = Ingreso_Mensual)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
theme_minimal() +
labs(title = "Boxplot del Ingreso Mensual", y = "Ingreso Mensual") +
theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))
b_distancia <- ggplot(rotacion_df, aes(y = Distancia_Casa)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
theme_minimal() +
labs(title = "Boxplot del Distancia casa", y = "Distancia Casa") +
theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))
b_satisfaccion <- ggplot(rotacion_df, aes(y = Satisfación_Laboral)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
theme_minimal() +
labs(title = "Boxplot Satisfacción Laboral", y = "Satisfacción Laboral") +
theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))
ggarrange(g_ingreso, b_ingreso, g_distancia, b_distancia, g_satisfacion, b_satisfaccion, ncol = 2, nrow = 3)
De acuerdo al análisis de las variables cuantitativas se puede decir que:
El ingreso mensual de las personas en promedio es 4919 y esta bastante alejado del valor máximo lo que puede indicar que la gran mayoria de las personas gana poco y tendrian más posibilidades de rotar.
La distancia de la casa al trabajo en pormedio es 7 km que está bien distante de los que viven mas lejos que son 29 km lo que en teoria reduciría el riesgo de rotación.
La satisfación laboral en la empresa esta en su gran mayoría satisfechos lo que puede generar menos riesgo de rotación.
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 hipotesis planteada en el punto 2.
# Codificar la variable 'Rotación'
rotacion_df$Rotación <- ifelse(rotacion_df$Rotación == "Si", 1, 0)
table(rotacion_df$Rotación)
##
## 0 1
## 1233 237
# Crear variables dummy para las variables categóricas seleccionadas
rotacion_dummy <- rotacion_df %>%
select(`Viaje de Negocios`, Horas_Extra, Cargo) %>%
mutate(across(where(is.factor), as.factor))
# Usar model.matrix para generar las variables dummy
dummy_data <- model.matrix(~ `Viaje de Negocios` + Horas_Extra + Cargo, data = rotacion_dummy)[, -1]
# Unir las variables dummy con el dataset original
rotacion_df_dummy <- cbind(rotacion_df %>% select(Rotación, Ingreso_Mensual, Distancia_Casa, Satisfación_Laboral), dummy_data)
# Ver el dataset con las variables dummy
head(rotacion_df_dummy)
## Rotación Ingreso_Mensual Distancia_Casa Satisfación_Laboral
## 1 1 5993 1 4
## 2 0 5130 8 2
## 3 1 2090 2 3
## 4 0 2909 3 3
## 5 0 3468 2 2
## 6 0 3068 2 4
## `Viaje de Negocios`No_Viaja `Viaje de Negocios`Raramente Horas_ExtraSi
## 1 0 1 1
## 2 0 0 0
## 3 0 1 1
## 4 0 0 1
## 5 0 1 0
## 6 0 0 0
## CargoDirector_Manofactura CargoEjecutivo_Ventas CargoGerente
## 1 0 1 0
## 2 0 0 0
## 3 0 0 0
## 4 0 0 0
## 5 0 0 0
## 6 0 0 0
## CargoInvestigador_Cientifico CargoRecursos_Humanos CargoRepresentante_Salud
## 1 0 0 0
## 2 1 0 0
## 3 0 0 0
## 4 1 0 0
## 5 0 0 0
## 6 0 0 0
## CargoRepresentante_Ventas CargoTecnico_Laboratorio
## 1 0 0
## 2 0 0
## 3 0 1
## 4 0 0
## 5 0 1
## 6 0 1
# Renombrar automáticamente las columnas con nombres válidos
names(rotacion_df_dummy) <- make.names(names(rotacion_df_dummy))
names(rotacion_df_dummy)
## [1] "Rotación" "Ingreso_Mensual"
## [3] "Distancia_Casa" "Satisfación_Laboral"
## [5] "X.Viaje.de.Negocios.No_Viaja" "X.Viaje.de.Negocios.Raramente"
## [7] "Horas_ExtraSi" "CargoDirector_Manofactura"
## [9] "CargoEjecutivo_Ventas" "CargoGerente"
## [11] "CargoInvestigador_Cientifico" "CargoRecursos_Humanos"
## [13] "CargoRepresentante_Salud" "CargoRepresentante_Ventas"
## [15] "CargoTecnico_Laboratorio"
# Modelos de regresión logística simple para variables categóricas
modelo_viaje <- glm(Rotación ~ X.Viaje.de.Negocios.Raramente + X.Viaje.de.Negocios.No_Viaja, data=rotacion_df_dummy, family=binomial)
summary(modelo_viaje)
##
## Call:
## glm(formula = Rotación ~ X.Viaje.de.Negocios.Raramente + X.Viaje.de.Negocios.No_Viaja,
## family = binomial, data = rotacion_df_dummy)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.1034 0.1389 -7.943 1.98e-15 ***
## X.Viaje.de.Negocios.Raramente -0.6346 0.1638 -3.873 0.000107 ***
## X.Viaje.de.Negocios.No_Viaja -1.3389 0.3315 -4.039 5.36e-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: 1274.8 on 1467 degrees of freedom
## AIC: 1280.8
##
## Number of Fisher Scoring iterations: 5
modelo_horas_extra <- glm(Rotación ~ `Horas_ExtraSi`, data=rotacion_df_dummy, family=binomial)
summary(modelo_horas_extra)
##
## Call:
## glm(formula = Rotación ~ Horas_ExtraSi, family = binomial, data = rotacion_df_dummy)
##
## 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
modelo_cargo <- glm(Rotación ~ `CargoDirector_Manofactura`+ `CargoEjecutivo_Ventas`+`CargoGerente`
+`CargoInvestigador_Cientifico`+`CargoRecursos_Humanos`+`CargoRepresentante_Salud`
+`CargoRepresentante_Ventas`+`CargoTecnico_Laboratorio`, data=rotacion_df_dummy, family=binomial)
summary(modelo_cargo)
##
## Call:
## glm(formula = Rotación ~ CargoDirector_Manofactura + CargoEjecutivo_Ventas +
## CargoGerente + CargoInvestigador_Cientifico + CargoRecursos_Humanos +
## CargoRepresentante_Salud + CargoRepresentante_Ventas + CargoTecnico_Laboratorio,
## family = binomial, data = rotacion_df_dummy)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.6636 0.7161 -5.116 3.12e-07 ***
## CargoDirector_Manofactura 1.0609 0.7875 1.347 0.177957
## CargoEjecutivo_Ventas 2.1119 0.7308 2.890 0.003854 **
## CargoGerente 0.6983 0.8504 0.821 0.411553
## CargoInvestigador_Cientifico 2.0125 0.7336 2.743 0.006083 **
## CargoRecursos_Humanos 2.4596 0.7881 3.121 0.001804 **
## CargoRepresentante_Salud 1.0568 0.7951 1.329 0.183793
## CargoRepresentante_Ventas 3.2480 0.7504 4.328 1.50e-05 ***
## CargoTecnico_Laboratorio 2.5075 0.7308 3.431 0.000601 ***
## ---
## 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: 1209.7 on 1461 degrees of freedom
## AIC: 1227.7
##
## Number of Fisher Scoring iterations: 6
# Modelos de regresión logística simple para variables cuantitativas
modelo_ingreso <- glm(Rotación ~ Ingreso_Mensual, data=rotacion_df, family=binomial)
# Resúmenes de los modelos
summary(modelo_ingreso)
##
## Call:
## glm(formula = Rotación ~ Ingreso_Mensual, family = binomial,
## data = rotacion_df)
##
## 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
modelo_distancia <- glm(Rotación ~ Distancia_Casa, data=rotacion_df, family=binomial)
summary(modelo_distancia)
##
## Call:
## glm(formula = Rotación ~ Distancia_Casa, family = binomial,
## data = rotacion_df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.890051 0.111382 -16.969 < 2e-16 ***
## Distancia_Casa 0.024710 0.008312 2.973 0.00295 **
## ---
## 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: 1290.0 on 1468 degrees of freedom
## AIC: 1294
##
## Number of Fisher Scoring iterations: 4
modelo_satisfaccion <- glm(Rotación ~ Satisfación_Laboral, data=rotacion_df, family=binomial)
summary(modelo_satisfaccion)
##
## Call:
## glm(formula = Rotación ~ Satisfación_Laboral, family = binomial,
## data = rotacion_df)
##
## 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
Viaje de Negocios: Aquellos empleados que no viajan por negocios o lo hacen raramente tienen una menor probabilidad de rotación en comparación con aquellos que viajan frecuentemente.
Horas Extra: Los empleados que realizan horas extra tienen una probabilidad mucho mayor de rotación, como se observa con el coeficiente positivo significativo (p-valor < 0.001).
Cargo: Algunas categorías de cargos, como Representante de Ventas y Recursos Humanos, parecen tener una mayor tendencia a la rotación, mientras que otros cargos no presentan una relación estadísticamente significativa con la rotación.
Ingreso Mensual: El ingreso mensual parece tener una relación negativa con la rotación, pero no es estadísticamente significativo en este caso (p-valor = 0.095).
Distancia de Casa: Los empleados que viven más lejos de la empresa tienen una mayor probabilidad de rotación.
Satisfacción Laboral: Como era de esperarse, la baja satisfacción laboral se asocia con un aumento en la rotación, siendo una variable significativa con un p-valor muy bajo (p < 0.001).
Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime un modelo logístico con la muestra del 70%. Muestre los resultados.
# Seleccionar las variables necesarias
variables_seleccionadas <- rotacion_df %>%
select(Rotación, `Viaje de Negocios`, Horas_Extra, Cargo,
Ingreso_Mensual, Distancia_Casa, Satisfación_Laboral)
set.seed(123) # Asegurar la reproducibilidad
index <- sample(1:nrow(variables_seleccionadas), 0.7 * nrow(variables_seleccionadas))
# Crear los conjuntos de entrenamiento y prueba
train_data <- variables_seleccionadas[index, ]
test_data <- variables_seleccionadas[-index, ]
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
# Ajustar el modelo logístico
modelo_logistico <- glm(Rotación ~ `Viaje de Negocios` + Horas_Extra + Cargo +
+ Ingreso_Mensual + Distancia_Casa + Satisfación_Laboral,
data = train_data, family = binomial)
# Resumen del modelo
summary(modelo_logistico)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios` + Horas_Extra +
## Cargo + +Ingreso_Mensual + Distancia_Casa + Satisfación_Laboral,
## family = binomial, data = train_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.343e+00 1.338e+00 -1.751 0.079923 .
## `Viaje de Negocios`No_Viaja -1.147e+00 4.136e-01 -2.772 0.005568 **
## `Viaje de Negocios`Raramente -6.894e-01 2.162e-01 -3.188 0.001431 **
## Horas_ExtraSi 1.419e+00 1.940e-01 7.313 2.61e-13 ***
## CargoDirector_Manofactura 1.059e+00 1.164e+00 0.909 0.363135
## CargoEjecutivo_Ventas 1.836e+00 1.140e+00 1.611 0.107080
## CargoGerente 1.158e+00 1.193e+00 0.971 0.331779
## CargoInvestigador_Cientifico 1.449e+00 1.223e+00 1.185 0.236085
## CargoRecursos_Humanos 2.396e+00 1.257e+00 1.906 0.056652 .
## CargoRepresentante_Salud 1.017e+00 1.180e+00 0.862 0.388932
## CargoRepresentante_Ventas 2.893e+00 1.258e+00 2.299 0.021528 *
## CargoTecnico_Laboratorio 2.155e+00 1.220e+00 1.767 0.077261 .
## Ingreso_Mensual -8.777e-05 5.265e-05 -1.667 0.095484 .
## Distancia_Casa 2.621e-02 1.138e-02 2.303 0.021279 *
## Satisfación_Laboral -3.024e-01 8.362e-02 -3.616 0.000299 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 896.03 on 1028 degrees of freedom
## Residual deviance: 740.08 on 1014 degrees of freedom
## AIC: 770.08
##
## Number of Fisher Scoring iterations: 6
# Hacer predicciones sobre el conjunto de prueba
predicciones <- predict(modelo_logistico, newdata = test_data, type = "response")
# Generar la curva ROC
roc_curve <- roc(test_data$Rotación, predicciones)
# Mostrar el AUC
auc(roc_curve)
## Area under the curve: 0.7788
# Graficar la curva ROC
plot(roc_curve, col = "blue", main = "Curva ROC - Modelo Logístico")
La curva ROC es clave para medir el rendimiento predictivo del modelo. Un AUC de 0.7788 indica un buen poder predictivo, aunque no perfecto. Un AUC cercano a 0.8 indica que el modelo tiene una capacidad razonable para distinguir entre empleados que van a rotar y los que no.
En las conclusiones adicione una discució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).
Las variables más significativas para la rotación incluyen:
Horas Extra: Los empleados que realizan más horas extra tienen una mayor probabilidad de rotación. Esto sugiere que la sobrecarga de trabajo puede ser una razón importante para que los empleados dejen la empresa.
Viaje de Negocios: Los empleados que no viajan o lo hacen raramente están menos inclinados a rotar, mientras que aquellos que viajan frecuentemente tienen un mayor riesgo de rotación.
Distancia a Casa: Los empleados que viven más lejos también tienden a rotar más, lo que sugiere que la ubicación geográfica es un factor a tener en cuenta.
Satisfacción Laboral: La insatisfacción laboral es una de las causas más relevantes para la rotación, como se ve en el análisis.
La siguientes estrategias, basadas en los hallazgos del análisis, podrían contribuir a reducir significativamente la rotación de empleados en la empresa.
Revisión de Horas Extra: Implementar políticas que limiten las horas extra o proporcionar incentivos adicionales para los empleados que las realicen de manera frecuente.
Mejorar la Satisfacción Laboral: Invertir en iniciativas de bienestar y desarrollo profesional para mejorar la satisfacción laboral. Realizar encuestas periódicas y reuniones con el personal para entender sus preocupaciones.
Flexibilidad de Viajes: Para aquellos empleados que viajan por negocios, se podrían ofrecer incentivos adicionales o proporcionar una mayor flexibilidad en sus horarios y cargas de trabajo.
Ubicación de la Oficina: Considerar la posibilidad de teletrabajo o horarios flexibles para empleados que viven más lejos, lo cual puede mejorar su calidad de vida y reducir la rotación.