Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación. Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
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, …
Variables Categoricas - Campo de Educación: Este campo puede ser un campo decisivo dado que personas cuyo cargo esté acorde con su puesto de trabajo puede resultar más provechoso para su vida profesional, por ende la oportunidad de rotación es inferior.
Horas Extra: Este también es otro factor categórico crucial, dado que entre más horas extra trabaje, es posible que tenga más carga laboral y por ende esté propenso a rotar de cargo
Educación: Niveles como ‘Secundaria’, ‘Universitaria’, ‘Posgrado’. Son variables que pueden determinar la rotación o no de un trabajador, dado que entre más nivel de estudio tenga la persona, a un cargo mayor aspira, por ende es posible que rote más de cargo.
Variables Numericas
Edad: Un factor determinante, dado que, entre mas joven, es menor el miedo a rotar de cargo.
Ingreso Mensual: Se espera que si un trabajador tiene un salario mensual bajo, aspire a rotar de cargo hasta que encuentre un cargo donde le brinden un salario ideal para el trabajador.
Años de experiencia: Se espera que entre más años de experiencia tenga el trabajador es posible que más rote de cargo aspirando posiciones más altas.
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
table(rotacion$Campo_Educación)
##
## Ciencias Humanidades Mercadeo Otra Salud Tecnicos
## 606 27 159 82 464 132
table(rotacion$Horas_Extra)
##
## No Si
## 1054 416
table(rotacion$Educación)
##
## 1 2 3 4 5
## 170 282 572 398 48
Basándonos en los datos proporcionados, podemos concluir lo siguiente:
Campo de Educación:
Trabaja Horas Extra:
Nivel Educativo:
En resumen, estos datos sugieren una fuerza laboral con una sólida base en ciencias y salud, una preferencia por no trabajar horas extra, y un nivel educativo que tiende hacia la formación técnica o de pregrado. Para obtener conclusiones más profundas, sería útil considerar estos datos en el contexto de la industria específica, la geografía, la economía y otros factores sociales que pueden influir en la educación y las horas de trabajo.
summary(rotacion$Antigüedad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.000 5.000 7.008 9.000 40.000
hist(rotacion$Antigüedad, col = "red", xlab = "Años de Antigüedad en la empresa", main = "Distribución de Antigüedad")
summary(rotacion$Edad)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 30.00 36.00 36.92 43.00 60.00
hist(rotacion$Edad, col = "green", xlab = "Edad", main = "Distribución de Edad")
summary(rotacion$Ingreso_Mensual)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1009 2911 4919 6503 8379 19999
hist(rotacion$Ingreso_Mensual, col = "blue", xlab = "Ingreso Mensual", main = "Distribución Salario Mensual del Empleado")
Rango de Edad: La distribución de las edades de los trabajadores se extiende de 18 a 60 años, con una edad mediana de 36 años y un promedio cercano a los 36.92 años. Este análisis revela que gran parte del personal se encuentra en el rango de 30 a 43 años, mostrando una tendencia a inclinarse hacia edades más avanzadas, notándose incluso algunos casos de empleados que superan los 60 años.
Años de Antigüedad: En cuanto a los años de antigüedad en la organización, este oscila entre menos de un año y los 40 años, teniendo una mediana de 5 años y un promedio alrededor de los 7.01 años. Esto refleja que un gran número de trabajadores posee una experiencia menor a 10 años dentro de la empresa, aunque existen excepciones de individuos con una larga trayectoria laboral.
Ingreso Mensual: En el ingreso mensual varia de los 1009 a los 20000, con un ingreso salarial de mediana de 4919 y un promedio cercano a 6503 USD. Este análisis nos indica que gran parte de los rangos salariales se encuentran entre los 1000 y 13000 USD mostrando una tendencia por inclinarse a los 4000 USD.
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.
rotacion_selected <- rotacion[,c("Rotación", "Campo_Educación", "Horas_Extra", "Educación", "Antigüedad", "Edad", "Ingreso_Mensual")]
rotacion_selected<-as.data.frame(rotacion_selected)
head(rotacion_selected)
## Rotación Campo_Educación Horas_Extra Educación Antigüedad Edad
## 1 Si Ciencias Si 2 6 41
## 2 No Ciencias No 1 10 49
## 3 Si Otra Si 2 0 37
## 4 No Ciencias Si 4 8 33
## 5 No Salud No 1 2 27
## 6 No Ciencias No 2 7 32
## Ingreso_Mensual
## 1 5993
## 2 5130
## 3 2090
## 4 2909
## 5 3468
## 6 3068
NAs<-colSums(is.na(rotacion_selected))
as.data.frame(NAs)
## NAs
## Rotación 0
## Campo_Educación 0
## Horas_Extra 0
## Educación 0
## Antigüedad 0
## Edad 0
## Ingreso_Mensual 0
rotacion_selected$y<-ifelse(rotacion_selected$Rotación=="Si",1,0)
Ahora vamos a realizar el modelo para las variables que seleccionamos anteriormente:
generoModel <- glm(y ~ Campo_Educación, data = rotacion_selected, family = binomial)
round(summary(generoModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.76 0.11 -15.33 0.00
## Campo_EducaciónHumanidades 0.71 0.45 1.56 0.12
## Campo_EducaciónMercadeo 0.49 0.22 2.22 0.03
## Campo_EducaciónOtra -0.11 0.34 -0.31 0.76
## Campo_EducaciónSalud -0.09 0.18 -0.51 0.61
## Campo_EducaciónTecnicos 0.62 0.23 2.66 0.01
La variable cargo se puede evidenciar que es una variable influyente en la rotación de cargos dado que en cargos como Mercadeo, Humanidades y Tecnicos tienen valores significativos
horasExtraModel <- glm(y ~ Horas_Extra, data = rotacion_selected, family = binomial)
round(summary(horasExtraModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.15 0.10 -21.34 0
## Horas_ExtraSi 1.33 0.15 9.06 0
Se puede ver que las horas extra es una variable que influye en la rotación de cargos
educacionModel <- glm(y ~ Educación, data = rotacion_selected, family = binomial)
round(summary(educacionModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.41 0.21 -6.75 0.00
## Educación -0.08 0.07 -1.20 0.23
Se puede ver que la educación no es un predictor de mucha relevancia, dado que sus valores son muy cercanos a 0
antiguedadModel <- glm(y ~ Antigüedad, data = rotacion_selected, family = binomial)
round(summary(antiguedadModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.16 0.11 -10.38 0
## Antigüedad -0.08 0.02 -5.07 0
La antiguedad no es una variable determinante en la rotación de cargos.
edadModel <- glm(y ~ Edad, data = rotacion_selected, family = binomial)
round(summary(edadModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.21 0.31 0.67 0.5
## Edad -0.05 0.01 -6.01 0.0
La edad tampoco es un factor muy determinante a la hora de la rotación de cargos
ingresoModel <- glm(y ~ Ingreso_Mensual, data = rotacion_selected, family = binomial)
round(summary(ingresoModel)$coefficients,2)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.93 0.13 -7.19 0
## Ingreso_Mensual 0.00 0.00 -5.88 0
El ingreso mensual no es predictor dado que sus valores son muy cercanos a 0
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.
rotacion$Rotación <- ifelse(rotacion$Rotación == "Si", 1, 0)
head(rotacion)
## # A tibble: 6 × 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
## # ℹ 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>
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following object is masked from 'package:boot':
##
## melanoma
set.seed(123)
particion <- createDataPartition(rotacion$Rotación, p = 0.7, list = FALSE)
datos_entrenamiento <- rotacion[particion, ]
datos_prueba <- rotacion[-particion, ]
modelo_logistico <- glm(Rotación ~ Campo_Educación + Horas_Extra + Educación + Antigüedad + Edad + Ingreso_Mensual,
data = datos_entrenamiento, family = "binomial")
summary(modelo_logistico)
##
## Call:
## glm(formula = Rotación ~ Campo_Educación + Horas_Extra + Educación +
## Antigüedad + Edad + Ingreso_Mensual, family = "binomial",
## data = datos_entrenamiento)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.420e-01 4.553e-01 -0.312 0.755077
## Campo_EducaciónHumanidades 1.417e+00 5.946e-01 2.384 0.017146 *
## Campo_EducaciónMercadeo 7.735e-01 3.099e-01 2.496 0.012566 *
## Campo_EducaciónOtra -1.883e-01 4.139e-01 -0.455 0.649159
## Campo_EducaciónSalud -1.318e-01 2.303e-01 -0.572 0.567086
## Campo_EducaciónTecnicos 7.209e-01 2.944e-01 2.448 0.014347 *
## Horas_ExtraSi 1.394e+00 1.898e-01 7.345 2.06e-13 ***
## Educación 8.325e-02 9.350e-02 0.890 0.373314
## Antigüedad -2.217e-02 2.245e-02 -0.988 0.323361
## Edad -4.930e-02 1.332e-02 -3.702 0.000214 ***
## Ingreso_Mensual -1.009e-04 3.513e-05 -2.872 0.004081 **
## ---
## 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: 763.44 on 1018 degrees of freedom
## AIC: 785.44
##
## Number of Fisher Scoring iterations: 5
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
Calculamos las predicciones probabilisticas del modelo logistico:
datos_prueba$prob_pred <- predict(modelo_logistico, datos_prueba, type = "response")
Primero, calculamos la curva ROC
#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 objects are masked from 'package:stats':
##
## cov, smooth, var
curva_roc <- roc(datos_prueba$Rotación, datos_prueba$prob_pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc_score <- auc(curva_roc)
plot(curva_roc, main = "Curva ROC del Modelo de Regresión Logística",
xlab = "1 - Especificidad", ylab = "Sensibilidad")
print(paste("Área bajo la curva (AUC):", round(auc_score, 3)))
## [1] "Área bajo la curva (AUC): 0.685"
Esto sugiere que el modelo tiene una eficacia de casi el 69% para clasificar los empleados entre rotación y no rotación.
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).
Basado en el análisis de los datos, para disminuir la tasa de rotación de personal, se recomienda enfocar los esfuerzos de reclutamiento y retención en aspectos claves identificados:
Ofrecer remuneraciones que sean competitivas dentro del mercado laboral, idealmente superando el umbral de 6000, dado que se observa una notable disminución de la permanencia del personal más allá de este punto salarial.
Prestar especial atención a los empleados menores de 30 años, quienes tienden a presentar mayores tasas de rotación según se desprende de nuestro análisis. Esta tendencia sugiere la importancia de desarrollar estrategias específicas dirigidas a este grupo demográfico.
Considerar la implementación de programas de desarrollo y mentoría dirigidos a empleados con menos años de antigüedad. Esto no solo contribuirá a su crecimiento profesional sino que también aumentará su compromiso y lealtad hacia la empresa.
Reconocer los roles y posiciones dentro de la organización que experimentan una rotación más elevada y colaborar estrechamente con los departamentos pertinentes para diseñar e implementar programas efectivos de retención para estos roles críticos.