## Loading required package: cubature
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Loading required package: flextable
## Warning: package 'flextable' was built under R version 4.3.2
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
##
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
##
## label, label<-
## The following object is masked from 'package:dplyr':
##
## n
## The following objects are masked from 'package:stats':
##
## IQR, median, sd, var
## The following objects are masked from 'package:base':
##
## max, mean, min, range, sum
Comenzamos por revisar que tipo de datos tiene cada columna y que tipo de datos podemos tener en cada uno de las columnas
tipos_de_datos <- sapply(rotacion, class)
print(tipos_de_datos)
## Rotación Edad
## "character" "numeric"
## Viaje de Negocios Departamento
## "character" "character"
## Distancia_Casa Educación
## "numeric" "numeric"
## Campo_Educación Satisfacción_Ambiental
## "character" "numeric"
## Genero Cargo
## "character" "character"
## Satisfación_Laboral Estado_Civil
## "numeric" "character"
## Ingreso_Mensual Trabajos_Anteriores
## "numeric" "numeric"
## Horas_Extra Porcentaje_aumento_salarial
## "character" "numeric"
## Rendimiento_Laboral Años_Experiencia
## "numeric" "numeric"
## Capacitaciones Equilibrio_Trabajo_Vida
## "numeric" "numeric"
## Antigüedad Antigüedad_Cargo
## "numeric" "numeric"
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## "numeric" "numeric"
De lo anterior tenemos que las variables que nos interesan son 14 variables que son de tipo numérico, por lo que no hay necesidad de transformarlas. Y tenemos otras 10 de tipo string incluidas la variable objetivo “Rotación”. Vamos a ver un resumen descriptivo de las variables.
rotacion2<-rotacion
summary(rotacion)
## 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
Con lo anterior identificamos los rangos en los que se mueven las distintas variables numéricas, observamos que la mayoría de los datos se encuentran en rangos de similares, entre 0 y 10.
Comenzamos por la relación entre nuestras variables y la variable numéricas con la variable objetivo.
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
# Seleccionar las variables de interés
variables_interes <- c("Rendimiento_Laboral", "Años_Experiencia", "Capacitaciones",
"Equilibrio_Trabajo_Vida", "Porcentaje_aumento_salarial",
"Satisfacción_Ambiental", "Edad", "Educación", "Rotación")
# Subconjunto de datos con las variables de interés
datos_interes <- rotacion[, variables_interes]
# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
# Seleccionar las variables de interés
variables_interes <- c("Antigüedad", "Antigüedad_Cargo",
"Años_ultima_promoción", "Años_acargo_con_mismo_jefe",
"Satisfación_Laboral", "Distancia_Casa", "Rotación")
# Subconjunto de datos con las variables de interés
datos_interes <- rotacion[, variables_interes]
# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
De lo anterior observanmos que las variables que mejor me puedan ayudar a segmentar ambas poblaciones son la Edad, ya que vemos que como las dos distribuciones de Si(verde) y No(Rojo) se segmentan mejor sobre esta variables, así mismo la satisfacción laboral, y satisfacción ambiental.
# Convertir "Si" a 1 y "No" a 0 en la columna "Rotación"
rotacion$Rotación <- as.numeric(rotacion$Rotación == "Si")
rotacion
## # A tibble: 1,470 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <dbl> <dbl> <chr> <chr> <dbl> <dbl>
## 1 1 41 Raramente Ventas 1 2
## 2 0 49 Frecuentemente IyD 8 1
## 3 1 37 Raramente IyD 2 2
## 4 0 33 Frecuentemente IyD 3 4
## 5 0 27 Raramente IyD 2 1
## 6 0 32 Frecuentemente IyD 2 2
## 7 0 59 Raramente IyD 3 3
## 8 0 30 Raramente IyD 24 1
## 9 0 38 Frecuentemente IyD 23 3
## 10 0 36 Raramente IyD 27 3
## # ℹ 1,460 more rows
## # ℹ 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>, …
library(ltm)
## Warning: package 'ltm' was built under R version 4.3.3
## Loading required package: msm
## Warning: package 'msm' was built under R version 4.3.3
## Loading required package: polycor
## Warning: package 'polycor' was built under R version 4.3.3
##
## Attaching package: 'polycor'
## The following object is masked from 'package:psych':
##
## polyserial
##
## Attaching package: 'ltm'
## The following object is masked from 'package:psych':
##
## factor.scores
# Definir las variables de interés
variables_interes <- c("Rendimiento_Laboral", "Años_Experiencia", "Capacitaciones",
"Equilibrio_Trabajo_Vida", "Porcentaje_aumento_salarial",
"Satisfacción_Ambiental", "Edad", "Educación", "Antigüedad", "Antigüedad_Cargo",
"Años_ultima_promoción", "Años_acargo_con_mismo_jefe",
"Satisfación_Laboral", "Distancia_Casa")
# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()
# Calcular el coeficiente de punto biserial para cada variable continua
for (column in variables_interes) {
result <- biserial.cor(rotacion[[column]], rotacion$Rotación)
correlation_results[[column]] <- result
}
# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))
# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]
correlation_df
## Variable Correlation
## Años_Experiencia Años_Experiencia 0.171063246
## Antigüedad_Cargo Antigüedad_Cargo 0.160545004
## Edad Edad 0.159227826
## Años_acargo_con_mismo_jefe Años_acargo_con_mismo_jefe 0.156199316
## Antigüedad Antigüedad 0.134392214
## Satisfación_Laboral Satisfación_Laboral 0.103481126
## Satisfacción_Ambiental Satisfacción_Ambiental 0.103368978
## Distancia_Casa Distancia_Casa -0.077923583
## Equilibrio_Trabajo_Vida Equilibrio_Trabajo_Vida 0.063939047
## Capacitaciones Capacitaciones 0.059477799
## Años_ultima_promoción Años_ultima_promoción 0.033018775
## Educación Educación 0.031372820
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial 0.013478202
## Rendimiento_Laboral Rendimiento_Laboral -0.002888752
# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()
# Calcular la correlación de Kendall para cada variable
for (column in variables_interes) {
result <- cor(rotacion[[column]], rotacion$Rotación, method = "kendall")
correlation_results[[column]] <- result
}
# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))
# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]
correlation_df
## Variable Correlation
## Años_Experiencia Años_Experiencia -0.166781144
## Antigüedad Antigüedad -0.161005913
## Antigüedad_Cargo Antigüedad_Cargo -0.156710954
## Años_acargo_con_mismo_jefe Años_acargo_con_mismo_jefe -0.152006156
## Edad Edad -0.142027312
## Satisfación_Laboral Satisfación_Laboral -0.094304759
## Satisfacción_Ambiental Satisfacción_Ambiental -0.088376678
## Distancia_Casa Distancia_Casa 0.066764681
## Equilibrio_Trabajo_Vida Equilibrio_Trabajo_Vida -0.049365275
## Años_ultima_promoción Años_ultima_promoción -0.047753106
## Capacitaciones Capacitaciones -0.047153882
## Educación Educación -0.027817077
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial -0.020189908
## Rendimiento_Laboral Rendimiento_Laboral 0.002888752
# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()
# Calcular la correlación de Kendall para cada variable
for (column in variables_interes) {
result <- cor(rotacion[[column]], rotacion$Rotación, method = "spearman")
correlation_results[[column]] <- result
}
# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))
# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]
correlation_df
## Variable Correlation
## Años_Experiencia Años_Experiencia -0.199002020
## Antigüedad Antigüedad -0.190419098
## Antigüedad_Cargo Antigüedad_Cargo -0.180623030
## Años_acargo_con_mismo_jefe Años_acargo_con_mismo_jefe -0.175355081
## Edad Edad -0.171231659
## Satisfación_Laboral Satisfación_Laboral -0.102948195
## Satisfacción_Ambiental Satisfacción_Ambiental -0.096486420
## Distancia_Casa Distancia_Casa 0.079248186
## Años_ultima_promoción Años_ultima_promoción -0.053272642
## Equilibrio_Trabajo_Vida Equilibrio_Trabajo_Vida -0.051951357
## Capacitaciones Capacitaciones -0.051757308
## Educación Educación -0.030345908
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial -0.023612035
## Rendimiento_Laboral Rendimiento_Laboral 0.002888752
De acuerdo a lo anterior pensamos que las variables mas adecuadas y mas relacionadas para trabajar serían los años de experiencia, la antiguedad, antiguedad cargo, edad,Satisfación_Laboral, y años a cargo con mismo jefe
Pero a la vez antiguedad, antiguedad cargo y años a cargo con mismo jefe son variables demasiado correlacionadas entre ellas y podríamos caer colinealidad y es algo que estamos tratando de evitar para el modelo
Con las variables categóricas procedemos a observar los valores únicos para cada una de las categorías. Para saber que datos tenemos disponibles por categoría.
# Obtener los valores únicos de cada columna
valores_viaje_negocios <- unique(rotacion$'Viaje de Negocios')
valores_departamento <- unique(rotacion$Departamento)
valores_educacion <- unique(rotacion$Campo_Educación)
valores_genero <- unique(rotacion$Genero)
valores_cargo <- unique(rotacion$Cargo)
valores_estado_civil <- unique(rotacion$Estado_Civil)
valores_horas_extra <- unique(rotacion$Horas_Extra)
valores_rotacion <- unique(rotacion$Rotación)
# Imprimir los valores únicos de cada columna
print("Valores únicos de la columna 'Viaje de Negocios':")
## [1] "Valores únicos de la columna 'Viaje de Negocios':"
print(valores_viaje_negocios)
## [1] "Raramente" "Frecuentemente" "No_Viaja"
print("Valores únicos de la columna 'Departamento':")
## [1] "Valores únicos de la columna 'Departamento':"
print(valores_departamento)
## [1] "Ventas" "IyD" "RH"
print("Valores únicos de la columna 'Campo Educación':")
## [1] "Valores únicos de la columna 'Campo Educación':"
print(valores_educacion)
## [1] "Ciencias" "Otra" "Salud" "Mercadeo" "Tecnicos"
## [6] "Humanidades"
print("Valores únicos de la columna 'Género':")
## [1] "Valores únicos de la columna 'Género':"
print(valores_genero)
## [1] "F" "M"
print("Valores únicos de la columna 'Cargo':")
## [1] "Valores únicos de la columna 'Cargo':"
print(valores_cargo)
## [1] "Ejecutivo_Ventas" "Investigador_Cientifico"
## [3] "Tecnico_Laboratorio" "Director_Manofactura"
## [5] "Representante_Salud" "Gerente"
## [7] "Representante_Ventas" "Director_Investigación"
## [9] "Recursos_Humanos"
print("Valores únicos de la columna 'Estado Civil':")
## [1] "Valores únicos de la columna 'Estado Civil':"
print(valores_estado_civil)
## [1] "Soltero" "Casado" "Divorciado"
print("Valores únicos de la columna 'Horas Extra':")
## [1] "Valores únicos de la columna 'Horas Extra':"
print(valores_horas_extra)
## [1] "Si" "No"
print("Valores únicos de la columna 'Rotación':")
## [1] "Valores únicos de la columna 'Rotación':"
print(valores_rotacion)
## [1] 1 0
Ahora para determinar si nuestra variables categóricas están relacionadas con Rotación procedemos a usar la prueba de Chi-Cuadrado, que son “Viaje de Negocios”, “Departamento”, “Campo Educación”, “Género”, “Cargo” y “Estado Civil”.
Para las variables binaria “Horas Extra” y la variable objetivo “Rotación”, vamos a usar la prueba de chi-cuadrado y el coeficiente de contingencia para evaluar la asociación entre estas variables.
# Instalacion de paquete
library(grid)
# Instalacion de paquete
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
# Prueba de independencia chi-cuadrado para variables categóricas
chi_square_test_viaje_negocios <- chisq.test(rotacion$'Viaje de Negocios', rotacion$Rotación)
chi_square_test_departamento <- chisq.test(rotacion$Departamento, rotacion$Rotación)
chi_square_test_educacion <- chisq.test(rotacion$Campo_Educación, rotacion$Rotación)
## Warning in chisq.test(rotacion$Campo_Educación, rotacion$Rotación): Chi-squared
## approximation may be incorrect
chi_square_test_genero <- chisq.test(rotacion$Genero, rotacion$Rotación)
chi_square_test_cargo <- chisq.test(rotacion$Cargo, rotacion$Rotación)
chi_square_test_estado_civil <- chisq.test(rotacion$Estado_Civil, rotacion$Rotación)
# Prueba de independencia chi-cuadrado para variables binarias
chi_square_test_horas_extra <- chisq.test(rotacion$Horas_Extra, rotacion$Rotación)
# Coeficiente de contingencia para variables binarias
coef_contingencia_horas_extra <- assocstats(table(rotacion$Horas_Extra, rotacion$Rotación))
# Mostrar resultados
print("Prueba de independencia chi-cuadrado para variables categóricas:")
## [1] "Prueba de independencia chi-cuadrado para variables categóricas:"
print(chi_square_test_viaje_negocios)
##
## Pearson's Chi-squared test
##
## data: rotacion$"Viaje de Negocios" and rotacion$Rotación
## X-squared = 24.182, df = 2, p-value = 5.609e-06
print(chi_square_test_departamento)
##
## Pearson's Chi-squared test
##
## data: rotacion$Departamento and rotacion$Rotación
## X-squared = 10.796, df = 2, p-value = 0.004526
print(chi_square_test_educacion)
##
## Pearson's Chi-squared test
##
## data: rotacion$Campo_Educación and rotacion$Rotación
## X-squared = 16.025, df = 5, p-value = 0.006774
print(chi_square_test_genero)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: rotacion$Genero and rotacion$Rotación
## X-squared = 1.117, df = 1, p-value = 0.2906
print(chi_square_test_cargo)
##
## Pearson's Chi-squared test
##
## data: rotacion$Cargo and rotacion$Rotación
## X-squared = 86.19, df = 8, p-value = 2.752e-15
print(chi_square_test_estado_civil)
##
## Pearson's Chi-squared test
##
## data: rotacion$Estado_Civil and rotacion$Rotación
## X-squared = 46.164, df = 2, p-value = 9.456e-11
print("Prueba de independencia chi-cuadrado y coeficiente de contingencia para variable binaria:")
## [1] "Prueba de independencia chi-cuadrado y coeficiente de contingencia para variable binaria:"
print(chi_square_test_horas_extra)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: rotacion$Horas_Extra and rotacion$Rotación
## X-squared = 87.564, df = 1, p-value < 2.2e-16
print(coef_contingencia_horas_extra)
## X^2 df P(> X^2)
## Likelihood Ratio 81.402 1 0
## Pearson 89.044 1 0
##
## Phi-Coefficient : 0.246
## Contingency Coeff.: 0.239
## Cramer's V : 0.246
Para seleccionar las tres variables más significativas para predecir la “Rotación” basado en los resultados de las pruebas de independencia chi-cuadrado, podrías considerar aquellas variables que tienen los valores de chi-cuadrado más altos y los p-values más bajos. Esto indicaría una asociación más fuerte entre esas variables y la variable objetivo “Rotación”. Basado en los resultados proporcionados, las tres variables más prometedoras podrían ser:
Cargo: Tiene el valor de chi-cuadrado más alto y el p-valor más bajo entre todas las variables categóricas, lo que indica una fuerte asociación entre el cargo y la rotación.
Estado Civil: También tiene un alto valor de chi-cuadrado y un p-valor muy bajo, lo que sugiere una relación significativa con la rotación.
Horas Extra: Para la variable binaria “Horas Extra”, el valor de chi-cuadrado es muy alto y el p-valor es extremadamente bajo, lo que indica una fuerte asociación con la rotación. Además, el coeficiente de contingencia y otras medidas también sugieren una asociación moderada.
Por lo tanto, basado en estos resultados, podrías considerar estas tres variables (Cargo, Estado Civil y Horas Extra) como las más prometedoras para predecir la rotación en tu modelo. Sin embargo, siempre es importante tener en cuenta el contexto específico de tu problema y las características de tus datos al seleccionar las variables para tu modelo predictivo.
Las variables numéricas a escoger son:
Las variables categoricas a escoger son:
# Seleccionar las variables de interés
variables_seleccionadas <- c("Años_Experiencia", "Edad", "Satisfación_Laboral", "Cargo", "Horas_Extra", "Estado_Civil","Rotación")
# Crear un nuevo dataframe con las variables seleccionadas
rotacion_df <- rotacion[, variables_seleccionadas]
# Mostrar las primeras filas del nuevo dataset
head(rotacion_df)
## # A tibble: 6 × 7
## Años_Experiencia Edad Satisfación_Laboral Cargo Horas_Extra Estado_Civil
## <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 8 41 4 Ejecutivo… Si Soltero
## 2 10 49 2 Investiga… No Casado
## 3 7 37 3 Tecnico_L… Si Soltero
## 4 8 33 3 Investiga… Si Casado
## 5 6 27 2 Tecnico_L… No Casado
## 6 8 32 4 Tecnico_L… No Soltero
## # ℹ 1 more variable: Rotación <dbl>
Comenzamos por revisar un histograma de cada uno de las variables numericas a continuacion para observar como se comporta la variable.
# Definir las variables de interés
variables_interes <- c("Años_Experiencia", "Edad", "Satisfación_Laboral")
# Crear histogramas para cada variable de interés
for (variable in variables_interes) {
# Crear el histograma
histograma <- ggplot(data = rotacion, aes(x = get(variable))) +
geom_histogram(fill = "lightblue", color = "black", bins = 20) +
labs(title = paste("Histograma de", variable),
x = variable, y = "Frecuencia") +
theme_minimal()
# Imprimir el histograma
print(histograma)
}
El histograma de años de Experiencia y comportarse de manera mas cerca una normal, pero podríamos hacer hipótesis para confirmarlo.
# Crear un dataframe con las variables de interés
variables_interes <- c("Años_Experiencia", "Edad", "Satisfación_Laboral")
datos_interes <- rotacion[, variables_interes]
# Crear gráficos de densidad para cada variable
for (variable in variables_interes) {
plot<-ggplot(datos_interes, aes(x = get(variable))) +
geom_density(fill = "lightblue", color = "black") +
labs(title = paste("Densidad de", variable),
x = variable, y = "Densidad") +
theme_minimal()
print(plot)
}
Tambien revisamos para las categóricas cuantos valores diferentes tenemos para cada categoría.
# Definir las variables de interés
# Crear un count plot para la variable "Cargo"
ggplot(rotacion, aes(x = Cargo)) +
geom_bar(fill = "lightblue", color = "black") +
labs(title = "Count Plot de Cargo", x = "Cargo", y = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
# Crear un count plot para la variable "Horas_Extra"
ggplot(rotacion, aes(x = Horas_Extra)) +
geom_bar(fill = "lightblue", color = "black") +
labs(title = "Count Plot de Horas Extra", x = "Horas Extra", y = "Frecuencia") +
theme_minimal()
# Crear un count plot para la variable "Estado_Civil"
ggplot(rotacion, aes(x = Estado_Civil)) +
geom_bar(fill = "lightblue", color = "black") +
labs(title = "Count Plot de Estado Civil", x = "Estado Civil", y = "Frecuencia") +
theme_minimal()
Comenzamos revisando la distribución de nuestras variables numéricas con respecto a Rotación, en esta sección revisamos
library(GGally)
# Seleccionar las variables de interés
variables_interes <- c("Años_Experiencia", "Satisfación_Laboral", "Edad", "Rotación")
#variables_interes <- c("Años_Experiencia", "Antigüedad", "Años_acargo_con_mismo_jefe", "Rotación")
# Subconjunto de datos con las variables de interés
datos_interes <- rotacion2[, variables_interes]
# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Como vemos tanto acá como en el anterior parte, la variable de satisfacción laboral, es una variable discreta, por lo cual se va a evaluar acá en el siguiente parte.
Procedemos a hacer un análisis de correspondencia para las variables categoricas, iniciando por Rotacion y Cargo.
library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.2
tabla_rotacion_vs_horas_extra <- table(rotacion$Rotación, rotacion$Horas_Extra)
#colnames(tabla_rotacion_vs_horas_extra) <- c("Si","No")
tabla_rotacion_vs_horas_extra
##
## No Si
## 0 944 289
## 1 110 127
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.2
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
resultados_ac <- CA(tabla_rotacion_vs_horas_extra)
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has 2 categories; the column variable has 2 categories
## The chi square of independence between the two variables is equal to 89.04388 (p-value = 3.861518e-21 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
Lo que vemos de lo anterior es que proporcionalmente el hecho de tener horas extra, si tiene una gran cantidad de gente que hace rotación. Eso nos da idea de que las horas es extra es algo que puede mover la gente a otros cargos o lugares laborales
Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y Cargo.
library(FactoMineR)
tabla_rotacion_vs_Cargo <- table(rotacion$Rotación, rotacion$Cargo)
tabla_rotacion_vs_Cargo
##
## Director_Investigación Director_Manofactura Ejecutivo_Ventas Gerente
## 0 78 135 269 97
## 1 2 10 57 5
##
## Investigador_Cientifico Recursos_Humanos Representante_Salud
## 0 245 40 122
## 1 47 12 9
##
## Representante_Ventas Tecnico_Laboratorio
## 0 50 197
## 1 33 62
resultados_ac <- CA(tabla_rotacion_vs_Cargo)
# Mostrar un resumen de los resultados
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has 2 categories; the column variable has 9 categories
## The chi square of independence between the two variables is equal to 86.19025 (p-value = 2.752482e-15 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
Lo que vemos de lo anterior es que proporcionalmente los cargos directivos son cargos en los que no suele hacer movimiento y mas bien Representante_Ventas y Tecnico_Laboratorio son cargos en los que la gente suele moverse mucho, y suelen cambiar de trabajo
Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y Satisfación_Laboral. En lo que esperariamos haya una gran relación.
tabla_rotacion_vs_Satisfacion_Laboral <- table(rotacion$Rotación, rotacion$Satisfación_Laboral)
tabla_rotacion_vs_Satisfacion_Laboral
##
## 1 2 3 4
## 0 223 234 369 407
## 1 66 46 73 52
resultados_ac <- CA(tabla_rotacion_vs_Satisfacion_Laboral)
# Mostrar un resumen de los resultados
summary(tabla_rotacion_vs_Satisfacion_Laboral)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 17.505, df = 3, p-value = 0.0005563
Lo que vemos en la parte anterior es que curiosamente no esta tan correlacionado como se esperaría realmente, tal vez las personas no suelen contestar con honestidad su nivel de satisfacción o no es tan importante realmente para las personas.
Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y El estado civil. En lo que esperaríamos haya una gran relación.
tabla_rotacion_vs_Estado_Civil <- table(rotacion$Rotación, rotacion$Estado_Civil)
tabla_rotacion_vs_Estado_Civil
##
## Casado Divorciado Soltero
## 0 589 294 350
## 1 84 33 120
resultados_ac <- CA(tabla_rotacion_vs_Estado_Civil)
#resultados_ac
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has 2 categories; the column variable has 3 categories
## The chi square of independence between the two variables is equal to 46.16368 (p-value = 9.455511e-11 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
De lo anterior vemos que las personas solteras, suelen estar mas libres y están mas asociadas a la rotación laboral
Ya que sabemos con que variables vamos a trabajar procedemos a dividir nuestro dataset en train y test. Dejamos 70% de los datos entrenamiento del modelo, y un 30% para evaluar el rendimiento del modelo.
#install.packages("caret")
# Establece la semilla para reproducibilidad
set.seed(42)
# Carga bibliotecas para dividir train-test
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
# Partición de los datos (70% entrenamiento, 30% prueba)
indices_entrenamiento <- createDataPartition(rotacion_df$Rotación, p = 0.7, list = FALSE)
datos_entrenamiento <- rotacion_df[indices_entrenamiento, ]
datos_prueba <- rotacion_df[-indices_entrenamiento, ]
Procedemos a observar el conjunto de datos obtenido.
# Mostrar las primeras filas del nuevo dataset
head(datos_entrenamiento)
## # A tibble: 6 × 7
## Años_Experiencia Edad Satisfación_Laboral Cargo Horas_Extra Estado_Civil
## <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 8 41 4 Ejecutivo… Si Soltero
## 2 10 49 2 Investiga… No Casado
## 3 7 37 3 Tecnico_L… Si Soltero
## 4 8 32 4 Tecnico_L… No Soltero
## 5 1 30 3 Tecnico_L… No Divorciado
## 6 17 36 3 Represent… No Casado
## # ℹ 1 more variable: Rotación <dbl>
# Mostrar las primeras filas del nuevo dataset
head(datos_prueba)
## # A tibble: 6 × 7
## Años_Experiencia Edad Satisfación_Laboral Cargo Horas_Extra Estado_Civil
## <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 8 33 3 Investiga… Si Casado
## 2 6 27 2 Tecnico_L… No Casado
## 3 12 59 1 Tecnico_L… Si Casado
## 4 10 38 3 Director_… No Soltero
## 5 10 29 3 Tecnico_L… Si Soltero
## 6 6 28 3 Tecnico_L… Si Soltero
## # ℹ 1 more variable: Rotación <dbl>
Ya con esto podemos proceder a generar el modelo con los datos de entrenamiento generados.
datos_entrenamiento$Rotación
## [1] 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0
## [38] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0
## [75] 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
## [112] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
## [149] 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [186] 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
## [223] 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
## [260] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
## [297] 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
## [334] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
## [371] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1
## [408] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
## [445] 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0
## [482] 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1
## [519] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0
## [556] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0
## [593] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
## [630] 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
## [667] 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
## [704] 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
## [741] 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
## [778] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
## [815] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
## [852] 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0
## [889] 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
## [926] 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
## [963] 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1000] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
# Estimar el modelo logit con variables categóricas
modelo_logit <- glm(datos_entrenamiento$Rotación ~ ., data = datos_entrenamiento, family = binomial)
# Mostrar un resumen del modelo
summary(modelo_logit)
##
## Call:
## glm(formula = datos_entrenamiento$Rotación ~ ., family = binomial,
## data = datos_entrenamiento)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.91140 0.95405 -2.003 0.04513 *
## Años_Experiencia -0.00424 0.02308 -0.184 0.85426
## Edad -0.03642 0.01572 -2.316 0.02055 *
## Satisfación_Laboral -0.33803 0.08635 -3.915 9.05e-05 ***
## CargoDirector_Manofactura 0.42595 0.87202 0.488 0.62522
## CargoEjecutivo_Ventas 1.57643 0.78488 2.008 0.04459 *
## CargoGerente 0.93930 0.91228 1.030 0.30319
## CargoInvestigador_Cientifico 1.10270 0.80757 1.365 0.17211
## CargoRecursos_Humanos 2.05767 0.89535 2.298 0.02155 *
## CargoRepresentante_Salud 0.05510 0.91583 0.060 0.95203
## CargoRepresentante_Ventas 2.52965 0.85366 2.963 0.00304 **
## CargoTecnico_Laboratorio 2.04833 0.80140 2.556 0.01059 *
## Horas_ExtraSi 1.71319 0.20365 8.412 < 2e-16 ***
## Estado_CivilDivorciado -0.26256 0.28272 -0.929 0.35306
## Estado_CivilSoltero 0.92065 0.21780 4.227 2.37e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 879.08 on 1028 degrees of freedom
## Residual deviance: 694.96 on 1014 degrees of freedom
## AIC: 724.96
##
## Number of Fisher Scoring iterations: 6
De lo anterior obtenemos unos valores similares a lo anterior. Un \(b_{0}\) pequeño, y el modelo logit quedaria de la siguiente manera.
\(Rotacion = \frac{1}{1 + e^{-(\beta_{0} + \beta_{1}* AnosExperiencia + \beta_{2}* Antiguedad + \beta_{3}* AnosCargoConMismoJefe + \beta_{4} * CargoDirectorManofactura + \beta_{5} * CargoEjecutivoVentas + \beta_{6} * Cargo_Gerente + \beta_{7} * CargoInvestigadorCientifico + \beta_{8} * CargoRecursosHumanos + \beta_{9} * CargoRepresentanteSalud + \beta_{10} * CargoRepresentanteVentas + \beta_{11} * CargoTecnicoLaboratorio + \beta_{12} * HorasExtraSi + \beta_{13} * EstadoCivilDivorciado + \beta_{14} * EstadoCivilSoltero)}}\)
Lo que vemos en coeficientes es Representante_Ventas, Tecnico_Laboratorio, CargoRecursos_Humanos y Horas_ExtraSi que los grupos con coeficientes positivos con valores más grandes, lo cual nos indica que nos permite identificar un grupo sensible rotacion. Por contrario los coeficientes de las personas con muchos años experiencia, y edades mayores suelen ser personas que permanecen mas tiempo en un lugar de empleo.
Lo que observamos de nuestro \(R^{2}\) es que con un valor \(R^{2}=0.6507\), nos puede explicar 65% de la variabilidad de los datos, de manera proporcional. Lo ideal sería que fuera cerca 1, pero en este caso no se presenta.
Para mejorar esta metrica podríamos tomar acciones como buscar mas variables relevante para el modelo, escalar las variables para que esten en la misma magnitud, también eliminar outliers, detectar de multicolinealidad para eliminar variables que tal vez presenten redundancia de información.
# Predecir las probabilidades de rotación para los datos de prueba
#predicciones <- predict(modelo_logit, newdata = datos_prueba, type = "response")
predicciones <- predict(modelo_logit, newdata = datos_prueba, type = "response")
# Convertir las predicciones en clases basadas en un umbral de decisión
clases_predichas <- ifelse(predicciones > 0.5, 1, 0)
# Calcular la precisión
precision <- mean(clases_predichas == datos_prueba$Rotación)
precision
## [1] 0.8390023
Obtuvimos una métrica de precision de 0.839 de los valores, lo cual es muy positivo. Ahora procedemos a graficar la curva ROC
# Instalar y cargar el paquete pROC si aún no lo has hecho
# install.packages("pROC")
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following object is masked from 'package:rapportools':
##
## var
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
# Calcular la curva ROC
curva_roc <- roc(datos_prueba$Rotación, predicciones)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Graficar la curva ROC
plot(curva_roc, main = "Curva ROC", col = "blue", lwd = 2)
# Calcular el área bajo la curva (AUC)
auc <- auc(curva_roc)
# Mostrar el valor del AUC en la gráfica
text(0.5, 0.5, paste("AUC =", round(auc, 2)), adj = c(0.5, -0.5))
# Añadir una línea de referencia diagonal
abline(a = 0, b = 1, lty = 2)
# Añadir leyenda
legend("bottomright", legend = paste("AUC =", round(auc, 2)), col = "blue", lty = 1, cex = 0.8)
Con lo anterior obtuvimos una gran métrica, lo que mas queremos evitar es la es que sea 0.5, que significa que no tiene la capacidad de predecir, con un 0,76 significa que tiene un buen nivel para segmentar ambos grupos y captar la generalidad de cada uno de los grupos. Hay buen equilibrio entre sensitividad y especificidad. Ademas de que con un accuracy de 0.839 es buen valor.
Hacer un buen tratamiento de datos y análisis extenso antes de generar un modelo predictivo es importante para que cuando el modelo y algoritmo se configure pueda tener un mejor desempeño al momento de evaluarlo.
Las métricas para determinar si el resultado de un modelo es bueno, en este caso lo mejor es usar ROC y accuracy. Para determinar el comportamiento del modelo.
Lo que observamos es que las personas casadas o con mas años de experiencia. Suelen buscar lugares mas estables para permanecer, lo que ayuda a evitar la rotación, en general la sensación de inestabilidad de un lugar de trabajo, por eso también mantener el jefe usual, es algo que ayuda a determinar si alguien se va a quedar, o las horas extra, ya que las horas extra para alguien que quiere estabilidad no es algo muy positivo, en general como estrategia para poder retener trabajadores lo mejor es ofrecer estabilidad laboral, donde los horarios sean claros, las funcionalidades y así mismo las personas con las que se va trabajar para generar la sensación de familiaridad y constancia, por eso las personas como Años_Experiencia, Edad, Satisfación_Laboral, Estado_CivilDivorciado tienen coeficiente negativo, es decir este tipo de grupos quieren estabilidad a mayor cantidad de años de experiencias y satisfacción laboral alta es un grupo que no tiende tanto a la rotación laboral.
Parte esencial de crear un plan de retención de empleados, es esencial identificar el grupo mas vulnerable en este caso suelen ser personas personas solteras suelen ser que tienen movilidad alta, al igual que los cargos bajos, como Representante_Ventas y Tecnico_Laboratorio y CargoRecursos_Humanos que los grupos con coeficientes positivos con valores más grandes. Al parecer este tipo de cargos deben tener mejores condiciones laborales, tener estabilidad en contrato, no tener horas extra y dar oportunidad a gente mayor, que son características que ayudaría a mermar el numero de personas que rota mucho laboral mente.