Seleccion de Variables

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.

Variables Numericas

Análisis univariado

Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.

Variables Cualitativas

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.

Variables Cuantitativas

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")

Análisis bivariado

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:

Campo de Educación

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

Horas Extra

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

Educacion

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

Antigüedad

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.

Edad

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

Ingreso Mensual

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

Estimación del Modelo

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
  • Campo_Educación: Las categorías “Humanidades”, “Mercadeo” y “Técnicos” muestran un efecto positivo significativo sobre la rotación comparadas con la categoría de referencia (probablemente “Ciencias”, si estamos asumiendo que la categoría no aparece porque es la de referencia). Esto sugiere que los empleados con educación en Humanidades, Mercadeo, y áreas Técnicas tienen una mayor probabilidad de rotación que la categoría de referencia.
  • Horas_Extra: Hacer horas extra (“Si”) está fuertemente asociado con una mayor probabilidad de rotación, con un efecto significativo y positivo.
  • Edad: Hay una asociación negativa significativa entre la edad y la rotación, indicando que a medida que aumenta la edad, la probabilidad de rotación disminuye.
  • Ingreso_Mensual: Existe una asociación negativa significativa entre el ingreso mensual y la rotación, lo que sugiere que mayores ingresos están asociados con una menor probabilidad de rotación.
  • Las categorías de “Campo_Educación” de “Otra” y “Salud” no mostraron un efecto significativo sobre la rotación, lo que significa que no hay evidencia suficiente para afirmar que estas categorías difieran de la categoría de referencia en términos de impacto sobre la rotación.
  • La “Educación” (probablemente el nivel de educación, aunque no se especifica el significado exacto) y la “Antigüedad” no tuvieron efectos significativos sobre la rotación. Esto sugiere que, con los datos disponibles y el modelo actual, no hay evidencia suficiente para afirmar que estos factores influyen en la probabilidad de rotación.
  • La devianza nula es 896.03, y la devianza residual es 763.44, lo que indica que el modelo es significativamente mejor que el modelo nulo (un modelo sin predictores). La reducción en la devianza indica que los predictores incluidos en el modelo explican una buena parte de la variabilidad en la rotación.
  • El AIC (Criterio de Información de Akaike) del modelo es 785.44. El AIC es un indicador de la calidad del modelo, tomando en cuenta la complejidad del mismo; modelos con AIC más bajo son generalmente preferidos, aunque este valor se usa más para comparar modelos.

Evaluacion

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.

Conclusiones

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.