## Loading required package: cubature
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: flextable
## Warning: package 'flextable' was built under R version 4.3.2
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: psych
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
## 
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
## 
##     label, label<-
## The following object is masked from 'package:dplyr':
## 
##     n
## The following objects are masked from 'package:stats':
## 
##     IQR, median, sd, var
## The following objects are masked from 'package:base':
## 
##     max, mean, min, range, sum

1. Problema Rotación de cargo

1.1 Análisis Exploratorio del Dataset

Comenzamos por revisar que tipo de datos tiene cada columna y que tipo de datos podemos tener en cada uno de las columnas

tipos_de_datos <- sapply(rotacion, class)
print(tipos_de_datos)
##                    Rotación                        Edad 
##                 "character"                   "numeric" 
##           Viaje de Negocios                Departamento 
##                 "character"                 "character" 
##              Distancia_Casa                   Educación 
##                   "numeric"                   "numeric" 
##             Campo_Educación      Satisfacción_Ambiental 
##                 "character"                   "numeric" 
##                      Genero                       Cargo 
##                 "character"                 "character" 
##         Satisfación_Laboral                Estado_Civil 
##                   "numeric"                 "character" 
##             Ingreso_Mensual         Trabajos_Anteriores 
##                   "numeric"                   "numeric" 
##                 Horas_Extra Porcentaje_aumento_salarial 
##                 "character"                   "numeric" 
##         Rendimiento_Laboral            Años_Experiencia 
##                   "numeric"                   "numeric" 
##              Capacitaciones     Equilibrio_Trabajo_Vida 
##                   "numeric"                   "numeric" 
##                  Antigüedad            Antigüedad_Cargo 
##                   "numeric"                   "numeric" 
##       Años_ultima_promoción  Años_acargo_con_mismo_jefe 
##                   "numeric"                   "numeric"

De lo anterior tenemos que las variables que nos interesan son 14 variables que son de tipo numérico, por lo que no hay necesidad de transformarlas. Y tenemos otras 10 de tipo string incluidas la variable objetivo “Rotación”. Vamos a ver un resumen descriptivo de las variables.

rotacion2<-rotacion
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

Con lo anterior identificamos los rangos en los que se mueven las distintas variables numéricas, observamos que la mayoría de los datos se encuentran en rangos de similares, entre 0 y 10.

Comenzamos por la relación entre nuestras variables y la variable numéricas con la variable objetivo.

1.1.1 Análisis Para Variables Numericas

library(GGally)
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
# Seleccionar las variables de interés
variables_interes <- c("Rendimiento_Laboral", "Años_Experiencia", "Capacitaciones",
                       "Equilibrio_Trabajo_Vida", "Porcentaje_aumento_salarial",
                       "Satisfacción_Ambiental", "Edad", "Educación", "Rotación")

# Subconjunto de datos con las variables de interés
datos_interes <- rotacion[, variables_interes]

# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
        title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# Seleccionar las variables de interés
variables_interes <- c("Antigüedad", "Antigüedad_Cargo",
                       "Años_ultima_promoción", "Años_acargo_con_mismo_jefe",
                       "Satisfación_Laboral", "Distancia_Casa", "Rotación")

# Subconjunto de datos con las variables de interés
datos_interes <- rotacion[, variables_interes]

# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
        title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

De lo anterior observanmos que las variables que mejor me puedan ayudar a segmentar ambas poblaciones son la Edad, ya que vemos que como las dos distribuciones de Si(verde) y No(Rojo) se segmentan mejor sobre esta variables, así mismo la satisfacción laboral, y satisfacción ambiental.

# Convertir "Si" a 1 y "No" a 0 en la columna "Rotación"
rotacion$Rotación <- as.numeric(rotacion$Rotación == "Si")
rotacion
## # A tibble: 1,470 × 24
##    Rotación  Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
##       <dbl> <dbl> <chr>               <chr>                 <dbl>     <dbl>
##  1        1    41 Raramente           Ventas                    1         2
##  2        0    49 Frecuentemente      IyD                       8         1
##  3        1    37 Raramente           IyD                       2         2
##  4        0    33 Frecuentemente      IyD                       3         4
##  5        0    27 Raramente           IyD                       2         1
##  6        0    32 Frecuentemente      IyD                       2         2
##  7        0    59 Raramente           IyD                       3         3
##  8        0    30 Raramente           IyD                      24         1
##  9        0    38 Frecuentemente      IyD                      23         3
## 10        0    36 Raramente           IyD                      27         3
## # ℹ 1,460 more rows
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## #   Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## #   Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## #   Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## #   Años_Experiencia <dbl>, Capacitaciones <dbl>,
## #   Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>, …
library(ltm)
## Warning: package 'ltm' was built under R version 4.3.3
## Loading required package: msm
## Warning: package 'msm' was built under R version 4.3.3
## Loading required package: polycor
## Warning: package 'polycor' was built under R version 4.3.3
## 
## Attaching package: 'polycor'
## The following object is masked from 'package:psych':
## 
##     polyserial
## 
## Attaching package: 'ltm'
## The following object is masked from 'package:psych':
## 
##     factor.scores
# Definir las variables de interés
variables_interes <- c("Rendimiento_Laboral", "Años_Experiencia", "Capacitaciones",
                       "Equilibrio_Trabajo_Vida", "Porcentaje_aumento_salarial",
                       "Satisfacción_Ambiental", "Edad", "Educación", "Antigüedad", "Antigüedad_Cargo",
                       "Años_ultima_promoción", "Años_acargo_con_mismo_jefe",
                       "Satisfación_Laboral", "Distancia_Casa")


# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()

# Calcular el coeficiente de punto biserial para cada variable continua
for (column in variables_interes) {
  result <- biserial.cor(rotacion[[column]], rotacion$Rotación)
  correlation_results[[column]] <- result
}

# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))

# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]

correlation_df
##                                                Variable  Correlation
## Años_Experiencia                       Años_Experiencia  0.171063246
## Antigüedad_Cargo                       Antigüedad_Cargo  0.160545004
## Edad                                               Edad  0.159227826
## Años_acargo_con_mismo_jefe   Años_acargo_con_mismo_jefe  0.156199316
## Antigüedad                                   Antigüedad  0.134392214
## Satisfación_Laboral                 Satisfación_Laboral  0.103481126
## Satisfacción_Ambiental           Satisfacción_Ambiental  0.103368978
## Distancia_Casa                           Distancia_Casa -0.077923583
## Equilibrio_Trabajo_Vida         Equilibrio_Trabajo_Vida  0.063939047
## Capacitaciones                           Capacitaciones  0.059477799
## Años_ultima_promoción             Años_ultima_promoción  0.033018775
## Educación                                     Educación  0.031372820
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial  0.013478202
## Rendimiento_Laboral                 Rendimiento_Laboral -0.002888752
# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()

# Calcular la correlación de Kendall para cada variable
for (column in variables_interes) {
  result <- cor(rotacion[[column]], rotacion$Rotación, method = "kendall")
  correlation_results[[column]] <- result
}

# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))

# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]

correlation_df
##                                                Variable  Correlation
## Años_Experiencia                       Años_Experiencia -0.166781144
## Antigüedad                                   Antigüedad -0.161005913
## Antigüedad_Cargo                       Antigüedad_Cargo -0.156710954
## Años_acargo_con_mismo_jefe   Años_acargo_con_mismo_jefe -0.152006156
## Edad                                               Edad -0.142027312
## Satisfación_Laboral                 Satisfación_Laboral -0.094304759
## Satisfacción_Ambiental           Satisfacción_Ambiental -0.088376678
## Distancia_Casa                           Distancia_Casa  0.066764681
## Equilibrio_Trabajo_Vida         Equilibrio_Trabajo_Vida -0.049365275
## Años_ultima_promoción             Años_ultima_promoción -0.047753106
## Capacitaciones                           Capacitaciones -0.047153882
## Educación                                     Educación -0.027817077
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial -0.020189908
## Rendimiento_Laboral                 Rendimiento_Laboral  0.002888752
# Inicializar una lista para almacenar los resultados de correlación
correlation_results <- list()

# Calcular la correlación de Kendall para cada variable
for (column in variables_interes) {
  result <- cor(rotacion[[column]], rotacion$Rotación, method = "spearman")
  correlation_results[[column]] <- result
}

# Crear un dataframe con los resultados de la correlación
correlation_df <- data.frame(Variable = names(correlation_results), Correlation = unlist(correlation_results))

# Ordenar el dataframe por el valor absoluto de la correlación
correlation_df <- correlation_df[order(abs(correlation_df$Correlation), decreasing = TRUE),]

correlation_df
##                                                Variable  Correlation
## Años_Experiencia                       Años_Experiencia -0.199002020
## Antigüedad                                   Antigüedad -0.190419098
## Antigüedad_Cargo                       Antigüedad_Cargo -0.180623030
## Años_acargo_con_mismo_jefe   Años_acargo_con_mismo_jefe -0.175355081
## Edad                                               Edad -0.171231659
## Satisfación_Laboral                 Satisfación_Laboral -0.102948195
## Satisfacción_Ambiental           Satisfacción_Ambiental -0.096486420
## Distancia_Casa                           Distancia_Casa  0.079248186
## Años_ultima_promoción             Años_ultima_promoción -0.053272642
## Equilibrio_Trabajo_Vida         Equilibrio_Trabajo_Vida -0.051951357
## Capacitaciones                           Capacitaciones -0.051757308
## Educación                                     Educación -0.030345908
## Porcentaje_aumento_salarial Porcentaje_aumento_salarial -0.023612035
## Rendimiento_Laboral                 Rendimiento_Laboral  0.002888752

De acuerdo a lo anterior pensamos que las variables mas adecuadas y mas relacionadas para trabajar serían los años de experiencia, la antiguedad, antiguedad cargo, edad,Satisfación_Laboral, y años a cargo con mismo jefe

Pero a la vez antiguedad, antiguedad cargo y años a cargo con mismo jefe son variables demasiado correlacionadas entre ellas y podríamos caer colinealidad y es algo que estamos tratando de evitar para el modelo

1.1.2 Análisis Para Variables Categoricas

Con las variables categóricas procedemos a observar los valores únicos para cada una de las categorías. Para saber que datos tenemos disponibles por categoría.

# Obtener los valores únicos de cada columna
valores_viaje_negocios <- unique(rotacion$'Viaje de Negocios')
valores_departamento <- unique(rotacion$Departamento)
valores_educacion <- unique(rotacion$Campo_Educación)
valores_genero <- unique(rotacion$Genero)
valores_cargo <- unique(rotacion$Cargo)
valores_estado_civil <- unique(rotacion$Estado_Civil)
valores_horas_extra <- unique(rotacion$Horas_Extra)
valores_rotacion <- unique(rotacion$Rotación)

# Imprimir los valores únicos de cada columna
print("Valores únicos de la columna 'Viaje de Negocios':")
## [1] "Valores únicos de la columna 'Viaje de Negocios':"
print(valores_viaje_negocios)
## [1] "Raramente"      "Frecuentemente" "No_Viaja"
print("Valores únicos de la columna 'Departamento':")
## [1] "Valores únicos de la columna 'Departamento':"
print(valores_departamento)
## [1] "Ventas" "IyD"    "RH"
print("Valores únicos de la columna 'Campo Educación':")
## [1] "Valores únicos de la columna 'Campo Educación':"
print(valores_educacion)
## [1] "Ciencias"    "Otra"        "Salud"       "Mercadeo"    "Tecnicos"   
## [6] "Humanidades"
print("Valores únicos de la columna 'Género':")
## [1] "Valores únicos de la columna 'Género':"
print(valores_genero)
## [1] "F" "M"
print("Valores únicos de la columna 'Cargo':")
## [1] "Valores únicos de la columna 'Cargo':"
print(valores_cargo)
## [1] "Ejecutivo_Ventas"        "Investigador_Cientifico"
## [3] "Tecnico_Laboratorio"     "Director_Manofactura"   
## [5] "Representante_Salud"     "Gerente"                
## [7] "Representante_Ventas"    "Director_Investigación" 
## [9] "Recursos_Humanos"
print("Valores únicos de la columna 'Estado Civil':")
## [1] "Valores únicos de la columna 'Estado Civil':"
print(valores_estado_civil)
## [1] "Soltero"    "Casado"     "Divorciado"
print("Valores únicos de la columna 'Horas Extra':")
## [1] "Valores únicos de la columna 'Horas Extra':"
print(valores_horas_extra)
## [1] "Si" "No"
print("Valores únicos de la columna 'Rotación':")
## [1] "Valores únicos de la columna 'Rotación':"
print(valores_rotacion)
## [1] 1 0

Ahora para determinar si nuestra variables categóricas están relacionadas con Rotación procedemos a usar la prueba de Chi-Cuadrado, que son “Viaje de Negocios”, “Departamento”, “Campo Educación”, “Género”, “Cargo” y “Estado Civil”.

Para las variables binaria “Horas Extra” y la variable objetivo “Rotación”, vamos a usar la prueba de chi-cuadrado y el coeficiente de contingencia para evaluar la asociación entre estas variables.

# Instalacion de paquete
library(grid)

# Instalacion de paquete
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
# Prueba de independencia chi-cuadrado para variables categóricas
chi_square_test_viaje_negocios <- chisq.test(rotacion$'Viaje de Negocios', rotacion$Rotación)
chi_square_test_departamento <- chisq.test(rotacion$Departamento, rotacion$Rotación)
chi_square_test_educacion <- chisq.test(rotacion$Campo_Educación, rotacion$Rotación)
## Warning in chisq.test(rotacion$Campo_Educación, rotacion$Rotación): Chi-squared
## approximation may be incorrect
chi_square_test_genero <- chisq.test(rotacion$Genero, rotacion$Rotación)
chi_square_test_cargo <- chisq.test(rotacion$Cargo, rotacion$Rotación)
chi_square_test_estado_civil <- chisq.test(rotacion$Estado_Civil, rotacion$Rotación)

# Prueba de independencia chi-cuadrado para variables binarias
chi_square_test_horas_extra <- chisq.test(rotacion$Horas_Extra, rotacion$Rotación)

# Coeficiente de contingencia para variables binarias
coef_contingencia_horas_extra <- assocstats(table(rotacion$Horas_Extra, rotacion$Rotación))

# Mostrar resultados
print("Prueba de independencia chi-cuadrado para variables categóricas:")
## [1] "Prueba de independencia chi-cuadrado para variables categóricas:"
print(chi_square_test_viaje_negocios)
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$"Viaje de Negocios" and rotacion$Rotación
## X-squared = 24.182, df = 2, p-value = 5.609e-06
print(chi_square_test_departamento)
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Departamento and rotacion$Rotación
## X-squared = 10.796, df = 2, p-value = 0.004526
print(chi_square_test_educacion)
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Campo_Educación and rotacion$Rotación
## X-squared = 16.025, df = 5, p-value = 0.006774
print(chi_square_test_genero)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rotacion$Genero and rotacion$Rotación
## X-squared = 1.117, df = 1, p-value = 0.2906
print(chi_square_test_cargo)
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Cargo and rotacion$Rotación
## X-squared = 86.19, df = 8, p-value = 2.752e-15
print(chi_square_test_estado_civil)
## 
##  Pearson's Chi-squared test
## 
## data:  rotacion$Estado_Civil and rotacion$Rotación
## X-squared = 46.164, df = 2, p-value = 9.456e-11
print("Prueba de independencia chi-cuadrado y coeficiente de contingencia para variable binaria:")
## [1] "Prueba de independencia chi-cuadrado y coeficiente de contingencia para variable binaria:"
print(chi_square_test_horas_extra)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  rotacion$Horas_Extra and rotacion$Rotación
## X-squared = 87.564, df = 1, p-value < 2.2e-16
print(coef_contingencia_horas_extra)
##                     X^2 df P(> X^2)
## Likelihood Ratio 81.402  1        0
## Pearson          89.044  1        0
## 
## Phi-Coefficient   : 0.246 
## Contingency Coeff.: 0.239 
## Cramer's V        : 0.246

Para seleccionar las tres variables más significativas para predecir la “Rotación” basado en los resultados de las pruebas de independencia chi-cuadrado, podrías considerar aquellas variables que tienen los valores de chi-cuadrado más altos y los p-values más bajos. Esto indicaría una asociación más fuerte entre esas variables y la variable objetivo “Rotación”. Basado en los resultados proporcionados, las tres variables más prometedoras podrían ser:

Cargo: Tiene el valor de chi-cuadrado más alto y el p-valor más bajo entre todas las variables categóricas, lo que indica una fuerte asociación entre el cargo y la rotación.

Estado Civil: También tiene un alto valor de chi-cuadrado y un p-valor muy bajo, lo que sugiere una relación significativa con la rotación.

Horas Extra: Para la variable binaria “Horas Extra”, el valor de chi-cuadrado es muy alto y el p-valor es extremadamente bajo, lo que indica una fuerte asociación con la rotación. Además, el coeficiente de contingencia y otras medidas también sugieren una asociación moderada.

Por lo tanto, basado en estos resultados, podrías considerar estas tres variables (Cargo, Estado Civil y Horas Extra) como las más prometedoras para predecir la rotación en tu modelo. Sin embargo, siempre es importante tener en cuenta el contexto específico de tu problema y las características de tus datos al seleccionar las variables para tu modelo predictivo.

1.2 Escoger variables.

Las variables numéricas a escoger son:

  • Años_Experiencia
  • Edad
  • Satisfación_Laboral

Las variables categoricas a escoger son:

  • Cargo
  • Estado Civil
  • Horas Extra
# Seleccionar las variables de interés
variables_seleccionadas <- c("Años_Experiencia", "Edad", "Satisfación_Laboral", "Cargo", "Horas_Extra", "Estado_Civil","Rotación")

# Crear un nuevo dataframe con las variables seleccionadas
rotacion_df <- rotacion[, variables_seleccionadas]

# Mostrar las primeras filas del nuevo dataset
head(rotacion_df)
## # A tibble: 6 × 7
##   Años_Experiencia  Edad Satisfación_Laboral Cargo      Horas_Extra Estado_Civil
##              <dbl> <dbl>               <dbl> <chr>      <chr>       <chr>       
## 1                8    41                   4 Ejecutivo… Si          Soltero     
## 2               10    49                   2 Investiga… No          Casado      
## 3                7    37                   3 Tecnico_L… Si          Soltero     
## 4                8    33                   3 Investiga… Si          Casado      
## 5                6    27                   2 Tecnico_L… No          Casado      
## 6                8    32                   4 Tecnico_L… No          Soltero     
## # ℹ 1 more variable: Rotación <dbl>

2. Analisis Univariado

Comenzamos por revisar un histograma de cada uno de las variables numericas a continuacion para observar como se comporta la variable.

# Definir las variables de interés
variables_interes <- c("Años_Experiencia", "Edad", "Satisfación_Laboral")

# Crear histogramas para cada variable de interés
for (variable in variables_interes) {
  # Crear el histograma
  histograma <- ggplot(data = rotacion, aes(x = get(variable))) +
    geom_histogram(fill = "lightblue", color = "black", bins = 20) +
    labs(title = paste("Histograma de", variable),
         x = variable, y = "Frecuencia") +
    theme_minimal()
  
  # Imprimir el histograma
  print(histograma)
}

El histograma de años de Experiencia y comportarse de manera mas cerca una normal, pero podríamos hacer hipótesis para confirmarlo.

# Crear un dataframe con las variables de interés
variables_interes <- c("Años_Experiencia", "Edad", "Satisfación_Laboral")
datos_interes <- rotacion[, variables_interes]

# Crear gráficos de densidad para cada variable
for (variable in variables_interes) {
  plot<-ggplot(datos_interes, aes(x = get(variable))) +
    geom_density(fill = "lightblue", color = "black") +
    labs(title = paste("Densidad de", variable),
         x = variable, y = "Densidad") +
    theme_minimal()
  print(plot)
}

Tambien revisamos para las categóricas cuantos valores diferentes tenemos para cada categoría.

# Definir las variables de interés

# Crear un count plot para la variable "Cargo"
ggplot(rotacion, aes(x = Cargo)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(title = "Count Plot de Cargo", x = "Cargo", y = "Frecuencia") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

# Crear un count plot para la variable "Horas_Extra"
ggplot(rotacion, aes(x = Horas_Extra)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(title = "Count Plot de Horas Extra", x = "Horas Extra", y = "Frecuencia") +
  theme_minimal()

# Crear un count plot para la variable "Estado_Civil"
ggplot(rotacion, aes(x = Estado_Civil)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(title = "Count Plot de Estado Civil", x = "Estado Civil", y = "Frecuencia") +
  theme_minimal()

3. Analisis Bivariado.

Comenzamos revisando la distribución de nuestras variables numéricas con respecto a Rotación, en esta sección revisamos

library(GGally)
# Seleccionar las variables de interés
variables_interes <- c("Años_Experiencia", "Satisfación_Laboral", "Edad", "Rotación")
#variables_interes <- c("Años_Experiencia", "Antigüedad", "Años_acargo_con_mismo_jefe", "Rotación")

# Subconjunto de datos con las variables de interés
datos_interes <- rotacion2[, variables_interes]

# Gráfico de pares con la variable categórica "Rotacion"
ggpairs(datos_interes, aes(color = Rotación),
        title = "Correlación entre variables y rotación", progress = FALSE)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como vemos tanto acá como en el anterior parte, la variable de satisfacción laboral, es una variable discreta, por lo cual se va a evaluar acá en el siguiente parte.

Procedemos a hacer un análisis de correspondencia para las variables categoricas, iniciando por Rotacion y Cargo.

library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.2
tabla_rotacion_vs_horas_extra <- table(rotacion$Rotación, rotacion$Horas_Extra)
#colnames(tabla_rotacion_vs_horas_extra) <- c("Si","No")
tabla_rotacion_vs_horas_extra
##    
##      No  Si
##   0 944 289
##   1 110 127
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.2
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
resultados_ac <- CA(tabla_rotacion_vs_horas_extra)
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has  2  categories; the column variable has 2 categories
## The chi square of independence between the two variables is equal to 89.04388 (p-value =  3.861518e-21 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

Lo que vemos de lo anterior es que proporcionalmente el hecho de tener horas extra, si tiene una gran cantidad de gente que hace rotación. Eso nos da idea de que las horas es extra es algo que puede mover la gente a otros cargos o lugares laborales

Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y Cargo.

library(FactoMineR)
tabla_rotacion_vs_Cargo <- table(rotacion$Rotación, rotacion$Cargo)
tabla_rotacion_vs_Cargo
##    
##     Director_Investigación Director_Manofactura Ejecutivo_Ventas Gerente
##   0                     78                  135              269      97
##   1                      2                   10               57       5
##    
##     Investigador_Cientifico Recursos_Humanos Representante_Salud
##   0                     245               40                 122
##   1                      47               12                   9
##    
##     Representante_Ventas Tecnico_Laboratorio
##   0                   50                 197
##   1                   33                  62
resultados_ac <- CA(tabla_rotacion_vs_Cargo)
# Mostrar un resumen de los resultados
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has  2  categories; the column variable has 9 categories
## The chi square of independence between the two variables is equal to 86.19025 (p-value =  2.752482e-15 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

Lo que vemos de lo anterior es que proporcionalmente los cargos directivos son cargos en los que no suele hacer movimiento y mas bien Representante_Ventas y Tecnico_Laboratorio son cargos en los que la gente suele moverse mucho, y suelen cambiar de trabajo

Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y Satisfación_Laboral. En lo que esperariamos haya una gran relación.

tabla_rotacion_vs_Satisfacion_Laboral <- table(rotacion$Rotación, rotacion$Satisfación_Laboral)
tabla_rotacion_vs_Satisfacion_Laboral
##    
##       1   2   3   4
##   0 223 234 369 407
##   1  66  46  73  52
resultados_ac <- CA(tabla_rotacion_vs_Satisfacion_Laboral)

# Mostrar un resumen de los resultados
summary(tabla_rotacion_vs_Satisfacion_Laboral)
## Number of cases in table: 1470 
## Number of factors: 2 
## Test for independence of all factors:
##  Chisq = 17.505, df = 3, p-value = 0.0005563

Lo que vemos en la parte anterior es que curiosamente no esta tan correlacionado como se esperaría realmente, tal vez las personas no suelen contestar con honestidad su nivel de satisfacción o no es tan importante realmente para las personas.

Para continuar ahora revisamos la relaciones con nuestra variable objetivo ahora revisamos la relación entre Rotación y El estado civil. En lo que esperaríamos haya una gran relación.

tabla_rotacion_vs_Estado_Civil <- table(rotacion$Rotación, rotacion$Estado_Civil)
tabla_rotacion_vs_Estado_Civil
##    
##     Casado Divorciado Soltero
##   0    589        294     350
##   1     84         33     120
resultados_ac <- CA(tabla_rotacion_vs_Estado_Civil)

#resultados_ac
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has  2  categories; the column variable has 3 categories
## The chi square of independence between the two variables is equal to 46.16368 (p-value =  9.455511e-11 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

De lo anterior vemos que las personas solteras, suelen estar mas libres y están mas asociadas a la rotación laboral

4. Desarrollo de Modelo.

4.1 Division Train-Test Modelo

Ya que sabemos con que variables vamos a trabajar procedemos a dividir nuestro dataset en train y test. Dejamos 70% de los datos entrenamiento del modelo, y un 30% para evaluar el rendimiento del modelo.

#install.packages("caret")
# Establece la semilla para reproducibilidad
set.seed(42)
# Carga  bibliotecas para dividir train-test
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
# Partición de los datos (70% entrenamiento, 30% prueba)
indices_entrenamiento <- createDataPartition(rotacion_df$Rotación, p = 0.7, list = FALSE)
datos_entrenamiento <- rotacion_df[indices_entrenamiento, ]
datos_prueba <- rotacion_df[-indices_entrenamiento, ]

Procedemos a observar el conjunto de datos obtenido.

# Mostrar las primeras filas del nuevo dataset
head(datos_entrenamiento)
## # A tibble: 6 × 7
##   Años_Experiencia  Edad Satisfación_Laboral Cargo      Horas_Extra Estado_Civil
##              <dbl> <dbl>               <dbl> <chr>      <chr>       <chr>       
## 1                8    41                   4 Ejecutivo… Si          Soltero     
## 2               10    49                   2 Investiga… No          Casado      
## 3                7    37                   3 Tecnico_L… Si          Soltero     
## 4                8    32                   4 Tecnico_L… No          Soltero     
## 5                1    30                   3 Tecnico_L… No          Divorciado  
## 6               17    36                   3 Represent… No          Casado      
## # ℹ 1 more variable: Rotación <dbl>
# Mostrar las primeras filas del nuevo dataset
head(datos_prueba)
## # A tibble: 6 × 7
##   Años_Experiencia  Edad Satisfación_Laboral Cargo      Horas_Extra Estado_Civil
##              <dbl> <dbl>               <dbl> <chr>      <chr>       <chr>       
## 1                8    33                   3 Investiga… Si          Casado      
## 2                6    27                   2 Tecnico_L… No          Casado      
## 3               12    59                   1 Tecnico_L… Si          Casado      
## 4               10    38                   3 Director_… No          Soltero     
## 5               10    29                   3 Tecnico_L… Si          Soltero     
## 6                6    28                   3 Tecnico_L… Si          Soltero     
## # ℹ 1 more variable: Rotación <dbl>

Ya con esto podemos proceder a generar el modelo con los datos de entrenamiento generados.

4.2 Entrenamiento Modelo Logit

datos_entrenamiento$Rotación
##    [1] 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0
##   [38] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0
##   [75] 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
##  [112] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
##  [149] 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
##  [186] 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
##  [223] 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
##  [260] 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
##  [297] 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0
##  [334] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0
##  [371] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1
##  [408] 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0
##  [445] 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0
##  [482] 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1
##  [519] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0
##  [556] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0
##  [593] 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
##  [630] 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0
##  [667] 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
##  [704] 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
##  [741] 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
##  [778] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
##  [815] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0
##  [852] 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0
##  [889] 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1
##  [926] 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0
##  [963] 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [1000] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
# Estimar el modelo logit con variables categóricas
modelo_logit <- glm(datos_entrenamiento$Rotación ~ ., data = datos_entrenamiento, family = binomial)

# Mostrar un resumen del modelo
summary(modelo_logit)
## 
## Call:
## glm(formula = datos_entrenamiento$Rotación ~ ., family = binomial, 
##     data = datos_entrenamiento)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                  -1.91140    0.95405  -2.003  0.04513 *  
## Años_Experiencia             -0.00424    0.02308  -0.184  0.85426    
## Edad                         -0.03642    0.01572  -2.316  0.02055 *  
## Satisfación_Laboral          -0.33803    0.08635  -3.915 9.05e-05 ***
## CargoDirector_Manofactura     0.42595    0.87202   0.488  0.62522    
## CargoEjecutivo_Ventas         1.57643    0.78488   2.008  0.04459 *  
## CargoGerente                  0.93930    0.91228   1.030  0.30319    
## CargoInvestigador_Cientifico  1.10270    0.80757   1.365  0.17211    
## CargoRecursos_Humanos         2.05767    0.89535   2.298  0.02155 *  
## CargoRepresentante_Salud      0.05510    0.91583   0.060  0.95203    
## CargoRepresentante_Ventas     2.52965    0.85366   2.963  0.00304 ** 
## CargoTecnico_Laboratorio      2.04833    0.80140   2.556  0.01059 *  
## Horas_ExtraSi                 1.71319    0.20365   8.412  < 2e-16 ***
## Estado_CivilDivorciado       -0.26256    0.28272  -0.929  0.35306    
## Estado_CivilSoltero           0.92065    0.21780   4.227 2.37e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 879.08  on 1028  degrees of freedom
## Residual deviance: 694.96  on 1014  degrees of freedom
## AIC: 724.96
## 
## Number of Fisher Scoring iterations: 6

De lo anterior obtenemos unos valores similares a lo anterior. Un \(b_{0}\) pequeño, y el modelo logit quedaria de la siguiente manera.

\(Rotacion = \frac{1}{1 + e^{-(\beta_{0} + \beta_{1}* AnosExperiencia + \beta_{2}* Antiguedad + \beta_{3}* AnosCargoConMismoJefe + \beta_{4} * CargoDirectorManofactura + \beta_{5} * CargoEjecutivoVentas + \beta_{6} * Cargo_Gerente + \beta_{7} * CargoInvestigadorCientifico + \beta_{8} * CargoRecursosHumanos + \beta_{9} * CargoRepresentanteSalud + \beta_{10} * CargoRepresentanteVentas + \beta_{11} * CargoTecnicoLaboratorio + \beta_{12} * HorasExtraSi + \beta_{13} * EstadoCivilDivorciado + \beta_{14} * EstadoCivilSoltero)}}\)

Lo que vemos en coeficientes es Representante_Ventas, Tecnico_Laboratorio, CargoRecursos_Humanos y Horas_ExtraSi que los grupos con coeficientes positivos con valores más grandes, lo cual nos indica que nos permite identificar un grupo sensible rotacion. Por contrario los coeficientes de las personas con muchos años experiencia, y edades mayores suelen ser personas que permanecen mas tiempo en un lugar de empleo.

5. Evaluacion Modelo

Lo que observamos de nuestro \(R^{2}\) es que con un valor \(R^{2}=0.6507\), nos puede explicar 65% de la variabilidad de los datos, de manera proporcional. Lo ideal sería que fuera cerca 1, pero en este caso no se presenta.

Para mejorar esta metrica podríamos tomar acciones como buscar mas variables relevante para el modelo, escalar las variables para que esten en la misma magnitud, también eliminar outliers, detectar de multicolinealidad para eliminar variables que tal vez presenten redundancia de información.

# Predecir las probabilidades de rotación para los datos de prueba
#predicciones <- predict(modelo_logit, newdata = datos_prueba, type = "response")

predicciones <- predict(modelo_logit, newdata = datos_prueba, type = "response")

# Convertir las predicciones en clases basadas en un umbral de decisión
clases_predichas <- ifelse(predicciones > 0.5, 1, 0)

# Calcular la precisión
precision <- mean(clases_predichas == datos_prueba$Rotación)
precision
## [1] 0.8390023

Obtuvimos una métrica de precision de 0.839 de los valores, lo cual es muy positivo. Ahora procedemos a graficar la curva ROC

# Instalar y cargar el paquete pROC si aún no lo has hecho
# install.packages("pROC")
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following object is masked from 'package:rapportools':
## 
##     var
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
# Calcular la curva ROC
curva_roc <- roc(datos_prueba$Rotación, predicciones)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Graficar la curva ROC
plot(curva_roc, main = "Curva ROC", col = "blue", lwd = 2)

# Calcular el área bajo la curva (AUC)
auc <- auc(curva_roc)

# Mostrar el valor del AUC en la gráfica
text(0.5, 0.5, paste("AUC =", round(auc, 2)), adj = c(0.5, -0.5))

# Añadir una línea de referencia diagonal
abline(a = 0, b = 1, lty = 2)

# Añadir leyenda
legend("bottomright", legend = paste("AUC =", round(auc, 2)), col = "blue", lty = 1, cex = 0.8)

Con lo anterior obtuvimos una gran métrica, lo que mas queremos evitar es la es que sea 0.5, que significa que no tiene la capacidad de predecir, con un 0,76 significa que tiene un buen nivel para segmentar ambos grupos y captar la generalidad de cada uno de los grupos. Hay buen equilibrio entre sensitividad y especificidad. Ademas de que con un accuracy de 0.839 es buen valor.

6. Conclusiones :

  • Hacer un buen tratamiento de datos y análisis extenso antes de generar un modelo predictivo es importante para que cuando el modelo y algoritmo se configure pueda tener un mejor desempeño al momento de evaluarlo.

  • Las métricas para determinar si el resultado de un modelo es bueno, en este caso lo mejor es usar ROC y accuracy. Para determinar el comportamiento del modelo.

  • Lo que observamos es que las personas casadas o con mas años de experiencia. Suelen buscar lugares mas estables para permanecer, lo que ayuda a evitar la rotación, en general la sensación de inestabilidad de un lugar de trabajo, por eso también mantener el jefe usual, es algo que ayuda a determinar si alguien se va a quedar, o las horas extra, ya que las horas extra para alguien que quiere estabilidad no es algo muy positivo, en general como estrategia para poder retener trabajadores lo mejor es ofrecer estabilidad laboral, donde los horarios sean claros, las funcionalidades y así mismo las personas con las que se va trabajar para generar la sensación de familiaridad y constancia, por eso las personas como Años_Experiencia, Edad, Satisfación_Laboral, Estado_CivilDivorciado tienen coeficiente negativo, es decir este tipo de grupos quieren estabilidad a mayor cantidad de años de experiencias y satisfacción laboral alta es un grupo que no tiende tanto a la rotación laboral.

  • Parte esencial de crear un plan de retención de empleados, es esencial identificar el grupo mas vulnerable en este caso suelen ser personas personas solteras suelen ser que tienen movilidad alta, al igual que los cargos bajos, como Representante_Ventas y Tecnico_Laboratorio y CargoRecursos_Humanos que los grupos con coeficientes positivos con valores más grandes. Al parecer este tipo de cargos deben tener mejores condiciones laborales, tener estabilidad en contrato, no tener horas extra y dar oportunidad a gente mayor, que son características que ayudaría a mermar el numero de personas que rota mucho laboral mente.