Carga de librerías e Importación de Datos
suppressWarnings({
library(paqueteMODELOS)
library(dplyr)
library(pROC)
library(ggplot2)
library(modelr)
data("rotacion")
glimpse(rotacion)
})
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
##
## Attaching package: 'modelr'
## The following object is masked from 'package:broom':
##
## bootstrap
## Rows: 1,470
## Columns: 24
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente"…
## $ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
## $ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
## $ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
## $ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
## $ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", …
## $ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
A partir de los datos históricos recopilados por la Empresa sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes, se solicita desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuáles factores indicen en mayor proporción a estos cambios.A continuación, se detallan los pasos que la gerencia ha propuesto para el análisis.
Se seleccionan 6 variables que se consideran pueden estar relacionadas con la rotación, 3 categóricas y 3 numéricas.
A continuación, se describen las hipótesis para las 3 variables categóricas seleccionadas: cargo, viaje de negocios y horas extra.
Se espera que el cargo se relacione con la rotación ya que algunos roles conllevan el afrontar mayores responsabilidades y, por tanto, mayor estrés. La hipótesis es que existen algunos cargos tales como Gerente o Director que tienen mayor rotación que otros cargos tales como técnico o representante.
Se espera que la variable de “viaje de negocios” se relacione con la rotación debdo a que las personas que viajan frecuentemente podrían estar extrañando pasar más tiempo en casa con sus familias. La hipótesis es que las personas que deben viajar frecuentemente tienen mayor rotación que los empleados que no viajan o que raramente viajan.
Se espera que las horas extra se relacionen con la rotación debido a que las personas que laboran horas extra tienen un desgaste mayor y podrían estar descuidando aspectos personales y familiares. La hipótesis es que las personas que trabajan horas extra tienen mayor posibilidad de rotación en comparación con las que no laboran horas extra.
A continuación, se describen las hipótesis para las 3 variables numéricas seleccionadas: Satisfacción laboral, ingreso mensual y años de experiencia.
Se asume que la satisfacción laboral se relaciona con la rotación en el sentido en que un trabajador satisfecho no tedría razón para la rotación. La hipótesis es que a mayor satisfacción se da menos rotación y viceversa.
Se espera que el ingreso mensual se relacione con la rotación debido a que un menor ingreso podría ser motivo de rotación. La hipótesis es que a mayor ingreso se da menos probabilidad de rotación.
Se espera que un trabajador con muchos años de experiencia en un mismo cargo tenga cansancio y/o desmotivación, por lo que podría ser causante de rotación. La hipótesis es que a mayor experiencia se da mayor rotación.
Los atributos contenidos en la base de datos de rotación se pueden clasificar en: cualitativas nominales, cualitativas ordinales, cuantitativas discretas y cuantitativas continuas.
En este grupo se encuentran las variables: rotación, viaje de negocios, departamento, campo educación, género, cargo, estado civil y horas extra.
La variable rotación es el motivo de análisis de este informe, es decir, se considera la etiqueta. Tiene dos estados o clases, Si o No, haciendo referencia para cada uno de los 1470 registros si ha tenido rotación o no. Se considera que el resultado positivo o negativo es función de las otras 23 variables del tipo cualitativas y cuantitativas.
t=table(rotacion$Rotación)
summarytools::freq(rotacion$Rotación, cumul = FALSE)
## Frequencies
## rotacion$Rotación
## Type: Character
##
## Freq % Valid % Total
## ----------- ------ --------- ---------
## No 1233 83.88 83.88
## Si 237 16.12 16.12
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Rotación)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
El resultado indica que de los 1470 registros o casos, el 84% ha presentado rotación.
t=table(rotacion$`Viaje de Negocios`)
summarytools::freq(rotacion$`Viaje de Negocios`, cumul = FALSE)
## Frequencies
## rotacion$`Viaje de Negocios`
## Type: Character
##
## Freq % Valid % Total
## -------------------- ------ --------- ---------
## Frecuentemente 277 18.84 18.84
## No_Viaja 150 10.20 10.20
## Raramente 1043 70.95 70.95
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$`Viaje de Negocios`)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Departamento)
summarytools::freq(rotacion$Departamento, cumul = FALSE)
## Frequencies
## rotacion$Departamento
## Type: Character
##
## Freq % Valid % Total
## ------------ ------ --------- ---------
## IyD 961 65.37 65.37
## RH 63 4.29 4.29
## Ventas 446 30.34 30.34
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Departamento)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Campo_Educación)
summarytools::freq(rotacion$Campo_Educación, cumul = FALSE)
## Frequencies
## rotacion$Campo_Educación
## Type: Character
##
## Freq % Valid % Total
## ----------------- ------ --------- ---------
## Ciencias 606 41.22 41.22
## Humanidades 27 1.84 1.84
## Mercadeo 159 10.82 10.82
## Otra 82 5.58 5.58
## Salud 464 31.56 31.56
## Tecnicos 132 8.98 8.98
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Campo_Educación)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Genero)
summarytools::freq(rotacion$Genero, cumul = FALSE)
## Frequencies
## rotacion$Genero
## Type: Character
##
## Freq % Valid % Total
## ----------- ------ --------- ---------
## F 588 40.00 40.00
## M 882 60.00 60.00
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Genero)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Cargo)
summarytools::freq(rotacion$Cargo, cumul = FALSE)
## Frequencies
## rotacion$Cargo
## Type: Character
##
## Freq % Valid % Total
## ----------------------------- ------ --------- ---------
## Director_Investigación 80 5.44 5.44
## Director_Manofactura 145 9.86 9.86
## Ejecutivo_Ventas 326 22.18 22.18
## Gerente 102 6.94 6.94
## Investigador_Cientifico 292 19.86 19.86
## Recursos_Humanos 52 3.54 3.54
## Representante_Salud 131 8.91 8.91
## Representante_Ventas 83 5.65 5.65
## Tecnico_Laboratorio 259 17.62 17.62
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Cargo)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Estado_Civil)
summarytools::freq(rotacion$Estado_Civil, cumul = FALSE)
## Frequencies
## rotacion$Estado_Civil
## Type: Character
##
## Freq % Valid % Total
## ---------------- ------ --------- ---------
## Casado 673 45.78 45.78
## Divorciado 327 22.24 22.24
## Soltero 470 31.97 31.97
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Estado_Civil)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
t=table(rotacion$Horas_Extra)
summarytools::freq(rotacion$Horas_Extra, cumul = FALSE)
## Frequencies
## rotacion$Horas_Extra
## Type: Character
##
## Freq % Valid % Total
## ----------- ------ --------- ---------
## No 1054 71.70 71.70
## Si 416 28.30 28.30
## <NA> 0 0.00
## Total 1470 100.00 100.00
lbs=unique(rotacion$Horas_Extra)
pct=round(t/sum(t)*100)
labs=paste(lbs, pct)
labs=paste(labs, "%", sep = " ")
pie(t, labels=labs)
En este grupo se encuentran las variables: educación, satisfacción ambiental, rendimiento laboral y equilibrio trabajo vida.
t=table(rotacion$Educación)
summarytools::freq(rotacion$Educación)
## Frequencies
## rotacion$Educación
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 170 11.56 11.56 11.56 11.56
## 2 282 19.18 30.75 19.18 30.75
## 3 572 38.91 69.66 38.91 69.66
## 4 398 27.07 96.73 27.07 96.73
## 5 48 3.27 100.00 3.27 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
ev=table(rotacion$Educación)
names(ev)=c("1","2","3","4","5")
barplot(ev,
main = "Nivel de educación",
las=1 )
t=table(rotacion$Satisfacción_Ambiental)
summarytools::freq(rotacion$Satisfacción_Ambiental)
## Frequencies
## rotacion$Satisfacción_Ambiental
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 284 19.32 19.32 19.32 19.32
## 2 287 19.52 38.84 19.52 38.84
## 3 453 30.82 69.66 30.82 69.66
## 4 446 30.34 100.00 30.34 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
ev=table(rotacion$Satisfacción_Ambiental)
names(ev)=c("1","2","3","4")
barplot(ev,
main = "Satisfacción Ambiental",
las=1 )
t=table(rotacion$Rendimiento_Laboral)
summarytools::freq(rotacion$Rendimiento_Laboral)
## Frequencies
## rotacion$Rendimiento_Laboral
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 3 1244 84.63 84.63 84.63 84.63
## 4 226 15.37 100.00 15.37 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
ev=table(rotacion$Rendimiento_Laboral)
names(ev)=c("3","4")
barplot(ev,
main = "Rendimiento Laboral",
las=1 )
t=table(rotacion$Equilibrio_Trabajo_Vida)
summarytools::freq(rotacion$Equilibrio_Trabajo_Vida)
## Frequencies
## rotacion$Equilibrio_Trabajo_Vida
## Type: Numeric
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## 1 80 5.44 5.44 5.44 5.44
## 2 344 23.40 28.84 23.40 28.84
## 3 893 60.75 89.59 60.75 89.59
## 4 153 10.41 100.00 10.41 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
ev=table(rotacion$Equilibrio_Trabajo_Vida)
names(ev)=c("1","2","3","4")
barplot(ev,
main = "Rendimiento Laboral",
las=1 )
En este grupo se encuentran las variables: Edad, distancia casa, trabajos anteriores, años de experiencia, capacitaciones, antigüedad, antigüedad cargo, años última promoción y años a cargo con mismo jefe.
hist(rotacion$Edad, main = "Histograma de Edad", xlab = "Edad")
hist(rotacion$Distancia_Casa, main = "Histograma de Distancia Casa", xlab = "Distancia Casa")
hist(rotacion$Trabajos_Anteriores, main = "Histograma de Trabajos Anteriores", xlab = "Trabajos Anteriores")
hist(rotacion$Años_Experiencia, main = "Histograma de Años Experiencia", xlab = "Años Experiencia")
hist(rotacion$Capacitaciones, main = "Histograma de Capacitaciones", xlab = "Capacitaciones")
hist(rotacion$Antigüedad, main = "Histograma de Antigüedad", xlab = "Antigüedad")
hist(rotacion$Antigüedad_Cargo, main = "Histograma de Antigüedad Cargo", xlab = "Antigüedad Cargo")
hist(rotacion$Años_ultima_promoción, main = "Histograma de Años última promoción", xlab = "Años última promoción")
hist(rotacion$Años_acargo_con_mismo_jefe, main = "Histograma de Años a cargo con mismo jefe", xlab = "Años a cargo con mismo jefe")
En este grupo se encuentran las variables: Ingreso mensual y porcentaje aumento salarial.
summarytools::descr(rotacion$Ingreso_Mensual)
## Descriptive Statistics
## rotacion$Ingreso_Mensual
## N: 1470
##
## Ingreso_Mensual
## ----------------- -----------------
## Mean 6502.93
## Std.Dev 4707.96
## Min 1009.00
## Q1 2911.00
## Median 4919.00
## Q3 8380.00
## Max 19999.00
## MAD 3260.24
## IQR 5468.00
## CV 0.72
## Skewness 1.37
## SE.Skewness 0.06
## Kurtosis 0.99
## N.Valid 1470.00
## Pct.Valid 100.00
boxplot(rotacion$Ingreso_Mensual, xlab = "Ingreso mensual", ylab = "Valor en USD",
las=1)
summarytools::descr(rotacion$Porcentaje_aumento_salarial)
## Descriptive Statistics
## rotacion$Porcentaje_aumento_salarial
## N: 1470
##
## Porcentaje_aumento_salarial
## ----------------- -----------------------------
## Mean 15.21
## Std.Dev 3.66
## Min 11.00
## Q1 12.00
## Median 14.00
## Q3 18.00
## Max 25.00
## MAD 2.97
## IQR 6.00
## CV 0.24
## Skewness 0.82
## SE.Skewness 0.06
## Kurtosis -0.31
## N.Valid 1470.00
## Pct.Valid 100.00
boxplot(rotacion$Porcentaje_aumento_salarial, xlab = "Porcentaje aumento salarial", ylab = "%",
las=1)
Se realiza análisis de las diferentes variables con respecto a la variable respuesta de Rotación. se realiza en primera instancia la codificación de la variable respuesta.
rotacion$Rotación <- ifelse(rotacion$Rotación == "Si", 1, 0)
Se crea primero una lista de variables categóricas
categorical_variables <- names(rotacion)[sapply(rotacion, is.factor) | sapply(rotacion, is.character)]
categorical_variables
## [1] "Viaje de Negocios" "Departamento" "Campo_Educación"
## [4] "Genero" "Cargo" "Estado_Civil"
## [7] "Horas_Extra"
Se crea una lista vacía para guardar los resultados del test chi-square
cramers_v <- numeric(length(categorical_variables))
Se aplica el loop para las variables categóricas
for (i in seq_along(categorical_variables)) {
# se crea tabla de contingencia
tabla_contingencia <- table(rotacion$Rotación, rotacion[[categorical_variables[i]]])
# Calculate chi-square test
chi_square_test <- chisq.test(tabla_contingencia)
# Se calcula Cramer's V
cramers_v[i] <- sqrt(chi_square_test$statistic / (sum(tabla_contingencia) * (min(nrow(tabla_contingencia), ncol(tabla_contingencia)) - 1)))
}
## Warning in chisq.test(tabla_contingencia): Chi-squared approximation may be
## incorrect
Se visualizan los resultados teniendo en cuenta que valores mayores indican mayor nivel de asociación
cramers_v
## [1] 0.12825998 0.08569844 0.10440852 0.02756522 0.24214216 0.17721135 0.24406464
categorical_variables
## [1] "Viaje de Negocios" "Departamento" "Campo_Educación"
## [4] "Genero" "Cargo" "Estado_Civil"
## [7] "Horas_Extra"
Según estos resultados las variables categóricas que tienen mayor nivel de asociación con la rotación son: Las horas extra, el cargo y los viajes de negocio.
Se crea primero una lista de variables numéricas
numerical_variables <- names(rotacion)[-1][sapply(rotacion[-1], is.numeric)]
numerical_variables
## [1] "Edad" "Distancia_Casa"
## [3] "Educación" "Satisfacción_Ambiental"
## [5] "Satisfación_Laboral" "Ingreso_Mensual"
## [7] "Trabajos_Anteriores" "Porcentaje_aumento_salarial"
## [9] "Rendimiento_Laboral" "Años_Experiencia"
## [11] "Capacitaciones" "Equilibrio_Trabajo_Vida"
## [13] "Antigüedad" "Antigüedad_Cargo"
## [15] "Años_ultima_promoción" "Años_acargo_con_mismo_jefe"
Se crea una lista vacía para guardar los resultados de coeficientes de correlación
correlation_coefficients <- numeric(length(numerical_variables))
Se aplica el loop para las variables numéricas
for (i in seq_along(numerical_variables)) {
correlation_coefficients[i] <- cor(rotacion[[numerical_variables[i]]], as.numeric(rotacion$Rotación))
}
Se realiza procedimiento para obtener los coeficientes de correlación absolutos más significativos de manera ordenada
abs_correlation_coefficients <- abs(correlation_coefficients)
sorted_indices <- order(abs_correlation_coefficients, decreasing = TRUE)
sorted_numerical_variables <- numerical_variables[sorted_indices]
for (i in seq_along(sorted_indices)) {
cat("Absolute Value:", abs_correlation_coefficients[sorted_indices[i]], "\tVariable:", sorted_numerical_variables[i], "\n")
}
## Absolute Value: 0.1710632 Variable: Años_Experiencia
## Absolute Value: 0.160545 Variable: Antigüedad_Cargo
## Absolute Value: 0.1598396 Variable: Ingreso_Mensual
## Absolute Value: 0.1592278 Variable: Edad
## Absolute Value: 0.1561993 Variable: Años_acargo_con_mismo_jefe
## Absolute Value: 0.1343922 Variable: Antigüedad
## Absolute Value: 0.1034811 Variable: Satisfación_Laboral
## Absolute Value: 0.103369 Variable: Satisfacción_Ambiental
## Absolute Value: 0.07792358 Variable: Distancia_Casa
## Absolute Value: 0.06393905 Variable: Equilibrio_Trabajo_Vida
## Absolute Value: 0.0594778 Variable: Capacitaciones
## Absolute Value: 0.04349374 Variable: Trabajos_Anteriores
## Absolute Value: 0.03301878 Variable: Años_ultima_promoción
## Absolute Value: 0.03137282 Variable: Educación
## Absolute Value: 0.0134782 Variable: Porcentaje_aumento_salarial
## Absolute Value: 0.002888752 Variable: Rendimiento_Laboral
Según estos resultados las variables numéricas que tienen mayor nivel de asociación con la rotación son: Años de experiencia, antigüedad en el cargo y el ingreso mensual.
Según los resultados obtenidos de los análisis bivariados, las 3 variables categóricas seleccionadas fueron las 3 variables con mayor grado de asociación con la variable respuesta. Para el caso de las variables numéricas, dos de las variables seleccionadas (ingrso mensual y años de experiencia) se encuentran entre las 3 variables con mayor coeficiente de correlación. Según los resultados del análisis bivariado, la variable antigüedad en el cargo se encontraba entre las 3 primeras respecto al mayor grado de asociación. La variable que se escogió en su lugar fue la de satisfacción laboral, la cual obtuvo el octavo lugar entre las variables numéricas.
se crea el modelo de regresión logística usando las 6 variables seleccionadas.
modeloRotacion <- glm(Rotación ~ Cargo + `Viaje de Negocios` + Horas_Extra + Ingreso_Mensual + Años_Experiencia + Satisfación_Laboral, data = rotacion, family = binomial)
Se visualizan los resultados del modelo
summary(modeloRotacion)
##
## Call:
## glm(formula = Rotación ~ Cargo + `Viaje de Negocios` + Horas_Extra +
## Ingreso_Mensual + Años_Experiencia + Satisfación_Laboral,
## family = binomial, data = rotacion)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.608e+00 1.021e+00 -2.555 0.010621 *
## CargoDirector_Manofactura 1.155e+00 8.857e-01 1.304 0.192363
## CargoEjecutivo_Ventas 2.237e+00 8.381e-01 2.669 0.007615 **
## CargoGerente 9.996e-01 8.701e-01 1.149 0.250651
## CargoInvestigador_Cientifico 1.988e+00 9.264e-01 2.146 0.031873 *
## CargoRecursos_Humanos 2.573e+00 9.551e-01 2.694 0.007070 **
## CargoRepresentante_Salud 1.187e+00 8.924e-01 1.330 0.183449
## CargoRepresentante_Ventas 3.279e+00 9.549e-01 3.434 0.000596 ***
## CargoTecnico_Laboratorio 2.721e+00 9.253e-01 2.940 0.003277 **
## `Viaje de Negocios`No_Viaja -1.337e+00 3.518e-01 -3.800 0.000145 ***
## `Viaje de Negocios`Raramente -7.002e-01 1.819e-01 -3.850 0.000118 ***
## Horas_ExtraSi 1.533e+00 1.614e-01 9.500 < 2e-16 ***
## Ingreso_Mensual 5.401e-05 5.180e-05 1.043 0.297122
## Años_Experiencia -5.950e-02 1.844e-02 -3.227 0.001253 **
## Satisfación_Laboral -3.338e-01 7.011e-02 -4.761 1.93e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1298.6 on 1469 degrees of freedom
## Residual deviance: 1068.4 on 1455 degrees of freedom
## AIC: 1098.4
##
## Number of Fisher Scoring iterations: 6
Según los resultados obtenidos los parámetros que presentan una mayor significancia en la rotación son: La existencia de horas extra, la evaluación de la satisfacción laboral, que se tengan viajes de negocio raramente, que no se tengan viajes de negocio y el cargo de representante de ventas.
Los parámetros que le seguirían en orden de significancia serían: los años de experiencia, el cargo de técnico de laboratorio, el cargo de recursos humanos y el cargo de ejecutivo de ventas.
A partir de los coeficientes de los parámetros con mayor significancia se tendrían las siguientes interpretaciones:
Para el parámetro de la existencia de horas extra manteniendo todas las demás variables constantes se tiene que
exp(1.533)
## [1] 4.632052
lo cual significa que cuando una persona trabaja horas extra tiene 0.46 veces más probabilidad de realizar rotación.
En el caso del parámetro de la evaluación de satisfacción laboral si se tienen todas las dempas variables constantes, se tiene que
exp(-3.338e-01)
## [1] 0.716197
lo cual significa que por cada unidad de cambio en la evaluación de satisfacción laboral el trabajador tiene 0.71 veces más probabilidad de realizar rotación.
Para los parámetros de tener vaijes de negocio raramente o no tener viajes de negocio, si se mantenien todas las demás variables constantes se tiene que
exp(-7.002e-01)
## [1] 0.496486
exp(-1.337)
## [1] 0.2626324
Esto significa que los individuos que raramente viajan tienen 0.49 veces más probabilidad de tener rotación y los que no viajan 0.26 veces más probabilidad.
Para el caso del cargo de representante de ventas si se mantienen todas las demás variables constantes se tiene que
exp(3.279)
## [1] 26.54921
Lo cual significa que un individuo que tenga este cargo tiene 26.54 veces más probabilidad de cambiar de cargo.
Se dividen los datos en dos conjuntos, entrenamiento y prueba train con el 60% de los registros test con el 40% de los registros
ntrain <- nrow(rotacion)*0.6
ntest <- nrow(rotacion)*0.4
set.seed(123)
index_train<-sample(1:nrow(rotacion),size = ntrain)
train<-rotacion[index_train,] # muestra de entrenamiento
test<-rotacion[-index_train,] # muestra de prueba
Se crea el modelo con los datos de entrenamiento y se generan los valores pronosticados con los datos de prueba
modeloRotacion2 <- glm(Rotación ~ Cargo + `Viaje de Negocios` + Horas_Extra + Ingreso_Mensual + Años_Experiencia + Satisfación_Laboral, data = train, family = binomial)
valor_pronosticado <- predict(modeloRotacion2, test, type = "response")
Se genera la curva ROC y se estima el AUC
curva_ROC <- roc(test$Rotación, valor_pronosticado)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc<- round(auc(curva_ROC, levels =c(0,1), direction = "<"),4)
ggroc(curva_ROC, colour = "#FF7F00", size=1)+
ggtitle(paste0("Curva ROC ", "(AUC = ", auc, ")"))+
xlab("Especificidad")+
ylab("Sensibilidad")
El área comprendida entre la curva ROC y la diagonal del cuadrado (AUC = 0.7787), indica un ajuste aceptable del modelo de predicción.
Se crea un individuo hipotético con los siguientes datos:
new_sample <- data.frame(
Edad = 31,
`Viaje de Negocios` = "Raramente",
Departamento = "IyD",
Distancia_Casa = 8,
Educación = 4,
Campo_Educación = "Ciencias",
Satisfacción_Ambiental = 3,
Genero = "F",
Cargo = "Director_Manofactura",
Satisfación_Laboral = 4,
Estado_Civil = "Soltero",
Ingreso_Mensual = 4424,
Trabajos_Anteriores = 1,
Horas_Extra = "No",
Porcentaje_aumento_salarial = 13,
Rendimiento_Laboral = 3,
Años_Experiencia = 16,
Capacitaciones = 2,
Equilibrio_Trabajo_Vida = 3,
Antigüedad = 5,
Antigüedad_Cargo = 3,
Años_ultima_promoción = 4,
Años_acargo_con_mismo_jefe = 3
)
names(new_sample)[which(names(new_sample) == "Viaje.de.Negocios")] <- "Viaje de Negocios"
new_sample
## Edad Viaje de Negocios Departamento Distancia_Casa Educación Campo_Educación
## 1 31 Raramente IyD 8 4 Ciencias
## Satisfacción_Ambiental Genero Cargo Satisfación_Laboral
## 1 3 F Director_Manofactura 4
## Estado_Civil Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## 1 Soltero 4424 1 No
## Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1 13 3 16
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1 2 3 5 3
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 1 4 3
Se predice la probabilidad de rotación del nuevo registro de individuo
predicted_probabilities <- predict(modeloRotacion, newdata = new_sample, type = "response")
predicted_probabilities
## 1
## 0.0147515
La probabilidad de que un individuo hipotético con los datos ingresados tenga rotación es del 0.014, bastante bajo debido a que campos como el de horas extra se registró con un “No”. Un punto de corte o umbral para decidir cuando se debería realizar una intervención podría ser con una probabilidad de 0.5, es decir, cuando se tenga >= 0.5 se recomienda realizar intervención.
Teniendo en consideración las variables significativas obtenidas en el análisis bivariado del punto 3, se plantea la siguiente estrategia para disminuir la rotación en la empresa: Disminuir las horas extra mediante la contratación de más personal en modalidades de contratación que no generen mayor carga prestacional para la empresa, realizar más actividades por fuera de la oficina para los empleados que no deben viajar constantemente, generar incentivos económicos para los empleados con ingresos mensuales más bajos, incentivar a los empleados con tiempos largos en la empresa o en el mismo cargo mediante bonificaciones por resutlados y buen desempeño.