Integrantes:
Luis Angel Elizondo Gallegos A01198186
Avril Lobato Delgado A00833113
Genaro RodrĆguez A00833172
Enrique Pablos A00835037
Diego PerƩz A01275561
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
## Warning: package 'plotly' was built under R version 4.3.3
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
## Warning: package 'forecast' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Warning: package 'tm' was built under R version 4.3.3
## Loading required package: NLP
##
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
##
## annotate
## Warning: package 'wordcloud' was built under R version 4.3.3
## Loading required package: RColorBrewer
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
## Warning: package 'e1071' was built under R version 4.3.3
##
## Attaching package: 'ggpubr'
## The following object is masked from 'package:forecast':
##
## gghistogram
## Registered S3 methods overwritten by 'dlookr':
## method from
## plot.transform scales
## print.transform scales
##
## Attaching package: 'dlookr'
## The following objects are masked from 'package:e1071':
##
## kurtosis, skewness
## The following object is masked from 'package:tidyr':
##
## extract
## The following object is masked from 'package:base':
##
## transform
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
## Warning: package 'tseries' was built under R version 4.3.3
## Warning: package 'vars' was built under R version 4.3.3
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:plotly':
##
## select
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: strucchange
## Warning: package 'strucchange' was built under R version 4.3.3
## Loading required package: sandwich
## Loading required package: urca
## Warning: package 'urca' was built under R version 4.3.3
## Loading required package: lmtest
##
## Attaching package: 'vars'
## The following object is masked from 'package:dlookr':
##
## normality
## Warning: package 'syuzhet' was built under R version 4.3.3
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
##
## Attaching package: 'scales'
## The following object is masked from 'package:syuzhet':
##
## rescale
## The following object is masked from 'package:readr':
##
## col_factor
## The following object is masked from 'package:purrr':
##
## discard
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following object is masked from 'package:dplyr':
##
## combine
## The following object is masked from 'package:ggplot2':
##
## margin
La base para la situación problema de Recursos Humanos en Form estÔ conformada por 29 variables para un total de 553 empleados registrados, entre las cuÔles se presenta información personal del empleado como su nombre, fecha de nacimiento, género y lugar de residencia, asà como datos laborales que incluyen fecha de inicio en Form, departamento, puesto, salario, entre otros datos del tipo fiscal. Esta fue creada a partir de la unión previa de la base de empleados actuales de Form hasta el 2024, asà como la base de Bajas Form 2024.
En consideración de esto, la base resultante presenta información tanto de empleados que continĆŗan sus actividades laborales en la empresa (empleado con mayor antigüedad en 2010), como de aquellos que han abandonado sus puestos desde 2022. Para estos Ćŗltimos se consideran datos relacionados con la baja, como la fecha, motivo y detalles de Ć©sta. Asimismo, es necesario mencionar que mediante la unión de ambas bases, fue posible determinar la variable dependiente a analizar, la cual corresponde a āRenunciaā, una variable previamente creada para diferenciar a los empleados de cada previa, es decir, aquellos que SĆ renuncian y los que No.
## tibble [553 Ć 29] (S3: tbl_df/tbl/data.frame)
## $ No_Empleado : num [1:553] 10 12 13 19 20 29 35 37 42 44 ...
## $ Apellidos : chr [1:553] "Luna Lopez" "Suarez Romo" "Cruz Ramos" "Garcia Perales" ...
## $ Nombre : chr [1:553] "Yolanda Judith" "Julio Cesar" "Victor Abel" "Yuliana Mireya" ...
## $ Fecha_Nacimiento : POSIXct[1:553], format: "1985-08-18" "1969-06-27" ...
## $ Genero : chr [1:553] "Femenino" "Masculino" "Masculino" "Femenino" ...
## $ RFC : chr [1:553] "LULY8508183C7" "SURJ690627TK7" "CURV890621SC2" "GAPY840819V87" ...
## $ Fecha_Alta : POSIXct[1:553], format: "2017-02-20" "2017-12-01" ...
## $ Primer_mes : POSIXct[1:553], format: "2017-03-22" "2017-12-31" ...
## $ Cuarto_mes : POSIXct[1:553], format: "2017-06-20" "2018-03-31" ...
## $ Baja : POSIXct[1:553], format: "2023-10-02" "2023-01-05" ...
## $ Puesto : chr [1:553] "Costurera" "Gestor" "Chofer" "Ayudante General" ...
## $ Departamento : chr [1:553] "Costura" "Embarques" "Embarques" "Produccion Cartón MC" ...
## $ No_SeguroSocial : chr [1:553] "43108518077" "43956909626" "43058956681" "43008429805" ...
## $ Salario_diario : num [1:553] 153 177 177 144 177 ...
## $ Fact_Infonavit : chr [1:553] NA NA NA NA ...
## $ No_CreditoInfonavit: chr [1:553] NA NA NA NA ...
## $ Lugar_nacimiento : chr [1:553] NA NA NA NA ...
## $ CURP : chr [1:553] "LULY850818MNLNPL02" "SURJ690627HNLRML04" "CURV890621HVZRMC05" "GAPY840819MNLRRL00" ...
## $ Calle : chr [1:553] "De Los Carniceros" "Mar Rojo" "Altamura" "Santa Rosa" ...
## $ No_Interno : chr [1:553] NA NA "216" NA ...
## $ Colonia : chr [1:553] "C. H. Blas Chumacero C.T.M" "Loma Linda" "Lomas De San Martin" "El Rosario" ...
## $ Municipio : chr [1:553] "San Nicolas De Los G" "Monterrey" "Pesqueria" "Apodaca" ...
## $ Estado : chr [1:553] "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ Codigo_Postal : num [1:553] 66473 64120 66673 66647 25115 ...
## $ Estado_Civil : chr [1:553] "Casado" "Casado" "Casado" "Unión libre" ...
## $ Tarjeta_Cuenta : chr [1:553] "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
## $ Renuncia : chr [1:553] "Si" "Si" "Si" "Si" ...
## $ MotivoRenuncia : chr [1:553] "Personal" "Interna" "No le agradaba horario de entrada/salida" NA ...
## $ DetallesRenuncia : chr [1:553] "DejarÔ de trabajar para atender a sus hijos en casa" "Se realizó cambio de empresa (Form - Poligrama)" NA NA ...
## No_Empleado Apellidos Nombre
## Min. : 1.0 Length:553 Length:553
## 1st Qu.:202.0 Class :character Class :character
## Median :350.0 Mode :character Mode :character
## Mean :380.3
## 3rd Qu.:501.0
## Max. :851.0
##
## Fecha_Nacimiento Genero RFC
## Min. :1955-09-10 00:00:00.000 Length:553 Length:553
## 1st Qu.:1983-08-14 00:00:00.000 Class :character Class :character
## Median :1994-05-06 00:00:00.000 Mode :character Mode :character
## Mean :1991-05-20 09:17:15.080
## 3rd Qu.:2000-10-30 00:00:00.000
## Max. :2022-10-31 00:00:00.000
##
## Fecha_Alta Primer_mes
## Min. :2010-07-01 00:00:00.00 Min. :2010-07-31 00:00:00.00
## 1st Qu.:2022-12-23 00:00:00.00 1st Qu.:2023-01-22 00:00:00.00
## Median :2023-05-24 00:00:00.00 Median :2023-06-23 00:00:00.00
## Mean :2023-02-17 05:30:42.30 Mean :2023-03-19 08:35:35.25
## 3rd Qu.:2023-08-25 00:00:00.00 3rd Qu.:2023-09-24 00:00:00.00
## Max. :2024-05-07 00:00:00.00 Max. :2024-06-06 00:00:00.00
##
## Cuarto_mes Baja
## Min. :2010-10-29 00:00:00.00 Min. :2022-01-25 00:00:00.00
## 1st Qu.:2023-04-24 00:00:00.00 1st Qu.:2023-03-02 00:00:00.00
## Median :2023-09-23 00:00:00.00 Median :2023-06-07 00:00:00.00
## Mean :2023-06-19 01:38:57.06 Mean :2023-05-24 11:12:43.64
## 3rd Qu.:2023-12-25 00:00:00.00 3rd Qu.:2023-08-14 06:00:00.00
## Max. :2024-09-06 00:00:00.00 Max. :2024-02-22 00:00:00.00
## NA's :157
## Puesto Departamento No_SeguroSocial Salario_diario
## Length:553 Length:553 Length:553 Min. :1.440e+02
## Class :character Class :character Class :character 1st Qu.:2.180e+02
## Mode :character Mode :character Mode :character Median :2.180e+02
## Mean :2.751e+06
## 3rd Qu.:2.180e+02
## Max. :1.517e+09
##
## Fact_Infonavit No_CreditoInfonavit Lugar_nacimiento CURP
## Length:553 Length:553 Length:553 Length:553
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Calle No_Interno Colonia Municipio
## Length:553 Length:553 Length:553 Length:553
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Estado Codigo_Postal Estado_Civil Tarjeta_Cuenta
## Length:553 Min. : 9999 Length:553 Length:553
## Class :character 1st Qu.:66646 Class :character Class :character
## Mode :character Median :66646 Mode :character Mode :character
## Mean :65125
## 3rd Qu.:66670
## Max. :99999
##
## Renuncia MotivoRenuncia DetallesRenuncia
## Length:553 Length:553 Length:553
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
Tras haber comprendido la estructura y contenido de la base de datos, se llevó a cabo una serie de medidas para la limpieza y ajuste para su adecuado procesamiento. Estos se muestran a continuación:
Se optó por modificar el nombre de las columnas del dataframe con la finalidad de facilitar el manejo y entendimiento de las columnas durante la manipulación de los datos, considerando aspectos como el evitar los espacios en blanco y el uso de sĆmbolos para cada uno de los nombres. Los nombres definitivos para cada columna puede apreciarse a continuación:
# Renombrar columnas
colnames(rh_alt) <- c('No_Empleado','Apellidos', 'Nombre','Fecha_Nacimiento','Genero', 'RFC',
'Fecha_Alta','Primer_mes','Cuarto_mes','Baja','Puesto','Departamento',
'No_SeguroSocial','Salario_diario', 'Fact_Infonavit','No_CreditoInfonavit',
'Lugar_nacimiento','CURP', 'Calle', 'No_Interno','Colonia','Municipio',
'Estado','Codigo_Postal','Estado_Civil', 'Tarjeta', 'Renuncia',
'MotivoRenuncia', 'DetalleRenuncia')
Primeramente se identificaron nulos sobre las variables listadas a continuación:
Baja (Fecha baja)
Departamento
Fact_Infonavit
No_CreditoInfonavit
MotivoRenuncia
DetalleRenuncia
Tarjeta
Lugar de Nacimiento
Para atender esta situación fueron empleadas dos medidas:
Reemplazar valores nulos: Esta medida consistió en cambiar los valores nulos por una nueva clase. Para el primer caso, la columna Departamento, se definió como Ćrea Desconocida, con la intención de no perder los datos para estos empleados, sino que en caso de destacar como variable en los modelos, tener la capacidad de analizarla mediante su variable complementaria āPuestoā. Por otro lado, las variables relacionadas con el comportamiento de renuncia, incluyendo MotivoRenuncia y DetalleRenuncia, para los empleados actualmente activos, al no haber renunciado no es posible contar con valores para esta columna, por lo que se crea la clase āNo Aplicaā.
Insertar NAs: Debido a la naturaleza del resto de variables consideradas, una falta en sus registros no puede imputarse directamente. Ante esto, directamente fue insertado el valor āNaā. Esta medida no tendrĆ” un efecto perjudicial sobre los niveles de las variables, pues los casos en los que aplica consideran información muy amplia y especĆfica, por lo que al no ser de utilidad, serĆ”n descartadas en el proceso de selección de variables para la especificación de los modelos mĆ”s adelante.
# Identificar variables con valores nulos
missing_values <- sapply(rh_alt, function(x) sum(is.na(x)))
missing_values
## No_Empleado Apellidos Nombre Fecha_Nacimiento
## 0 0 0 0
## Genero RFC Fecha_Alta Primer_mes
## 0 0 0 0
## Cuarto_mes Baja Puesto Departamento
## 0 157 0 369
## No_SeguroSocial Salario_diario Fact_Infonavit No_CreditoInfonavit
## 0 0 46 35
## Lugar_nacimiento CURP Calle No_Interno
## 31 0 0 17
## Colonia Municipio Estado Codigo_Postal
## 0 0 0 0
## Estado_Civil Tarjeta Renuncia MotivoRenuncia
## 0 50 0 481
## DetalleRenuncia
## 516
# Imputar/Reemplazar valores nulos
## Departamento
rh_alt <- rh_alt %>%
mutate(Departamento = ifelse(is.na(Departamento), "Area No Definida", Departamento))
## MotivoRenuncia
rh_alt$MotivoRenuncia[rh_alt$MotivoRenuncia == "N/A"] <- "No aplica"
rh_alt$MotivoRenuncia <- ifelse(is.na(rh_alt$MotivoRenuncia), "No aplica", rh_alt$MotivoRenuncia)
## DetalleRenuncia
rh_alt$DetalleRenuncia[rh_alt$DetalleRenuncia == "N/A"] <- "No aplica"
rh_alt$DetalleRenuncia <- ifelse(is.na(rh_alt$DetalleRenuncia), "No aplica", rh_alt$DetalleRenuncia)
# Insertar Nas
## Fact_Infonavit
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == "CUOTA FIJA EN VSM"] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == "CUOTA FIJA"] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == " "] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == "N/A"] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == "Mensual"] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == "Pesos"] <- "Na"
rh_alt$Fact_Infonavit[rh_alt$Fact_Infonavit == NULL] <- "Na"
rh_alt$Fact_Infonavit <- ifelse(is.na(rh_alt$Fact_Infonavit), "Na", rh_alt$Fact_Infonavit)
## No_Interno
rh_alt$No_Interno[rh_alt$No_Interno == "N/A"] <- "Na"
rh_alt$No_Interno <- ifelse(is.na(rh_alt$No_Interno), "Na", rh_alt$No_Interno)
## No_CreditoInfonavit
rh_alt$No_CreditoInfonavit[rh_alt$No_CreditoInfonavit == " "] <- "Na"
rh_alt$No_CreditoInfonavit[rh_alt$No_CreditoInfonavit == "N/A"] <- "Na"
rh_alt$No_CreditoInfonavit[rh_alt$No_CreditoInfonavit == NULL] <- "Na"
rh_alt$No_CreditoInfonavit[rh_alt$No_CreditoInfonavit == "N/A"] <- "Na"
rh_alt$No_CreditoInfonavit <- ifelse(is.na(rh_alt$No_CreditoInfonavit), "Na", rh_alt$No_CreditoInfonavit)
## Lugar de Nacimiento
rh_alt$Lugar_nacimiento[rh_alt$Lugar_nacimiento == "N/A"] <- "Na"
rh_alt$Lugar_nacimiento <- ifelse(is.na(rh_alt$Lugar_nacimiento), "Na", rh_alt$Lugar_nacimiento)
Con la finalidad de establecer una escritura estandarizada, se definieron funciones que permitirÔn disponer de valores sin acentos y con letras minúsculas (para algunos casos), guiando a un mejor procesamiento de los datos en su lectura para la creación de modelos.
# Definir funciones para estandarizar columnas a minĆŗsculas sin acentos
convertir_acentos <- function(x) {
x <- chartr("ƔƩĆóúüñĆĆĆĆĆĆĆ", "aeiouunAEIOUUN", x)
x
}
convertir_acentos1 <- function(x) {
x <- tolower(iconv(x, from = "latin1", to = "UTF-8"))
x <- chartr("ƔƩĆóúüñĆĆĆĆĆĆĆ", "aeiouunAEIOUUN", x)
x
}
convertir_acentos2 <- function(x) {
x <- tolower(iconv(x, from = "latin1", to = "UTF-8"))
x <- chartr("ƔƩĆóúüñĆĆĆĆĆĆĆ", "aeiouunAEIOUUN", x)
x
}
convertir_acentos3 <- function(x) {
x <- tolower(iconv(x, from = "latin1", to = "UTF-8"))
x <- chartr("ƔƩĆóúüñĆĆĆĆĆĆĆ", "aeiouunAEIOUUN", x)
x
}
# Pasar nombres y apellidos a minĆŗsculas
rh_alt <- rh_alt %>%
mutate(Nombre = tolower(iconv(Nombre, from = "latin1", to = "UTF-8")),
Apellidos = tolower(iconv(Apellidos, from = "latin1", to = "UTF-8")))
# Aplicar las funciones
rh_alt$Nombre <- convertir_acentos(rh_alt$Nombre)
rh_alt$Apellidos <- convertir_acentos(rh_alt$Apellidos)
rh_alt$Puesto <- convertir_acentos1(rh_alt$Puesto)
rh_alt$MotivoRenuncia <- convertir_acentos2(rh_alt$MotivoRenuncia)
rh_alt$DetalleRenuncia <- convertir_acentos2(rh_alt$DetalleRenuncia)
rh_alt$Departamento <- convertir_acentos3(rh_alt$Departamento)
El proceso de homologación considera el definir una Ćŗnica forma de escribir los nombres de las clases o niveles en una variable al detectar que esta ha sido escrita de mĆŗltiples formas diferentes entre sĆ. Debido a esto, es necesario recodificar cada una de las variaciones y asĆ disponer de una cantidad real de niveles para las variables categóricas.
# Estandarizar variables categóricas como Estado_Civil, Puesto, Departamento, etc.
rh_alt$Estado_Civil <- recode(rh_alt$Estado_Civil,
"Soltera" = "Solteria", "Soltero" = "Solteria",
"Casada" = "Matrimonio", "casado" = "Matrimonio",
"CASADA" = "Matrimonio", "CASADO" = "Matrimonio",
"Casado" = "Matrimonio", "Divorciada" = "Divorcio",
"Separada" = "Divorcio", "Divorciado" = "Divorcio",
"Unión Libre" = "Union Libre", "Unión libre" = "Union Libre",
"Unión libre" = "Union Libre", "Viudo" = "Viudez",
"Viuda" = "Viudez")
Adicional a la recodificación de la variable Departamento, se creó la columna āOtrosā, esta considera: Cajas, Celdas, Mantenimiento y Rotativa. Esta etiqueta fue creada debido al bajo volumen de empleados dentro de los departamentos previamente mencionados, asĆ como una similitud entre las tareas y nivel organizacional.
rh_alt$Puesto[rh_alt$Puesto == "ayudante de embarques"] <- "Ayudante de embarques"
rh_alt$Puesto[rh_alt$Puesto == "ayud. de embarques"] <- "Ayudante de embarques"
rh_alt$Puesto[rh_alt$Puesto == "auxiliar de embarques"] <- "Ayudante de embarques"
rh_alt$Puesto[rh_alt$Puesto == "ayudante de soldador"] <- "Ayudante de soldador"
rh_alt$Puesto[rh_alt$Puesto == "ayu. de soldador"] <- "Ayudante de soldador"
rh_alt$Puesto[rh_alt$Puesto == "ay. general"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "Ayudante general"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "ayu. de pintor"] <- "Ayudante de pintor"
rh_alt$Puesto[rh_alt$Puesto == "Ayudante De Pintor"] <- "Ayudante de pintor"
rh_alt$Puesto[rh_alt$Puesto == "ayudante general-cedis"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "ayudante general cedis"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "ayudante general"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "inspectora de calidad"] <- "Calidad"
rh_alt$Puesto[rh_alt$Puesto == "calidad"] <- "Calidad"
rh_alt$Puesto[rh_alt$Puesto == "inspector de calidad"] <- "Calidad"
rh_alt$Puesto[rh_alt$Puesto == "Inspectora De Calidad"] <- "Calidad"
rh_alt$Puesto[rh_alt$Puesto == "Materialista"] <- "Materiales"
rh_alt$Puesto[rh_alt$Puesto == "Operador Sierra"] <- "Operador"
rh_alt$Puesto[rh_alt$Puesto == "Op. Flexo-Ranuradora-Refiladora"] <- "Operador"
rh_alt$Puesto[rh_alt$Puesto == "op. flexo-ranuradora-refiladora"] <- "Operador"
rh_alt$Puesto[rh_alt$Puesto == "materialista"] <- "Materiales"
rh_alt$Puesto[rh_alt$Puesto == "materiales"] <- "Materiales"
rh_alt$Puesto[rh_alt$Puesto == "costurera"] <- "Costura"
rh_alt$Puesto[rh_alt$Puesto == "costurero"] <- "Costura"
rh_alt$Puesto[rh_alt$Puesto == "chofer gestor"] <- "Chofer"
rh_alt$Puesto[rh_alt$Puesto == "Chofer CEDIS"] <- "Chofer"
rh_alt$Puesto[rh_alt$Puesto == "chofer"] <- "Chofer"
rh_alt$Puesto[rh_alt$Puesto == "gestor"] <- "Gestor"
rh_alt$Puesto[rh_alt$Puesto == "residente"] <- "Residente"
rh_alt$Puesto[rh_alt$Puesto == "pintor"] <- "Pintor"
rh_alt$Puesto[rh_alt$Puesto == "limpieza"] <- "Limpieza"
rh_alt$Puesto[rh_alt$Puesto == "enfermera"] <- "Enfermera"
rh_alt$Puesto[rh_alt$Puesto == "soldador"] <- "Soldador"
rh_alt$Puesto[rh_alt$Puesto == "mozo"] <- "Ayudante general"
rh_alt$Puesto[rh_alt$Puesto == "almacenista"] <- "Almacenista"
rh_alt$Puesto[rh_alt$Puesto == "guardia de seguridad"] <- "Guardia"
rh_alt$Puesto[rh_alt$Puesto == "supervisor de maquina"] <- "Supervisor"
rh_alt$Puesto[rh_alt$Puesto == "supervisor de pegado"] <- "Supervisor"
rh_alt$Puesto[rh_alt$Puesto == "supervisora"] <- "Supervisor"
rh_alt$Puesto[rh_alt$Puesto == "supervisor de maquinas"] <- "Supervisor"
rh_alt$Puesto[rh_alt$Puesto == "marcadora"] <- "Marcadora"
rh_alt$Puesto[rh_alt$Puesto == "chofer cedis"] <- "Chofer"
rh_alt$Puesto[rh_alt$Puesto == "residente stabilus"] <- "Residente"
rh_alt$Puesto[rh_alt$Puesto == "residente yfcf"] <- "Residente"
rh_alt$Puesto[rh_alt$Puesto == "ayudante de mantenimiento"] <- "Ayudante de mantenimiento"
rh_alt$Puesto[rh_alt$Puesto == "montacarguista"] <- "Montacarguista"
# Recodificación columna Departamento
rh_alt$Departamento[rh_alt$Departamento == "Cedis"] <- "CEDIS"
rh_alt$Departamento[rh_alt$Departamento == "cedis"] <- "CEDIS"
rh_alt$Departamento[rh_alt$Departamento == "calidad"] <- "Calidad"
rh_alt$Departamento[rh_alt$Departamento == "cajas"] <- "Otros"
rh_alt$Departamento[rh_alt$Departamento == "cortadoras"] <- "Cortadoras"
rh_alt$Departamento[rh_alt$Departamento == "costura"] <- "Costura"
rh_alt$Departamento[rh_alt$Departamento == "celdas"] <- "Otros"
rh_alt$Departamento[rh_alt$Departamento == "embarques"] <- "Embarques"
rh_alt$Departamento[rh_alt$Departamento == "Ehs"] <- "EHS"
rh_alt$Departamento[rh_alt$Departamento == "ehs"] <- "EHS"
rh_alt$Departamento[rh_alt$Departamento == "mantenimieto"] <- "Otros"
rh_alt$Departamento[rh_alt$Departamento == "mantenimiento"] <- "Otros"
rh_alt$Departamento[rh_alt$Departamento == "materiales"] <- "Materiales"
rh_alt$Departamento[rh_alt$Departamento == "paileria"] <- "Paileria y Pintura"
rh_alt$Departamento[rh_alt$Departamento == "paileria y pintura"] <- "Paileria y Pintura"
rh_alt$Departamento[rh_alt$Departamento == "rotativa"] <- "Otros"
rh_alt$Departamento[rh_alt$Departamento == "stabilus"] <- "Stabilus"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Carton MC"] <- "Produccion Carton MC"
rh_alt$Departamento[rh_alt$Departamento == "produccion carton mc"] <- "Produccion Carton MC"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Cartón MC"] <- "Produccion Carton MC"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Cart\xf3n MC"] <- "Produccion Carton MC"
rh_alt$Departamento[rh_alt$Departamento == "produccion carton mdl"] <- "Produccion Carton MDL"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Cart\xf3n MDL"] <- "Produccion Carton MDL"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Carton MDL"] <- "Produccion Carton MDL"
rh_alt$Departamento[rh_alt$Departamento == "Produccion Cartón Mdl"] <- "Produccion Carton MDL"
rh_alt$Departamento[rh_alt$Departamento == "Producción Retorn"] <- "Produccion Retornable"
rh_alt$Departamento[rh_alt$Departamento == "produccion retornable"] <- "Produccion Retornable"
rh_alt$Departamento[rh_alt$Departamento == "produccion cartã³n mdl"] <- "Produccion Carton MDL"
rh_alt$Departamento[rh_alt$Departamento == "produccion cartã³n mc"] <- "Produccion Carton MC"
rh_alt$Departamento[rh_alt$Departamento == "producciã³n retornable"] <- "Produccion Retornable"
rh_alt$Departamento[rh_alt$Departamento == "producciã³n cartã³n mc"] <- "Produccion Carton MC"
# Recodificación columna Municipio
rh_alt$Municipio[rh_alt$Municipio == "Ramoz Arizpe"] <- "Ramos Arizpe"
rh_alt$Municipio[rh_alt$Municipio == "RAMOS ARIZPE"] <- "Ramos Arizpe"
rh_alt$Municipio[rh_alt$Municipio == "PESQUERIA"] <- "Pesqueria"
rh_alt$Municipio[rh_alt$Municipio == "MONTERREY"] <- "Monterrey"
rh_alt$Municipio[rh_alt$Municipio == "JUAREZ"] <- "Juarez"
rh_alt$Municipio[rh_alt$Municipio == "GUADALUPE"] <- "Guadalupe"
rh_alt$Municipio[rh_alt$Municipio == "CAĆADA BLANCA"] <- "CaƱada Blanca"
rh_alt$Municipio[rh_alt$Municipio == "APODACA"] <- "Apodaca"
rh_alt$Municipio[rh_alt$Municipio == "SAN NICOLAS DE LOS G"] <- "San Nicolas de los Garza"
rh_alt$Municipio[rh_alt$Municipio == "San Nicolas De Los G"] <- "San Nicolas de los Garza"
rh_alt$Municipio[rh_alt$Municipio == "San Nicolas"] <- "San Nicolas de los Garza"
rh_alt$Municipio[rh_alt$Municipio == "Cienega de Flores"] <- "Cienega de Flores"
rh_alt$Municipio[rh_alt$Municipio == "Cienega De Flores"] <- "Cienega de Flores"
rh_alt$Municipio[rh_alt$Municipio == "CiƩnega de Flores"] <- "Cienega de Flores"
rh_alt$Municipio[rh_alt$Municipio == "SALTILLO"] <- "Saltillo"
# Recodificación columna Estado
rh_alt$Estado[rh_alt$Estado == "Nuevo León"] <- "Nuevo Leon"
rh_alt$Estado[rh_alt$Estado == "Nuevo Le\xf3n"] <- "Nuevo Leon"
rh_alt$Estado[rh_alt$Estado == "COAHUILA"] <- "Coahuila"
Una vez corregidas las variables disponibles en la base de datos, es necesario definir nuevas posibles variables independientes que permitan aportar mayor explicabilidad a la variable de interés (Renuncia). Ante esto, se utilizaron las variables de fechas, las cuales pasaron por una transformación a columna tipo fecha, para definir dos nuevas variables:
Edad: La edad de los empleados puede ser una variable de impacto en su criterio para continuar o no trabajando en una empresa, considerando las posibles implicaciones fĆsicas y sociales de contar una menor o mayor edad. La columna fue creada tomando en cuenta el escenario de empleados de baja y los que continĆŗan laborando. Esto se determino en caso de tener o no valores nulos en la columna de fecha de baja, siendo esta la restada a su fecha de nacimiento para los empleados para conocer la edad a la que deciden renunciar. Por otro lado, para los empleados que deciden continuar, su edad es calculada restando la fecha al dĆa actual a su fecha de nacimiento, siendo esta considerada como una posible edad para que los empleados opten por continuar en la empresa.
NombreMes: El Mes en el que iniciaron actividades laborales en Form puede ser un factor decisivo para que un empleado opte por permanecer o no en la empresa, considerando la primera impresión de las actividades del dĆa a dĆa que deberĆ” estar realizando. Esta variable fue creada al extraer el mes de la columna Fecha Alta.
# Convertir fechas en formato de fecha
rh_alt$Fecha_Nacimiento<-as.Date(rh_alt$Fecha_Nacimiento,format="%m/%d/%Y")
rh_alt$Fecha_Alta <-as.Date(rh_alt$Fecha_Alta,format="%m/%d/%Y")
rh_alt$Primer_mes <-as.Date(rh_alt$Primer_mes,format="%m/%d/%Y")
rh_alt$Cuarto_mes <-as.Date(rh_alt$Cuarto_mes,format="%m/%d/%Y")
rh_alt$Baja <-as.Date(rh_alt$Baja,format="%m/%d/%Y")
rh_alt <- rh_alt %>%
mutate(Fecha_Hoy = Sys.Date())
rh_alt$Fecha_Hoy <-as.Date(rh_alt$Fecha_Hoy,format="%m/%d/%Y")
# Crear columna edad
rh_alt <- rh_alt %>%
mutate(
Edad = ifelse(is.na(Baja),
floor(as.numeric(difftime(Fecha_Hoy, Fecha_Nacimiento, units = "days")) / 365),
floor(as.numeric(difftime(Baja, Fecha_Nacimiento, units = "days")) / 365))
)
# Crear columna NombreMes
rh_alt$NombreMes <- format(rh_alt$Fecha_Alta, "%B")
Dentro de las columnas disponibles originalmente en la base de datos, se detectaron outliers en una de ellas, siendo el Salario Diario con una cantidad considerablemente alta a diferencia del resto de salarios. Asimismo, tras crear la columna Edad se identificaron cantidades muy bajas, siendo imposible contar con empleados que no cumplen con la mayorĆa de edad laborando en la empresa.
Tras considerar ambos casos, se realizó una imputación de la mediana, como una alternativa mĆ”s representativa ante el sesgo que pudiera implicar el usar la media de los datos. Para el caso de edad se realiza la imputación al contar con una edad menor a la mayorĆa de edad. Por otro lado, en el salario diario se imputa al considerar altas cantidades que superan los $5000 MXN diarios.
# Reemplazar outliers
## Variable Edad
mediana_edad <- median(rh_alt$Edad, na.rm = TRUE)
rh_alt$Edad <- ifelse(rh_alt$Edad < 17, mediana_edad, rh_alt$Edad)
## Variable Salario
mediana_salario <- median(rh_alt$Salario_diario, na.rm = TRUE)
rh_alt$Salario_diario <- ifelse(rh_alt$Salario_diario > 5000, mediana_salario, rh_alt$Salario_diario)
Finalmente, el último tratamiento de los datos contempla la conversión de variables categóricas a factores, alineando algunas de las variables al procesamiento necesario para la creación de modelos de aprendizaje automÔtico.
Junto a esto, la revisión final consiste en usar variables que contienen datos puntuales y especĆficos para cada persona, como su nombre y apellido (previamente estandarizados en escritura) y su RFC, para detectar empleados registrados mĆŗltiples veces. Este proceso revela que no existen estos casos en la base de datos resultante.
# Convertir variables categóricas a factores
rh_alt$Genero <-as.factor(rh_alt$Genero)
rh_alt$Puesto <-as.factor(rh_alt$Puesto)
rh_alt$Departamento <-as.factor(rh_alt$Departamento)
rh_alt$Municipio <-as.factor(rh_alt$Municipio)
rh_alt$Estado <-as.factor(rh_alt$Estado)
rh_alt$Estado_Civil <-as.factor(rh_alt$Estado_Civil)
rh_alt$Salario_diario<-as.numeric(rh_alt$Salario_diario)
rh_alt$Renuncia <-as.factor(rh_alt$Renuncia)
rh_alt$NombreMes <-as.factor(rh_alt$NombreMes)
# Eliminar duplicados
rh_alt <- distinct(rh_alt, Nombre, Apellidos, RFC, .keep_all = TRUE)
summary(rh_alt)
## No_Empleado Apellidos Nombre Fecha_Nacimiento
## Min. : 1.0 Length:553 Length:553 Min. :1955-09-10
## 1st Qu.:202.0 Class :character Class :character 1st Qu.:1983-08-14
## Median :350.0 Mode :character Mode :character Median :1994-05-06
## Mean :380.3 Mean :1991-05-20
## 3rd Qu.:501.0 3rd Qu.:2000-10-30
## Max. :851.0 Max. :2022-10-31
##
## Genero RFC Fecha_Alta Primer_mes
## Femenino :306 Length:553 Min. :2010-07-01 Min. :2010-07-31
## Masculino:247 Class :character 1st Qu.:2022-12-23 1st Qu.:2023-01-22
## Mode :character Median :2023-05-24 Median :2023-06-23
## Mean :2023-02-17 Mean :2023-03-19
## 3rd Qu.:2023-08-25 3rd Qu.:2023-09-24
## Max. :2024-05-07 Max. :2024-06-06
##
## Cuarto_mes Baja Puesto
## Min. :2010-10-29 Min. :2022-01-25 Ayudante general:450
## 1st Qu.:2023-04-24 1st Qu.:2023-03-02 Costura : 15
## Median :2023-09-23 Median :2023-06-07 Soldador : 12
## Mean :2023-06-19 Mean :2023-05-24 Chofer : 10
## 3rd Qu.:2023-12-25 3rd Qu.:2023-08-14 Residente : 10
## Max. :2024-09-06 Max. :2024-02-22 Calidad : 8
## NA's :157 (Other) : 48
## Departamento No_SeguroSocial Salario_diario
## area no definida :369 Length:553 Min. :144.4
## Produccion Carton MC : 50 Class :character 1st Qu.:217.6
## Produccion Carton MDL: 37 Mode :character Median :217.6
## CEDIS : 24 Mean :215.9
## Costura : 15 3rd Qu.:217.6
## Produccion Retornable: 14 Max. :337.1
## (Other) : 44
## Fact_Infonavit No_CreditoInfonavit Lugar_nacimiento CURP
## Length:553 Length:553 Length:553 Length:553
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Calle No_Interno Colonia Municipio
## Length:553 Length:553 Length:553 Apodaca :370
## Class :character Class :character Class :character Pesqueria : 60
## Mode :character Mode :character Mode :character Juarez : 50
## Guadalupe : 30
## Ramos Arizpe : 24
## General Zuazua: 4
## (Other) : 15
## Estado Codigo_Postal Estado_Civil Tarjeta Renuncia
## Coahuila : 27 Min. : 9999 Divorcio : 8 Length:553 No:157
## Nuevo Leon:526 1st Qu.:66646 Matrimonio :155 Class :character Si:396
## Median :66646 Solteria :258 Mode :character
## Mean :65125 Union Libre:130
## 3rd Qu.:66670 Viudez : 2
## Max. :99999
##
## MotivoRenuncia DetalleRenuncia Fecha_Hoy Edad
## Length:553 Length:553 Min. :2024-06-02 Min. :18.00
## Class :character Class :character 1st Qu.:2024-06-02 1st Qu.:22.00
## Mode :character Mode :character Median :2024-06-02 Median :29.00
## Mean :2024-06-02 Mean :31.87
## 3rd Qu.:2024-06-02 3rd Qu.:40.00
## Max. :2024-06-02 Max. :68.00
##
## NombreMes
## julio : 70
## agosto : 65
## febrero: 63
## abril : 60
## enero : 57
## marzo : 55
## (Other):183
Durante el proceso de limpieza y anĆ”lisis de los datos del archivo āform_rh_datos.xlsxā, se identificaron y corrigieron mĆŗltiples inconsistencias y errores considerando desde valores atĆpicos hasta ortografĆa incorrecta, los cuales podĆan afectar la calidad de los anĆ”lisis posteriores. Uno de los hallazgos mĆ”s relevantes fue la presencia de valores nulos en varias columnas clave, como āFact_Infonavitā y āFecha_Nacimientoā. Estos valores se gestionaron mediante la imputación de datos faltantes y la eliminación de registros incompletos, lo que permitió mejorar la integridad y consistencia del conjunto de datos.
AdemĆ”s, se realizaron correcciones en las variables categóricas, como la estandarización de los nombres de empleados y departamentos para asegurar uniformidad en el anĆ”lisis. Por ejemplo, se corrigieron inconsistencias en la columna āEstado_Civilā, donde tĆ©rminos como āSolteraā y āCasadoā se unificaron bajo las categorĆas āSolteriaā y āMatrimonioā, respectivamente. Este paso fue crucial para evitar duplicaciones y errores durante el anĆ”lisis de las tendencias demogrĆ”ficas y de empleo.
La creación de nuevas variables, como la āEdadā de los empleados, y la corrección de valores atĆpicos en āSalario_diarioā y āEdadā, permitió obtener una visión mĆ”s precisa y adecuada de los datos. En resumen, el proceso de limpieza y estandarización no solo mejoró la calidad del conjunto de datos, sino que tambiĆ©n sentó las bases para anĆ”lisis mĆ”s robustos y confiables en futuros estudios. Este ejercicio subraya la importancia de la limpieza de datos en el campo de Business Intelligence, donde decisiones informadas y estrategias efectivas dependen de la precisión y confiabilidad de los datos analizados.
## # A tibble: 20 Ć 32
## No_Empleado Apellidos Nombre Fecha_Nacimiento Genero RFC Fecha_Alta
## <dbl> <chr> <chr> <date> <fct> <chr> <date>
## 1 10 luna lopez yolan⦠1985-08-18 Femen⦠LULY⦠2017-02-20
## 2 12 suarez romo julio⦠1969-06-27 Mascu⦠SURJ⦠2017-12-01
## 3 13 cruz ramos victo⦠1989-06-21 Mascu⦠CURV⦠2018-03-23
## 4 19 garcia perales yulia⦠1984-08-19 Femen⦠GAPY⦠2019-05-02
## 5 20 yabert alvarado mario⦠1990-06-24 Mascu⦠YAAM⦠2019-07-30
## 6 29 lopez torres martin 1978-02-27 Mascu⦠LOTM⦠2020-08-20
## 7 35 celestino barboza jaime 1982-06-02 Mascu⦠CEBJ⦠2021-02-16
## 8 37 hernandez felix emili⦠1993-06-22 Femen⦠HEFE⦠2021-03-25
## 9 42 chapan marcial ernes⦠1969-11-11 Femen⦠CAME⦠2021-05-27
## 10 44 arriaga reyes erika⦠2001-10-22 Femen⦠AIRE⦠2021-08-12
## 11 45 gonzalez esquivel franc⦠1982-01-08 Mascu⦠GOEF⦠2021-09-15
## 12 48 garcia chapa jesus⦠2003-01-20 Mascu⦠GACJ⦠2021-10-09
## 13 49 perez olarte santi⦠2001-07-25 Mascu⦠PEOS⦠2021-11-04
## 14 56 garcia garcia sofia 2002-01-11 Femen⦠GAGS⦠2022-02-11
## 15 57 salas perales irene⦠1976-09-29 Femen⦠SAPI⦠2022-02-16
## 16 59 hernandez tovar palom⦠2000-05-01 Femen⦠HETP⦠2022-03-09
## 17 60 esquivel medina cassa⦠2002-11-22 Femen⦠EUMC⦠2022-03-09
## 18 64 compean paz ferna⦠1997-01-22 Mascu⦠COPF⦠2022-04-09
## 19 67 ortiz de la torre fermi⦠1966-07-07 Femen⦠OITF⦠2022-06-01
## 20 71 martinez ramirez yudit⦠1977-03-07 Femen⦠MARY⦠2022-06-14
## # ā¹ 25 more variables: Primer_mes <date>, Cuarto_mes <date>, Baja <date>,
## # Puesto <fct>, Departamento <fct>, No_SeguroSocial <chr>,
## # Salario_diario <dbl>, Fact_Infonavit <chr>, No_CreditoInfonavit <chr>,
## # Lugar_nacimiento <chr>, CURP <chr>, Calle <chr>, No_Interno <chr>,
## # Colonia <chr>, Municipio <fct>, Estado <fct>, Codigo_Postal <dbl>,
## # Estado_Civil <fct>, Tarjeta <chr>, Renuncia <fct>, MotivoRenuncia <chr>,
## # DetalleRenuncia <chr>, Fecha_Hoy <date>, Edad <dbl>, NombreMes <fct>
## No_Empleado Apellidos Nombre Fecha_Nacimiento
## Min. : 1.0 Length:553 Length:553 Min. :1955-09-10
## 1st Qu.:202.0 Class :character Class :character 1st Qu.:1983-08-14
## Median :350.0 Mode :character Mode :character Median :1994-05-06
## Mean :380.3 Mean :1991-05-20
## 3rd Qu.:501.0 3rd Qu.:2000-10-30
## Max. :851.0 Max. :2022-10-31
##
## Genero RFC Fecha_Alta Primer_mes
## Femenino :306 Length:553 Min. :2010-07-01 Min. :2010-07-31
## Masculino:247 Class :character 1st Qu.:2022-12-23 1st Qu.:2023-01-22
## Mode :character Median :2023-05-24 Median :2023-06-23
## Mean :2023-02-17 Mean :2023-03-19
## 3rd Qu.:2023-08-25 3rd Qu.:2023-09-24
## Max. :2024-05-07 Max. :2024-06-06
##
## Cuarto_mes Baja Puesto
## Min. :2010-10-29 Min. :2022-01-25 Ayudante general:450
## 1st Qu.:2023-04-24 1st Qu.:2023-03-02 Costura : 15
## Median :2023-09-23 Median :2023-06-07 Soldador : 12
## Mean :2023-06-19 Mean :2023-05-24 Chofer : 10
## 3rd Qu.:2023-12-25 3rd Qu.:2023-08-14 Residente : 10
## Max. :2024-09-06 Max. :2024-02-22 Calidad : 8
## NA's :157 (Other) : 48
## Departamento No_SeguroSocial Salario_diario
## area no definida :369 Length:553 Min. :144.4
## Produccion Carton MC : 50 Class :character 1st Qu.:217.6
## Produccion Carton MDL: 37 Mode :character Median :217.6
## CEDIS : 24 Mean :215.9
## Costura : 15 3rd Qu.:217.6
## Produccion Retornable: 14 Max. :337.1
## (Other) : 44
## Fact_Infonavit No_CreditoInfonavit Lugar_nacimiento CURP
## Length:553 Length:553 Length:553 Length:553
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Calle No_Interno Colonia Municipio
## Length:553 Length:553 Length:553 Apodaca :370
## Class :character Class :character Class :character Pesqueria : 60
## Mode :character Mode :character Mode :character Juarez : 50
## Guadalupe : 30
## Ramos Arizpe : 24
## General Zuazua: 4
## (Other) : 15
## Estado Codigo_Postal Estado_Civil Tarjeta Renuncia
## Coahuila : 27 Min. : 9999 Divorcio : 8 Length:553 No:157
## Nuevo Leon:526 1st Qu.:66646 Matrimonio :155 Class :character Si:396
## Median :66646 Solteria :258 Mode :character
## Mean :65125 Union Libre:130
## 3rd Qu.:66670 Viudez : 2
## Max. :99999
##
## MotivoRenuncia DetalleRenuncia Fecha_Hoy Edad
## Length:553 Length:553 Min. :2024-06-02 Min. :18.00
## Class :character Class :character 1st Qu.:2024-06-02 1st Qu.:22.00
## Mode :character Mode :character Median :2024-06-02 Median :29.00
## Mean :2024-06-02 Mean :31.87
## 3rd Qu.:2024-06-02 3rd Qu.:40.00
## Max. :2024-06-02 Max. :68.00
##
## NombreMes
## julio : 70
## agosto : 65
## febrero: 63
## abril : 60
## enero : 57
## marzo : 55
## (Other):183
Inicialmente, para la creación de los modelos de aprendizaje automÔtico se dividieron los datos en dos conjuntos, entrenamiento y prueba, con una repartición 80-20, tomando en cuenta que el 80% de los datos se consideren como entrenamiento. Este tamaño de conjuntos se planteó considerando la baja cantidad de registros de empleados disponibles, siendo necesario conservar una alta cantidad de registros para un mejor entrenamiento por parte del modelo, conservando un 20% para su posterior evaluación.
Objetivo
Esta partición considera la variable de interĆ©s, previamente definida como Renuncia o No Renuncia, esto con el objetivo de construir modelos capaces principalmente de determinar las cualidades que conducen a que un empleado decida mantenerse en Form, optimizando asĆ la selección de prospectos durante el proceso de reclutamiento, y en algunos casos al diseƱo de estrategias para aumentar esfuerzos sobre los empleados con mayor tendencia a renunciar, guiando de esta manera a mejorar los niveles de retención en la empresa. En consideración de esto, la clase de positiva o de interĆ©s serĆa āNoā, es decir, aquellos empleados que no renuncian.
Primeramente, se descartan variables inadecuadas por su extensión de valores disponibles (Calle, No_Interno, Colonia), redundancia (Ubicación GeogrÔfica, Ej: Estado-Municipio), o información irrelevante (Datos Personales y fiscales: nombre, No_CreditoInfonavit, No_CreditoInfonavit, etc.). Posteriormente, tras evaluar múltiples variables en la especificación del modelo, las siguientes fueron seleccionadas como las mÔs adecuadas para predecir la Renuncia de los colaboradores.
El primer modelo seleccionado es la regresión lineal, siendo un modelo inicial adecuado debido a su simplicidad y funcionamiento, permitiendo establecer una base para comprender el comportamiento de renuncia por los empleados en Form.
Primeramente, es necesario destacar las variables que obtuvieron un mayor nivel de significancia al obtener un p-value menor a 0.05, es decir, las que realmente permiten la distinción de las categorĆas en la variable de interĆ©s. En conjunto con esto, tambiĆ©n aquellas con un mayor nivel de importancia en el modelo, al tener nivel de impacto mayor para pertenecer a una clase u otra.
Salario Diario: Cuenta con un nivel de significancia bastante alto, al igual que con el mayor nivel de importancia en el modelo (6.88). Con un coeficiente de -5.083e-02, esta variable determina que los empleados que Renuncian cuentan con un salario mƔs bajo.
Departamento: La pertenencia a los departamentos de Produccion Carton MC, Costura, Produccion Retornable y Produccion Carton MDL representan una alta significancia, al igual que algunos de los niveles mƔs altos de importancia (5.74, 5.19, 4.84 y 4 respectivamente). Los coeficientes revelan que los empleados en estos departamentos son aquellos que tienen mayor abandono, particularmente siendo en mayor medida por el departamento de costura al tener el coeficiente mƔs bajo (-5.741e+00).
Mes: El ser contratados durante los meses de Febrero, Junio y Julio tiene un alto nivel de signifancia dentro del modelo, asĆ como los niveles mĆ”s altos niveles de importancia para los meses (4.71, 4.36 y 3.83 respectivamente). Al ser contratado durante el mes de junio, los empleados tienden a renunciar mĆ”s de acuerdo a un coeficiente alto de 5.829e+00, posiblemente debido a las altas temperaturas del verano. Igualmente, Febrero serĆa el segundo mes mĆ”s alto (considerando Ćŗnicamente los significativos), que tiene mayor tendencia a que los empleados renuncien, siendo los mĆ”s ideales los meses de mayo y enero como los meses significativos (p-value menor a 0.05) con el coeficiente mĆ”s bajo (menor tendencia a renunciar).
##
## Call:
## glm(formula = formula_glm, family = "binomial", data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.106e+01 3.919e+00 2.823 0.004755 **
## GeneroMasculino -3.574e-01 3.547e-01 -1.008 0.313540
## DepartamentoCalidad -2.725e+00 1.447e+00 -1.883 0.059703 .
## DepartamentoCEDIS -1.719e+01 2.084e+03 -0.008 0.993417
## DepartamentoCortadoras 1.542e+01 3.956e+03 0.004 0.996891
## DepartamentoCostura -5.539e+00 1.103e+00 -5.024 5.05e-07 ***
## DepartamentoEHS -2.969e+00 1.107e+00 -2.681 0.007336 **
## DepartamentoEmbarques -1.040e+00 1.002e+00 -1.038 0.299131
## DepartamentoMateriales 1.434e+01 1.579e+03 0.009 0.992753
## DepartamentoOtros -4.112e+00 1.375e+00 -2.991 0.002779 **
## DepartamentoPaileria y Pintura -3.094e+00 1.451e+00 -2.132 0.033035 *
## DepartamentoProduccion Carton MC -3.792e+00 6.537e-01 -5.802 6.56e-09 ***
## DepartamentoProduccion Carton MDL -2.516e+00 6.207e-01 -4.053 5.05e-05 ***
## DepartamentoProduccion Retornable -4.073e+00 8.456e-01 -4.816 1.46e-06 ***
## DepartamentoStabilus 1.224e+01 2.407e+03 0.005 0.995942
## MunicipioCienega de Flores 1.284e+01 3.956e+03 0.003 0.997409
## MunicipioEscobedo 1.412e+01 3.956e+03 0.004 0.997153
## MunicipioGeneral Zuazua -1.333e+00 2.022e+00 -0.659 0.509971
## MunicipioGuadalupe -1.686e+00 7.930e-01 -2.126 0.033518 *
## MunicipioHuinala -1.596e+01 3.956e+03 -0.004 0.996781
## MunicipioJuarez 2.181e-02 6.223e-01 0.035 0.972042
## MunicipioMonterrey 3.566e-01 4.855e+00 0.073 0.941457
## MunicipioPesqueria -2.481e-01 5.669e-01 -0.438 0.661651
## MunicipioRamos Arizpe 1.553e+01 2.084e+03 0.007 0.994055
## MunicipioSalinas Victoria 3.337e+01 5.595e+03 0.006 0.995241
## MunicipioSaltillo 1.152e+01 2.084e+03 0.006 0.995590
## MunicipioSan Nicolas de los Garza -1.969e+01 3.956e+03 -0.005 0.996028
## Estado_CivilMatrimonio 2.340e+00 3.358e+00 0.697 0.485995
## Estado_CivilSolteria 2.527e+00 3.360e+00 0.752 0.451960
## Estado_CivilUnion Libre 2.328e+00 3.375e+00 0.690 0.490283
## Estado_CivilViudez -1.495e+01 3.956e+03 -0.004 0.996984
## Salario_diario -5.285e-02 7.607e-03 -6.947 3.74e-12 ***
## Edad -3.337e-02 1.736e-02 -1.922 0.054592 .
## NombreMesagosto 2.172e+00 7.196e-01 3.018 0.002546 **
## NombreMesdiciembre 2.391e+00 1.061e+00 2.253 0.024250 *
## NombreMesenero 1.670e+00 7.243e-01 2.305 0.021159 *
## NombreMesfebrero 3.511e+00 7.348e-01 4.778 1.77e-06 ***
## NombreMesjulio 3.016e+00 7.795e-01 3.869 0.000109 ***
## NombreMesjunio 5.940e+00 1.340e+00 4.431 9.37e-06 ***
## NombreMesmarzo 1.036e+00 5.592e-01 1.853 0.063931 .
## NombreMesmayo 1.374e+00 6.453e-01 2.130 0.033193 *
## NombreMesnoviembre -8.987e-03 9.029e-01 -0.010 0.992058
## NombreMesoctubre 5.663e-01 9.007e-01 0.629 0.529523
## NombreMesseptiembre 1.903e+00 8.398e-01 2.266 0.023421 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 529.02 on 442 degrees of freedom
## Residual deviance: 264.99 on 399 degrees of freedom
## AIC: 352.99
##
## Number of Fisher Scoring iterations: 16
# Impacto de las Variables
Importancia <- varImp(model_glm1)
Importancia <- Importancia %>%
arrange(desc(Overall))
Importancia
## Overall
## Salario_diario 6.946690215
## DepartamentoProduccion Carton MC 5.801755553
## DepartamentoCostura 5.024336935
## DepartamentoProduccion Retornable 4.816238280
## NombreMesfebrero 4.778487359
## NombreMesjunio 4.431239857
## DepartamentoProduccion Carton MDL 4.053355395
## NombreMesjulio 3.869496152
## NombreMesagosto 3.017772537
## DepartamentoOtros 2.991192244
## DepartamentoEHS 2.681191005
## NombreMesenero 2.305127624
## NombreMesseptiembre 2.266499071
## NombreMesdiciembre 2.253141479
## DepartamentoPaileria y Pintura 2.131652580
## NombreMesmayo 2.129738773
## MunicipioGuadalupe 2.125825491
## Edad 1.922107625
## DepartamentoCalidad 1.882982290
## NombreMesmarzo 1.852663783
## DepartamentoEmbarques 1.038298815
## GeneroMasculino 1.007822503
## Estado_CivilSolteria 0.752151982
## Estado_CivilMatrimonio 0.696692277
## Estado_CivilUnion Libre 0.689858387
## MunicipioGeneral Zuazua 0.658882912
## NombreMesoctubre 0.628733850
## MunicipioPesqueria 0.437635015
## MunicipioMonterrey 0.073439334
## MunicipioJuarez 0.035047642
## NombreMesnoviembre 0.009953382
## DepartamentoMateriales 0.009083075
## DepartamentoCEDIS 0.008250414
## MunicipioRamos Arizpe 0.007450765
## MunicipioSalinas Victoria 0.005964589
## MunicipioSaltillo 0.005527697
## DepartamentoStabilus 0.005085925
## MunicipioSan Nicolas de los Garza 0.004977652
## MunicipioHuinala 0.004034689
## DepartamentoCortadoras 0.003896589
## Estado_CivilViudez 0.003780021
## MunicipioEscobedo 0.003568782
## MunicipioCienega de Flores 0.003246788
El modelo demuestra tener un desempeño inicial adecuado, siendo acertado en un 87.27% de los casos en que un colaborador tiende a renunciar. Asimismo, cuenta con un Kappa de 0.6793, teniendo por lo tanto, un mejor desempeño que una predicción aleatoria.
# Predicción
prediccion_glm <- predict(model_glm1, test, type = "response")
# Matriz de confuisión
confusion_glm <- confusionMatrix(as.factor(ifelse(prediccion_glm>0.5, "Si", "No")),
test$Renuncia, positive = "No")
print(confusion_glm)
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Si
## No 23 6
## Si 8 73
##
## Accuracy : 0.8727
## 95% CI : (0.7957, 0.9286)
## No Information Rate : 0.7182
## P-Value [Acc > NIR] : 8.935e-05
##
## Kappa : 0.6793
##
## Mcnemar's Test P-Value : 0.7893
##
## Sensitivity : 0.7419
## Specificity : 0.9241
## Pos Pred Value : 0.7931
## Neg Pred Value : 0.9012
## Prevalence : 0.2818
## Detection Rate : 0.2091
## Detection Prevalence : 0.2636
## Balanced Accuracy : 0.8330
##
## 'Positive' Class : No
##
Asimismo, en el modelo glm se obtiene un valor en AUC de 0.85, reafirmando que la predicción del modelo es mejor que una predicción aleatoria.
# Curva ROC
## Obtener las puntuaciones de probabilidad
prediccion_prob_glm <- predict(model_glm1, test, type = "response")
## Generar la curva ROC
roc_obj_glm <- roc(test$Renuncia, as.numeric(prediccion_prob_glm))
## Dibujar la curva ROC
plot.roc(roc_obj_glm, main = "Curva ROC", col = "blue")
## Area under the curve: 0.8591
El segundo modelo elegido es el Ćrbol de Decisión, el cual al ser un modelo basado en el establecimiento de reglas, un planteamiento comĆŗnmente usado en problemas de clasificación, asĆ como ser un modelo de fĆ”cil interpretación visual, fue seleccionado como una de las posibles alternativas de modelo para el entendimiento en el comportamiento de renuncia de los empleados de Form.
El primer camino (0% de probabilidad de renunciar con cobertura del 2% de empleados) indica que cuando el salario diario es menor a 229, el empleado trabaja en uno de los departamentos (Calidad, CEDIS, EHS, Embarques, Otros, PailerĆa y Pintura, Producción Cartón MDL) y el mes es enero o noviembre, la probabilidad de renuncia es muy baja, casi nula.
El segundo camino (11% de probabilidad de renunciar con cobertura del 20% de empleados) sugiere que cuando el salario diario es igual o mayor a 229, la probabilidad de renuncia aumenta ligeramente, pero todavĆa es relativamente baja.
El tercer camino (14% de probabilidad de renunciar con cobertura del 7% de empleados) muestra que si el salario diario es menor a 229, el empleado trabaja en los departamentos (Calidad, CEDIS, EHS, Embarques, Otros, PailerĆa y Pintura, Producción Cartón MDL) y el mes es agosto, diciembre, febrero, julio, octubre o septiembre, y la edad es mayor o igual a 47, la probabilidad de renuncia es mayor que en la primera regla, pero aĆŗn no es muy alta.
El cuarto camino (18% de probabilidad de renunciar con cobertura del 2% de empleados) muestra una mayor probabilidad de renuncia cuando se combinan caracterĆsticas como salario diario menor a 229, trabajo en los departamentos (Costura, Producción Cartón MC, Producción Retornable) y el mes es agosto, diciembre, enero, febrero, julio, noviembre, octubre o septiembre.
El quinto camino (86% de probabilidad de renunciar con cobertura del 8% de empleados) indica una alta probabilidad de renuncia cuando el salario diario es menor a 229 y el empleado trabaja en los departamentos de (Calidad, CEDIS, EHS, Embarques, Otros, PailerĆa y Pintura, Producción Cartón MDL) durante los meses agosto, diciembre, febrero, julio, octubre o septiembre, y la edad es menor a 47.
El sexto camino (89% de probabilidad de renunciar con cobertura del 8% de empleados) indica una alta probabilidad de renuncia cuando el salario diario es menor a 229 y el empleado trabaja en los departamentos de (Calidad, CEDIS, Costura, EHS, Embarques, Otros, PailerĆa y Pintura, Producción Cartón MC, Producción Cartón MDL, Producción Retornable) durante los meses abril, junio, marzo o mayo.
Finalmente, el sĆ©ptimo camino (100% de probabilidad de renuncia con cobertura del 56%, la mayorĆa de empleados) muestra la probabilidad mĆ”s alta de renuncia cuando el salario diario es menor a 229 y el empleado trabaja en departamentos (Ćrea no definida, Cortadoras, Materiales, Stabilus).
El anĆ”lisis sobre las reglas del modelo de Ćrbol determina que los empleados con salarios diarios bajos (menos de 229) estĆ”n mĆ”s propensos a renunciar, particularmente si trabajan en departamentos especĆficos y en ciertos meses del aƱo. Este riesgo de renuncia se intensifica en Ć”reas como Calidad, CEDIS, EHS, Embarques, Otros, PailerĆa y Pintura, Producción Cartón MDL, Producción Cartón MC, y Producción Retornable, posiblemente debido a factores como mayores cargas de trabajo, ambientes laborales desafiantes u oportunidades de crecimiento limitadas. AdemĆ”s, la probabilidad de renuncia aumenta durante los meses de agosto, diciembre, febrero, julio, octubre y septiembre, pudiendo ser perĆodos de alta demanda laboral o factores estacionales que les generan mayor estrĆ©s.
# GrĆ”fica del Ćrbol de Decisión
rpart.plot(arbol, type = 5, box.palette = "GnRd", shadow.col = "gray")
# Reglas del Ćrbol
rpart.rules(arbol, style = "tallw", cover = FALSE, clip.facs = TRUE, faclen = 0)
## Renuncia is 0.00 when
## Salario_diario < 229
## Calidad or CEDIS or EHS or Embarques or Otros or Paileria y Pintura or Produccion Carton MDL
## enero or noviembre
##
## Renuncia is 0.11 when
## Salario_diario >= 229
##
## Renuncia is 0.18 when
## Salario_diario < 229
## Costura or Produccion Carton MC or Produccion Retornable
## agosto or diciembre or enero or febrero or julio or noviembre or octubre or septiembre
##
## Renuncia is 0.22 when
## Salario_diario < 229
## Calidad or CEDIS or EHS or Embarques or Otros or Paileria y Pintura or Produccion Carton MDL
## agosto or diciembre or febrero or julio or octubre or septiembre
## Edad >= 46
##
## Renuncia is 0.89 when
## Salario_diario < 229
## Calidad or CEDIS or Costura or EHS or Embarques or Otros or Paileria y Pintura or Produccion Carton MC or Produccion Carton MDL or Produccion Retornable
## abril or junio or marzo or mayo
##
## Renuncia is 0.90 when
## Salario_diario < 229
## Calidad or CEDIS or EHS or Embarques or Otros or Paileria y Pintura or Produccion Carton MDL
## agosto or diciembre or febrero or julio or octubre or septiembre
## Edad < 46
##
## Renuncia is 1.00 when
## Salario_diario < 229
## area no definida or Cortadoras or Materiales or Stabilus
De acuerdo a los resultados de la matriz de confusión, el desempeño inicial del modelo muestra que se logra predecir acertadamente en un 87.27% de los casos. AdemÔs cuenta con un nivel de Kappa de 0.6856, siendo mejor a una predicción aleatoria.
# Predicción
prediccion_A<- predict(arbol, test, type="class")
# Matriz de confuisión
confusion_A <- confusionMatrix(prediccion_A, test$Renuncia,positive = "No")
print(confusion_A)
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Si
## No 24 7
## Si 7 72
##
## Accuracy : 0.8727
## 95% CI : (0.7957, 0.9286)
## No Information Rate : 0.7182
## P-Value [Acc > NIR] : 8.935e-05
##
## Kappa : 0.6856
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.7742
## Specificity : 0.9114
## Pos Pred Value : 0.7742
## Neg Pred Value : 0.9114
## Prevalence : 0.2818
## Detection Rate : 0.2182
## Detection Prevalence : 0.2818
## Balanced Accuracy : 0.8428
##
## 'Positive' Class : No
##
El AUC obtenido para el modelo de Ôrbol de decisión es de 0.92, reafirmando su desempeño sobre un modelo aleatoria.
# Curva ROC
## Obtener las puntuaciones de probabilidad
prediccion_prob_tree <- predict(arbol, test, type = "prob")
prediccion_prob_true_tree <- prediccion_prob_tree[ , "No"]
## Generar la curva ROC
roc_obj_tree <- roc(test$Renuncia, prediccion_prob_true_tree)
## Dibujar la curva ROC
plot.roc(roc_obj_tree, main="Curva ROC", col="blue")
## Area under the curve: 0.9249
El tercer modelo elegido fue Naive Bayes, este modelo fue seleccionado como una alternativa debido a su enfoque en la probabilidad condicional bajo el supuesto de que cada una de las variables explicativas impacta de manera independiente a la variable interĆ©s (sin existe una interacción entre ellas). Este funcionamiento puede representar una forma estadĆstica clara para diferenciar entre los empleados que renuncian y los que se mantienen en la empresa, manteniendo un buen nivel de interpretabilidad a travĆ©s de visualizaciones de la probabilidad para cada una de las variables independientes.
Con la finalidad de interpretar adecuadamente el modelo de Naive Bayes, con su supuesto de independiente, se obtuvieron una serie de visualizaciones que permiten determinar la probabilidad condicional con la que un nivel o valor en las variables independientes determina que un empleado renuncie o no
Se observa que la probabilidad de renuncia es similar para las mujeres y los hombres, ya que el modelo Naive Bayes no encuentra una diferencia significativa en la probabilidad de renuncia entre los dos gĆ©neros, es decir, el gĆ©nero no representa una variable que tenga efecto sobre el si un empleado renuncia o no. Esto podrĆa ocurrir debido a que los empleados dan mayor peso a otras variables y hay una distinción casi nula en el trato a los empleados segun su genero. No obstante, se observa que las mujeres tienen una probabilidad de renuncia ligeramente mayor que los hombres, por ende, se requiere generar un lugar de trabajo mĆ”s justo y equitativo para todos los empleados.
bp <- barplot(modelo_nb$tables$Genero, beside = TRUE, col = c("black", "lightgray"), legend.text = TRUE, main = "GƩnero",
ylim = c(0, max(modelo_nb$tables$Genero) * 1.2))
text(x = bp, y = modelo_nb$tables$Genero, label = round(modelo_nb$tables$Genero,4), pos = 3)
Los empleados del departamento āĆrea no definidaā tienen una mayor
probabilidad de considerar la renuncia, posiblemente debido a la falta
de claridad en sus roles y responsabilidades, lo que genera
incertidumbre y desmotivación. En contraste, aquellos que trabajan en
los departamentos de Producción MC, MCL y Retornable, asà como en
Costura y CEDIS, muestran una mayor probabilidad de permanecer en la
empresa, probablemente porque estos roles estƔn mejor definidos y
proporcionan una mayor estabilidad y satisfacción laboral. De hecho, la
variación de probabilidades de renuncia entre los diferentes
departamentos de FORM puede explicarse por diversos factores
relacionados con el contexto de negocio de la empresa. Algunos de estos
factores podrĆan ser:
* Condiciones de trabajo: Las condiciones de trabajo en algunos
departamentos pueden ser mƔs duras o peligrosas que en otros, lo que
podrĆa conducir a una menor satisfacción laboral y una mayor
probabilidad de renuncia.
* Salario y beneficios: El salario y los beneficios pueden ser mƔs bajos
en algunos departamentos que en otros, lo que podrĆa llevar a la
frustración y la renuncia.
* Oportunidades de crecimiento: Las oportunidades de crecimiento pueden
ser mĆ”s limitadas en algunos departamentos que en otros, lo que podrĆa
desmotivar a los empleados y llevarlos a buscar oportunidades en otras
empresas.
* Cultura del departamento: La cultura del departamento puede ser mƔs
negativa o tóxica en algunos departamentos que en otros, lo que podrĆa
crear un ambiente de trabajo hostil y llevar a la renuncia.
bp <- barplot(modelo_nb$tables$Departamento, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), main = "Departamento",
ylim = c(0, max(modelo_nb$tables$Departamento) * 1.2), cex.names = 0.6)
text(x = bp, y = modelo_nb$tables$Departamento, label = round(modelo_nb$tables$Departamento,2), pos = 3)
Los colaboradores del municipio de Apodaca tienen mayor probabilidad de considerar renunciar debido a posibles desafĆos logĆsticos y una menor calidad de vida, lo que afecta negativamente su satisfacción laboral. En contraste, los colaboradores de Guadalupe tienen mayor probabilidad de permanecer en la empresa, posiblemente gracias a mejores condiciones de vida y servicios, lo que contribuye a una mayor satisfacción y compromiso con la empresa. Sin embargo, es importante destacar la variación de probabilidades de renuncia entre los diferentes municipios de FORM, lo cual puede explicarse por diversos factores relacionados con el contexto de negocio de la empresa. Algunos de estos factores podrĆan ser: * Costo de vida: El costo de vida puede ser mĆ”s alto en algunos municipios que en otros, lo que podrĆa llevar a la insatisfacción de los empleados con su salario y beneficios. * Distancia al trabajo: La distancia al trabajo puede ser mĆ”s larga en algunos municipios que en otros, lo que podrĆa generar dificultades en el transporte y un menor equilibrio entre la vida laboral y personal. * Oportunidades de empleo: Las oportunidades de empleo pueden ser mĆ”s limitadas en algunos municipios que en otros, lo que podrĆa desmotivar a los empleados y llevarlos a buscar oportunidades en otras empresas. * Calidad de vida: La calidad de vida puede ser mĆ”s baja en algunos municipios que en otros, lo que podrĆa afectar negativamente la satisfacción general de los empleados.
bp <-barplot(modelo_nb$tables$Municipio, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), main = "Municipio",
ylim = c(0, max(modelo_nb$tables$Municipio) * 1.2))
text(x = bp, y = modelo_nb$tables$Municipio, label = round(modelo_nb$tables$Municipio,2), pos = 3)
Los colaboradores en matrimonio y los divorciados tienen una mayor probabilidad de permanecer en la empresa, probablemente debido a sus mayores responsabilidades familiares y financieras, que los hacen valorar mĆ”s la estabilidad laboral. Por otro lado, los colaboradores solteros y aquellos en unión libre presentan una mayor probabilidad de renunciar, posiblemente debido a su menor nivel de compromisos personales, lo que les otorga una mayor libertad para buscar nuevas oportunidades y cambios en su carrera profesional. La diferencia de probabilidades de renuncia entre los empleados de FORM segĆŗn su estado civil puede explicarse por diversos factores relacionados con el contexto de negocio de la empresa. Algunos de estos factores podrĆan ser: * EstrĆ©s: Los empleados divorciados pueden experimentar mĆ”s estrĆ©s que los empleados casados o solteros, lo que podrĆa afectar negativamente su salud mental y fĆsica y conducir a una menor satisfacción laboral y una mayor probabilidad de renuncia. * Dificultades financieras: Los empleados divorciados pueden tener mĆ”s dificultades financieras que los empleados casados o solteros, lo que podrĆa llevarlos a buscar un trabajo con un salario mĆ”s alto o a renunciar para cuidar a sus hijos. * Falta de apoyo social: Los empleados divorciados pueden tener menos apoyo social que los empleados casados o solteros, lo que podrĆa desmotivarlos y hacerlos mĆ”s propensos a renunciar.
bp <-barplot(modelo_nb$tables$Estado_Civil, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), main = "Estado Civil",
ylim = c(0, max(modelo_nb$tables$Estado_Civil) * 1.2))
text(x = bp, y = modelo_nb$tables$Estado_Civil, label = round(modelo_nb$tables$Estado_Civil,2), pos = 3)
Los empleados con un salario mĆ”s alto tienen una menor probabilidad de renunciar que los empleados con un salario mĆ”s bajo. Las probabilidades especĆficas son las siguientes: * Salario diario menor a 200: 61% * Salario diario entre 200 y 300: 48% * Salario diario entre 300 y 400: 35% * Salario diario mayor a 400: 22%
La relación inversa entre el salario y la probabilidad de renuncia es un fenómeno común en el mercado laboral. Existen diversas explicaciones para esta relación: * Satisfacción laboral: Los empleados con un salario mÔs alto suelen estar mÔs satisfechos con su trabajo que los empleados con un salario mÔs bajo. Esto se debe a que el salario puede satisfacer necesidades bÔsicas y proporcionar un mayor nivel de vida. * Motivación: Los empleados con un salario mÔs alto suelen estar mÔs motivados para trabajar duro y alcanzar sus objetivos. Esto se debe a que ven su trabajo como una forma de alcanzar sus metas financieras y personales. * Oportunidades alternativas: Los empleados con un salario mÔs alto suelen tener mÔs oportunidades de empleo en otras empresas. Esto significa que si no estÔn satisfechos con su trabajo actual, es mÔs probable que buscquen y/o encuentren otro trabajo mejor pagado.
## Tablas de Media y Desviación EstÔndar para Variables Continuas
bp <-barplot(modelo_nb$tables$Salario_diario, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), names.arg = c("Media", "Desviación estÔndar"), main = "Salario_diario",
ylim = c(0, max(modelo_nb$tables$Salario_diario) * 1.2))
text(x = bp, y = modelo_nb$tables$Salario_diario, label = round(modelo_nb$tables$Salario_diario,2), pos = 3)
Los colaboradores de mayor edad tienen una mayor probabilidad de permanecer dentro de la empresa, ya que suelen valorar mĆ”s la estabilidad laboral y las relaciones establecidas en su entorno de trabajo. Por otro lado, los colaboradores de menor edad tienden a considerar la renuncia con mayor frecuencia, posiblemente debido a la mayor libertad e independencia que caracteriza a los adultos jóvenes. Esta diferencia en la propensión a permanecer o renunciar puede estar influenciada por las distintas prioridades y expectativas que tienen los empleados en diferentes etapas de sus vidas profesionales. En resumen, los empleados mĆ”s jóvenes tienen una menor probabilidad de renunciar que los empleados mĆ”s mayores. Las probabilidades especĆficas son las siguientes: * Menor a 25: 38% * Entre 25 y 30: 45% * Entre 30 y 35: 52% * Entre 35 y 40: 59% * Mayor a 40: 65%
bp <-barplot(modelo_nb$tables$Edad, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), main = "Edad", names.arg = c("Media", "Desviación estÔndar"),
ylim = c(0, max(modelo_nb$tables$Edad) * 1.2))
text(x = bp, y = modelo_nb$tables$Edad, label = round(modelo_nb$tables$Edad,2), pos = 3)
La retención de empleados en la empresa FORM muestra una tendencia
clara en función del mes de contratación. Los colaboradores contratados
durante los meses de abril, febrero, marzo, mayo y octubre tienen una
mayor probabilidad de permanecer en la empresa, con una retención
particularmente alta en abril. En contraste, aquellos que inician su
trabajo en los meses de agosto, junio, julio y septiembre presentan una
mayor tendencia a considerar la renuncia. Esto sugiere que la
planificación estratĆ©gica de las contrataciones en meses especĆficos
puede influir significativamente en la estabilidad y la permanencia del
personal. De hecho, la diferencia de probabilidades de renuncia entre
los empleados de FORM según su mes de contratación puede explicarse por
diversos factores como: * 1. Contrataciones estacionales: FORM podrĆa
realizar contrataciones estacionales para satisfacer una mayor demanda
de productos o servicios durante los meses de verano, cuando las
personas suelen tener mƔs tiempo libre y dinero para gastar. Estos
empleados contratados estacionalmente podrĆan ser menos propensos a
permanecer en la empresa despuĆ©s de la temporada alta, lo que explicarĆa
la mayor probabilidad de renuncia en los meses de verano.
* 2. Falta de capacitación: FORM podrĆa no proporcionar una capacitación
adecuada a los empleados contratados durante los meses de verano, lo que
podrĆa generar dificultades en su trabajo y una menor satisfacción
laboral. Esto podrĆa llevar a una mayor probabilidad de renuncia en
estos meses.
* 3. Expectativas no cumplidas: Los empleados contratados durante los
meses de verano podrĆan tener expectativas poco realistas sobre su
trabajo, como un mayor salario o mƔs oportunidades de crecimiento.
Cuando estas expectativas no se cumplen, los empleados podrĆan sentirse
frustrados y renunciar.
* 4. Factores externos: La mayor probabilidad de renuncia en los meses
de verano tambiĆ©n podrĆa estar relacionada con factores externos, como
el clima cĆ”lido o las vacaciones escolares. Estos factores podrĆan hacer
que los empleados sean mƔs propensos a buscar otras oportunidades o a
tomar un tiempo libre, lo que podrĆa conducir a una mayor rotación de
personal.
bp <- barplot(modelo_nb$tables$NombreMes, legend.text = TRUE, beside = TRUE, col = c("black", "lightgray"), main = "Mes de Contratación", cex.names = 0.8)
text(x = bp, y = modelo_nb$tables$NombreMes, label = round(modelo_nb$tables$NombreMes,2), pos = 3)
Gracias a la matriz de confusión es posible determinar que el modelo predice acertadamente en un 90.91% de los casos en que un colaborador decide renunciar. Junto a esto, se obtiene un valor de Kappa de 0.7754, mostrando que el modelo estÔ prediciendo considerablemente mejor a una clasificación aleatoria.
# Predicción
prediccion_nb <- predict(modelo_nb, test)
# Matriz de Confusión
confusion_nb <- confusionMatrix(prediccion_nb, test$Renuncia,positive = "No")
print(confusion_nb)
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Si
## No 26 5
## Si 5 74
##
## Accuracy : 0.9091
## 95% CI : (0.8392, 0.9555)
## No Information Rate : 0.7182
## P-Value [Acc > NIR] : 8.235e-07
##
## Kappa : 0.7754
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.8387
## Specificity : 0.9367
## Pos Pred Value : 0.8387
## Neg Pred Value : 0.9367
## Prevalence : 0.2818
## Detection Rate : 0.2364
## Detection Prevalence : 0.2818
## Balanced Accuracy : 0.8877
##
## 'Positive' Class : No
##
Se obtiene un valor de AUC del 0.8971, reafirmando que la predicción del modelo es mejor que una predicción aleatoria
# Curva ROC
## Obtener las puntuaciones de probabilidad
prediccion_prob_nb <- predict(modelo_nb, test, type = "raw")
## Seleccionar la columna que corresponde a la clase 'No'
prediccion_prob_true_nb <- prediccion_prob_nb[, "No"]
## Generar la curva ROC
roc_obj_nb <- roc(test$Renuncia, prediccion_prob_true_nb)
## Dibujar la curva ROC
plot.roc(roc_obj_nb, main="Curva ROC", col="blue")
## Area under the curve: 0.8971
El modelo de Random Forest fue seleccionado con la intención de emplear un modelo complejo capaz de tener una alta capacidad predictiva a cambio de perder interpretabilidad, buscando comparar de esta manera el desempeño de modelos de mayor simplicidad con uno de alta complejidad. Los parÔmetros seleccionados fueron un estÔndar seleccionado para la configuración del random forest.
set.seed(123)
# Creación del modelo
rf_model <- randomForest(formula1, data = train, ntree=500, mtry=5, nodesize=5, importance=TRUE)
A pesar del tradeoff entre interpretabilidad y precisión, el modelo ofrece una visualización para comprobar el impacto que estÔ ejerciendo cada variable para determinar la pertenencia a una determinada clase (Renuncia o No renuncia). Sin embargo, esto no contempla una dirección clara del impacto ejercido. Considerando esto, se determina que las variables que tienen mayor influencia en el modelo corresponden a: Salario diario, departamento y el mes de contratación, siendo poco relevantes el género y el estado civil (de acuerdo al modelo).
El modelo logra predecir acertadamente en un 90% de los casos en que un colaborador decide renunciar. El nivel de kappa es de 0.7402, superando a una clasificación aleatoria.
# Predicción
prediccion_rf <- predict(rf_model, test)
# Matriz de Confusión
confusion_rf <- confusionMatrix(prediccion_rf, test$Renuncia,positive = "No")
print(confusion_rf)
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Si
## No 23 3
## Si 8 76
##
## Accuracy : 0.9
## 95% CI : (0.8281, 0.949)
## No Information Rate : 0.7182
## P-Value [Acc > NIR] : 3.045e-06
##
## Kappa : 0.7402
##
## Mcnemar's Test P-Value : 0.2278
##
## Sensitivity : 0.7419
## Specificity : 0.9620
## Pos Pred Value : 0.8846
## Neg Pred Value : 0.9048
## Prevalence : 0.2818
## Detection Rate : 0.2091
## Detection Prevalence : 0.2364
## Balanced Accuracy : 0.8520
##
## 'Positive' Class : No
##
Tiene un valor de AUC de 0.96, reafirmando su superioridad sobre una predicción aleatoria.
# Curva ROC
## Obtener las puntuaciones de probabilidad
prediccion_prob_rf <- predict(rf_model, test, type = "prob")
## Seleccionar la columna que corresponde a la clase 'No'
prediccion_prob_true_rf <- prediccion_prob_rf[, "No"]
## Generar la curva ROC
roc_obj_rf <- roc(test$Renuncia, prediccion_prob_true_rf)
## Dibujar la curva ROC
plot.roc(roc_obj_rf, main="Curva ROC", col="blue")
## Area under the curve: 0.9622
# Obtener cada una de las mƩtricas
#ACCURACY
acc_RM<- confusion_glm$overall["Accuracy"]
acc_A<- confusion_A$overall["Accuracy"]
acc_NB<- confusion_nb$overall["Accuracy"]
acc_RF<- confusion_rf$overall["Accuracy"]
#BALANCED ACCURACY
B_acc_RM<- confusion_glm$byClass["Balanced Accuracy"]
B_acc_A<- confusion_A$byClass["Balanced Accuracy"]
B_acc_NB<- confusion_nb$byClass["Balanced Accuracy"]
B_acc_RF<- confusion_rf$byClass["Balanced Accuracy"]
#KAPPA
kappa_RM<- confusion_glm$overall["Kappa"]
kappa_A<- confusion_A$overall["Kappa"]
kappa_NB<- confusion_nb$overall["Kappa"]
kappa_RF<- confusion_rf$overall["Kappa"]
#SENSITIVITY
sens_RM<- confusion_glm$byClass["Sensitivity"]
sens_A<- confusion_A$byClass["Sensitivity"]
sens_NB<- confusion_nb$byClass["Sensitivity"]
sens_RF<- confusion_rf$byClass["Sensitivity"]
#SPECIFITY
spec_RM<- confusion_glm$byClass["Specificity"]
spec_A<- confusion_A$byClass["Specificity"]
spec_NB<- confusion_nb$byClass["Specificity"]
spec_RF<- confusion_rf$byClass["Specificity"]
#AUC
auc_RM<- auc_glm
auc_A<- auc_tree
auc_NB<- auc_nb
auc_rf<-auc_rf
# Creación de vectores para las métricas de cada modelo
metricas <- c("Accuracy", "Balanced Accuracy", "Kappa", "Sensitivity", "Specificity", "AUC")
glm_values <- c(acc_RM, B_acc_RM, kappa_RM, sens_RM, spec_RM, auc_RM)
arbol_values <- c(acc_A, B_acc_A, kappa_A, sens_A, spec_A, auc_A)
naiveBayes_values <- c(acc_NB, B_acc_NB, kappa_NB, sens_NB, spec_NB, auc_NB)
randomforest_values <- c(acc_RF, B_acc_RF, kappa_RF, sens_RF, spec_RF, auc_rf)
Tras la construcción de distintos modelos para la situación problema de Form fue posible obtener las siguientes medidas de desempeño para cada uno de ellos: Accuracy, Balanced Accuracy, Kappa, Sensitivity, Specificity, AUC. En consideración de estos, se plantea la siguiente evaluación:
1. Accuracy: Inicialmente, como una medida rƔpida sobre el desempeƱo general de los modelos se considera el Accuracy General, es decir, el porcentaje de aciertos del modelo sobre el total de predicciones. En este caso, los modelos tienen un desempeƱo bastante similar, estando en un rando entre el 87-90.9%. Sin embargo, el modelo con el mejor desempeƱo corresponde a Naive Bayes.
2. Kappa: Como siguiente medida, es necesario evaluar el que cada uno de los modelos fuera capaz de realizar una predicción mejor a una clasificación aleatoria, es decir, tener un valor Kappa mayor a 0. En este caso, cada uno de los modelos construidos obtuvo altos valores para esta medida, superiores a 0.6, lo cual es un primer buen indicativo del modelo.
3. Balanced Accuracy: Tras afirmar que los modelos no estÔn realizando predicciones aleatorias, se comprueba mediante el Balanced Accuracy la ponderación de las predicciones correctas de ambas clases, destacando nuevamente el modelo de Naive Bayes como aquel que mantiene el porcentaje mÔs alto con 88.7%.
4. Sensitivity y Specificity: Mediante estas medidas se analizarĆ”n individualmente las predicciones correctas de cada clase. Siendo sensitivity el porcentaje de predicciones correctas para los empleados que no renuncian, y specificity, las predicciones correctas para los que sĆ renuncian. En este caso, Naive Bayes obtiene el valor mĆ”s alto de sensitivity con 83.87% seguido del Ćrbol de Decisión con 77.4%. Por otro lado, el modelo de Random Forest obtiene el valor mĆ”s alto de specificity con 96.2%, seguido de Naive Bayes con 93.67%.
5. AUC y Curva ROC: Finalmente, la Ćŗltima mĆ©trica a revisar para este caso es el Ćrea bajo la Curva (AUC), obtenida de la curva ROC. La curva ROC muestra la distinción entre verdaderos y falsos positivos por parte del modelo, buscando que esta sea lo mĆ”s recta y grande posible, permitiendo alcanzar un Ć”rea lo mĆ”s cercana posible a 1. Para esta mĆ©trica el modelo de Random Forest es aquel que mejor se desempeƱo al hacer la distinción, con un AUC de 0.96 (muy cercano a 1: ajuste casi perfecto), seguido del Ćrbol de Decisión con 0.92.
# Crear el dataframe comparativo
TablaComparacion <- data.frame(
Metrica = metricas,
RegresiónLogistica = glm_values,
ArboldeDecision = arbol_values,
NaiveBayes = naiveBayes_values,
RandomForest = randomforest_values
)
rownames(TablaComparacion) = NULL
TablaComparacion <- head(TablaComparacion, 6)
kable(TablaComparacion)
Metrica | RegresiónLogistica | ArboldeDecision | NaiveBayes | RandomForest |
---|---|---|---|---|
Accuracy | 0.8727273 | 0.8727273 | 0.9090909 | 0.9000000 |
Balanced Accuracy | 0.8329931 | 0.8427930 | 0.8877093 | 0.8519804 |
Kappa | 0.6793003 | 0.6855860 | 0.7754185 | 0.7402319 |
Sensitivity | 0.7419355 | 0.7741935 | 0.8387097 | 0.7419355 |
Specificity | 0.9240506 | 0.9113924 | 0.9367089 | 0.9620253 |
AUC | 0.8591262 | 0.9248673 | 0.8971009 | 0.9622295 |
Las curvas ROC (Receiver Operating Characteristic) son una herramienta grĆ”fica que se utiliza para evaluar el rendimiento de un modelo de clasificación binaria, en este caso si el empleado de FORM decide seguir o no en la empresa. A continuación, en las curvas ROC que se muestran en la imagen, se estĆ”n comparando los cuatro modelos de clasificación: Regresión, Ćrbol de Decision, Naive Bayes y Random Forest.
1. Curva ROC de Regresión: La curva tiene una baja especificidad, lo que significa que el modelo es propenso a clasificar erróneamente los negativos como positivos. Esto se puede observar en la parte inferior izquierda de la curva, donde la curva se acerca a la lĆnea diagonal.
2. Curva ROC de Ćrbol: Tiene una especificidad mĆ”s alta que la curva ROC de Regresión, lo que significa que el modelo es menos propenso a clasificar erróneamente los negativos como positivos. Sin embargo, la curva ROC de Ćrbol tambiĆ©n tiene una sensibilidad mĆ”s baja, lo que significa que el modelo es menos propenso a clasificar correctamente los positivos. Esto se puede observar en la parte superior izquierda de la curva, donde la curva se aleja de la lĆnea diagonal.
3. Curva ROC de Naive Bayes: Tiene una especificidad similar a la curva ROC de Ćrbol, pero una sensibilidad mĆ”s alta. Esto significa que el modelo es mĆ”s propenso a clasificar correctamente los positivos, pero tambiĆ©n es mĆ”s propenso a clasificar erróneamente los negativos como positivos.
4. Curva ROC de Random Forest: Tiene la especificidad mÔs alta de las cuatro curvas ROC. Esto significa que el modelo es menos propenso a clasificar erróneamente los negativos como positivos. La curva ROC de Random Forest también tiene una sensibilidad alta, lo que significa que el modelo es mÔs propenso a clasificar correctamente los positivos.
#GRAFICAS ROC
par(mfrow=c(2, 2))
plot.roc(roc_obj_glm, main = "Curva ROC Regresión", col = "blue")
plot.roc(roc_obj_tree, main="Curva ROC Ćrbol", col="blue")
plot.roc(roc_obj_nb, main="Curva ROC Naive Bayes", col="blue")
plot.roc(roc_obj_rf, main="Curva ROC Random Forest", col="blue")
Con base en los anĆ”lisis previamente hechos de los modelos realizados, se determina que el modelo mĆ”s apropiado para analizar el abandono de los empleados en Form corresponde a Naive Bayes, debido a su capacidad de analizar cada factor de forma independiente, asĆ como su desempeƱo considerable en las mĆ©tricas. Accuracy:0. 91, Kappa: 0.78 y AUC: 0.90. Acorde a esto, se determina que la mayorĆa de la fuerza laboral de Form tiene las siguientes caracterĆsticas: Mujeres solteras de 31 o 32 aƱos, residentes de Apodaca, con un puesto de Ayudante General del cual perciben un salario promedio de $215.9.
Por otra parte, acorde al modelo Naive Bayes, las variables explicativas estiman que estiman el siguiente perfil para determinar la permanencia/retención de los empleados en Form: * Empleadas y empleados casados y/o divorciados de mayor edad que viven en el municipio de Guadalupe pertenecientes a los departamentos de Producción MC, MCL y Retornable que perciben un salario diario mayor donde su mes de contratación es mayormente a principios de año.
El perfil anterior se puede generar debido a que los empleados casados y divorciados suelen tener mayores responsabilidades familiares y financieras, lo que los hace valorar mĆ”s la estabilidad laboral. AdemĆ”s, al ser personas de mayor pueden tener menos disposición para cambiar de trabajo debido a estas responsabilidades y a que tienden a valorar mĆ”s la estabilidad, la seguridad y las relaciones establecidas en su lugar de trabajo. Asimismo, al ser residentes de Guadalupe podrĆa implicar no solamente que por la ubicación de la empresa realizan menores tiempos de desplazamiento sino que tambiĆ©n la oferta de trabajo en dicha ubicación es mejor que en su lugar de residencia. No obstante, se debe tomar en cuenta que los departamentos de dicho grupo de personas ya que, implica que tienen roles mĆ”s definidos y estables, con una clara trayectoria de desarrollo y una sensación de contribución tangible al producto final en comparación con otros departamentos lo cual se refuerza con la percepción de un salario diario dando a entender que los empleados sienten que estĆ”n bien compensados por su trabajo y por ende, son mĆ”s propensos a permanecer en la empresa.
Sin embargo, acorde al modelo Naive Bayes, las variables explicativas que estiman el siguiente perfil para determinar la renuncia y/o falta de seguimiento de los empleados en Form son: * Empleadas y empleados solteros y en unión libre de menor edad (adultos jóvenes) que viven en el municipio de Apodaca que perciben un salario diario menor donde su mes de contratación es mayormente a mediados de año.
El perfil anterior se puede generar debido a que los colaboradores solteros y en unión libre suelen tener menos responsabilidades familiares, lo que les otorga mayor libertad para buscar mejores oportunidades laborales. AdemĆ”s, estan mĆ”s dispuestos a cambiar de trabajo en busca de mejores condiciones o desafĆos nuevos, mayormente si perciben un salario bajo ya que implica una fuente importante de insatisfacción labor. Esto se refuerza ya que, al ser adultos jóvenes suelen tener menos compromisos y pueden ser mĆ”s propensos a buscar nuevas oportunidades para avanzar en sus carreras. No obstante, se observa que dicho perfil abarca residentes de Apodaca lo que implica que al vivir en dicha zona buscan y/o conocen oportunidades laborales en las cuales perciban mayor valor que en FORM. Asimismo, el periodo de contratación tiene alta posibilidad de coincidir con los meses donde hay altas temperaturas afectando las condiciones laborales, tiempos de contratación de otras empresas en las cuales se puede percibir un mayor beneficio y/o con periodos de FORM donde hay una contratación mĆ”s impulsiva para cubrir necesidades temporales. En consecuencia, los empleados contratados en estos meses pueden sentir una menor integración y estabilidad en la empresa, lo que incrementa la probabilidad de renuncia.
Por lo tanto, las caracterĆsticas que influyen en la permanencia o renuncia en la empresa FORM reflejan la importancia de la estabilidad, la claridad en el rol, la compensación adecuada y las condiciones personales de los empleados. Entender estos factores permite a la empresa implementar estrategias especĆficas para mejorar la retención, como: * Realizar un anĆ”lisis de mercado para asegurar que los salarios sean competitivos, ya que considerar aumentos salariales o bonificaciones justas para aumentar la satisfacción y reducir la intención de renunciar debido a la percepción de una compensación justa. * Implementar programas de capacitación y desarrollo de habilidades, asĆ como planes de carrera claros para todos los empleados, lo que puede aumentar la lealtad y el compromiso de los empleados con la empresa. * Planificar las contrataciones estratĆ©gicamente para evitar los meses con mayor Ćndice de renuncia (Agosto, Junio, Julio, Septiembre) y mejorar el proceso de onboarding para integrar a los empleados de manera efectiva; lo cual reducirĆ” la rotación temprana de los nuevos empleados.
SegĆŗn el modelo seleccionado, se estima que aproximadamente el 16% de los empleados actuales de la empresa FORM consideran no seguir siendo parte de la organización en un futuro próximo. AdemĆ”s, dentro de este grupo, se observa que tres de cada cinco empleados son mujeres. Dicho hallazgo sugiere la necesidad de desarrollar estrategias efectivas de retención que aborden las preocupaciones y necesidades especĆficas de este segmento de la fuerza laboral.
test_muestra <- test
test_muestra$prediccion <- predict(modelo_nb, test)
# Filtrar solo los empleados que tienen "No" en la columna "Renuncia"
test_muestra_filtrado <- test_muestra %>%
filter(Renuncia == "No")
# Mostrar Valor Real vs Predicción para Cada Empleado del Set de Muestra
test_muestra_filtrado %>%
dplyr::select(Nombre, Apellidos, Renuncia, prediccion)
## # A tibble: 31 Ć 4
## Nombre Apellidos Renuncia prediccion
## <chr> <chr> <fct> <fct>
## 1 mariana de leon moreno No Si
## 2 maria cazares morales No No
## 3 jose antonio riojas gutierrez No No
## 4 blanca olivia barron ramos No No
## 5 pedro ivan marin arjona No No
## 6 maria esther baluis paulino No No
## 7 adriana irene zapata garcia No No
## 8 andres sanchez de la rosa No No
## 9 belem sarahi moncada zavala No Si
## 10 anjuli rubi bezanilla villarreal No Si
## # ā¹ 21 more rows
##
## FALSE TRUE
## 26 5