A continuación se revisará un caso sobre la rotación de empleados.

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.

# Carga de datos:

library(paqueteMODELOS)
library(dplyr)
data("rotacion")
glimpse(rotacion)
## Rows: 1,470
## Columns: 24
## $ Rotación                    <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad                        <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios`         <chr> "Raramente", "Frecuentemente", "Raramente"…
## $ Departamento                <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
## $ Distancia_Casa              <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación                   <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación             <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
## $ Satisfacción_Ambiental      <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero                      <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
## $ Cargo                       <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
## $ Satisfación_Laboral         <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil                <chr> "Soltero", "Casado", "Soltero", "Casado", …
## $ Ingreso_Mensual             <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores         <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra                 <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral         <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia            <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones              <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida     <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad                  <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo            <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción       <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe  <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …

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. Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).

Respuesta:

1.1 Variabes cuantitativas:

  • Edad: puede influir en la rotación porque empleados más jóvenes podrían estar en una fase de exploración de su carrera y, por lo tanto, inclinarse a cambiar de trabajo en busca de nuevas oportunidades o experiencias. Los empleados mayores podrían buscar estabilidad o estar menos dispuestos a cambiar por mantenerse en su zona de confort o por estar cercanos a la jubilación.Hipótesis: Que las personas más jovenes tienen mayor posibilidad de rotación que los mayores.

  • Ingreso mensual: Los empleados que consideran que su compensación no es adecuada, podrían buscar otro lugar para cambiar de posición dentro de la organización, especialmente si perciben que otras posiciones ofrecen mejor remuneración por responsabilidades similares.Hipótesis: empleados con menor ingreso mensual tienen mayor posibilidad de rotación que aquellos con mayor ingreso.

  • Antigüedad en el trabajo: podría estar inversamente relacionada con la rotación, puesto que los empleados con más tiempo en la empresa pueden tener más inversiones en forma de beneficios acumulados, conocimiento institucional o lealtad a la organización. Hipótesis: Los empleados con menor antigüedad tienen menor rotación que los empleados con mayor antigüedad

1.2 Variables categóricas:

  • Horas extra: Se espera que las horas extra se relacionen con la rotación ya que las personas podrían desgastarse mas al trabajar horas extra y descuidan aspectos personales. La hipótesis es que las personas que trabajan horas extra tienen mayor posibilidad de rotar que las que no trabajan extra.

  • Estado Civil: los trabajadores con compromisos familiares pueden valorar la estabilidad y la seguridad laboral y, por lo tanto, podrían ser menos propensos a la rotación. Hipótesis: los trabajadores casados tienen menor probabilidad de rotación que los empleados solteros o divorciados.

  • Viaje de Negocios: al viajar frecuentemente, los trabajadores pueden experimentar un mayor estrés y una menor satisfacción con el equilibrio entre la vida laboral y personal, lo que podría aumentar la probabilidad de rotación. Hipótesis: Los trabajadores que viajan frecuentemente tienen mayor probabilidad de rotación que aquellos que no viajan o que viajan raramente.

2 Análisis Univariado.

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

Respuesta:

# Se confirma si hay datos faltantes:
library(mice)
grafico <- md.pattern(rotacion, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

Con el gráfico anterior se confirma que no hay datos faltantes en el dataset.

2.1 Variabes cuantitativas:

Se continúa con las estadísticas descriptivas:

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

Gráficos de variables seleccionadas en la hipótesis:

par(mfrow = c(1, 3))
hist(rotacion$Edad, main = "Histograma de Edad", xlab = "Edad", col = "#13B3C1")
hist(rotacion$Ingreso_Mensual, main = "Histograma de Ingreso Mensual", xlab = "Ingreso mensual", col ="#FE3F75")
hist(rotacion$Antigüedad, main = "Histograma de Antigüedad", xlab = "Antigüedad", col ="#66ADA4")

Para identificar visualmente si existen valores extremos en estas variables, se realiza un boxplot:

par(mfrow = c(1, 3))
boxplot(rotacion$Edad, main = "Edad de trabajadores", col = "#13B3C1")
boxplot(rotacion$Ingreso_Mensual, main = "Ingreso Mensual", col = "#FE3F75")
boxplot(rotacion$Antigüedad, main = "Antigüedad", col = "#66ADA4")

  • La variable edad va desde los 18 hasta los 60 años con un promedio de 36,9 y una mediana de 26 años. Un 25% de ellos tiene menos de 30 años y otro 25% tiene entre 43 y 60 años. No se observa una distribución normal, se identifica un pequeño sesgo a la derecha.No tiene valores extremos.

  • El Ingreso mensual varía entre 1.009 y 19.999 con media de 6503 y mediana de 4919. No se observa una distribución normal. Esta variable tiene outliers superiores.

  • La variable antiguedad va desde 0 hasta 40 años,la antigüedad promedio es de 5 años y la mediana de 5 años. El 25% tiene menos de 3 años de antiguedad y otro 25% tiene entre 9 y 40 años. Esta variable tiene valores extremos superiores.

En relación con las demás variables, se encuentra:

  • La distancia a la casa va desde 1 hasta 29, el promedio de distancia es de 9 KM, el 25% de los empleados viven entre 14 y 29 (km?) de distancia

  • El % de aumento salarial va desde 11 hasta 25%, el promedio es de 15%.

  • En relación con los años de experiencia, van desde 0 hasta 40 años, el promedio de trabajadores cuenta con 11 años de experiencia, la mitad de los trabajadores tiene más de 10 años de experiencia.

  • La antiguedad en el cargo varía entre 0 y 18 años, el promedio de los trabajadores tiene una antigüedad de 4,2 años. La mitad de los trabajadores tiene menos de 5 años de antigüedad en su cargo.

  • La cantidad de capacitaciones recibidas va desde 0 hasta 6 en el periodo de tiempo evaluado. En promedio se brindan 2,7 capacitaciones en dicho periodo.

  • El 25% de los trabajadores lleva 0 años desde su última promoción, el mayor tiempo desde la última promoción es de 15 años. El 50% ha sido promovido hace más de un año.

  • Con el mismo jefe han estado desde 0 hasta 17 años, el promedio de trabajadores lleva más de 4 años y el 50% lleva menos de 3 años.

2.2 Variables categóricas:

Resultado esperado: Rotación

freq(rotacion$Rotación)
## Frequencies  
## rotacion$Rotación  
## Type: Character  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##          No   1233     83.88          83.88     83.88          83.88
##          Si    237     16.12         100.00     16.12         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
rot <- table(rotacion$Rotación)

posiciones_barras <- barplot(rot,
                             main = "Rotación",
                             xlab = "Índice",
                             ylab = "Rotación",
                             col = "skyblue",
                             border = "darkblue")

valores_rotacion <- as.numeric(rot)

text(x = posiciones_barras, 
     y = valores_rotacion + max(valores_rotacion) * 0.01,  
     labels = valores_rotacion, 
     pos = 3, 
     cex = 0.9)

El 83% de los trabajadores no tiene rotación con un total de 1233 trabajadores, el 16,1% Si rota (n=237)

Viaje de negocios:

library(flextable)

viajen <- table(rotacion$`Viaje de Negocios`)# número de casos por categoría

porcentajes <- prop.table(viajen) * 100 # porcentajes

tabulacion <- data.frame(
  Viaje_de_Negocios = names(viajen), 
  Total = as.integer(viajen),
  Porcentaje = sprintf("%.2f%%", round(porcentajes, 2))  # Formateamos los porcentajes como texto
)

tabulacion <- tabulacion[order(-tabulacion$Total), ]# Ordenar la tabla por Total

ft <- flextable(tabulacion)
ft <- align(ft, align = "center", part = "all") # Centra todo el texto
ft <- bg(ft, part = "header", bg = "#4F81BD") # Fondo del encabezado
ft <- color(ft, part = "header", color = "white") # Color del texto en el encabezado

ft

Viaje_de_Negocios

Total

Porcentaje

Raramente

1,043

70.95%

Frecuentemente

277

18.84%

No_Viaja

150

10.20%

Gráfica de barras:

library(plotly)

turquesa_paleta <- colorRampPalette(c("#40E0D0", "#86BEDA", "#006A89"))(length(viajen))

p <- plot_ly(x = names(viajen), y = porcentajes, type = 'bar',
             marker = list(color = turquesa_paleta),
             text = ~viajen,  
             textposition = 'outside',  
             hoverinfo = 'text',  
             texttemplate = '%{text}') %>%  
  layout(title = 'Distribución de Viaje de Negocios',
         xaxis = list(title = 'Categoría'),
         yaxis = list(title = 'Porcentaje'))

p

El 71% de los empleados viaja raramente (n=1043). El 19% viaja frecuentemente (n=277) y el 10% restante no viaja.

Horas Extra:

horas <- table(rotacion$Horas_Extra)
porcentajes <- prop.table(horas) * 100 # porcentajes

horase <- data.frame(
  Horas_Extra = names(horas), 
  Total = as.integer(horas),
  Porcentaje = sprintf("%.2f%%", round(porcentajes, 2)) 
)

horase <- horase[order(-horase$Total), ]# Ordenar la tabla por Total

hr <- flextable(horase)
hr <- align(hr, align = "center", part = "all") 
hr <- bg(hr, part = "header", bg = "#4F81BD") 
hr <- color(hr, part = "header", color = "white") 

hr

Horas_Extra

Total

Porcentaje

No

1,054

71.70%

Si

416

28.30%

el 71,7% de los empleados no trabajan horas extra (n= 1054), el 28.5% restante sí.

Estado civil:

civil <- table(rotacion$Estado_Civil)

porcentajes <- prop.table(civil) * 100 # porcentajes

ecivil <- data.frame(
  Estado_Civil = names(civil), 
  Total = as.integer(civil),
  Porcentaje = sprintf("%.2f%%", round(porcentajes, 2)) 
)

ecivil <- ecivil[order(-ecivil$Total), ]# Ordenar la tabla por Total

ec <- flextable(ecivil)
ec <- align(ec, align = "center", part = "all") 
ec <- bg(ec, part = "header", bg = "#4F81BD") 
ec <- color(ec, part = "header", color = "white") 

ec

Estado_Civil

Total

Porcentaje

Casado

673

45.78%

Soltero

470

31.97%

Divorciado

327

22.24%

El 45.7% de los empleados son casados (n=673), el 32% es soltero (n= 470) y el 22% restante es divorciado.

Se exploran los resultados de las demás variables con tablas de frecuencias:

# Resultados de Departamento: EL 65.3% de los empleados estan en IyD, el 30.3% en ventas y el 4,2% restante en RH
freq (rotacion$Departamento)
## Frequencies  
## rotacion$Departamento  
## Type: Character  
## 
##                Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ------------ ------ --------- -------------- --------- --------------
##          IyD    961     65.37          65.37     65.37          65.37
##           RH     63      4.29          69.66      4.29          69.66
##       Ventas    446     30.34         100.00     30.34         100.00
##         <NA>      0                               0.00         100.00
##        Total   1470    100.00         100.00    100.00         100.00
# Resultados de Educación (1=primaria, 2=secundaria, 3=técnico/tecnólogo 4=pregrado y 5=posgrado): En los tres resultados mas frecuentes se encuentra que el 38% tiene estudios  de técnico/tecnólogo y el 27% de pregrado y el 19% de secundaria.
freq(rotacion$Educación)
## Frequencies  
## rotacion$Educación  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           1    170     11.56          11.56     11.56          11.56
##           2    282     19.18          30.75     19.18          30.75
##           3    572     38.91          69.66     38.91          69.66
##           4    398     27.07          96.73     27.07          96.73
##           5     48      3.27         100.00      3.27         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
# Resultados de Campo de educación: En los tres m'as frecuentes se observa que el 41% se relaciona con el campo de ciencias, el 31% con el de la salud y el 10.8% en mercadeo.
freq(rotacion$Campo_Educación)
## Frequencies  
## rotacion$Campo_Educación  
## Type: Character  
## 
##                     Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------------- ------ --------- -------------- --------- --------------
##          Ciencias    606     41.22          41.22     41.22          41.22
##       Humanidades     27      1.84          43.06      1.84          43.06
##          Mercadeo    159     10.82          53.88     10.82          53.88
##              Otra     82      5.58          59.46      5.58          59.46
##             Salud    464     31.56          91.02     31.56          91.02
##          Tecnicos    132      8.98         100.00      8.98         100.00
##              <NA>      0                               0.00         100.00
##             Total   1470    100.00         100.00    100.00         100.00
# Resultados de Satisfacción ambiental (1=Muy insatisfecho, 2=insatisfecho, 3=satisfecho y 4=Muy insatisfecho): Los niveles de satisfaccion 3 y 4 se clasificaron cada uno en el 30% de los empleados.
freq(rotacion$Satisfacción_Ambiental)
## Frequencies  
## rotacion$Satisfacción_Ambiental  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           1    284     19.32          19.32     19.32          19.32
##           2    287     19.52          38.84     19.52          38.84
##           3    453     30.82          69.66     30.82          69.66
##           4    446     30.34         100.00     30.34         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
# Resultados de Género: La mayoria son hombres con el 60% (n=882)
freq(rotacion$Genero)
## Frequencies  
## rotacion$Genero  
## Type: Character  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           F    588     40.00          40.00     40.00          40.00
##           M    882     60.00         100.00     60.00         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
# Resultados de Cargo: El cargo con mayor frecuencia de empleados es ejecutivo de ventas con el 22,1% (n=326) seguido de investigador cientifico con 19.8% (n=292)
freq(rotacion$Cargo)
## Frequencies  
## rotacion$Cargo  
## Type: Character  
## 
##                                 Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------------------------- ------ --------- -------------- --------- --------------
##        Director_Investigación     80      5.44           5.44      5.44           5.44
##          Director_Manofactura    145      9.86          15.31      9.86          15.31
##              Ejecutivo_Ventas    326     22.18          37.48     22.18          37.48
##                       Gerente    102      6.94          44.42      6.94          44.42
##       Investigador_Cientifico    292     19.86          64.29     19.86          64.29
##              Recursos_Humanos     52      3.54          67.82      3.54          67.82
##           Representante_Salud    131      8.91          76.73      8.91          76.73
##          Representante_Ventas     83      5.65          82.38      5.65          82.38
##           Tecnico_Laboratorio    259     17.62         100.00     17.62         100.00
##                          <NA>      0                               0.00         100.00
##                         Total   1470    100.00         100.00    100.00         100.00
# Resultados de Satisfacción laboral (1=Muy insatisfecho, 2=insatisfecho, 3=satisfecho y 4=Muy insatisfecho):
freq(rotacion$Satisfación_Laboral)
## Frequencies  
## rotacion$Satisfación_Laboral  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           1    289     19.66          19.66     19.66          19.66
##           2    280     19.05          38.71     19.05          38.71
##           3    442     30.07          68.78     30.07          68.78
##           4    459     31.22         100.00     31.22         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
# Resultados de Rendimiento laboral (1= bajo, 2=medio, 3=alto, 4=Muy alto): Todos los empleados tienen rendimiento entre alto y muy alto
freq(rotacion$Rendimiento_Laboral)
## Frequencies  
## rotacion$Rendimiento_Laboral  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           3   1244     84.63          84.63     84.63          84.63
##           4    226     15.37         100.00     15.37         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00
# Resultado de Equilibrio trabajo - vida (1=Muy bajo, 2=bajo, 3=Medio, 4=alto): La mayor proporción de empleados se consideran muy insatisfechos con el 31% (n= 459) seguido de satisfecho con el 30% (n=442)
freq(rotacion$Equilibrio_Trabajo_Vida)
## Frequencies  
## rotacion$Equilibrio_Trabajo_Vida  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##           1     80      5.44           5.44      5.44           5.44
##           2    344     23.40          28.84     23.40          28.84
##           3    893     60.75          89.59     60.75          89.59
##           4    153     10.41         100.00     10.41         100.00
##        <NA>      0                               0.00         100.00
##       Total   1470    100.00         100.00    100.00         100.00

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 1.

Respuesta:

Se realiza un análisis bivariado con las variables seleccionadas en el numeral 1 y la variable respuesta (rotación):

3.1 Rotación con Variables Cuantitativas:

Edad y Rotación:

library(ggplot2)

ggplot(rotacion, aes(x = Rotación, y = Edad, fill= Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Edad según Rotación",
       x = "Rotación",
       y = "Edad") +
  scale_fill_manual(values = c("Si" = "#40E0D0", "No" = "#006A89"))

El gráfico muestra que hay una edad menor en el grupo que presenta rotación con algunos valores extremos, impresiona que son diferentes las distribuciones de edad en ambos grupos.

Para determinar si la edad es estadísticamente diferente en los grupos de rotación, se puede realizar una prueba estadística, dado que no calculamos la normalidad, utilizamos Wilcoxon

wilcox.test(Edad ~ Rotación, data = rotacion)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Edad by Rotación
## W = 185366, p-value = 5.281e-11
## alternative hypothesis: true location shift is not equal to 0

Con el resultado de p-value = 5.281e-11 podemos concluir que hay una diferencia estadísticamente significativa en las edades entre los dos grupos de “Rotación”

Rotación e Ingreso mensual:

library(ggplot2)
ggplot(rotacion, aes(x = Rotación, y = Ingreso_Mensual, fill = Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Ingreso Mensual según Rotación",
       x = "Rotación",
       y = "Ingreso Mensual") +
  scale_fill_manual(values = c("Si" = "#40E0D0", "No" = "#006A89"))

Al observar la gráfica, se identifica que las personas con rotación, tienen un ingreso mensual menor que aquellos que no rotan. Aplicamos la prueba de Wilcoxon para identificar si estos dos grupos son estadísticamente diferentes. En ambos grupos hay valores extremos superiores de ingreso.

wilcox.test(Ingreso_Mensual ~ Rotación, data = rotacion)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Ingreso_Mensual by Rotación
## W = 191601, p-value = 2.951e-14
## alternative hypothesis: true location shift is not equal to 0

Con el resultado estadístico obtenido, se confirma que sí hay diferencias significativas en el ingreso mensual de los trabajadores que no rotan y los que sí rotan.

Antigüedad en el trabajo y Rotación:

ggplot(rotacion, aes(x = Rotación, y = Antigüedad, fill = Rotación)) +
  geom_boxplot() +
  labs(title = "Distribución de Antigüedad según Rotación",
       x = "Rotación",
       y = "Antigüedad") +
  scale_fill_manual(values = c("Si" = "#40E0D0", "No" = "#006A89"))

Igual que con las variables anteriores, se observan diferencias en Antigüedad entre los trabajadores que rotan y los que no rotan, identificando rotación en el grupo con menor Antigüedad.En ambos grupos se identifican valores extremos.

wilcox.test(Antigüedad ~ Rotación, data = rotacion)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Antigüedad by Rotación
## W = 189639, p-value = 2.916e-13
## alternative hypothesis: true location shift is not equal to 0

Con el resultado estadístico obtenido, se confirma que sí hay diferencias significativas en la antigüedad de los trabajadores que no rotan y los que sí rotan.

3.2 Rotación con Variables categóricas:

Horas extra y Rotación:

ggplot(data = rotacion, aes(x = Rotación, fill = `Horas_Extra`)) +
  geom_bar(position = "dodge") +
  labs(title = "Rotación y Horas Extra",
       x = "Rotación",
       y = "Frecuencia",
       fill = "Horas Extra")

En el grupo que no tiene rotación, hay mayor frecuencia de trabajadores que no realizan horas extra. En el grupo que sí tiene rotación, hay más trabajadores que sí realizaron horas extra. Se puede confirmar esto en una tabla de 2X2 y confirmar si ay diferencia estadística con la prueba de chi2

# Crear la tabla de contingencia
Hor <- table(rotacion$Rotación, rotacion$`Horas_Extra`)

Hor
##     
##       No  Si
##   No 944 289
##   Si 110 127

Dado que se cumple el supuesto requerido para aplicar la prueba de Chi2 de esperar al menos 5 observaciones en el 80% de las celdas de la tabla de contingencia, se procede a aplicar la prueba:

test_chi <- chisq.test(Hor)
test_chi
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  Hor
## X-squared = 87.564, df = 1, p-value < 2.2e-16

El Chi2 se utiliza para determinar si hay una asociación significativa entre dos variables categóricas. El p-value < 2.2e-16 indica que hay evidencia estadística suficiente para rechazar la hipótesis nula de que no hay asociación entre las variables “Rotación” y “Horas Extra”. Esto sugiere que existe una asociación significativa entre si un empleado realiza horas extra y si experimenta rotación.

Estado civil y Rotación:

ggplot(data = rotacion, aes(x = Rotación, fill = `Estado_Civil`)) +
  geom_bar(position = "dodge") +
  labs(title = "Rotación y Estado Civil",
       x = "Rotación",
       y = "Frecuencia",
       fill = "Estado Civil")

En el grupo de no rotación, la mayor frecuencia de empleados se encuentra en el grupo de casados y en segundo lugar de solteros. En el grupo que sí presenta rotación, hay una mayor frecuencia de empleados solteros y en segundo lugar los casados. están invertidos en relación con el grupo de no rotación. El grupo de divorciados es el tercero en ambos grupos.

Ecv <- table(rotacion$Rotación, rotacion$`Estado_Civil`)
Ecv
##     
##      Casado Divorciado Soltero
##   No    589        294     350
##   Si     84         33     120

Se cumple el supuesto de frecuencia en cada celda de la tabla de contingencia, se procede a calcular el Chi2:

test_chiEcv <- chisq.test(Ecv)
test_chiEcv
## 
##  Pearson's Chi-squared test
## 
## data:  Ecv
## X-squared = 46.164, df = 2, p-value = 9.456e-11

El valor p muy bajo permite rechazar la hipótesis nula, que sostiene que no hay asociación entre las variables “Rotación” y “Estado Civil”. Esto significa que hay evidencia estadística suficiente para afirmar que existe una relación significativa entre estas variables. Esto no se puede confirmar como causalidad.

Viaje de Negocios y Rotación:

ggplot(data = rotacion, aes(x = Rotación, fill = `Viaje de Negocios`)) +
  geom_bar(position = "dodge") +
  labs(title = "Rotación y Viaje de negocios",
       x = "Rotación",
       y = "Frecuencia",
       fill = "Viaje de Negocios")

Al observar la gráfica, se identifica un comportamiento similar de viaje de negocios en el grupo que presenta rotación y el grupo que no rota. La mayoría de empleados en cada grupo raramente viaja, seguido del grupo que viaja frecuentemente y por último el grupo que no viaja.

Vj <- table(rotacion$Rotación, rotacion$`Viaje de Negocios`)
Vj
##     
##      Frecuentemente No_Viaja Raramente
##   No            208      138       887
##   Si             69       12       156

La tabla de contingencia de 3x2 confirma lo explicado a través del gráfico. All cumplir el supuesto de frecuencia en cada celda, se calcula el Chi2.

test_chiVj <- chisq.test(Vj)
test_chiVj
## 
##  Pearson's Chi-squared test
## 
## data:  Vj
## X-squared = 24.182, df = 2, p-value = 5.609e-06

Con el resultado del p, se concluye que las diferencias identificadas en los grupos de rotación no son debidas al azar. Sí hay una diferencia estadísticamente significativa en ambos grupos.

4 Partición de los datos.

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.

Respuesta:

Para realizar la partición de los datos para entrenar el modelo, primero se define un nuevo dataframe solo con las variables seleccionadas previamente.

4.1 Preparación de variables:

df <- rotacion[c("Edad", "Ingreso_Mensual", "Antigüedad", 
                                   "Estado_Civil", "Horas_Extra", 
                                   "Viaje de Negocios", "Rotación")]

head(df)

Se transforman las variables categóricas a numéricas:

Se recodifican las variables categóricas Estado civil, Horas Extra y Viaje de negocios. Dado que no tienen un orden jerárquico, se recodifican Estado Civil y Viaje de negocios como variables dummies:

# Recodificar "Estado_Civil" a variables dummy
estado_civil_dummies <- model.matrix(~ Estado_Civil - 1, data = df)

# Unir las nuevas variables dummy al dataframe original (asegúrate de no incluir la variable original para evitar multicolinealidad)
df <- cbind(df, estado_civil_dummies)
# Recodificar "Horas extra"

df$Horas_Extra <- ifelse(df$Horas_Extra == "Si", 1, 0)
# Recodificar "Viaje de Negocios" a variables dummy
Viaje_dummies <- model.matrix(~ `Viaje de Negocios` - 1, data = df)

# Unir las nuevas variables dummy al dataframe original 
df <- cbind(df, Viaje_dummies)

# Eliminar las variables categóricas originales
df <- df[, !(names(df) %in% c("Estado_Civil", "Viaje de Negocios"))]
head(df)
str(df)
## 'data.frame':    1470 obs. of  11 variables:
##  $ Edad                             : num  41 49 37 33 27 32 59 30 38 36 ...
##  $ Ingreso_Mensual                  : num  5993 5130 2090 2909 3468 ...
##  $ Antigüedad                       : num  6 10 0 8 2 7 1 1 9 7 ...
##  $ Horas_Extra                      : num  1 0 1 1 0 0 1 0 0 0 ...
##  $ Rotación                         : chr  "Si" "No" "Si" "No" ...
##  $ Estado_CivilCasado               : num  0 1 0 1 1 0 1 0 0 1 ...
##  $ Estado_CivilDivorciado           : num  0 0 0 0 0 0 0 1 0 0 ...
##  $ Estado_CivilSoltero              : num  1 0 1 0 0 1 0 0 1 0 ...
##  $ `Viaje de Negocios`Frecuentemente: num  0 1 0 1 0 1 0 0 1 0 ...
##  $ `Viaje de Negocios`No_Viaja      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ `Viaje de Negocios`Raramente     : num  1 0 1 0 1 0 1 1 0 1 ...

Dado que utilizamos la librería caret, se mantiene la variable respuesta como Si y No y no se reemplaza por 1 y 0.

4.2 Partición de datos:

library(caret)

set.seed(123) 

particion <- createDataPartition(y = df$Rotación, p = 0.7, list = FALSE) # list = FALSE hace que la función devuelva un vector de índices en lugar de una lista

# Crear los conjuntos de datos de entrenamiento y prueba:
train <- df[particion, ]
test <- df[-particion, ]
# Se valida que los resultados en las categorías de respuesta hayan quedado asignadas en los diferentes conjuntos de datos:

table(df$Rotación)  # Revisar en el conjunto de datos completo
## 
##   No   Si 
## 1233  237
table(train$Rotación)  # Revisar en el conjunto de entrenamiento
## 
##  No  Si 
## 864 166
table(test$Rotación)  # Revisar en el conjunto de prueba
## 
##  No  Si 
## 369  71

4.3 Entrenamiento del modelo:

trainControl <- trainControl(method = "cv", number = 10) # Se incluye validación cruzada y 10 iteraciones

# Entrenar el modelo de regresión logística
modelo_logistico <- train(Rotación ~ ., data = train,
                          method = "glm",
                          family = "binomial",
                          trControl = trainControl)

# Mostrar el resultado del entrenamiento
print(modelo_logistico)
## Generalized Linear Model 
## 
## 1030 samples
##   10 predictor
##    2 classes: 'No', 'Si' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 927, 928, 928, 927, 927, 927, ... 
## Resampling results:
## 
##   Accuracy   Kappa    
##   0.8494994  0.2177855

El modelo predijo correctamente la categoría de “Rotación” en aproximadamente el 84.9% de los casos a través de la validación cruzada.

El coeficiente Kappa es una medida que compara la exactitud observada con la exactitud que se esperaría por azar, ajustando por el desequilibrio en la distribución de las clases. Un valor de Kappa de aproximadamente 0.21 sugiere una concordancia moderada.

summary(modelo_logistico)
## 
## Call:
## NULL
## 
## Coefficients: (2 not defined because of singularities)
##                                                         Estimate Std. Error
## (Intercept)                                           -1.373e-01  3.987e-01
## Edad                                                  -2.256e-02  1.226e-02
## Ingreso_Mensual                                       -6.806e-05  3.156e-05
## Antigüedad                                            -5.454e-02  2.269e-02
## Horas_Extra                                            1.413e+00  1.902e-01
## Estado_CivilCasado                                    -1.047e+00  2.099e-01
## Estado_CivilDivorciado                                -9.924e-01  2.591e-01
## Estado_CivilSoltero                                           NA         NA
## `\\`\\\\\\`Viaje de Negocios\\\\\\`Frecuentemente\\``  7.714e-01  2.151e-01
## `\\`\\\\\\`Viaje de Negocios\\\\\\`No_Viaja\\``       -1.144e+00  4.519e-01
## `\\`\\\\\\`Viaje de Negocios\\\\\\`Raramente\\``              NA         NA
##                                                       z value Pr(>|z|)    
## (Intercept)                                            -0.344 0.730677    
## Edad                                                   -1.840 0.065828 .  
## Ingreso_Mensual                                        -2.156 0.031059 *  
## Antigüedad                                             -2.404 0.016215 *  
## Horas_Extra                                             7.426 1.12e-13 ***
## Estado_CivilCasado                                     -4.988 6.11e-07 ***
## Estado_CivilDivorciado                                 -3.830 0.000128 ***
## Estado_CivilSoltero                                        NA       NA    
## `\\`\\\\\\`Viaje de Negocios\\\\\\`Frecuentemente\\``   3.586 0.000336 ***
## `\\`\\\\\\`Viaje de Negocios\\\\\\`No_Viaja\\``        -2.532 0.011329 *  
## `\\`\\\\\\`Viaje de Negocios\\\\\\`Raramente\\``           NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 909.69  on 1029  degrees of freedom
## Residual deviance: 756.90  on 1021  degrees of freedom
## AIC: 774.9
## 
## Number of Fisher Scoring iterations: 5

4.4 Interpretación de resultados:

El resultado arrojado muestra que para todas las variables calculadas hay una significancia estadística que indica asociación con la variable respuesta:

  • Edad: p-valor de 0.065. Es ligeramente superior al nivel de significancia

  • Ingreso_Mensual: p-valor de 0.031059 (*).

  • Antigüedad: -valor de 0.016215 (*).

  • Horas_Extra: p-valor muy pequeño (1.12e-13, marcado con ***), indicando una fuerte relación con la variable de respuesta.

  • Estado_CivilCasado: También muy significativo con un p-valor de 6.11e-07 (***).

  • Estado_CivilDivorciado: p-valor de 0.000128 (***).

  • Viaje de Negocios ‘Frecuentemente’: p-valor de 0.000336 (***).

  • Viaje de Negocios ‘No Viaja’: p-valor de 0.011329 (*).

Las variables de referencia no tienen cálculo de valor P.

En relación con el AIC (Criterio de Información de Akaike): Proporciona una medida de la calidad del modelo. Se obtuvo 774.9 En general, se prefieren los modelos con valores AIC más bajos.

Ahora se obtienen los coeficientes para interpretar mejor el modelo:

modelo_final <- modelo_logistico$finalModel
coeficientes <- coef(modelo_final)
ORs <- exp(coeficientes)

library(tidyverse)

# Crear un tibble con los coeficientes y los ORs
tabla_ORs_tibble <- tibble(
  Variable = names(coeficientes),
  Coeficiente = coeficientes,
  Odds_Ratio = ORs
)

tabla_ORs <- data.frame(
  Variable = names(coeficientes),
  Coeficiente = coeficientes,
  Odds_Ratio = ORs
)

errores_estandar <- sqrt(diag(vcov(modelo_final)))# Obtener los errores estándar de los coeficientes

# Definir el nivel de confianza, 95%
nivel_confianza <- 0.95
z <- qnorm((1 + nivel_confianza) / 2)  # Valor z para el nivel de confianza deseado

# Calcular los límites del intervalo de confianza en el espacio logarítmico

limite_inferior_log <- coeficientes - z * errores_estandar
limite_superior_log <- coeficientes + z * errores_estandar

# Exponenciar los límites para obtener los IC en el espacio de los ORs

limite_inferior_or <- exp(limite_inferior_log)
limite_superior_or <- exp(limite_superior_log)

# Añadir los IC al tibble
tabla_ORs_tibble <- tabla_ORs_tibble %>%
  mutate(
    IC_Inferior = limite_inferior_or,
    IC_Superior = limite_superior_or
  )

# O, para trabajar con data.frame
tabla_ORs$IC_Inferior <- limite_inferior_or
tabla_ORs$IC_Superior <- limite_superior_or

# Crear tabla
ft <- flextable(tabla_ORs)
ft <- ft %>%
  color(part = "body", color = "blue", i = ~ Odds_Ratio > 1) %>%
  bold(part = "header") %>%
  autofit()
ft

Variable

Coeficiente

Odds_Ratio

IC_Inferior

IC_Superior

(Intercept)

-0.1372564932

0.8717466

0.3990077

1.9045800

Edad

-0.0225604631

0.9776921

0.9544718

1.0014773

Ingreso_Mensual

-0.0000680596

0.9999319

0.9998701

0.9999938

Antigüedad

-0.0545427932

0.9469180

0.9057333

0.9899754

Horas_Extra

1.4125977626

4.1066096

2.8284885

5.9622806

Estado_CivilCasado

-1.0470050360

0.3509874

0.2326011

0.5296283

Estado_CivilDivorciado

-0.9923960763

0.3706874

0.2230900

0.6159359

Estado_CivilSoltero

`\`\\\`Viaje de Negocios\\\`Frecuentemente\``

0.7713576052

2.1627004

1.4186833

3.2969112

`\`\\\`Viaje de Negocios\\\`No_Viaja\``

-1.1444230202

0.3184076

0.1313149

0.7720628

`\`\\\`Viaje de Negocios\\\`Raramente\``

Interpretación de los OR:

Los ORs varían de 0 a infinito, donde:

  • Un OR = 1 indica que las odds de un evento son iguales en ambos grupos comparados.

  • Un OR mayor que 1 indica un aumento en las odds de un evento en el grupo de interés en comparación con el grupo de referencia.

  • Un OR menor que 1 indica una disminución en las odds de un evento en el grupo de interés en comparación con el grupo de referencia.

  • Intervalos de confianza: Cuando los intervalos de confianza de un Odds Ratio no incluyen el valor 1, esto indica que el efecto estimado (en este caso, la relación entre la variable predictora y la oportunidad de la variable de respuesta) es estadísticamente significativo al nivel de confianza establecido (comúnmente el 95%). Los Intervalos de confianza generados en la tabla presentan los valores en los que el OR puede variar con una confianza del 95%.

Dada la aclaración anterior, los resultados del modelo significan:

Nota: Los siguientes resultados presentados para cada variable son independientes del efecto de las demás covariables incluidas en el modelo.

  • Intercepto: Un OR de 0.87 para el intercepto no se interpreta de la misma manera que para otras variables. Este valor básicamente ajusta el modelo y no tiene una interpretación práctica directa sin el contexto de otras variables.

  • Edad: Un OR de 0.97 indica que por cada año adicional en la edad, la oportunidad de rotación disminuye en un 2.2% aproximadamente, manteniendo constantes las otras variables.El intervalo de confianza para este OR (0.9544718 a 1.0014773) cruza el valor 1, lo cual es consistente con el p-valor de 0.065. Un OR de 1 implicaría que la “Edad” no tiene efecto sobre la variable de respuesta, y dado que el intervalo de confianza incluye este valor, esto refuerza la idea de que no podemos estar seguros de la existencia de una asociación significativa entre la “Edad” y la rotación de los empleados.

  • Ingreso_Mensual: Un OR de 0.99 sugiere que por cada unidad incrementada en el ingreso mensual, la oportunidad de rotación disminuye muy ligeramente, prácticamente permaneciendo constantes.El intervalo de confianza está muy cerca del 1, lo que genera la inquietud si en realidad el ingreso mensual influye en la rotación.

  • Antigüedad: Un OR de 0.94 significa que por cada año adicional de antigüedad en la empresa, las oportunidades de rotación disminuyen en aproximadamente un 5.3%. A medida que las personas acumulan más tiempo en su puesto actual, se vuelven menos propensas a dejar su trabajo cada año. Ambos límites del intervalo de confianza son menores que 1, esto indica una asociación negativa significativa entre la antigüedad y la rotación de empleados.

  • Horas_Extra: Hacer horas extra aumenta la oportunidad de rotación 4.1 veces en comparación con aquellos que no realizan horas extra, lo que sugiere un fuerte efecto de las horas extra sobre la probabilidad de rotación.Ambos límites del intervalo de confianza son mayores que 1, esto sugiere que la variable predictora tiene una asociación positiva significativa con la oportunidad de ocurrencia de rotación.

  • Estado_CivilCasado/Divorciado: La oportunidad de rotación en los empleados casados es 0.35 veces la oportunidad de rotar que los solteros, estar casado reduce las odds de rotación en aproximadamente un 65% y la oportunidad de rotación de los divorciados es 0.37 veces la oportunidad de rotar que los solteros. Es decir, que estar casado o divorciado disminuye la oportunidad de rotar de puesto de trabajo en comparación con los solteros.Tanto para casados como divorciados, ambos límites del intervalo de confianza son menores que 1, esto indica una asociación negativa significativa entre la estar casado o divorciado y la rotación de empleados.

  • Viaje de Negocios: La oportunidad de rotar de aquellos empleados que viajan frecuentemente es 2.16 veces la oportunidad de rotar de los que viajan raramente, es decir que quienes viajan frecuentemente tienen más del doble de la oportunidad de rotar comparado con quienes viajan raramente. Ambos límites del intervalo de confianza son mayores que 1, esto sugiere que la variable predictora tiene una asociación positiva significativa con la oportunidad de ocurrencia de rotación. La oportunidad de rotar de aquellos empleados que No viajan es 0.31 veces la oportunidad de rotar de los que viajan raramente, No viajar por negocios reduce las odds de rotación en aproximadamente un 68% en comparación con los que viajan raramente.Ambos límites del intervalo de confianza son menores que 1, esto indica una asociación negativa significativa entre no viajar y la rotación de empleados.

5 Poder predictivo del modelo - Evaluación.

Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.

Respuesta:

5.1 AUC y ROC:

# Usando el modelo final para predecir las probabilidades en el conjunto de datos de prueba:
probabilidades_predichas <- predict(modelo_logistico, newdata = test, type = "prob")

# Cargar el paquete pROC
library(pROC)

# Calcular la curva ROC usando las probabilidades de la clase de interés y las etiquetas verdaderas

roc_resultado <- roc(test$Rotación, probabilidades_predichas[, "Si"])

# Calcular el AUC
auc_resultado <- auc(roc_resultado)
print(auc_resultado)
## Area under the curve: 0.7563
# Graficar la curva ROC
plot(roc_resultado, main = "Curva ROC", col = "#1f77b4")  
 
abline(a = 0, b = 1, lty = 2, col = "red")  

Resultado del AUC

En términos generales, un AUC:

  • Entre 0.5 y 0.7 se considera bajo.

  • Entre 0.7 y 0.9 se considera aceptable a excelente.

  • Mayor que 0.9 se considera sobresaliente.

Un AUC de 0.75 significa que hay aproximadamente un 75.63% de probabilidad de que el modelo clasifique correctamente un par aleatorio de observaciones, una de la clase positiva y otra de la clase negativa.Este modelo tiene una capacidad aceptable para distinguir entre los empleados que rotarán y los que no.

Curva ROC

La curva ROC es una representación gráfica de los valores de la tasa de falsos positivos (TFP o FPR) o 1-especificidad y en el eje de las ordenadas la tasa de verdaderos positivos (TVP o TPR) o también llamada sensibilidad, para diferentes valores del umbral de clasificación.

El área comprendida entre la curva ROC y la diagonal del cuadrado (AUC = 0.75), indica un buen ajuste del modelo de predicción.

5.2 Matriz de confusión:

Adicionalmente, se calcula la matriz de confusión para evaluar la capacidad de clasificación del modelo con el conjunto de prueba:

clases_predichas <- ifelse(probabilidades_predichas[, "Si"] > 0.5, "Si", "No")

test$Rotación <- factor(test$Rotación, levels = c("No", "Si"))


clases_predichas <- factor(clases_predichas, levels = c("No", "Si"))# Convertir las clasificaciones predichas en un factor con los mismos niveles

# Usar confusionMatrix de caret
library(caret)
matriz_confusion <- confusionMatrix(clases_predichas, test$Rotación)

print(matriz_confusion)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No  Si
##         No 359  60
##         Si  10  11
##                                           
##                Accuracy : 0.8409          
##                  95% CI : (0.8033, 0.8738)
##     No Information Rate : 0.8386          
##     P-Value [Acc > NIR] : 0.48            
##                                           
##                   Kappa : 0.1786          
##                                           
##  Mcnemar's Test P-Value : 4.724e-09       
##                                           
##             Sensitivity : 0.9729          
##             Specificity : 0.1549          
##          Pos Pred Value : 0.8568          
##          Neg Pred Value : 0.5238          
##              Prevalence : 0.8386          
##          Detection Rate : 0.8159          
##    Detection Prevalence : 0.9523          
##       Balanced Accuracy : 0.5639          
##                                           
##        'Positive' Class : No              
## 

Matriz de Confusión:

  • Negativos: El modelo predijo 359 casos correctamente como “No” (Verdaderos Negativos) y 10 casos incorrectamente como “Sí” (Falsos Positivos).

  • Positivos: El modelo predijo 11 casos correctamente como “Sí” (Verdaderos Positivos) y 60 casos incorrectamente como “No” (Falsos Negativos).

Estadísticas:

  • Accuracy: El 84.09% de todas las predicciones fueron correctas. El intervalo de confianza del 95% para la exactitud está entre 80.33% y 87.38%, lo que indica el rango en el que se espera que se encuentre la exactitud verdadera del modelo.

  • P-Value [Acc > NIR]: Con un p-valor de 0.48, no hay evidencia estadística suficiente para afirmar que la exactitud del modelo es mejor que la que se obtendría si simplemente se eligiera siempre la clase más frecuente.

  • Kappa: El valor de Kappa es 0.1786, lo que indica una concordancia mínima entre las predicciones y los valores reales, más allá del azar.

  • Sensibilidad: El 97.29% de los casos “No” reales fueron correctamente identificados por el modelo. Es una medida de la capacidad del modelo para detectar la clase “No”.A mayor sensibilidad menos falsos negativos, pero pueden aumentar los falsos positivos.

  • Especificidad: Solo el 15.49% de los casos “Sí” reales fueron correctamente identificados, lo que indica que el modelo tiene dificultades para detectar correctamente la clase “Sí”.

  • Pos Pred Value (Valor Predictivo Positivo): El 85.68% de las predicciones de “No” fueron correctas.

  • Neg Pred Value (Valor Predictivo Negativo): Mide la proporción de casos negativos reales (VN) en relación con el total de predicciones negativas correctas (VN + FN). El 52.38% de las predicciones de “Sí” fueron correctas, lo que es bastante bajo y sugiere que muchas predicciones de “Sí” eran realmente “No”.

  • Prevalencia: Indica que el 83.86% de las observaciones reales en el conjunto de datos de prueba son de la clase “No”.

  • Detection Rate: La tasa a la que el modelo detecta la clase “No” es 81.59%.

  • Detection Prevalence: El 95.23% de las predicciones del modelo fueron “No”.

  • Balanced Accuracy: La exactitud equilibrada es 56.39%, lo que refleja el promedio de la sensibilidad y la especificidad. Dado que la especificidad es muy baja, este valor también es relativamente bajo, lo que indica un desempeño no balanceado entre las clases.

6 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).

Respuesta:

  • El modelo realizado con el conjunto de prueba tiene una alta sensibilidad pero una especificidad muy baja, lo que significa que es muy bueno detectando la clase “No” pero no tanto detectando la clase “Sí”. Esto podría estar relacionado con el desbalance de las clases respuesta. Para mejorar esto, puede ser útil explorar estrategias para manejar el desequilibrio de clases, mejorar la característica o la selección de modelos, o aplicar técnicas de ponderación para mejorar la capacidad del modelo para detectar la clase “Sí”.

  • Entre las variables propuestas inicialmente, aunque en los análisis descriptivos iniciales se perciba diferencia en los grupos, no hay una validez estadística suficiente para establecer que el aumento en la edad de los trabajadores o el aumento en el ingreso influya en la rotación de los empleados.

  • Variables como trabajar horas extra o realizar viajes de negocios frecuentemente, se relacionan con una mayor oportunidad de rotación en los empleados.

  • Variables que incluyen en la menor rotación de empleados: El incremento en antigüedad, estado civil casado, divorciado (comparado con los solteros) o no realizar viaje de negocios (comparado con viajar raramente).

  • Si se desea bajar la rotación de los empleados en la empresa, se recomienda continuar estrategias de atracción del personal para aumentar la antigüedad laboral, disminuir la necesidad de trabajar horas extra, evaluar con detenimiento la necesidad de realización de viajes de negocio, de manera que se en lo posible, no se realicen; fomentar y apoyar la vida familiar de los empleados, dado que conformar o haber conformado una familia disminuye la rotación.