#install.packages("devtools")  solo la primera vez
#devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)
library(paqueteMODELOS)
library(dplyr)
library(plotly)
library(naniar)
library(mice)
library(plotly)
library(corrplot)
library(car)
library(caret)
library(Metrics)
library(tseries)
library(lmtest)
library(treemapify)
library(scales)
library(patchwork)
library(vcd) 
library(ltm)
library(pROC)

1 Punto 1

Primero se carga la base de datos para saber que variables se encuentran y de alli realizar la seleccion de las variables.

data("rotacion")
str(rotacion)
## tibble [1,470 × 24] (S3: tbl_df/tbl/data.frame)
##  $ Rotación                   : chr [1:1470] "Si" "No" "Si" "No" ...
##  $ Edad                       : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
##  $ Viaje de Negocios          : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
##  $ Departamento               : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
##  $ Distancia_Casa             : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
##  $ Educación                  : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
##  $ Campo_Educación            : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
##  $ Satisfacción_Ambiental     : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
##  $ Genero                     : chr [1:1470] "F" "M" "M" "F" ...
##  $ Cargo                      : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
##  $ Satisfación_Laboral        : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
##  $ Estado_Civil               : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
##  $ Ingreso_Mensual            : num [1:1470] 5993 5130 2090 2909 3468 ...
##  $ Trabajos_Anteriores        : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
##  $ Horas_Extra                : chr [1:1470] "Si" "No" "Si" "Si" ...
##  $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
##  $ Rendimiento_Laboral        : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
##  $ Años_Experiencia           : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
##  $ Capacitaciones             : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
##  $ Equilibrio_Trabajo_Vida    : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
##  $ Antigüedad                 : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
##  $ Antigüedad_Cargo           : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
##  $ Años_ultima_promoción      : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
##  $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...

Las 3 variables Categoricas que teoricamente pueden influir en la rotacion o salida de un empleado de la empresa son: ( Satisfaccion Laboral, el Cargo y el Rendimiento Laboral), por otra parte a nivel cuantitativo, las variables que pueden influir en la rotacion de los empleados son: (Distancia al trabajo, Trabajos anteriores y el Ingreso mensual), a continuacion se proporcionara las razones de porque se escogieron estas variables y que tipo de relacion se esperaria.

1.0.1 Variables categóricas:

  1. Satisfacción Laboral:

    • Influencia: Los empleados que no están satisfechos con su trabajo tienen más probabilidades de buscar nuevas oportunidades. La insatisfacción puede estar relacionada con varios factores como el ambiente laboral, la carga de trabajo, las políticas de la empresa, etc.

    • Relación esperada: la relacion es inversamente proporcional o negativa una baja satisfacción laboral debería estar asociada con una mayor rotación de empleados, ya que los trabajadores insatisfechos suelen tener más intención de abandonar la empresa.

  2. Cargo:

    • Influencia: Diferentes niveles jerárquicos o tipos de trabajo pueden tener tasas de rotación diferentes. Por ejemplo, los empleados en cargos operativos o de baja remuneración podrían enfrentar más presión o menores incentivos para permanecer.

    • Relación esperada: la relacion es inversamente proporcional o negativa Cargos con menores beneficios o menor crecimiento profesional podrían estar asociados a una mayor rotación. Mientras que, en puestos de mayor nivel, los empleados podrían ser más estables.

  3. Rendimiento Laboral:

    • Influencia: El desempeño laboral puede ser una señal importante para la empresa y el propio empleado sobre su ajuste al puesto. Un bajo rendimiento puede llevar al despido, o incluso el propio empleado puede sentirse insatisfecho si no cumple con las expectativas.

    • Relación esperada: La relacion es inversamente proporcional o negativa se espera que un bajo rendimiento esté asociado con una mayor rotación, ya sea por decisiones de la empresa o por autoexclusión del empleado.

1.0.2 Variables cuantitativas:

  1. Distancia al trabajo:

    • Influencia: Una mayor distancia al trabajo puede generar incomodidad, costos adicionales o menor calidad de vida, lo que puede aumentar la probabilidad de que el empleado busque alternativas más cercanas.

    • Relación esperada: La realcion es directamente proporcional a mayor distancia al trabajo, mayor probabilidad de rotación, ya que los empleados podrían preferir trabajos más cercanos a su lugar de residencia.

  2. Trabajos anteriores:

    • Influencia: El historial laboral puede reflejar la estabilidad del empleado en sus trabajos anteriores. Una persona que ha cambiado de empleo con frecuencia podría tener más probabilidades de hacerlo nuevamente.

    • Relación esperada: La relacion es directamente proporcional o positiva a mayor número de trabajos anteriores podría correlacionarse con una mayor rotación, ya que indica una tendencia a cambiar de empleador con mayor frecuencia.

  3. Ingreso mensual:

    • Influencia: Los empleados que sienten que su salario es insuficiente en relación con su trabajo o el mercado pueden estar motivados a buscar otros empleos mejor remunerados.

    • Relación esperada: La relacion es inversamente proporcional o negativa un menor ingreso mensual podría estar asociado con una mayor rotación, ya que los empleados podrían buscar alternativas que les ofrezcan una mejor compensación económica.

2 Punto 2

gg_miss_var(rotacion) # grafico de datos faltantes}

Se verifica que en la base de datos no existan datos faltantes, y tal como lo muestra el grafico no hay valores faltantes en ninguna de las columnas.

2.0.1 Analisis Univariado De Las Variables Categoricas

summarytools::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
# grafico de de tortas
# Datos
labels1 <- c("Si","No")
values1 <- c(16.12,83.88)

# Crear el gráfico de torta 3D con porcentajes adentro
torta2_3d <- plot_ly(labels = labels1, values = values1, type = "pie",
                    textinfo = "percent+label",
                    insidetextfont = list(color = "#FFFFFF"),
                    hoverinfo = "label+percent",
                    hole = 0.3,
                    marker = list(colors = c("red", "green")))

# Crear la figura
figura1 <- subplot(torta2_3d, margin = 0.04)

# se le agrega un titulo al grafico

figura1 <- figura1 %>%
  add_annotations(
    text = "Porcentaje de empleados que cambian de trabajo",
    x = 0.5,
    y = 1.08,
    xref = "paper",
    yref = "paper",
    showarrow = FALSE,
    font = list(size = 15)
  )

# Mostrar el gráfico
figura1

Como se puede observar en el siguiente grafico la mayoria de los trabajadores con un 83.9% no les gusta cambiar de trabajo.

summarytools::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
# grafico de de tortas
# Datos
labels1 <- c("Mujeres","Hombres")
values1 <- c(40,60)

# Crear el gráfico de torta 3D con porcentajes adentro
torta2_3d <- plot_ly(labels = labels1, values = values1, type = "pie",
                    textinfo = "percent+label",
                    insidetextfont = list(color = "#FFFFFF"),
                    hoverinfo = "label+percent",
                    hole = 0.3,
                    marker = list(colors = c("#FF3E96", "#00C5CD")))

# Crear la figura
figura2 <- subplot(torta2_3d, margin = 0.04)

# se le agrega un titulo al grafico

figura2 <- figura2 %>%
  add_annotations(
    text = "Porcentaje de Hombres y Mujeres en la empresa",
    x = 0.5,
    y = 1.08,
    xref = "paper",
    yref = "paper",
    showarrow = FALSE,
    font = list(size = 15)
  )

# Mostrar el gráfico
figura2

Tal como se evidencia en el grafico y la tabla de frecuencia, la mayoria de empleados son hombres representando un 60% y el resto son mujeres con un 40%

summarytools::freq(rotacion$`Viaje de Negocios`)
## Frequencies  
## rotacion$`Viaje de Negocios`  
## Type: Character  
## 
##                        Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## -------------------- ------ --------- -------------- --------- --------------
##       Frecuentemente    277     18.84          18.84     18.84          18.84
##             No_Viaja    150     10.20          29.05     10.20          29.05
##            Raramente   1043     70.95         100.00     70.95         100.00
##                 <NA>      0                               0.00         100.00
##                Total   1470    100.00         100.00    100.00         100.00
# grafico de de tortas
# Datos
labels1 <- c("Frecuentemente","No Viaja", "Raramente")
values1 <- c(18.84,10.20,70.95)

# Crear el gráfico de torta 3D con porcentajes adentro
torta2_3d <- plot_ly(labels = labels1, values = values1, type = "pie",
                    textinfo = "percent+label",
                    insidetextfont = list(color = "#FFFFFF"),
                    hoverinfo = "label+percent",
                    hole = 0.3,
                    marker = list(colors = c("#EED2EE", "#CD4F39","#EEEE00")))

# Crear la figura
figura3 <- subplot(torta2_3d, margin = 0.04)

# se le agrega un titulo al grafico

figura3 <- figura3 %>%
  add_annotations(
    text = "Porcentaje de Empleados que realiza viajes de negocio",
    x = 0.5,
    y = 1.08,
    xref = "paper",
    yref = "paper",
    showarrow = FALSE,
    font = list(size = 15)
  )

# Mostrar el gráfico
figura3

Como se puede observar en el grafico la mayoria de los empleados raramente realiza viajes de negocio esto representa un 71%.

summarytools::freq(rotacion$Estado_Civil)
## Frequencies  
## rotacion$Estado_Civil  
## Type: Character  
## 
##                    Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ---------------- ------ --------- -------------- --------- --------------
##           Casado    673     45.78          45.78     45.78          45.78
##       Divorciado    327     22.24          68.03     22.24          68.03
##          Soltero    470     31.97         100.00     31.97         100.00
##             <NA>      0                               0.00         100.00
##            Total   1470    100.00         100.00    100.00         100.00
# grafico de de tortas
# Datos
labels1 <- c("Casado","Divorciado", "Soltero")
values1 <- c(45.78,22.24,31.97)

# Crear el gráfico de torta 3D con porcentajes adentro
torta2_3d <- plot_ly(labels = labels1, values = values1, type = "pie",
                    textinfo = "percent+label",
                    insidetextfont = list(color = "#FFFFFF"),
                    hoverinfo = "label+percent",
                    hole = 0.3,
                    marker = list(colors = c("#00EE76", "#5CACEE","#EE9A49")))

# Crear la figura
figura4 <- subplot(torta2_3d, margin = 0.04)

# se le agrega un titulo al grafico

figura4 <- figura4 %>%
  add_annotations(
    text = "Porcentaje de empleados segun el estado civil",
    x = 0.5,
    y = 1.08,
    xref = "paper",
    yref = "paper",
    showarrow = FALSE,
    font = list(size = 15)
  )

# Mostrar el gráfico
figura4

Tal cual se evidencia en el siguiente grafico la mayoria de los empleados son casados representando un 45.8% seguido de los solteros que representan un 32% y de los divorciados con un 22.2%

summarytools::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
# Crear el dataframe 'plotdata' con la frecuencia y el porcentaje para 'Educación'
plotdata <- rotacion %>% 
  count(Educación) %>% 
  mutate(Nivel_Educacion = factor(Educación, 
                                  levels = c(1, 2, 3, 4, 5),
                                  labels = c("Primaria", "Secundaria", "Técnico/Tecnólogo", "Pregrado", "Posgrado")),
         prop = round(n * 100 / sum(n), 1))  # Calcular el porcentaje

# Crear el mapa de árbol con las etiquetas de los porcentajes y niveles de educación
ggplot(plotdata, aes(fill = Nivel_Educacion, area = n, label = paste(Nivel_Educacion, "\n", prop, "%"))) +
  geom_treemap() + 
  geom_treemap_text(colour = "white", place = "centre", grow = TRUE) +
  labs(title = "Distribución de los empleados por niveles educativos") +
  theme(legend.position = "none")  # Ocultar la leyenda

Tal como se puede observar en el siguiente mapa de arbol, segun el nivel de estudio, la mayoria de los empleados son tecnicos o tecnologos, esto representa un 38.9% seguido de aquellos empleados que han completado un pregado o estudios universitarios con 27% lo cual es bueno, ya que es una empresa que cuenta con bastante mano de obra Qualificada.

summarytools::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
# Crear el gráfico de barras con porcentajes usando la variable Departamento
bar_polar <- ggplot(data = rotacion) +
  geom_bar(mapping = aes(x = Departamento, fill = Departamento), width = 1) +
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL, title = "Distribución de empleados por departamento") +
  geom_text(stat = "count", aes(x = Departamento, label = scales::percent(..count.. / sum(..count..))),
            position = position_stack(vjust = 0.5)) +
  theme_minimal() +  # Tema minimalista para un look más limpio
  theme(legend.position = "right", plot.title = element_text(size = 16, face = "bold"))  # Leyenda a la derecha y título estilizado

# Transformar el gráfico en coordenadas polares
bar_polar + coord_polar()

Tal como se evidencia en el grafico anterior la mayoria de los empleados pertenecen al departamento de Investigacion y Desarrollo con 65% aproximadamente, seguido del departamento de ventas con un 30% y por ultimo del departamento de Recursos Humanos que es el que menor porcentaje de empleado tiene con un 4%

summarytools::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
# Crear el dataframe 'plotdata' con los datos del cargo
plotdata1 <- data.frame(
  Cargo = c("Director Investigación", "Director Manofactura", "Ejecutivo Ventas", "Gerente",
            "Investigador Cientifico", "Recursos_Humanos", "Representante Salud", 
            "Representante Ventas", "Tecnico Laboratorio"),
  n = c(80, 145, 326, 102, 292, 52, 131, 83, 259),
  prop = c(5.44, 9.86, 22.18, 6.94, 19.86, 3.54, 8.91, 5.65, 17.62)
)

# Crear el mapa de árbol con las etiquetas de los porcentajes y cargos
ggplot(plotdata1, aes(fill = Cargo, area = n, label = paste(Cargo, "\n", prop, "%"))) +
  geom_treemap() + 
  geom_treemap_text(colour = "white", place = "centre", grow = TRUE) +
  labs(title = "Distribución de los empleados por cargo") +
  theme(legend.position = "none")  # Ocultar la leyenda

Segun el mapa de arbol, los cargos que mas tienen empleados son el ejecutivo de ventas con un 22.18 seguido del investigador cientifico con un 19.86% y el tecnico de laboratorio con un 17.62%.

summarytools::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
# Asegúrate de que Satisfacción_Ambiental es un factor
rotacion$Satisfacción_Ambiental <- factor(rotacion$Satisfacción_Ambiental,
                                          levels = c("1", "2", "3", "4"),
                                          labels = c("Muy insatisfecho", "Insatisfecho", "Satisfecho", "Muy satisfecho"))


# Contar frecuencias de Satisfacción_Ambiental
data <- rotacion %>%
  group_by(Satisfacción_Ambiental) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100)

# Crear el gráfico de barras con porcentajes
ggplot(data, aes(x = Satisfacción_Ambiental, y = percentage, fill = Satisfacción_Ambiental)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(percentage, 1), "%")), 
            vjust = -0.5, size = 4) +
  labs(x = "Satisfacción Ambiental", y = "Porcentaje (%)", 
       title = "Porcentaje de Satisfacción Ambiental") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

segun el grafico anterior la mayoria de los empleados se encuentran satisfechos ambientalmente con un 60% esto sumando los que se encuentran satisfechos y muy satisfecho

summarytools::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
# Asegúrate de que Satisfacción_Laboral es un factor
rotacion$Satisfación_Laboral <- factor(rotacion$Satisfación_Laboral,
                                        levels = c("1", "2", "3", "4"),
                                        labels = c("Muy insatisfecho", "Insatisfecho", "Satisfecho", "Muy satisfecho"))

# Contar frecuencias de Satisfacción_Laboral
data_laboral <- rotacion %>%
  group_by(Satisfación_Laboral) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100)

# Crear el gráfico de barras con porcentajes para Satisfacción Laboral
ggplot(data_laboral, aes(x = Satisfación_Laboral, y = percentage, fill = Satisfación_Laboral)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(percentage, 1), "%")), 
            vjust = -0.5, size = 4) +
  labs(x = "Satisfacción Laboral", y = "Porcentaje (%)", 
       title = "Porcentaje de Satisfacción Laboral") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

Al igual que en el caso anterior se presenta que en Satisfaccion Laboral la mayoria de los empleados se encuentran satisfechos.

2.0.2 Analisis Univariado De Las Variables Cuantitativas

summary(rotacion$Ingreso_Mensual)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1009    2911    4919    6503    8379   19999
# Crear el histograma
histograma <- ggplot(rotacion, aes(x = Ingreso_Mensual)) +
  geom_histogram(binwidth = 1000, fill = "skyblue", color = "black") +
  labs(x = "Ingreso Mensual", y = "Frecuencia", 
       title = "Distribución del Ingreso Mensual (Histograma)") +
  theme_minimal()

# Crear el boxplot
boxplot <- ggplot(rotacion, aes(y = Ingreso_Mensual)) +
  geom_boxplot(fill = "lightgreen", color = "black") +
  labs(y = "Ingreso Mensual", 
       title = "Distribución del Ingreso Mensual (Boxplot)") +
  theme_minimal()+
   coord_flip()

# Combinar ambos gráficos uno encima del otro
histograma / boxplot

Tal como lo muestra la grafica la mayoria de los empleados se encuentran en el rango salarial de 2900 y 8400 y en promedio la mayoria gana 5000 aproximadamente.

summary(rotacion$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   30.00   36.00   36.92   43.00   60.00
# Crear el histograma para la variable Edad
histograma1 <- ggplot(rotacion, aes(x = Edad)) +
  geom_histogram(binwidth = 5, fill = "lightcoral", color = "black") +
  labs(x = "Edad", y = "Frecuencia", 
       title = "Distribución de la Edad (Histograma)") +
  theme_minimal()

# Crear el boxplot para la variable Edad y rotarlo horizontalmente
boxplot1 <- ggplot(rotacion, aes(x = Edad)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(x = "Edad", 
       title = "Distribución de la Edad (Boxplot)") +
  theme_minimal() +
  coord_flip()

# Combinar ambos gráficos uno encima del otro con proporciones ajustadas
(histograma1 / boxplot1) + plot_layout(heights = c(3, 1))

Como se logra evidenciar en el anterior grafico la mayoria de los trabajadores se encuentran en el rango de edad de 30 a 43 años y como promedio grupal tienen 36 años de edad.

summary(rotacion$Distancia_Casa)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   7.000   9.193  14.000  29.000
# Crear el histograma para la variable Distancia_Casa
histograma2 <- ggplot(rotacion, aes(x = Distancia_Casa)) +
  geom_histogram(binwidth = 5, fill = "orange", color = "black") +
  labs(x = "Distancia desde Casa", y = "Frecuencia", 
       title = "Distribución de la Distancia desde Casa (Histograma)") +
  theme_minimal()

# Crear el boxplot para la variable Distancia_Casa y rotarlo horizontalmente
boxplot2 <- ggplot(rotacion, aes(x = Distancia_Casa)) +
  geom_boxplot(fill = "purple", color = "black") +
  labs(x = "Distancia desde Casa", 
       title = "Distribución de la Distancia desde Casa (Boxplot)") +
  theme_minimal() +
  coord_flip()

# Combinar ambos gráficos uno encima del otro con proporciones ajustadas
(histograma2 / boxplot2) + plot_layout(heights = c(3, 1))

Segun los grafico y el resumen descriptivo de esa variable la mayoria de los trabajadores se encuentran en un rango de distancia de la casa al trabajo de entre 2 y 14 kilometros.

summary(rotacion$Trabajos_Anteriores)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.000   2.000   2.693   4.000   9.000
# Crear el histograma para la variable Trabajos_Anteriores
histograma3 <- ggplot(rotacion, aes(x = Trabajos_Anteriores)) +
  geom_histogram(binwidth = 1, fill = "#EEE685", color = "black") +
  labs(x = "Trabajos Anteriores", y = "Frecuencia", 
       title = "Distribución de los Trabajos Anteriores (Histograma)") +
  theme_minimal()

# Crear el boxplot para la variable Trabajos_Anteriores y rotarlo horizontalmente
boxplot3 <- ggplot(rotacion, aes(x = Trabajos_Anteriores)) +
  geom_boxplot(fill = "salmon", color = "black") +
  labs(x = "Trabajos Anteriores", 
       title = "Distribución de los Trabajos Anteriores (Boxplot)") +
  theme_minimal() +
  coord_flip()

# Combinar ambos gráficos uno encima del otro con proporciones ajustadas
(histograma3 / boxplot3) + plot_layout(heights = c(3, 1))

Analizando el grafico, la mayoria de los trabajadores ha tenido entre 1 y 4 empleos anteriormente a nivel general en promedio han desempeñado en 2 trabajos anteriormente.

3 Punto 3

para realizar el analisis bivariado es util hacer la matriz de correlacion de cramer para variables categoricas y luego la matriz de correlacion biserial para medir correlaciones entre categoricas y numericas

# Seleccionar columnas por índice (sólo como ejemplo, debes verificar los índices correctos)
categoricas <- rotacion[, c(1, 3, 4, 6, 7, 8, 9, 10, 11, 12, 15, 17, 20)]

# Función para calcular la V de Cramér entre dos variables categóricas
cramer_v <- function(x, y) {
  tbl <- table(x, y)
  chi2 <- chisq.test(tbl)$statistic
  n <- sum(tbl)
  min_dim <- min(dim(tbl)) - 1
  V <- sqrt(chi2 / (n * min_dim))
  return(as.numeric(V))
}

# Crear una matriz vacía para almacenar los resultados
num_vars <- length(categoricas)
cramer_matrix <- matrix(NA, nrow = num_vars, ncol = num_vars, 
                        dimnames = list(names(categoricas), names(categoricas)))

# Calcular V de Cramér para cada par de variables
for(i in 1:num_vars) {
  for(j in i:num_vars) {
    cramer_matrix[i, j] <- cramer_v(categoricas[[i]], categoricas[[j]])
    cramer_matrix[j, i] <- cramer_matrix[i, j] # Simetría
  }
}

# Visualizar la matriz de correlación con colores
corrplot(cramer_matrix, 
         method = "color", 
         col = colorRampPalette(c("#FF6A6A", "#FFFACD", "#CD6090"))(200),
         type = "lower", 
         tl.col = "black", tl.srt = 45,
         addCoef.col = "black",
         number.cex = 0.7)

Segun la matriz de cramer que muestra la asociacion entre las variables categoricas, se puede observar que las variables que mas influyen en la rotacion de los empleados son el Cargo y las horas Extras ambas con una asociacion de 0,24 y las Horas Extras con una asociacion de 0,18 de estas variables solo se coincide con lo planteado en el primer punto con la variable Cargo, sin embargo el signo no es el esperado ya que se esperaba una relacion inversamente proporcional o negativa pero en este caso la relacion es directamente proporcional o positiva, pero se destaca que el porcentaje es bajo.

4 Punto 4

# Codificar la variable de rotación
rotacion$Rotacion_binaria <- ifelse(rotacion$Rotación == "Si", 1, 0)


set.seed(300)
entrenamiento = sample(1:nrow(rotacion), 0.7 * nrow(rotacion))
datosTrain = rotacion[entrenamiento, ]
datosTest = rotacion[-entrenamiento, ]

modelo_logistico = glm(Rotacion_binaria ~ Horas_Extra + Cargo + Estado_Civil + Distancia_Casa + Trabajos_Anteriores  + Ingreso_Mensual , data = datosTrain, family = binomial(link="logit"))

options(scipen = 999)
summary(modelo_logistico)
## 
## Call:
## glm(formula = Rotacion_binaria ~ Horas_Extra + Cargo + Estado_Civil + 
##     Distancia_Casa + Trabajos_Anteriores + Ingreso_Mensual, family = binomial(link = "logit"), 
##     data = datosTrain)
## 
## Coefficients:
##                                 Estimate  Std. Error z value
## (Intercept)                  -5.38825695  1.30770340  -4.120
## Horas_ExtraSi                 1.68358005  0.19584986   8.596
## CargoDirector_Manofactura     1.53811192  1.16604186   1.319
## CargoEjecutivo_Ventas         2.50925590  1.13496998   2.211
## CargoGerente                  1.08153602  1.19039640   0.909
## CargoInvestigador_Cientifico  2.11911707  1.21837186   1.739
## CargoRecursos_Humanos         3.11227031  1.24458593   2.501
## CargoRepresentante_Salud      1.58728042  1.17478697   1.351
## CargoRepresentante_Ventas     3.96558882  1.25533932   3.159
## CargoTecnico_Laboratorio      2.95358079  1.21462830   2.432
## Estado_CivilDivorciado       -0.45074456  0.28099931  -1.604
## Estado_CivilSoltero           0.87139988  0.20439534   4.263
## Distancia_Casa                0.03121548  0.01133012   2.755
## Trabajos_Anteriores           0.11681784  0.03666757   3.186
## Ingreso_Mensual              -0.00002838  0.00005031  -0.564
##                                          Pr(>|z|)    
## (Intercept)                             0.0000378 ***
## Horas_ExtraSi                < 0.0000000000000002 ***
## CargoDirector_Manofactura                 0.18714    
## CargoEjecutivo_Ventas                     0.02705 *  
## CargoGerente                              0.36359    
## CargoInvestigador_Cientifico              0.08198 .  
## CargoRecursos_Humanos                     0.01240 *  
## CargoRepresentante_Salud                  0.17666    
## CargoRepresentante_Ventas                 0.00158 ** 
## CargoTecnico_Laboratorio                  0.01503 *  
## Estado_CivilDivorciado                    0.10870    
## Estado_CivilSoltero                     0.0000201 ***
## Distancia_Casa                            0.00587 ** 
## Trabajos_Anteriores                       0.00144 ** 
## Ingreso_Mensual                           0.57265    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 932.07  on 1028  degrees of freedom
## Residual deviance: 748.90  on 1014  degrees of freedom
## AIC: 778.9
## 
## Number of Fisher Scoring iterations: 6

Segun el resultado del modelo se analiza el p valor de cada una de las variables que se estimaron y las variables que resultaron significativas con un 95% de confianza son: Horas Extras, Cargo Ejecutivo de Ventas, Cargo Recursos humanos, Cargo Representante de Ventas, Cargo Tecnico laboratorio de ventas, Estado Civil Soltero, Distancia a la Casa y Trabajos anteriores, estas variables su p valor estuvo por debajo de 0,05 el cual es el umbral para rechazar la hipotesis nula de no significancia; cabe destacar que la variable Cargo Investigador Cientifico no resulto significativa al 95% pero si al 90% de confianza.

A continuacion se hara una intepretacion de los coeficientes de las variables que resultaron significativas para ello se calcula la funcion inversa de los coeficientes mas conocido como los odds ratios

# Calcular los odds ratios
odds_ratios<-exp(coef(modelo_logistico))
odds_ratios
##                  (Intercept)                Horas_ExtraSi 
##                  0.004569932                  5.384799339 
##    CargoDirector_Manofactura        CargoEjecutivo_Ventas 
##                  4.655791480                 12.295777316 
##                 CargoGerente CargoInvestigador_Cientifico 
##                  2.949206107                  8.323784898 
##        CargoRecursos_Humanos     CargoRepresentante_Salud 
##                 22.472004851                  4.890430891 
##    CargoRepresentante_Ventas     CargoTecnico_Laboratorio 
##                 52.751321056                 19.174490691 
##       Estado_CivilDivorciado          Estado_CivilSoltero 
##                  0.637153577                  2.390254571 
##               Distancia_Casa          Trabajos_Anteriores 
##                  1.031707790                  1.123914678 
##              Ingreso_Mensual 
##                  0.999971616

Al obtener los odds ratios aplicamos la siguiente formula: Probabilidad=(odds/1+odds) para obtener las probabilidades de cada variable

# Convertir los odds ratios a probabilidades
probabilidades <- odds_ratios / (1 + odds_ratios)

# Mostrar las probabilidades
print(probabilidades)
##                  (Intercept)                Horas_ExtraSi 
##                  0.004549143                  0.843378007 
##    CargoDirector_Manofactura        CargoEjecutivo_Ventas 
##                  0.823190087                  0.924788151 
##                 CargoGerente CargoInvestigador_Cientifico 
##                  0.746784550                  0.892747418 
##        CargoRecursos_Humanos     CargoRepresentante_Salud 
##                  0.957396055                  0.830233133 
##    CargoRepresentante_Ventas     CargoTecnico_Laboratorio 
##                  0.981395806                  0.950432454 
##       Estado_CivilDivorciado          Estado_CivilSoltero 
##                  0.389183755                  0.705036899 
##               Distancia_Casa          Trabajos_Anteriores 
##                  0.507803236                  0.529171294 
##              Ingreso_Mensual 
##                  0.499992904

Segun los resultados, los cargos de representante de ventas , recursos humanos, tecnico en laboratorio y ejecutivo de ventas tuvieron probabilidades superiores a 0.9 lo que quiere decir que si un trabajador ocupa una de los siguientes cargos en la empresa tiene un 90% de probabilidad de abandonar la empresa frente a los otros cargos, cabe destacar que el investigador cientifico obtuvo una probabilidad muy cercana de 0.89 o del 89%, por otra parte analizando el estado civil, si el trabajador es soltero tiene una probabilidad de abandonar la empresa en 0.7 o 70%, analizando la variable trabajos anteriores, por un aumento de un trabajo anterior que haya tenido el empleado, su probabilidad de dejar la empresa aumenta en 0.52 o 52%, analizando la variables horas extras, si el trabajador tiene horas extras su probabilidad de dejar la empresa aumenta en 0.84 o en un 84%, por ultimo si la distancia del trabajo a la casa aumenta en 1km la probabilidad de que el trabajador abandone la empresa aumenta en 0.507 es decir en un 50.7%

5 Punto 5

predicciones = predict(modelo_logistico, newdata = datosTest, type = "response")

roc_curve = roc(datosTest$Rotacion_binaria, predicciones)

auc_score <- auc(roc_curve)

plot_ly(x = ~1 - roc_curve$specificities, y = ~roc_curve$sensitivities, 
        type = 'scatter', mode = 'lines', line = list(color = 'blue'), 
        name = 'Curva ROC') %>%
  add_trace(x = c(0, 1), y = c(0, 1), mode = 'lines', line = list(color = 'red', dash = 'dash'), 
            name = 'Línea de referencia') %>%
  layout(title = paste("Curva ROC (AUC =", round(auc_score, 2), ")", sep = ""),
         xaxis = list(title = "1 - Especificidad"),
         yaxis = list(title = "Sensibilidad"))

El AUC del modelo arrojo 0,77 lo que indica que el modelo logra clasificar en un 77% los casos de abandono de la empresa, este porcentaje es aceptable pero puede ser aun mejorado.

La Curva ROC de color azul esta muy por encima de la linea roja el cual es un clasificador aleatorio, este hecho nos da una señal de que el modelo tiene un rendimiento moderado, puesto que aun le falta por estar mas cerca del 1, sin embargo muestra su buena capacidad para clasificar aquellos empleados que abandonan la empresan y a los que aun continuan en la empresa

6 Punto 6

6.1 Conclusiones

A modo de conclusiones podemos plantear las siguientes recomendaciones para evitar que los empleados abandone la empresa o renuncien, como ya habiamos notado una de las variables que mas influyen en que los empleados renuncien es el cargo que tienen en la compañia, identificamos que los cargos que tienen un rango mas bajo como representaje de ventas, ejecutivo de ventas o tecnico en laboratorio son cargos que tienen una alta probabilidad de abandono, por lo que se sugiere que estos cargos puedan tener algun incentivo economico adicional o un bono extra que permita que el trabajador se pueda sentir motivado.

Por otra parte una de las variables que tambien influyen en la probabilidad de abandono de la empresa es la variable horas extras la cual tiene una probabilidad del 84%, para dar una solucion que reduzca esta probabilidad o tasa de abandono damos 2 recomendaciones, como primera opcion, es hacer un ajuste y control a los turnos laborales, es decir reorganizar el cronograma de los turnos de tal manera que hayan horarios rotativos entre los trabajadores para que asi cada turno cumpla su horario reglamentado sin sobrecargar al empleado con mas trabajo, en dado caso no sea posible hacer ajustes de turnos rotativos, recomendamos que pueda haber un aumento significativo en el pago de las horas extras, que compense el sacrificio y el desgaste fisico que pueda tener el empleado por realizar trabajo fuera de su horario laboral.