Rotación de cargo

En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral,el salario actual, edad y otros factores relevantes. La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.

Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo. La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.

1. Selección 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.

library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Warning: package 'broom' was built under R version 4.3.3
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.3.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.3.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Loading required package: gridExtra
## Warning: package 'gridExtra' was built under R version 4.3.3
## Loading required package: knitr
## Warning: package 'knitr' was built under R version 4.3.3
## Loading required package: summarytools
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
data("rotacion")
colnames(rotacion)
##  [1] "Rotación"                    "Edad"                       
##  [3] "Viaje de Negocios"           "Departamento"               
##  [5] "Distancia_Casa"              "Educación"                  
##  [7] "Campo_Educación"             "Satisfacción_Ambiental"     
##  [9] "Genero"                      "Cargo"                      
## [11] "Satisfación_Laboral"         "Estado_Civil"               
## [13] "Ingreso_Mensual"             "Trabajos_Anteriores"        
## [15] "Horas_Extra"                 "Porcentaje_aumento_salarial"
## [17] "Rendimiento_Laboral"         "Años_Experiencia"           
## [19] "Capacitaciones"              "Equilibrio_Trabajo_Vida"    
## [21] "Antigüedad"                  "Antigüedad_Cargo"           
## [23] "Años_ultima_promoción"       "Años_acargo_con_mismo_jefe"

Variables Categóricas:

Género: En muchas organizaciones, dependiendo de su naturaleza, puede haber una preferencia por empleados de un género específico. Además, ciertos trabajos pueden requerir habilidades físicas que favorecen a un género sobre otro, lo que podría influir en la permanencia del empleado en la empresa.

Estado Civil: Las responsabilidades familiares y personales pueden desempeñar un papel importante en la decisión de un empleado de seguir en la empresa o buscar nuevas oportunidades.

Cargo: El nivel de estrés varía según el cargo y el área de trabajo, lo que puede llevar a que algunos empleados decidan abandonar la empresa si la presión es excesiva.

Variables Cuantitativas:

Edad: Los empleados más jóvenes, al tener menos responsabilidades familiares o financieras, suelen cambiar de trabajo con mayor facilidad, ya que tienen menos obstáculos para hacerlo.

Ingreso_Mensual: El salario es uno de los factores más importantes en la retención de empleados. Un ingreso mensual bajo podría aumentar la posibilidad de que un empleado busque otro cargo o empleo.

Distancia al Trabajo: Es probable que los empleados que viven más lejos de la oficina tengan mayor tendencia a cambiar de empleo en busca de una ubicación más conveniente.

Hipotesis:

Rotación y Edad:Se puede analizar si la edad influye en la rotación. Por ejemplo, los empleados más jóvenes pueden tener más probabilidades de rotar, ya que buscan más oportunidades para crecer y avanzar en su carrera, mientras que los empleados mayores podrían tener más estabilidad.Hipótesis: “La rotación es más común en empleados jóvenes que en los mayores”.

Estado Civil:Los empleados solteros podrían tener una mayor disposición para cambiar de cargo en comparación con los casados o divorciados, quienes podrían buscar más estabilidad. Hipótesis: “Los empleados solteros son más propensos a cambiar de cargo que los casados o divorciados debido a menores responsabilidades familiares”.

Distancia al Trabajo:La distancia desde el hogar al trabajo puede influir en la decisión de cambiar de cargo o incluso abandonar la empresa. Hipótesis: “A mayor distancia de la casa al trabajo, mayor es la probabilidad de que un empleado decida cambiar de cargo o buscar un nuevo empleo”.

Ingreso Mensual:El nivel de ingreso puede ser un fuerte determinante en la rotación. Los empleados con salarios más bajos podrían estar más inclinados a buscar otras oportunidades. Hipótesis: “Los empleados con ingresos bajos tienen mayor probabilidad de rotación debido a la insatisfacción con su compensación económica”.

rotacion_seleccionada <- rotacion[,c("Rotación", "Genero", "Estado_Civil", "Distancia_Casa", "Ingreso_Mensual", "Edad", "Cargo")]
rotacion_seleccionada<-as.data.frame(rotacion_seleccionada)
head(rotacion_seleccionada)
##   Rotación Genero Estado_Civil Distancia_Casa Ingreso_Mensual Edad
## 1       Si      F      Soltero              1            5993   41
## 2       No      M       Casado              8            5130   49
## 3       Si      M      Soltero              2            2090   37
## 4       No      F       Casado              3            2909   33
## 5       No      M       Casado              2            3468   27
## 6       No      M      Soltero              2            3068   32
##                     Cargo
## 1        Ejecutivo_Ventas
## 2 Investigador_Cientifico
## 3     Tecnico_Laboratorio
## 4 Investigador_Cientifico
## 5     Tecnico_Laboratorio
## 6     Tecnico_Laboratorio

Ahora vamos a validar los datos faltantes de esas variables

Faltantes<-colSums(is.na(rotacion_seleccionada))
as.data.frame(Faltantes)
##                 Faltantes
## Rotación                0
## Genero                  0
## Estado_Civil            0
## Distancia_Casa          0
## Ingreso_Mensual         0
## Edad                    0
## Cargo                   0

2. Análisis univariado

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

Variables Categoricas

Analísis variable Genero

p_genero <- ggplot(rotacion, aes(x = Genero)) + 
    geom_bar(fill = "red", color = "red", aes(y = ..count..)) +
    geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de variable: Genero", x = "Genero", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

print(p_genero)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

kable(table(rotacion$Genero))
Var1 Freq
F 588
M 882

Se observa que en la base el 60% de los usuarios son masculinos, es decir que hay una predominancia de los hombres en la organización.

Analísis variable Antigüedad_Cargo

kable(table(rotacion$Cargo))
Var1 Freq
Director_Investigación 80
Director_Manofactura 145
Ejecutivo_Ventas 326
Gerente 102
Investigador_Cientifico 292
Recursos_Humanos 52
Representante_Salud 131
Representante_Ventas 83
Tecnico_Laboratorio 259
p_cargo <- ggplot(rotacion, aes(x = Cargo)) + 
    geom_bar(fill = "skyblue", color = "skyblue") + 
    geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de barras para Carg", x = "Cargo", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_cargo)

El puesto de ejecutivo de ventas es el más común, representando el 22,18%, seguido por el investigador científico con un 19,86% y el técnico de laboratorio con un 17,62%. En contraste, el cargo menos común es el de Recursos Humanos, que solo alcanza un 3,54%. El análisis de las frecuencias de los diferentes roles sugiere que la organización tiene una clara orientación hacia la venta y la investigación. Mientras que los roles operativos y técnicos son predominantes, las posiciones directivas son menos numerosas, la estructura de roles revela una empresa que prioriza la eficiencia operativa y la innovación, con un potencial significativo para desarrollar una estrategia más equilibrada que incluya una mayor inversión en liderazgo y gestión del talento.

Analísis variable Estado Civil

kable(table(rotacion$Estado_Civil))
Var1 Freq
Casado 673
Divorciado 327
Soltero 470
p_civil<- ggplot(rotacion, aes(x = Estado_Civil)) + 
    geom_bar(fill = "green", color = "green") + 
  geom_text(aes(y = ..count.., label = scales::percent(..count../sum(..count..))), stat="count", position = position_dodge(0.9), vjust = -0.5) +
    labs(title = "Gráfico de barras para Estado_Civil", x = "Estado_Civil", y = "Frecuencia") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
print(p_civil)

La tabla muestra que la mayoria de las personas de nuestra data son casadas, en total un 45,8% son casadas, el 32% son soteras y el 22,2% son divorciadas

Variables Cuantitativas

Analísis variable Edad

# Estadísticas descriptivas y histograma para Edad
summary(rotacion$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   30.00   36.00   36.92   43.00   60.00
median_val_hist <- median(rotacion$Edad)
mean_val_hist <- mean(rotacion$Edad)

p_edad <- ggplot(rotacion, aes(x = Edad)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "black", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Edad", x = "Edad", y = "Densidad") +
    annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "black") + 
    theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
print(p_edad)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

El análisis de los datos muestra que la media es aproximadamente 36.92 y la mediana es 36, lo que indica que ambas medidas de tendencia central son similares y que los datos no están muy sesgados. La desviación estándar de 9.14 sugiere una dispersión moderada alrededor de la media, indicando cierta diversidad en las observaciones. Además, el rango de los datos varía entre un mínimo de 18 y un máximo de 60, lo que refleja diferencias significativas entre los valores. En conjunto, los datos presentan una tendencia central clara con una variabilidad notable.

p_boxedad <- ggplot(rotacion, aes(y = Edad)) + 
    geom_boxplot(fill = "#006400", color = "black", width = 0.5, outlier.shape = NA) + 
    geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "black") +  
    labs(
        title = "Boxplot para Edad",
        y = "Edad",  
        x = NULL
    ) + 
    theme_minimal() 
print(p_boxedad)

El 50% de nuestros datos se concentran entro los 30 y 43 años de edad.

Analísis variable Ingreso Mensual

# Estadísticas descriptivas y histograma para Edad
summary(rotacion$Ingreso_Mensual)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1009    2911    4919    6503    8379   19999
median_val_hist <- median(rotacion$Ingreso_Mensual)
mean_val_hist <- mean(rotacion$Ingreso_Mensual)

p_ingreso <- ggplot(rotacion, aes(x = Ingreso_Mensual)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Ingreso_Mensual", x = "Ingreso_Mensual", y = "Densidad") +
    annotate("text", x = mean_val_hist + 500, y = 0.00002, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 500, y = 0.00002, label = "Mediana", color = "blue") + 
    theme_minimal()
print(p_ingreso)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

p_ingreso <- ggplot(rotacion, aes(y = Edad)) + 
    geom_boxplot(fill = "#600200", color = "black", width = 0.5, outlier.shape = NA) + 
    geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "black") +  
    labs(
        title = "Boxplot para Edad",
        y = "Edad",  
        x = NULL
    ) + 
    theme_minimal() 
print(p_ingreso)

En conjunto, estos valores indican una distribución con una tendencia central (mediana) de 4919 y una media más alta de 6503, lo que sugiere la presencia de algunos valores extremos. La diferencia entre el primer y tercer cuartil (2911 a 8379) muestra una dispersión significativa en los datos. Esto podría implicar que el conjunto de datos tiene una variedad de observaciones, desde bajas hasta muy altas.

Analísis variable Distancia_Casa

summary(rotacion$Distancia_Casa)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   7.000   9.193  14.000  29.000
median_val_hist <- median(rotacion$Distancia_Casa)
mean_val_hist <- mean(rotacion$Distancia_Casa)

p_distancia <- ggplot(rotacion, aes(x = Distancia_Casa)) + 
    geom_histogram(aes(y = ..density..), fill = "#FFB6C1", color = "black", alpha = 0.7) + 
    geom_density(alpha = 0.2, fill = "#006400") +
    geom_vline(aes(xintercept = median_val_hist), color = "blue", linetype = "dashed", size = 0.5) + 
    geom_vline(aes(xintercept = mean_val_hist), color = "red", linetype = "dashed", size = 0.5) +
    labs(title = "Histograma para Distancia_Casa", x = "Distancia_Casa", y = "Densidad") +
    annotate("text", x = mean_val_hist + 2, y = 0.02, label = "Media", color = "red") + 
    annotate("text", x = median_val_hist - 2, y = 0.02, label = "Mediana", color = "blue") + 
    theme_minimal()
print(p_distancia)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

p_distancia <- ggplot(rotacion, aes(y = Edad)) + 
    geom_boxplot(fill = "#007200", color = "black", width = 0.5, outlier.shape = NA) + 
    geom_jitter(aes(x = 0), width = 0.25, size = 2, alpha = 0.7, color = "black") +  
    labs(
        title = "Boxplot para Edad",
        y = "Edad",  
        x = NULL
    ) + 
    theme_minimal() 
print(p_distancia)

En conjunto, los datos muestran una distribución que se extiende desde un mínimo de 1 hasta un máximo de 29, con una mediana de 7 y una media de aproximadamente 9.19. La diferencia entre el primer cuartil (2) y el tercer cuartil (14) sugiere una dispersión moderada en los datos. La media es mayor que la mediana, lo que indica la presencia de algunos valores extremos que influyen en el promedio.

3. 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_biv=rotacion
rotacion_biv$Rotación=as.numeric(rotacion_biv$Rotación=="Si")
rotacion_seleccionada$y<-ifelse(rotacion_seleccionada$Rotación=="Si",1,0)

Una vez Codificamos la variables asignando los 1 y 0.se realiza un análisis bivariado a cada una de las variables seleccionadas. Para lo anterior, se grafican las variables teniendo como resultado la variable rotación

Genero

m_genero <- glm(y ~ Genero, data = rotacion_seleccionada, family = binomial)
round(summary(m_genero)$coefficients,2)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -1.75       0.12  -15.07     0.00
## GeneroM         0.17       0.15    1.13     0.26
library(CGPfunctions)
## Warning: package 'CGPfunctions' was built under R version 4.3.3
## Warning in .recacheSubclasses(def@className, def, env): undefined subclass
## "ndiMatrix" of class "replValueSp"; definition not updated
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(purrr)
## Warning: package 'purrr' was built under R version 4.3.3
library(tidyselect) 
## Warning: package 'tidyselect' was built under R version 4.3.3
PlotXTabs2(data = rotacion_seleccionada,x = Genero,y = Rotación)

Los resultados del modelo indican que el intercepto es de -1.75, con un valor p de 0.00, lo que sugiere que la probabilidad de rotación es significativamente baja para la categoría de referencia, que en este caso sería el género femenino.

Por otro lado, el coeficiente asociado al género masculino (GeneroM) es de 0.17, lo que indica que ser hombre incrementa ligeramente el logaritmo de las probabilidades de rotación en comparación con las mujeres. Sin embargo, este efecto no es estadísticamente significativo, ya que el valor p correspondiente es de 0.26, superior al umbral comúnmente aceptado de 0.05. En otras palabras, no hay evidencia suficiente para afirmar que el género tiene un impacto significativo en la probabilidad de rotación.

Cargo

m_cargo <- glm(y ~ Cargo, data = rotacion_seleccionada, family = binomial)
round(summary(m_cargo)$coefficients,2)
##                              Estimate Std. Error z value Pr(>|z|)
## (Intercept)                     -3.66       0.72   -5.12     0.00
## CargoDirector_Manofactura        1.06       0.79    1.35     0.18
## CargoEjecutivo_Ventas            2.11       0.73    2.89     0.00
## CargoGerente                     0.70       0.85    0.82     0.41
## CargoInvestigador_Cientifico     2.01       0.73    2.74     0.01
## CargoRecursos_Humanos            2.46       0.79    3.12     0.00
## CargoRepresentante_Salud         1.06       0.80    1.33     0.18
## CargoRepresentante_Ventas        3.25       0.75    4.33     0.00
## CargoTecnico_Laboratorio         2.51       0.73    3.43     0.00
PlotXTabs2(data = rotacion_seleccionada,x = Cargo,y = Rotación)

los cargos como “Ejecutivo de Ventas”, “Investigador Científico”, “Recursos Humanos”, “Representante de Ventas”, y “Técnico de Laboratorio” tienen un efecto positivo y significativo en la probabilidad del evento de interés, lo que sugiere que las personas en estos cargos son más propensas a una rotacion. Por otro lado, los cargos como “Director de Manufactura”, “Gerente” y “Representante de Salud” no muestran un efecto estadísticamente significativo, lo que implica que el cargo no es un predictor fuerte del evento para estos grupos.

Estado_Civil

m_estado_civil <- glm(y ~ Estado_Civil, data = rotacion_seleccionada, family = binomial)
round(summary(m_estado_civil)$coefficients, 2)
##                        Estimate Std. Error z value Pr(>|z|)
## (Intercept)               -1.95       0.12  -16.70     0.00
## Estado_CivilDivorciado    -0.24       0.22   -1.10     0.27
## Estado_CivilSoltero        0.88       0.16    5.57     0.00
PlotXTabs2(data = rotacion_seleccionada,x = Estado_Civil ,y = Rotación)

En cuanto a las personas divorciadas, el coeficiente estimado es de -0.24, lo que indica una probabilidad ligeramente menor de experimentar una rotacion en comparación con las personas casadas. Sin embargo, esta diferencia no es estadísticamente significativa, ya que el valor p es de 0.27, lo que implica que no se puede concluir con certeza que el estado civil de divorciado tenga un impacto importante en el evento.Por otro lado, el estado civil de soltero muestra un coeficiente positivo de 0.88, lo que sugiere que las personas solteras tienen una probabilidad significativamente mayor de rotacion en comparación con las casadas.

En resumen, mientras que ser soltero está fuertemente relacionado con una mayor probabilidad de que ocurra rotacion, no se encontró evidencia estadística que sugiera que las personas divorciadas difieran significativamente de las casadas en cuanto a este resultado. Estos hallazgos proporcionan información útil sobre cómo el estado civil afecta o no el tema de la rotacion.

Distancia_Casa

m_distancia <- glm(y ~ Distancia_Casa, data = rotacion_seleccionada, family = binomial)
round(summary(m_distancia)$coefficients, 2)
##                Estimate Std. Error z value Pr(>|z|)
## (Intercept)       -1.89       0.11  -16.97        0
## Distancia_Casa     0.02       0.01    2.97        0
PlotXTabs2(data = rotacion_seleccionada,x = Distancia_Casa ,y = Rotación)

Por cada unidad adicional de distancia (ya sea un kilómetro o una milla) desde la casa al lugar de trabajo, la estimación aumenta en 0.02. Este resultado es estadísticamente significativo, lo que significa que entre mas lejos se ubique la casa del empleado mayo es la posibilidad de cambiar de trabajo.

Edad

m_Edad <- glm(y ~ Edad, data = rotacion_seleccionada, family = binomial)
round(summary(m_Edad)$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
rotacion_biv$m_Edad=cut(rotacion_biv$Edad,breaks = c(0,30,40,50,60))
PlotXTabs2(data = rotacion_biv,x = m_Edad,y = Rotación)

El análisis muestra que, aunque el intercepto del modelo no es significativo, la edad tiene un efecto significativo en la probabilidad de que ocurra el evento de interés. A medida que las personas envejecen, su probabilidad de experimentar el evento disminuye de manera significativa. Este hallazgo sugiere que la edad podría ser un factor relevante a considerar en las intervenciones o políticas diseñadas para abordar el evento estudiado.

Ingreso Mensual

m_ingreso_mensual <- glm(y ~ Ingreso_Mensual, data = rotacion_seleccionada, family = binomial)
round(summary(m_ingreso_mensual)$coefficients, 4)
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)      -0.9291     0.1292 -7.1911        0
## Ingreso_Mensual  -0.0001     0.0000 -5.8793        0
rotacion_biv$Ingreso_Mensual_acu=cut(rotacion_biv$Ingreso_Mensual,breaks = c(1000,4000,8000,12000,16000,20000))
PlotXTabs2(data = rotacion_biv,x = Ingreso_Mensual_acu,y = Rotación)

Las personas que ganan menos a 4 millones son las personas que mas rotación presentan con un 25% y las personas que menos rotan son las que ganan por encima de 16 millones. Esto confirma nuestra hipotesis de que las personas con menos ingresos buscan cambiar rapidamente a un puesto con mejor remuneración.

4. Estimación del modelo

Realiza la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotacion (y=1 es si rotación, y=0 es no rotación) y las covariables las 6 seleccionadas en el punto 1. Interprete los coeficientes del modelo y la significancia de los parámetros.

modelo_logistico <- glm(y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + Ingreso_Mensual + Edad , data = rotacion_seleccionada, family = binomial)
summary(modelo_logistico)
## 
## Call:
## glm(formula = y ~ Genero + Estado_Civil + Cargo + Distancia_Casa + 
##     Ingreso_Mensual + Edad, family = binomial, data = rotacion_seleccionada)
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -3.430e+00  1.014e+00  -3.384 0.000715 ***
## GeneroM                       1.440e-01  1.559e-01   0.924 0.355659    
## Estado_CivilDivorciado       -2.060e-01  2.235e-01  -0.922 0.356660    
## Estado_CivilSoltero           8.166e-01  1.654e-01   4.938 7.91e-07 ***
## CargoDirector_Manofactura     1.013e+00  8.682e-01   1.166 0.243502    
## CargoEjecutivo_Ventas         2.006e+00  8.254e-01   2.430 0.015078 *  
## CargoGerente                  7.663e-01  8.561e-01   0.895 0.370729    
## CargoInvestigador_Cientifico  1.874e+00  9.092e-01   2.061 0.039328 *  
## CargoRecursos_Humanos         2.547e+00  9.336e-01   2.728 0.006368 ** 
## CargoRepresentante_Salud      1.039e+00  8.750e-01   1.187 0.235256    
## CargoRepresentante_Ventas     3.027e+00  9.370e-01   3.230 0.001237 ** 
## CargoTecnico_Laboratorio      2.398e+00  9.066e-01   2.645 0.008178 ** 
## Distancia_Casa                2.908e-02  8.888e-03   3.272 0.001068 ** 
## Ingreso_Mensual               1.858e-05  4.378e-05   0.424 0.671352    
## Edad                         -2.530e-02  9.850e-03  -2.569 0.010199 *  
## ---
## 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: 1155.9  on 1455  degrees of freedom
## AIC: 1185.9
## 
## Number of Fisher Scoring iterations: 6

El modelo de regresión logística se aplicó para analizar factores que influyen en la rotación laboral, considerando variables como género, estado civil, cargo, distancia a la casa, ingreso mensual y edad. A continuación, se resumen los hallazgos más relevantes:

  1. Intercepto: Altamente significativo (-3.430), indicando que la probabilidad del evento es baja en ausencia de otros factores.

  2. Género: El coeficiente para masculino (0.144) no es significativo (p = 0.356).

  3. Estado Civil:

    • Soltero: Aumenta significativamente la probabilidad del evento (0.816, p < 0.001).
    • Divorciado: No significativo (-0.206, p = 0.357).
  4. Cargo:

    • Ejecutivo de Ventas (2.006, p = 0.015), Investigador Científico (1.874, p = 0.039), Recursos Humanos (2.547, p = 0.006), Representante de Ventas (3.027, p = 0.001) y Técnico de Laboratorio (2.398, p = 0.008) son significativos, sugiriendo mayor riesgo de rotación.
    • Otros cargos no mostraron significancia.
  5. Distancia a la Casa: Aumenta la probabilidad del evento (0.029, p = 0.001).

  6. Ingreso Mensual: No significativo (0.00001858, p = 0.671).

  7. Edad: Disminuye la probabilidad del evento (-0.0253, p = 0.010).

En resumen, las variables significativas que afectan la rotación laboral incluyen el estado civil (ser soltero), ciertos cargos (como ejecutivo de ventas y recursos humanos), la distancia a la casa y la edad. Estos factores deben ser considerados en las estrategias para gestionar la rotación en la organización.

5. Evaluación

Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC.

pred_probabilidades <- predict(modelo_logistico, type = "response")
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(rotacion_seleccionada$y, pred_probabilidades)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases

Graficar la Curva ROC:

plot(curva_roc, main="Curva ROC", col="red", lwd=2)
abline(h=0, v=1, col="black")

El AUC es del 71.8%, lo que sugiere que el modelo funciona bien para diferenciar entre los empleados con alta probabilidad de rotación y aquellos que no la tienen. Esto significa que tiene un poder predictivo moderado para distinguir entre las dos categorías de la variable dependiente, ya que es superior a 0.5, que es el umbral que indica predicciones aleatorias. Además, el intervalo de confianza del 95% sugiere que hay una alta probabilidad de que el verdadero AUC se encuentre entre el 68.2% y el 75.4%.

6. Predicciones

Realiza una predicción la probabilidad de que un individuo (hipotético) rote y defina un corte para decidir si se debe intervenir a este empleado o no (posible estrategia para motivar al empleado).

Predecir un individuo con las siguientes características:

Genero: Hombre Estado civil: “Soltero” Cargo: Ventas Edad: 20 Antiguedad en el cargo: 2 años Ingreso mensual: 5000 Y se hace la predicción con estos valores.

Empleadox <- data.frame(
                             Genero = "M",
                             Estado_Civil = "Soltero",
                             Cargo = "Ejecutivo_Ventas",
                             Distancia_Casa = 5,
                             Ingreso_Mensual = 5000,
                             Edad = 32)

Una vez definidas las variables procedemos a ejecutar nuestro modelo.

prediccion <- predict(modelo_logistico, newdata = Empleadox, type = "response")
print(prediccion)
##         1 
## 0.2622282

El resultado indica que el individuo tiene una probabilidad de 26.2% de rotar, es decir las probabilidades son bajas.

Empleadox <- data.frame(
                             Genero = "F",
                             Estado_Civil = "Soltero",
                             Cargo = "Tecnico_Laboratorio",
                             Distancia_Casa = 5,
                             Ingreso_Mensual = 5000,
                             Edad = 32)
prediccion <- predict(modelo_logistico, newdata = Empleadox, type = "response")
print(prediccion)
##         1 
## 0.3128199

El resultado indica que el individuo tiene una probabilidad de 31.2% de rotar, es decir las probabilidades son bajas.

7. Conclusiones

Al examinar los resultados relacionados con el estado civil, se observa que las personas solteras tienden a rotar más. Esto se puede atribuir a la búsqueda de nuevas oportunidades y a la falta de responsabilidades personales que les impidan cambiar de trabajo. Muchos jóvenes no permanecen en sus empleos porque no ven un futuro en ellos. Por lo tanto, se sugiere motivar a estos empleados mediante incentivos económicos, oportunidades educativas y otros beneficios que promuevan su desarrollo personal y profesional. Además, es importante ofrecer una ruta de carrera dentro de la empresa que les permita visualizar sus posibilidades de crecimiento según su desempeño

Por otro lado, las variables “Ingreso_Mensual” y “Distancia_Casa” son áreas donde la empresa puede tener un impacto directo. Ajustar los salarios o incentivar la compra de vivienda cercana al trabajo podría ser una estrategia efectiva para reducir la rotación de empleados. Aunque la implementación de estas medidas puede requerir una inversión inicial, es fundamental que la empresa considere los beneficios a largo plazo. La rotación de personal implica costos, como la pérdida de conocimiento especializado, una disminución en la productividad durante la adaptación de los nuevos empleados y el tiempo que necesitan para alcanzar su máximo rendimiento. Por lo tanto, cualquier estrategia que logre disminuir la rotación podría resultar rentable para la organización.

El salario también influye significativamente en la rotación, ya que las personas que ganan hasta dos salarios mínimos son las más propensas a dejar sus trabajos. La empresa debe revisar su estructura salarial y ajustarla si es necesario, además de fomentar que los empleados mejoren su desempeño y continúen su educación para ascender dentro de la organización y obtener mayores ingresos. Otra solución podría ser ofrecer bonos en fechas especiales o recompensar económicamente a aquellos que cumplan ciertas metas.