dentro de este documento daremos respuesta al analisis del caso de rotacion de personal
Este documento está dividido en los siguientes puntos:
1.Contexto
2.Seleccion de Variables
3.Analisis Únivariado
4.Analisis bivariado
5.Estimacion del Modelo
6.Evaluacion
7.Predicciones
8.Conclusiones
Dentro de estos numerales desarrollaremos los pasos requeridos para la determinación de los factores que mas influyen en la rotacion de empleados dentro de una empresa
En una organización, se busca comprender y prever los factores que influyen en la rotación de empleados entre distintos cargos. La empresa ha recopilado datos históricos sobre el empleo de sus trabajadores, incluyendo variables como la antigüedad en el cargo actual, el nivel de satisfacción laboral, el salario actual, edad y otros factores relevantes. La gerencia planea desarrollar un modelo de regresión logística que permita estimar la probabilidad de que un empleado cambie de cargo en el próximo período y determinar cuales factores indicen en mayor proporción a estos cambios.
Con esta información, la empresa podrá tomar medidas proactivas para retener a su talento clave, identificar áreas de mejora en la gestión de recursos humanos y fomentar un ambiente laboral más estable y tranquilo. La predicción de la probabilidad de rotación de empleados ayudará a la empresa a tomar decisiones estratégicas informadas y a mantener un equipo de trabajo comprometido y satisfecho en sus roles actuales.
Para poder dar inicio a la selección de variables, se nos solicita Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
para esto realizaremos la carga de la base de datos y mostraremos una pequeña muestra de la base#cargamos los datos de la base de datos
library(paqueteMODELOS)
## 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
library(dplyr)
##
## 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
data("rotacion")
#mostramos los primeros 10 registros de la data
head(rotacion,10)
## # A tibble: 10 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## 7 No 59 Raramente IyD 3 3
## 8 No 30 Raramente IyD 24 1
## 9 No 38 Frecuentemente IyD 23 3
## 10 No 36 Raramente IyD 27 3
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## # Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## # Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>,
## # Años_ultima_promoción <dbl>, Años_acargo_con_mismo_jefe <dbl>
dim(rotacion)
## [1] 1470 24
ahora procederemos a dar una corta informacion de la base de datos, para ver los tipos de datos, y los valores que cada atributo contiene, este base sta compuesta por 24 atributos y 1470
#vemos los posibles datos de cada columna
glimpse(rotacion)
## Rows: 1,470
## Columns: 24
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente"…
## $ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD…
## $ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, …
## $ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias"…
## $ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, …
## $ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M…
## $ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifi…
## $ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, …
## $ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", …
## $ Ingreso_Mensual <dbl> 5993, 5130, 2090, 2909, 3468, 3068, 2670, …
## $ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, …
## $ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
## $ Años_Experiencia <dbl> 8, 10, 7, 8, 6, 8, 12, 1, 10, 17, 6, 10, 5…
## $ Capacitaciones <dbl> 0, 3, 3, 3, 3, 2, 3, 2, 2, 3, 5, 3, 1, 2, …
## $ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, …
## $ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2,…
## $ Antigüedad_Cargo <dbl> 4, 7, 0, 7, 2, 7, 0, 0, 7, 7, 4, 5, 2, 2, …
## $ Años_ultima_promoción <dbl> 0, 1, 0, 3, 2, 3, 0, 0, 1, 7, 0, 0, 4, 1, …
## $ Años_acargo_con_mismo_jefe <dbl> 5, 7, 0, 0, 2, 6, 0, 0, 8, 7, 3, 8, 3, 2, …
ahora validaremos la cantidad de datos nulos que poseemos en la data para poder realizar una mejor seleccion de las variables que tomaremos tanto categoricas y cuantitiativas
library(naniar)
#generamos la nueva base
BaseSeleccionada = rotacion
# devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
Faltantes = gg_miss_var(BaseSeleccionada, show_pct=TRUE)
Faltantes
#faltantesporcen=n_miss(vivienda_faltantes$id)
faltantesVar = naniar::miss_var_summary(BaseSeleccionada)
faltantesVar
## # A tibble: 24 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 Rotación 0 0
## 2 Edad 0 0
## 3 Viaje de Negocios 0 0
## 4 Departamento 0 0
## 5 Distancia_Casa 0 0
## 6 Educación 0 0
## 7 Campo_Educación 0 0
## 8 Satisfacción_Ambiental 0 0
## 9 Genero 0 0
## 10 Cargo 0 0
## # ℹ 14 more rows
como podemos observar no se tienen datos nulos o faltantes por lo cual la base no requiere de tratamiento, ahora procederemos a ver los valores que posee cada una de las variables categoricas del datgaset
library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
# Variables vacías
datasetunido<- data.frame( campo = character(),
descripcion = character(),
conteo = numeric())
datasetconteo=sqldf("SELECT 'Rotacion' as tipo,Rotación as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Rotación")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Negocios' as tipo,`Viaje de Negocios` as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY `Viaje de Negocios`")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Departamento' as tipo,Departamento as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Departamento")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Campo_Educación' as tipo,Campo_Educación as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Campo_Educación")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Educación' as tipo,Educación as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Educación")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Satisfacción_Ambiental' as tipo,Satisfacción_Ambiental as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Satisfacción_Ambiental")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Genero' as tipo,Genero as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Genero")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Cargo' as tipo,Cargo as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Cargo")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Satisfación_Laboral' as tipo,Satisfación_Laboral as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Satisfación_Laboral")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Estado_Civil' as tipo,Estado_Civil as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Estado_Civil")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Horas_Extra' as tipo,Horas_Extra as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Horas_Extra")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Rendimiento_Laboral' as tipo,Rendimiento_Laboral as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Rendimiento_Laboral")
datasetunido=rbind(datasetunido,datasetconteo)
datasetconteo=sqldf("SELECT 'Equilibrio_Trabajo_Vida' as tipo,Equilibrio_Trabajo_Vida as descripcion, COUNT(*) as Freq FROM BaseSeleccionada GROUP BY Equilibrio_Trabajo_Vida")
datasetunido=rbind(datasetunido,datasetconteo)
datasetunido
## tipo descripcion Freq
## 1 Rotacion No 1233
## 2 Rotacion Si 237
## 3 Negocios Frecuentemente 277
## 4 Negocios No_Viaja 150
## 5 Negocios Raramente 1043
## 6 Departamento IyD 961
## 7 Departamento RH 63
## 8 Departamento Ventas 446
## 9 Campo_Educación Ciencias 606
## 10 Campo_Educación Humanidades 27
## 11 Campo_Educación Mercadeo 159
## 12 Campo_Educación Otra 82
## 13 Campo_Educación Salud 464
## 14 Campo_Educación Tecnicos 132
## 15 Educación 1 170
## 16 Educación 2 282
## 17 Educación 3 572
## 18 Educación 4 398
## 19 Educación 5 48
## 20 Satisfacción_Ambiental 1 284
## 21 Satisfacción_Ambiental 2 287
## 22 Satisfacción_Ambiental 3 453
## 23 Satisfacción_Ambiental 4 446
## 24 Genero F 588
## 25 Genero M 882
## 26 Cargo Director_Investigación 80
## 27 Cargo Director_Manofactura 145
## 28 Cargo Ejecutivo_Ventas 326
## 29 Cargo Gerente 102
## 30 Cargo Investigador_Cientifico 292
## 31 Cargo Recursos_Humanos 52
## 32 Cargo Representante_Salud 131
## 33 Cargo Representante_Ventas 83
## 34 Cargo Tecnico_Laboratorio 259
## 35 Satisfación_Laboral 1 289
## 36 Satisfación_Laboral 2 280
## 37 Satisfación_Laboral 3 442
## 38 Satisfación_Laboral 4 459
## 39 Estado_Civil Casado 673
## 40 Estado_Civil Divorciado 327
## 41 Estado_Civil Soltero 470
## 42 Horas_Extra No 1054
## 43 Horas_Extra Si 416
## 44 Rendimiento_Laboral 3 1244
## 45 Rendimiento_Laboral 4 226
## 46 Equilibrio_Trabajo_Vida 1 80
## 47 Equilibrio_Trabajo_Vida 2 344
## 48 Equilibrio_Trabajo_Vida 3 893
## 49 Equilibrio_Trabajo_Vida 4 153
Ahora teniendo en cuenta los registros obtenidos de la base datos , realizaremos la division de la base en base de datos con data cualitativa y base de datos con data cuantitiativa , esto para futuros analisis.
#base de datos cualitativos
BaseSeleccionadaCualitativos=BaseSeleccionada[ ,c(1,3:4,6:12,15,17,20)]
BaseSeleccionadaCualitativos
## # A tibble: 1,470 × 13
## Rotación `Viaje de Negocios` Departamento Educación Campo_Educación
## <chr> <chr> <chr> <dbl> <chr>
## 1 Si Raramente Ventas 2 Ciencias
## 2 No Frecuentemente IyD 1 Ciencias
## 3 Si Raramente IyD 2 Otra
## 4 No Frecuentemente IyD 4 Ciencias
## 5 No Raramente IyD 1 Salud
## 6 No Frecuentemente IyD 2 Ciencias
## 7 No Raramente IyD 3 Salud
## 8 No Raramente IyD 1 Ciencias
## 9 No Frecuentemente IyD 3 Ciencias
## 10 No Raramente IyD 3 Salud
## # ℹ 1,460 more rows
## # ℹ 8 more variables: Satisfacción_Ambiental <dbl>, Genero <chr>, Cargo <chr>,
## # Satisfación_Laboral <dbl>, Estado_Civil <chr>, Horas_Extra <chr>,
## # Rendimiento_Laboral <dbl>, Equilibrio_Trabajo_Vida <dbl>
#base de datos cuantitativos
BaseSeleccionadaCuantitativos=BaseSeleccionada[,c(1 ,2, 5, 13:14, 16, 18:19, 21:24)]
BaseSeleccionadaCuantitativos
## # A tibble: 1,470 × 12
## Rotación Edad Distancia_Casa Ingreso_Mensual Trabajos_Anteriores
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Si 41 1 5993 8
## 2 No 49 8 5130 1
## 3 Si 37 2 2090 6
## 4 No 33 3 2909 1
## 5 No 27 2 3468 9
## 6 No 32 2 3068 0
## 7 No 59 3 2670 4
## 8 No 30 24 2693 1
## 9 No 38 23 9526 0
## 10 No 36 27 5237 6
## # ℹ 1,460 more rows
## # ℹ 7 more variables: Porcentaje_aumento_salarial <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>, Antigüedad <dbl>,
## # Antigüedad_Cargo <dbl>, Años_ultima_promoción <dbl>,
## # Años_acargo_con_mismo_jefe <dbl>
BaseSeleccionada
## # A tibble: 1,470 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## 7 No 59 Raramente IyD 3 3
## 8 No 30 Raramente IyD 24 1
## 9 No 38 Frecuentemente IyD 23 3
## 10 No 36 Raramente IyD 27 3
## # ℹ 1,460 more rows
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## # Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## # Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>, …
Teniendo en cuenta estas dos nuevas dataframe seleccionaremos 3 variables categoricas y 3 variables numericas, ademas generaremos Hipotesis por cada una de ellas
Seleccion de Varialbes Cualitativas:
para este proceso tomamos las variables que pensamos que tendrian una correlacion directa con la variable de rotacion, las variables escogidas fueron las siguientes:
1.Satisfación_Laboral: se espera que la Satisfación_Laboral tenga una relacion directamente inversa a la rotacion es decir que a menor nivel de satisfaccion laboral , el porcentaje de rotacion sea mayor.
1.1. Justificacion: el nivel de satisfaccion laboral puede indicar que el empleado no esta de acuerdo con el cargo que desempeña lo cual puede influenciar fuertemente a la persona a buscar una mejora significativa de su satisfaccion en otro rol
1.2. la hipotesis formulada seria la siguiente: una persona que posee un menor nivel de satisfaccion laboral tiene mas probabilidades de rotar , que las personas que tienen un alto nivel de satisfaccion laboral.
2.Horas_Extra: se espera que las Horas_Extra tenga una relacion directa a la rotacion es decir que a si realiza Horas_Extra , el porcentaje de rotacion sea mayor.
2.1. Justificacion: si un usuario realiza horas extras podria tener una percepcion que el rol que desempeña no justifca el esfuerzo que realiza, ademas que su vida personal se ve afectada negativamnete. teniendo en cuenta lo anterior desea encontrar un rol donde pueda tener un mayor tiempo para si mismo y con menor esfuerzo
2.2. la hipotesis formulada sereia la siguiente: una persona que posee Horas_Extra tiene mas probabilidades de rotar , que las personas que tienen no tiene Horas_Extra.
3.Equilibrio_Trabajo_Vida : se espera que el Equilibrio_Trabajo_Vida tenga una relacion directamente inversa a la rotacion es decir que a menor nivel de Equilibrio_Trabajo_Vida, el porcentaje de rotacion sea mayor.
3.1. Justificacion: al no tener un buen nivel de vida trabajo el empleado puede sentir que esta perdiendo tiempo con sus seres queridos y amigos , lo cual impulsa a la persona a conseguir un ´punto de equilibrio entre su vida laboral y personal.
3.2. la hipotesis formulada sereia la siguiente: una persona que posee un menor nivel de Equilibrio_Trabajo_Vida tiene mas probabilidades de rotar , que las personas que tienen un alto nivel de Equilibrio_Trabajo_Vida.Seleccion de Varialbes Cauntitativas:
para este proceso tomamos las variables que pensamos que tendrian una correlacion directa con la variable de rotacion, las variables escogidas fueron las siguientes:
1.Edad: se espera que la Edad tenga una relacion directamente inversa a la rotacion es decir que a menor Edad , el porcentaje de rotacion sea mayor.
1.1 Justificacion: las personas mas jovenes tienden a tener mayores aspiraciones por lo cual buscan nuevos puestos y retos que les permita seguir creciendo
1.2. la hipotesis formulada sereia la siguiente: una persona que posee una menor Edad tiene mas probabilidades de rotar , que las personas que tienen un Edad alta.
2.Trabajos_Anteriores: se espera que la cantidad de Trabajos_Anteriores tenga una relacion directa a la rotacion es decir que a mayor cantidad de Trabajos_Anteriores , el porcentaje de rotacion sea mayor.
2.1. Justificacion: al tener un mayor numero de trabajos anteriores reflejaria una posible inestabilidad debido a temas de busqueda de nuevos retos, bajo rendimiento , mejor salario, mejor balence de tiempo, entre otros.
2.2. la hipotesis formulada sereia la siguiente: una persona que posee una mayor cantidad de Trabajos_Anteriores tiene mas probabilidades de rotar , que las personas que tienen un baja cantidad de Trabajos_Anteriores
3.Antigüedad : se espera que la Antigüedad tenga una relacion directamente inversa a la rotacion es decir que a menor valor de Antigüedad, el porcentaje de rotacion sea mayor.
3.1. Justificacion: al tener una mayor antiguedad de la persona en la empresa, se puede determinar que el empleado siente un mayor nivel de estabilidad y busca su posible pension con la empresa por lo cual no desearia rotar entre cargos.
3.2. la hipotesis formulada sereia la siguiente: una persona que posee un menor valor de Antigüedad tiene mas probabilidades de rotar , que las personas que tienen un alto valor de Antigüedad.Ahora realizaremos un analisis univariado primero de todas las variables cualitativas que tiene el dataset las cuales son:
glimpse(BaseSeleccionadaCualitativos)
## Rows: 1,470
## Columns: 13
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", "No"…
## $ `Viaje de Negocios` <chr> "Raramente", "Frecuentemente", "Raramente", "F…
## $ Departamento <chr> "Ventas", "IyD", "IyD", "IyD", "IyD", "IyD", "…
## $ Educación <dbl> 2, 1, 2, 4, 1, 2, 3, 1, 3, 3, 3, 2, 1, 2, 3, 4…
## $ Campo_Educación <chr> "Ciencias", "Ciencias", "Otra", "Ciencias", "S…
## $ Satisfacción_Ambiental <dbl> 2, 3, 4, 4, 1, 4, 3, 4, 4, 3, 1, 4, 1, 2, 3, 2…
## $ Genero <chr> "F", "M", "M", "F", "M", "M", "F", "M", "M", "…
## $ Cargo <chr> "Ejecutivo_Ventas", "Investigador_Cientifico",…
## $ Satisfación_Laboral <dbl> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, 3, 1…
## $ Estado_Civil <chr> "Soltero", "Casado", "Soltero", "Casado", "Cas…
## $ Horas_Extra <chr> "Si", "No", "Si", "Si", "No", "No", "Si", "No"…
## $ Rendimiento_Laboral <dbl> 3, 4, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3…
## $ Equilibrio_Trabajo_Vida <dbl> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, 3, 3…
# Instalar ggplot2
# install.packages("ggplot2")
# Cargar la librería ggplot2
library(ggplot2)
library(plotly)
##
## 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
# Obtener los nombres de las columnas
columnas <- colnames(BaseSeleccionadaCualitativos) # Cambia "df" por el nombre de tu dataframe
dataframe <- BaseSeleccionadaCualitativos
# Llamar a la función para cada columna en tu dataframe
for (col in columnas) {
# Calcular frecuencias y porcentajes
frecuencias <- table(dataframe[[col]])
porcentajes <- prop.table(frecuencias) * 100
# Convertir a dataframe para usar en ggplot2
df_grafico <- data.frame(
valor = names(frecuencias),
frecuencia = as.numeric(frecuencias),
porcentaje = as.numeric(porcentajes)
)
# Crear gráfico de pastel
pastel <- plot_ly(df_grafico, labels = ~valor, values = ~frecuencia, type = 'pie') %>%
layout(title = paste("Gráfico de pastel para", col),
xaxis = list(title = ""),
yaxis = list(title = ""),
showlegend = TRUE)
# Crear gráfico de barras
barras <- plot_ly(df_grafico, x = ~valor, y = ~frecuencia, type = 'bar', text = ~paste(round(porcentaje, 2), "% (", frecuencia, ")")) %>%
layout(title = paste("Gráfico de barras para", col),
xaxis = list(title = col),
yaxis = list(title = "Frecuencia"))
## Validamos si es la variable y guardamos la grafica en su respectiva variable
switch(col, 'Satisfación_Laboral'={g7 <- pastel
g10 <- barras}
, 'Horas_Extra'={g8 <- pastel
g11 <- barras}
,'Equilibrio_Trabajo_Vida'={g9 <- pastel
g12 <- barras})
# Imprimir los gráficos
print(pastel)
print(barras)
}
Ahora realizaremos un analisis univariado primero de todas las variables cuantitativas que tiene el dataset las cuales son:
glimpse(BaseSeleccionadaCuantitativos)
## Rows: 1,470
## Columns: 12
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", …
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35…
## $ Distancia_Casa <dbl> 1, 8, 2, 3, 2, 2, 3, 24, 23, 27, 16, 15, 2…
## $ 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, …
## $ Porcentaje_aumento_salarial <dbl> 11, 23, 15, 11, 12, 13, 20, 22, 21, 13, 13…
## $ 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, …
## $ 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, …
procedemos a graficar los diagramas de cajas y bigotes al igual que un pequeño resumen para ver los comportamientos de las variables cuantitativas:
#resumen de las varaibles cuantitativas
summary(BaseSeleccionadaCuantitativos)
## Rotación Edad Distancia_Casa Ingreso_Mensual
## Length:1470 Min. :18.00 Min. : 1.000 Min. : 1009
## Class :character 1st Qu.:30.00 1st Qu.: 2.000 1st Qu.: 2911
## Mode :character Median :36.00 Median : 7.000 Median : 4919
## Mean :36.92 Mean : 9.193 Mean : 6503
## 3rd Qu.:43.00 3rd Qu.:14.000 3rd Qu.: 8379
## Max. :60.00 Max. :29.000 Max. :19999
## Trabajos_Anteriores Porcentaje_aumento_salarial Años_Experiencia
## Min. :0.000 Min. :11.00 Min. : 0.00
## 1st Qu.:1.000 1st Qu.:12.00 1st Qu.: 6.00
## Median :2.000 Median :14.00 Median :10.00
## Mean :2.693 Mean :15.21 Mean :11.28
## 3rd Qu.:4.000 3rd Qu.:18.00 3rd Qu.:15.00
## Max. :9.000 Max. :25.00 Max. :40.00
## Capacitaciones Antigüedad Antigüedad_Cargo Años_ultima_promoción
## Min. :0.000 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.:2.000 1st Qu.: 3.000 1st Qu.: 2.000 1st Qu.: 0.000
## Median :3.000 Median : 5.000 Median : 3.000 Median : 1.000
## Mean :2.799 Mean : 7.008 Mean : 4.229 Mean : 2.188
## 3rd Qu.:3.000 3rd Qu.: 9.000 3rd Qu.: 7.000 3rd Qu.: 3.000
## Max. :6.000 Max. :40.000 Max. :18.000 Max. :15.000
## Años_acargo_con_mismo_jefe
## Min. : 0.000
## 1st Qu.: 2.000
## Median : 3.000
## Mean : 4.123
## 3rd Qu.: 7.000
## Max. :17.000
# Carga la librería ggplot2
library(ggplot2)
library(plotly)
for (col in names(BaseSeleccionadaCuantitativos)) {
if (is.numeric(BaseSeleccionadaCuantitativos[[col]])) { # Verifica si la columna es numérica
bigotes <- ggplot(BaseSeleccionadaCuantitativos, aes(y = .data[[col]])) +
geom_boxplot() +
labs(title = paste("Boxplot de", col)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
# Convertir a gráfico interactivo
bigotes_interactivo <- ggplotly(bigotes)
## Validamos si es la variable y guardamos la gráfica en su respectiva variable
switch(col, 'Edad'={g1 <- bigotes_interactivo}
, 'Antigüedad'={g2 <- bigotes_interactivo}
,'Trabajos_Anteriores'={g3 <- bigotes_interactivo})
print(bigotes_interactivo)
}
}
library(ggplot2)
library(plotly)
for (col in names(BaseSeleccionadaCuantitativos)) {
if (is.numeric(BaseSeleccionadaCuantitativos[[col]])) { # Verifica si la columna es numérica
# Creamos un histograma para la columna actual
histograma<-ggplot(BaseSeleccionadaCuantitativos, aes(x = .data[[col]])) +
geom_histogram(binwidth = 0.5, fill = "blue", color = "black", alpha = 0.5) + # Ajusta el ancho de los intervalos y los colores según tus preferencias
geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, size = 3) +
scale_x_continuous(breaks = seq(floor(min(BaseSeleccionadaCuantitativos[[col]])), ceiling(max(BaseSeleccionadaCuantitativos[[col]])), by = 1)) +
labs(title = paste("Histograma de", col),
x = col,
y = "Frecuencia") +
theme_minimal() + # Opcional: ajusta el tema del gráfico
theme(plot.title = element_text(hjust = 0.5)) # Centra el título del gráfico
# Convertir a gráfico interactivo
histograma_interactivo <- ggplotly(histograma)
##validamos si es la variable y guardamos la grafica en su respectiva variable
switch(col, 'Edad'={g4<-histograma_interactivo}
, 'Antigüedad'={g5<-histograma_interactivo}
,'Trabajos_Anteriores'={g6<-histograma_interactivo})
if (col != 'Ingreso_Mensual'){
print(histograma_interactivo)
}
}
}
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## ℹ The deprecated feature was likely used in the ggplot2 package.
## Please report the issue at <https://github.com/tidyverse/ggplot2/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
las anteriroes graficas representan todos los datos caulitativos y cuantitativos de la base de datos de rotacion, pero por motivos de analisis solo tomaremos las variables seleccionadas en el anterior punto para el analisis univariado, las variables en mension son:
#variables Cuantitativas
g1
g4
g2
g5
g3
g6
#varaibles cualitativas
g7
g10
g8
g11
g9
g12
luego de visualizadas las variables podemos generar las siguientes conclusiones: 1. los empleados se ubican en la mayoria entre las edades de 30 a 43 años, lo cual da a entender que la mayoria de empleados son casados o divorciados y la media de la edad se encuentra en 36 años, , debemos recalcar que el empleado con menor edad tiene 18 años y el empleado mas longevo tiene 60 años. 2.gracias a la variable antiguedad podemos determinar que existen una buena cantidad de outliers en la distribucion de datos, ademas que existen personas con ninguna antiguedad en la empresa y el maximo tiempo de actiguedad son 40 años y ademas la gran moyoria de registros se encuentra entre los 3 y 9 años de antoguedad, con un promedio de antiguedad de 5 años 3.las graficas muestran que la gran mayoria de datos oscial entre 1 y 4 tgrabajos anteriores, en promedio los empleados an tenido 2 trabajos anteriores y auqnue hay presencias de outliers, son pocos. la mayor canridad de registros solo han tenido 1 solo trabajo anterior 4.un 38.7% de las personas tiene una satisfaccion laboral baja (1,2), lo cual se ve reflejado en un total de 569 registros, mientras que el 61.3% tienen una satisfaccion laboral alta (3,4), lo cual se ve reflejado en 901 registros. 5. un 28.3% porciento de los registros mencionan que hacen horas extras, mientras que un 71.7% no hace horas extra. 6. se pude inferir que un 28.84% de los registros no tienen un equilibrio en su relacion trabajo vida y un 71.1% tienen un buen equilibrio de su trabajo vida
ahora procederemos a realizar un analisis bivariado para lo cual todas las variables cualitativas y cuantitativas seran comparadas con el atributo rotacion, pero primero realizaremos una pequeña matriz de coorelacion para ver si existe un grado fuerte de correlacion entre rotacion y los atributos numericos
#grafico normal de matriz de correlaciones
library(GGally)
library(ggcorrplot)
library(dplyr)
BaseSeleccionadaCuantitativos2=BaseSeleccionadaCuantitativos
#creamos una variable binaria para rotacion
BaseSeleccionadaCuantitativos2$Rotación_binaria = case_when( BaseSeleccionadaCuantitativos2$Rotación=="Si" ~ 1,
BaseSeleccionadaCuantitativos$Rotación=="No" ~ 0)
#convertimos a logartmo atributos que son muy grandes
BaseSeleccionadaCuantitativos2$Ingreso_Mensuallog=log(BaseSeleccionadaCuantitativos$Ingreso_Mensual)
BaseSeleccionadaCuantitativos2$Edadlog=log(BaseSeleccionadaCuantitativos$Edad)
BaseSeleccionadaCuantitativos2$Distancia_Casalog=log(BaseSeleccionadaCuantitativos$Distancia_Casa)
BaseSeleccionadaCuantitativos2$Porcentaje_aumento_salarialog=log(BaseSeleccionadaCuantitativos$Porcentaje_aumento_salarial)
BaseSeleccionadaCuantitativos2$Trabajos_Anterioreslog=log(BaseSeleccionadaCuantitativos$Trabajos_Anteriores)
BaseSeleccionadaCuantitativos2$Años_Experiencialog=log(BaseSeleccionadaCuantitativos$Años_Experiencia)
BaseSeleccionadaCuantitativos2$Capacitacioneslog=log(BaseSeleccionadaCuantitativos$Capacitaciones)
BaseSeleccionadaCuantitativos2$Antigüedadlog=log(BaseSeleccionadaCuantitativos$Antigüedad)
BaseSeleccionadaCuantitativos2$Antigüedad_Cargolog=log(BaseSeleccionadaCuantitativos$Antigüedad_Cargo)
BaseSeleccionadaCuantitativos2$Años_acargo_con_mismo_jefelog=log(BaseSeleccionadaCuantitativos$Años_acargo_con_mismo_jefe)
str(BaseSeleccionadaCuantitativos2)
## tibble [1,470 × 23] (S3: tbl_df/tbl/data.frame)
## $ Rotación : chr [1:1470] "Si" "No" "Si" "No" ...
## $ Edad : num [1:1470] 41 49 37 33 27 32 59 30 38 36 ...
## $ Distancia_Casa : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
## $ Ingreso_Mensual : num [1:1470] 5993 5130 2090 2909 3468 ...
## $ Trabajos_Anteriores : num [1:1470] 8 1 6 1 9 0 4 1 0 6 ...
## $ Porcentaje_aumento_salarial : num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
## $ Años_Experiencia : num [1:1470] 8 10 7 8 6 8 12 1 10 17 ...
## $ Capacitaciones : num [1:1470] 0 3 3 3 3 2 3 2 2 3 ...
## $ Antigüedad : num [1:1470] 6 10 0 8 2 7 1 1 9 7 ...
## $ Antigüedad_Cargo : num [1:1470] 4 7 0 7 2 7 0 0 7 7 ...
## $ Años_ultima_promoción : num [1:1470] 0 1 0 3 2 3 0 0 1 7 ...
## $ Años_acargo_con_mismo_jefe : num [1:1470] 5 7 0 0 2 6 0 0 8 7 ...
## $ Rotación_binaria : num [1:1470] 1 0 1 0 0 0 0 0 0 0 ...
## $ Ingreso_Mensuallog : num [1:1470] 8.7 8.54 7.64 7.98 8.15 ...
## $ Edadlog : num [1:1470] 3.71 3.89 3.61 3.5 3.3 ...
## $ Distancia_Casalog : num [1:1470] 0 2.079 0.693 1.099 0.693 ...
## $ Porcentaje_aumento_salarialog: num [1:1470] 2.4 3.14 2.71 2.4 2.48 ...
## $ Trabajos_Anterioreslog : num [1:1470] 2.08 0 1.79 0 2.2 ...
## $ Años_Experiencialog : num [1:1470] 2.08 2.3 1.95 2.08 1.79 ...
## $ Capacitacioneslog : num [1:1470] -Inf 1.1 1.1 1.1 1.1 ...
## $ Antigüedadlog : num [1:1470] 1.792 2.303 -Inf 2.079 0.693 ...
## $ Antigüedad_Cargolog : num [1:1470] 1.386 1.946 -Inf 1.946 0.693 ...
## $ Años_acargo_con_mismo_jefelog: num [1:1470] 1.609 1.946 -Inf -Inf 0.693 ...
df2 = BaseSeleccionadaCuantitativos2 %>%
dplyr::select( Rotación_binaria, Edad, Distancia_Casa, Ingreso_Mensual)
#graficamos la tabla de correlaciones
GGally::ggpairs(df2, title="Matriz de Correlaciones de Variables")
df2 = BaseSeleccionadaCuantitativos2 %>%
dplyr::select( Rotación_binaria, Trabajos_Anteriores,Porcentaje_aumento_salarial,Años_Experiencia)
#graficamos la tabla de correlaciones
GGally::ggpairs(df2, title="Matriz de Correlaciones de Variables")
df2 = BaseSeleccionadaCuantitativos2 %>%
dplyr::select( Rotación_binaria, Capacitaciones, Antigüedad, Antigüedad_Cargo, Años_acargo_con_mismo_jefe)
#graficamos la tabla de correlaciones
GGally::ggpairs(df2, title="Matriz de Correlaciones de Variables")
como pudimos darnos cuenta las varaibles cuantitativas tienen indicadores de correlacion muy bajos , si tratan de explicar la correlacion con el atributo binario, por lo cual las variables Edad , Antigüedad,Trabajos_Anteriores solo tienen porcentajes de correlacion de -15%, -13% y 4% respectivamente, pero la mayoria son significativas exeptuando por los trabajos anteriores, tal y como se muestra en la siguiente tabla de correlacion.
#grafico normal de matriz de correlaciones
library(GGally)
library(ggcorrplot)
library(dplyr)
df2 = BaseSeleccionadaCuantitativos2 %>%
dplyr::select( Rotación_binaria, Edad, Antigüedad, Trabajos_Anteriores)
#graficamos la tabla de correlaciones
GGally::ggpairs(df2, title="Matriz de Correlaciones de Variables escogidas")
df2 = BaseSeleccionadaCuantitativos2 %>%
dplyr::select( Edad, Distancia_Casa, Ingreso_Mensual, Trabajos_Anteriores, Porcentaje_aumento_salarial, Años_Experiencia, Capacitaciones, Antigüedad, Antigüedad_Cargo,
Años_ultima_promoción, Años_acargo_con_mismo_jefe, Rotación_binaria )
# Calculo de la correlacion
correlations = cor(df2)
# Mapa de calor con las variables y su correlacion
map_calor = ggplot(data = reshape2::melt(correlations), aes(x = Var1, y = Var2, fill = value)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "blue") +
labs(title = "Correlacion variables Rotacion", x='', y='') +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
geom_text(aes(label = round(value, 2)), vjust = 1, size = 2)
map_calor
como pudimos darnos cuenta las varaibles cuantitativas tienen indicadores de correlacion muy bajos , si tratan de explicar la correlacion con el atributo binario, por lo cual las variables Edad , Antigüedad,Trabajos_Anteriores solo tienen porcentajes de correlacion de -15%, -13% y 4% respectivamente, pero la mayoria son significativas exeptuando por los trabajos anteriores, tal y como se muestra en la siguiente tabla de correlacion.
BaseSeleccionadaCualitativos2=BaseSeleccionadaCualitativos
BaseSeleccionadaCualitativos2
## # A tibble: 1,470 × 13
## Rotación `Viaje de Negocios` Departamento Educación Campo_Educación
## <chr> <chr> <chr> <dbl> <chr>
## 1 Si Raramente Ventas 2 Ciencias
## 2 No Frecuentemente IyD 1 Ciencias
## 3 Si Raramente IyD 2 Otra
## 4 No Frecuentemente IyD 4 Ciencias
## 5 No Raramente IyD 1 Salud
## 6 No Frecuentemente IyD 2 Ciencias
## 7 No Raramente IyD 3 Salud
## 8 No Raramente IyD 1 Ciencias
## 9 No Frecuentemente IyD 3 Ciencias
## 10 No Raramente IyD 3 Salud
## # ℹ 1,460 more rows
## # ℹ 8 more variables: Satisfacción_Ambiental <dbl>, Genero <chr>, Cargo <chr>,
## # Satisfación_Laboral <dbl>, Estado_Civil <chr>, Horas_Extra <chr>,
## # Rendimiento_Laboral <dbl>, Equilibrio_Trabajo_Vida <dbl>
Ahora procedemeros a generar los graficos para cada una de los atributos que fueron catalogados como cualitativos.
# Cargar las librerías
library(ggplot2)
library(plotly)
for (i in 2:length(BaseSeleccionadaCualitativos2)) {
variable <- names(BaseSeleccionadaCualitativos2)[i]
# Calcular frecuencia y porcentaje
freq_table <- table(BaseSeleccionadaCualitativos2[[variable]], BaseSeleccionadaCualitativos2$Rotación)
freq_df <- as.data.frame(freq_table)
colnames(freq_df) <- c(variable, "Rotación", "Frecuencia")
freq_df$Porcentaje <- freq_df$Frecuencia / sum(freq_df$Frecuencia) * 100
# Graficar con plotly
plot <- ggplot(freq_df, aes(x = !!as.symbol(variable), y = Frecuencia, fill = Rotación)) +
geom_bar(stat = "identity") +
geom_text(aes(label = paste(Frecuencia, "(", round(Porcentaje, 1), "%)")),
position = position_stack(vjust = 0.5), size = 2) + # Tamaño de letra ajustado
labs(title = paste("Gráfico de Barras para", variable))
plotly_plot <- ggplotly(plot)
## Validamos si es la variable y guardamos la grafica en su respectiva variable
switch(variable, 'Satisfación_Laboral'={g13 <- plotly_plot}
, 'Horas_Extra'={g14 <- plotly_plot}
,'Equilibrio_Trabajo_Vida'={g15 <- plotly_plot})
print(plotly_plot)
}
luego de calculado los graficos de barras para las variables cualitativas, tomaremos unicamente las tres variables seleccionadas las cuales son: ‘Satisfación_Laboral’, ‘Horas_Extra’, ‘Equilibrio_Trabajo_Vida’
#desplegamos los que nos conciernen
g13
g14
g15
teniendo en cuenta los graficos obtenidos anterioremente podemos llegar a las siguientes conluciones:
Ahora realizaremos la compracion de los resultados obtenidos con las hipotesis que se plantearon, las hipotesis planteadas fueron las siguientes:
1.Satisfación_Laboral: se espera que la Satisfación_Laboral tenga una relacion directamente inversa a la rotacion es decir que a menor nivel de satisfaccion laboral , el porcentaje de rotacion sea mayor.
1.1. la hipotesis formulada seria la siguiente: una persona que posee un menor nivel de satisfaccion laboral tiene mas probabilidades de rotar , que las personas que tienen un alto nivel de satisfaccion laboral.
Respuesta: la hipotesis fue validad debido a que la gran mayoria de casos que rotaron estan entre los valores 1 y 3
2.Horas_Extra: se espera que las Horas_Extra tenga una relacion directa a la rotacion es decir que a si realiza Horas_Extra , el porcentaje de rotacion sea mayor.
2.1. la hipotesis formulada sereia la siguiente: una persona que posee Horas_Extra tiene mas probabilidades de rotar , que las personas que tienen no tiene Horas_Extra.
Respuesta: la hipotesis fue validad debido a que el porcentaje de rotacion es del 30.52% , es decir que aquellas personas que tiene horas extra tiene 3 veces mas posibilidades de realizar rotacion de cargo
3.Equilibrio_Trabajo_Vida : se espera que el Equilibrio_Trabajo_Vida tenga una relacion directamente inversa a la rotacion es decir que a menor nivel de Equilibrio_Trabajo_Vida, el porcentaje de rotacion sea mayor.
3.1. la hipotesis formulada sereia la siguiente: una persona que posee un menor nivel de Equilibrio_Trabajo_Vida tiene mas probabilidades de rotar , que las personas que tienen un alto nivel de Equilibrio_Trabajo_Vida.Respuesta: la hipotesis fue validad debido a que el nivel 1 tiene un porcentaje de rotacion del 31.25% mientras que los otros niveles tiene valroes de rotacion entre 10 y 14%
Seleccion de Varialbes Cauntitativas:
1.Edad: se espera que la Edad tenga una relacion directamente inversa a la rotacion es decir que a menor Edad , el porcentaje de rotacion sea mayor.
1.1. la hipotesis formulada sereia la siguiente: una persona que posee una menor Edad tiene mas probabilidades de rotar , que las personas que tienen un Edad alta.
Respuesta: la hipotesis fue validad debido a que en la matriz de correlacion se genero un -15% lo que indica que se tiene una relacion inversa entre edad y rotacion
2.Trabajos_Anteriores: se espera que la cantidad de Trabajos_Anteriores tenga una relacion directa a la rotacion es decir que a mayor cantidad de Trabajos_Anteriores , el porcentaje de rotacion sea mayor.
2.1. la hipotesis formulada sereia la siguiente: una persona que posee una mayor cantidad de Trabajos_Anteriores tiene mas probabilidades de rotar , que las personas que tienen un baja cantidad de Trabajos_Anteriores
Respuesta: la hipotesis fue desechada debido a que en la matriz de correlacion se genero un 4% lo que indica que se tiene una relacion es positiva , pero por el valor no es determinante para un comportamiento entre trabajos_anteriores y rotacion, es decir esta variable no afecta en gran medida la rotacion
3.Antigüedad : se espera que la Antigüedad tenga una relacion directamente inversa a la rotacion es decir que a menor valor de Antigüedad, el porcentaje de rotacion sea mayor.
3.1. la hipotesis formulada sereia la siguiente: una persona que posee un menor valor de Antigüedad tiene mas probabilidades de rotar , que las personas que tienen un alto valor de Antigüedad.Respuesta: la hipotesis fue validad debido a que en la matriz de correlacion se genero un -13% lo que indica que se tiene una relacion inversa entre Antiguedad y rotacion
Ahora procederemos a calcular el modelos generlizado teniendo en cuenta el atributo de rotacion y las 6 variables que se eligieron en el punto nuemro 2, cabe resaltar que para la realizacion de estos procesos realizaremos unas modificaciones a la data original la cual peude ser visualizada a continuacion:
BaseSeleccionada
## # A tibble: 1,470 × 24
## Rotación Edad `Viaje de Negocios` Departamento Distancia_Casa Educación
## <chr> <dbl> <chr> <chr> <dbl> <dbl>
## 1 Si 41 Raramente Ventas 1 2
## 2 No 49 Frecuentemente IyD 8 1
## 3 Si 37 Raramente IyD 2 2
## 4 No 33 Frecuentemente IyD 3 4
## 5 No 27 Raramente IyD 2 1
## 6 No 32 Frecuentemente IyD 2 2
## 7 No 59 Raramente IyD 3 3
## 8 No 30 Raramente IyD 24 1
## 9 No 38 Frecuentemente IyD 23 3
## 10 No 36 Raramente IyD 27 3
## # ℹ 1,460 more rows
## # ℹ 18 more variables: Campo_Educación <chr>, Satisfacción_Ambiental <dbl>,
## # Genero <chr>, Cargo <chr>, Satisfación_Laboral <dbl>, Estado_Civil <chr>,
## # Ingreso_Mensual <dbl>, Trabajos_Anteriores <dbl>, Horas_Extra <chr>,
## # Porcentaje_aumento_salarial <dbl>, Rendimiento_Laboral <dbl>,
## # Años_Experiencia <dbl>, Capacitaciones <dbl>,
## # Equilibrio_Trabajo_Vida <dbl>, Antigüedad <dbl>, Antigüedad_Cargo <dbl>, …
como pimer paso vamos a seleccionar las variables que tomaneros en cuenta, las cuales son: Edad, Antigüedad, Trabajos_Anteriores, Satisfación_Laboral,Horas_Extra y Equilibrio_Trabajo_Vida
#base de datos cualitativos
BaseModelo=BaseSeleccionada[ ,c(1,2,21,14,11,15,20)]
BaseModelo
## # A tibble: 1,470 × 7
## Rotación Edad Antigüedad Trabajos_Anteriores Satisfación_Laboral Horas_Extra
## <chr> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Si 41 6 8 4 Si
## 2 No 49 10 1 2 No
## 3 Si 37 0 6 3 Si
## 4 No 33 8 1 3 Si
## 5 No 27 2 9 2 No
## 6 No 32 7 0 4 No
## 7 No 59 1 4 1 Si
## 8 No 30 1 1 3 No
## 9 No 38 9 0 3 No
## 10 No 36 7 6 3 No
## # ℹ 1,460 more rows
## # ℹ 1 more variable: Equilibrio_Trabajo_Vida <dbl>
como primer paso y debido a que el algoritmo del modelo solo procesa datos binarios crearemos la variable binaria de rotacion y ademas las varaibles cualitativas las convertiremos en factores para poder generar un one hot de ellas, adeams que debemos escalar las variables de edad, antiguedad y trabajos anteriores
library(dplyr)
#creamos una variable binaria para rotacion
BaseModelo$Rotación_binaria = case_when( BaseModelo$Rotación=="Si" ~ 1,
BaseModelo$Rotación=="No" ~ 0)
#convertimos las variables en facctores para el caso de las varaibles cualitativas
BaseModelo$Satisfación_Laboral <- as.factor(BaseModelo$Satisfación_Laboral)
BaseModelo$Horas_Extra <- as.factor(BaseModelo$Horas_Extra)
BaseModelo$Equilibrio_Trabajo_Vida <- as.factor(BaseModelo$Equilibrio_Trabajo_Vida)
#creamos las variables del one hot
#Satisfación_Laboral
BaseModelo$Satisfación_Laboral1<-as.numeric(BaseModelo$Satisfación_Laboral==1)
BaseModelo$Satisfación_Laboral2<-as.numeric(BaseModelo$Satisfación_Laboral==2)
BaseModelo$Satisfación_Laboral3<-as.numeric(BaseModelo$Satisfación_Laboral==3)
BaseModelo$Satisfación_Laboral4<-as.numeric(BaseModelo$Satisfación_Laboral==4)
#Horas Extras
BaseModelo$Horas_ExtraSi<-as.numeric(BaseModelo$Horas_Extra=="Si")
BaseModelo$Horas_ExtraNo<-as.numeric(BaseModelo$Horas_Extra=="No")
#Equilibrio_Trabajo_Vida
BaseModelo$Equilibrio_Trabajo_Vida1<-as.numeric(BaseModelo$Equilibrio_Trabajo_Vida==1)
BaseModelo$Equilibrio_Trabajo_Vida2<-as.numeric(BaseModelo$Equilibrio_Trabajo_Vida==2)
BaseModelo$Equilibrio_Trabajo_Vida3<-as.numeric(BaseModelo$Equilibrio_Trabajo_Vida==3)
BaseModelo$Equilibrio_Trabajo_Vida4<-as.numeric(BaseModelo$Equilibrio_Trabajo_Vida==4)
#escalamos las varaibles de edad
BaseModelo$Edad_esc<-scale(BaseModelo$Edad)
BaseModelo$Antigüedad_esc<-scale(BaseModelo$Antigüedad)
BaseModelo$Trabajos_Anteriores_esc<-scale(BaseModelo$Trabajos_Anteriores)
#base Nueva
BaseModelo
## # A tibble: 1,470 × 21
## Rotación Edad Antigüedad Trabajos_Anteriores Satisfación_Laboral Horas_Extra
## <chr> <dbl> <dbl> <dbl> <fct> <fct>
## 1 Si 41 6 8 4 Si
## 2 No 49 10 1 2 No
## 3 Si 37 0 6 3 Si
## 4 No 33 8 1 3 Si
## 5 No 27 2 9 2 No
## 6 No 32 7 0 4 No
## 7 No 59 1 4 1 Si
## 8 No 30 1 1 3 No
## 9 No 38 9 0 3 No
## 10 No 36 7 6 3 No
## # ℹ 1,460 more rows
## # ℹ 15 more variables: Equilibrio_Trabajo_Vida <fct>, Rotación_binaria <dbl>,
## # Satisfación_Laboral1 <dbl>, Satisfación_Laboral2 <dbl>,
## # Satisfación_Laboral3 <dbl>, Satisfación_Laboral4 <dbl>,
## # Horas_ExtraSi <dbl>, Horas_ExtraNo <dbl>, Equilibrio_Trabajo_Vida1 <dbl>,
## # Equilibrio_Trabajo_Vida2 <dbl>, Equilibrio_Trabajo_Vida3 <dbl>,
## # Equilibrio_Trabajo_Vida4 <dbl>, Edad_esc <dbl[,1]>, …
#descripcion de la base nueva
glimpse(BaseModelo)
## Rows: 1,470
## Columns: 21
## $ Rotación <chr> "Si", "No", "Si", "No", "No", "No", "No", "No…
## $ Edad <dbl> 41, 49, 37, 33, 27, 32, 59, 30, 38, 36, 35, 2…
## $ Antigüedad <dbl> 6, 10, 0, 8, 2, 7, 1, 1, 9, 7, 5, 9, 5, 2, 4,…
## $ Trabajos_Anteriores <dbl> 8, 1, 6, 1, 9, 0, 4, 1, 0, 6, 0, 0, 1, 0, 5, …
## $ Satisfación_Laboral <fct> 4, 2, 3, 3, 2, 4, 1, 3, 3, 3, 2, 3, 3, 4, 3, …
## $ Horas_Extra <fct> Si, No, Si, Si, No, No, Si, No, No, No, No, S…
## $ Equilibrio_Trabajo_Vida <fct> 1, 3, 3, 3, 3, 2, 2, 3, 3, 2, 3, 3, 2, 3, 3, …
## $ Rotación_binaria <dbl> 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, …
## $ Satisfación_Laboral1 <dbl> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Satisfación_Laboral2 <dbl> 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, …
## $ Satisfación_Laboral3 <dbl> 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, …
## $ Satisfación_Laboral4 <dbl> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, …
## $ Horas_ExtraSi <dbl> 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, …
## $ Horas_ExtraNo <dbl> 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, …
## $ Equilibrio_Trabajo_Vida1 <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Equilibrio_Trabajo_Vida2 <dbl> 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, …
## $ Equilibrio_Trabajo_Vida3 <dbl> 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, …
## $ Equilibrio_Trabajo_Vida4 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Edad_esc <dbl[,1]> <matrix[26 x 1]>
## $ Antigüedad_esc <dbl[,1]> <matrix[26 x 1]>
## $ Trabajos_Anteriores_esc <dbl[,1]> <matrix[26 x 1]>
ahora procederemos a realizar el modelo de regresion logistico y generaremos sus valores para cada una de las variables, pero primero generaremos las dabes de pruebas y entrenamiento
#install.packages('caTools', repos='http://cran.us.r-project.org')
library(caTools)
## Warning: package 'caTools' was built under R version 4.3.3
#priemero separamos lod datos en data de entrenamiento y data prueba
set.seed(123)
# Dividir los datos en entrenamiento (70%) y test (30%)
split = sample.split(BaseModelo$Rotación_binaria , SplitRatio = 0.7)
# Conjunto de entrenamiento
Data_entrenamiento = BaseModelo[split, ]
# Conjunto de prueba
Data_Prueba = BaseModelo[!split, ]
#mostramos la data de entrenamiento
dim(Data_entrenamiento)
## [1] 1029 21
head(Data_entrenamiento)
## # A tibble: 6 × 21
## Rotación Edad Antigüedad Trabajos_Anteriores Satisfación_Laboral Horas_Extra
## <chr> <dbl> <dbl> <dbl> <fct> <fct>
## 1 Si 41 6 8 4 Si
## 2 No 33 8 1 3 Si
## 3 No 32 7 0 4 No
## 4 No 59 1 4 1 Si
## 5 No 30 1 1 3 No
## 6 No 38 9 0 3 No
## # ℹ 15 more variables: Equilibrio_Trabajo_Vida <fct>, Rotación_binaria <dbl>,
## # Satisfación_Laboral1 <dbl>, Satisfación_Laboral2 <dbl>,
## # Satisfación_Laboral3 <dbl>, Satisfación_Laboral4 <dbl>,
## # Horas_ExtraSi <dbl>, Horas_ExtraNo <dbl>, Equilibrio_Trabajo_Vida1 <dbl>,
## # Equilibrio_Trabajo_Vida2 <dbl>, Equilibrio_Trabajo_Vida3 <dbl>,
## # Equilibrio_Trabajo_Vida4 <dbl>, Edad_esc <dbl[,1]>,
## # Antigüedad_esc <dbl[,1]>, Trabajos_Anteriores_esc <dbl[,1]>
#mostramos la data de entrenamiento
dim(Data_Prueba)
## [1] 441 21
#generacion del modelo
modelo1 <- glm(Rotación_binaria~Satisfación_Laboral1+Satisfación_Laboral2+Satisfación_Laboral3+Satisfación_Laboral4+Horas_ExtraSi+Horas_ExtraNo+Equilibrio_Trabajo_Vida1+Equilibrio_Trabajo_Vida2+Equilibrio_Trabajo_Vida3+Equilibrio_Trabajo_Vida4+Edad_esc+Antigüedad_esc+Trabajos_Anteriores_esc,data = Data_entrenamiento, family = "binomial")
# resultados de modelo
summary(modelo1)
##
## Call:
## glm(formula = Rotación_binaria ~ Satisfación_Laboral1 + Satisfación_Laboral2 +
## Satisfación_Laboral3 + Satisfación_Laboral4 + Horas_ExtraSi +
## Horas_ExtraNo + Equilibrio_Trabajo_Vida1 + Equilibrio_Trabajo_Vida2 +
## Equilibrio_Trabajo_Vida3 + Equilibrio_Trabajo_Vida4 + Edad_esc +
## Antigüedad_esc + Trabajos_Anteriores_esc, family = "binomial",
## data = Data_entrenamiento)
##
## Coefficients: (3 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.95108 0.34928 -8.449 < 2e-16 ***
## Satisfación_Laboral1 1.17892 0.27150 4.342 1.41e-05 ***
## Satisfación_Laboral2 0.87445 0.28391 3.080 0.002070 **
## Satisfación_Laboral3 0.80012 0.25344 3.157 0.001594 **
## Satisfación_Laboral4 NA NA NA NA
## Horas_ExtraSi 1.44639 0.18784 7.700 1.36e-14 ***
## Horas_ExtraNo NA NA NA NA
## Equilibrio_Trabajo_Vida1 1.12037 0.41332 2.711 0.006715 **
## Equilibrio_Trabajo_Vida2 0.04210 0.33622 0.125 0.900355
## Equilibrio_Trabajo_Vida3 -0.18985 0.30378 -0.625 0.531990
## Equilibrio_Trabajo_Vida4 NA NA NA NA
## Edad_esc -0.40236 0.10763 -3.739 0.000185 ***
## Antigüedad_esc -0.36673 0.12324 -2.976 0.002924 **
## Trabajos_Anteriores_esc 0.12576 0.09539 1.318 0.187347
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 909.34 on 1028 degrees of freedom
## Residual deviance: 787.02 on 1018 degrees of freedom
## AIC: 809.02
##
## Number of Fisher Scoring iterations: 5
#explicacion de coeficientes
exp(modelo1$coefficients)
## (Intercept) Satisfación_Laboral1 Satisfación_Laboral2
## 0.05228337 3.25084951 2.39754731
## Satisfación_Laboral3 Satisfación_Laboral4 Horas_ExtraSi
## 2.22580758 NA 4.24774157
## Horas_ExtraNo Equilibrio_Trabajo_Vida1 Equilibrio_Trabajo_Vida2
## NA 3.06597785 1.04299750
## Equilibrio_Trabajo_Vida3 Equilibrio_Trabajo_Vida4 Edad_esc
## 0.82707960 NA 0.66873937
## Antigüedad_esc Trabajos_Anteriores_esc
## 0.69299887 1.13401345
Ahora procederemos a realizar una estimacion paso a paso mediante el metodo Steppwise
modelo_b0<- glm(Rotación_binaria ~ 1, data=BaseModelo) # modelo y= b0
modelo_all <- glm(Rotación_binaria ~ Satisfación_Laboral1+Satisfación_Laboral2+Satisfación_Laboral3+Satisfación_Laboral4+Horas_ExtraSi+Horas_ExtraNo+Equilibrio_Trabajo_Vida1+Equilibrio_Trabajo_Vida2+Equilibrio_Trabajo_Vida3+Equilibrio_Trabajo_Vida4+Edad_esc+Antigüedad_esc+Trabajos_Anteriores_esc , data=Data_entrenamiento) # modelo con todas las variables independientes
forward <- step(modelo_b0, direction='forward', scope=formula(modelo_all), trace=0)
# Visualización de los resultados
forward$anova
## Step Df Deviance Resid. Df Resid. Dev AIC
## 1 NA NA 1469 198.7898 1234.548
## 2 + Horas_ExtraSi -1 12.0415064 1468 186.7483 1144.693
## 3 + Edad_esc -1 5.4902502 1467 181.2580 1102.828
## 4 + Trabajos_Anteriores_esc -1 2.1220361 1466 179.1360 1087.517
## 5 + Equilibrio_Trabajo_Vida1 -1 1.8802875 1465 177.2557 1074.006
## 6 + Satisfación_Laboral4 -1 1.7693350 1464 175.4864 1061.259
## 7 + Antigüedad_esc -1 0.7277393 1463 174.7586 1057.150
## 8 + Satisfación_Laboral1 -1 0.6133448 1462 174.1453 1053.982
## 9 + Equilibrio_Trabajo_Vida3 -1 0.3532790 1461 173.7920 1052.996
summary(forward)
##
## Call:
## glm(formula = Rotación_binaria ~ Horas_ExtraSi + Edad_esc +
## Trabajos_Anteriores_esc + Equilibrio_Trabajo_Vida1 + Satisfación_Laboral4 +
## Antigüedad_esc + Satisfación_Laboral1 + Equilibrio_Trabajo_Vida3,
## data = BaseModelo)
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.123781 0.018903 6.548 8.04e-11 ***
## Horas_ExtraSi 0.208143 0.020016 10.399 < 2e-16 ***
## Edad_esc -0.063356 0.010147 -6.244 5.58e-10 ***
## Trabajos_Anteriores_esc 0.030055 0.009730 3.089 0.00205 **
## Equilibrio_Trabajo_Vida1 0.133014 0.041591 3.198 0.00141 **
## Satisfación_Laboral4 -0.061693 0.020648 -2.988 0.00286 **
## Antigüedad_esc -0.024318 0.009746 -2.495 0.01269 *
## Satisfación_Laboral1 0.054980 0.024023 2.289 0.02224 *
## Equilibrio_Trabajo_Vida3 -0.033325 0.019337 -1.723 0.08504 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.1189542)
##
## Null deviance: 198.79 on 1469 degrees of freedom
## Residual deviance: 173.79 on 1461 degrees of freedom
## AIC: 1053
##
## Number of Fisher Scoring iterations: 2
como podemos observar segun el metodo spetwise las variables significativas del modelo son :+ Horas_ExtraSi,+ Edad_esc, + Trabajos_Anteriores_esc,+ Equilibrio_Trabajo_Vida1,+ Satisfación_Laboral4, + Antigüedad_esc,+ Satisfación_Laboral1+ Equilibrio_Trabajo_Vida3
Teiendo en cuenta los resultados obtenidos en los procesos anteriores podemos llegar a las siguientes conclusiones:
para el atributo Satisfación_Laboral los niveles 1, 2 y 3 son significativos para el modeloy el valor del ODDs implica que si se encuentra en este rango tiene entre 1 y 0.61 veces de poder rotar
para el atributo Horas_ExtraSi es significativo para el modelo y el valor del ODDs implica que si se encuentra en este rango tiene entre 1.5 veces mayor probalidad de poder rotar
para el atributo Equilibrio_Trabajo_Vida1 es un poco significativo para el modelo y el valor del ODDs implica que si se encuentra en este rango tiene entre 0.86 veces mayor probalidad de poder rotar
para los casos de las varaibles numericas Edad_esc, Antigüedad_esc, Trabajos_Anteriores_esc son significativas tienendo valores de ODD de -0.56, -0.28 y 0.25 respectivantes
Para realizar la evaluacion del modelo realizaremos la Curso ROC y el auc para evaluar el rendimiento de modelos de clasificación preo primero realizaremos la prediccion del modelos de falsos y postivisos
#install.packages("caret")
#install.packages('caret', repos='http://cran.us.r-project.org')
library(vcd)
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
library(caret)
## Warning: package 'caret' was built under R version 4.3.3
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following object is masked from 'package:boot':
##
## melanoma
#calculamos la predicion
prediccion= predict.glm(modelo1, newdata = Data_Prueba, type = "response")
resp = table(Data_Prueba$Rotación_binaria, ifelse(prediccion >0.5, 1, 0), dnn = c("observaciones", "predicciones"))
resp
## predicciones
## observaciones 0 1
## 0 365 5
## 1 57 14
para enterder los resultados podemos darnos cuenta que el modelos calcula correctamente 379 e incorrectamente 62 es decir el modelo predice bien el 85.94% de las veces, ahora procederemos a calcular la curva roc para ver el rendimiento del modelo y el valro del AUC es de 77.5% lo cual indica una clasificacion exceletne
# Carga el paquete pROC
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(plotly)
# Calcula la curva ROC y el AUC
cURVA_ROC <- roc(Data_Prueba$Rotación_binaria, prediccion)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
auc_value<- round(auc(cURVA_ROC, levels =c(0,1), direction = "<"),4) # 0.9177
# Grafica la curva ROC
ggroc(cURVA_ROC, colour = "#FF7F00", size=1)+
ggtitle(paste0("Curva ROC ", "(AUC = ", auc_value, ")"))+
xlab("Especificidad")+
ylab("Sensibilidad")
#Calculo del AUC
auc_value
## [1] 0.775
Ahora procederemos a calcular los indices sy numeros del mdoelos sobre la data de pruerba
# Instalar y cargar el paquete caret si no está instalado
#if (!requireNamespace("caret", quietly = TRUE)) {
# install.packages("caret")
#}
library(caret)
# Obtener las predicciones del modelo en los datos de prueba
clases_predichas <- ifelse(prediccion > 0.5, 1, 0)
Data_Prueba$rotacion1<-as.numeric(Data_Prueba$Rotación=="Si")
# Crear la matriz de confusión
matriz_confusion <- confusionMatrix(table(clases_predichas, Data_Prueba$rotacion1))
# Mostrar la matriz de confusión y métricas de evaluación
print(matriz_confusion)
## Confusion Matrix and Statistics
##
##
## clases_predichas 0 1
## 0 365 57
## 1 5 14
##
## Accuracy : 0.8594
## 95% CI : (0.8234, 0.8905)
## No Information Rate : 0.839
## P-Value [Acc > NIR] : 0.1346
##
## Kappa : 0.2609
##
## Mcnemar's Test P-Value : 9.356e-11
##
## Sensitivity : 0.9865
## Specificity : 0.1972
## Pos Pred Value : 0.8649
## Neg Pred Value : 0.7368
## Prevalence : 0.8390
## Detection Rate : 0.8277
## Detection Prevalence : 0.9569
## Balanced Accuracy : 0.5918
##
## 'Positive' Class : 0
##
como podemos darnos cuenta el accuray es bastante alto 85% ademas que mas medidas de sensibilidad es alta con un 98%, anque el porcentaje de especificidad es bastante bajo solo del 19% pero consideramos que no es importante debido a que debemos hallar los casos positivos de rotacion osea los verdaderos positivos
teniendo en cuenta todo lo anterior ahora procederemos a realizar una posible estimacion de prediccion si un caso partiuclar rota y presentaremos una posible estrategia para motivar al empleado, primero realizaremos la prediccion solo ingresando los datos hipoteticos al modelo, pero solo colocaremos las variables que fueron consideradas como importantes pode le metodo stepwise
#varaibles significativas Horas_ExtraSi,+ Edad_esc, + Trabajos_Anteriores_esc,+ Equilibrio_Trabajo_Vida1,+ Satisfación_Laboral4, Antigüedad_esc,+ Satisfación_Laboral1+ Equilibrio_Trabajo_Vida3
#escalamos los datos
# Cargar la librería dplyr
library(dplyr)
# Supongamos que tu dataframe se llama df
# Filtrar los registros con edad igual a 26
df_filtrado <- Data_entrenamiento %>%
filter(Edad == 26)
# Agrupar por la columna de edad escalonada y contar los registros
resultado <- df_filtrado %>%
group_by(Edad_esc) %>%
summarize(Conteo = n())
# Añadir una columna estática que indique la edad
resultado$tipo <- "Edad"
resultado$Edad <- 26
# Convertir el resultado a un dataframe
resultado_df <- data.frame(resultado)
# Filtrar los registros con edad igual a 26
df_filtrado <- Data_entrenamiento %>%
filter(Trabajos_Anteriores == 3)
# Agrupar por la columna de edad escalonada y contar los registros
resultado1 <- df_filtrado %>%
group_by(Trabajos_Anteriores_esc) %>%
summarize(Conteo = n())
# Añadir una columna estática que indique la edad
resultado1$tipo <- "Trabajos_Anteriores"
resultado1$Trabajos_Anteriores <- 3
# Convertir el resultado a un dataframe
resultado_df1 <- data.frame(resultado1)
# Filtrar los registros con edad igual a 26
df_filtrado <- Data_entrenamiento %>%
filter(Antigüedad == 3)
# Agrupar por la columna de edad escalonada y contar los registros
resultado2 <- df_filtrado %>%
group_by(Antigüedad_esc) %>%
summarize(Conteo = n())
# Añadir una columna estática que indique la edad
resultado2$tipo <- "Antigüedad"
resultado2$Antigüedad <- 3
# Convertir el resultado a un dataframe
resultado_df2 <- data.frame(resultado2)
# Mostrar el resultado
#print(resultado_df)
#print(resultado_df1)
#print(resultado_df2)
#lista de entradas al modelos
lista<-list(Satisfación_Laboral1=0,
Satisfación_Laboral2=0,
Satisfación_Laboral3=1,
Satisfación_Laboral4=0,
Horas_ExtraSi=1,
Horas_ExtraNo=0,
Equilibrio_Trabajo_Vida1=1,
Equilibrio_Trabajo_Vida2=0,
Equilibrio_Trabajo_Vida3=0,
Equilibrio_Trabajo_Vida4=0,
Edad_esc=resultado_df$Edad_esc,
Antigüedad_esc=resultado_df1$Trabajos_Anteriores_esc,
Trabajos_Anteriores_esc=resultado_df2$Antigüedad_esc)
#predicciones de modelo
predict(modelo1,lista)
## 1
## 0.7696093
print(paste("Edad",resultado_df$Edad,"-",resultado_df$Edad_esc))
## [1] "Edad 26 - -1.195771008922"
print(paste("Antigüedad",resultado_df2$Antigüedad,"-",resultado_df2$Antigüedad_esc))
## [1] "Antigüedad 3 - -0.654231096028984"
print(paste("Trabajos_Anteriores",resultado_df1$Trabajos_Anteriores,"-",resultado_df1$Trabajos_Anteriores_esc))
## [1] "Trabajos_Anteriores 3 - 0.122818901109977"
para el caso anterior podemso observar un empleado el cual posee las siguientes caractertisticas: nivel de satisfaccion laboral 3, horas extra Si, equilibrio_trabajo_vida nivel 1, edad del empleado 26 años, antiguedad 3 y trabajos anteriroes 3, y podemos observar que para este caso hipotetico la probabilidad que exista rotacion es del 76.9%
Por otro lado como pudimos ver las variables consideradas importantes para el modelos segun el metodo Stepwise fueron Horas_ExtraSi,+ Edad_esc, + Trabajos_Anteriores_esc,+ Equilibrio_Trabajo_Vida1,+ Satisfación_Laboral4, Antigüedad_esc,+ Satisfación_Laboral1+ Equilibrio_Trabajo_Vida3, por lo cual las estrategias que se desarrollen deberan tener un especial enfasis en personas que puedan entrar a una o mas varaibles al mismo tiempo, estas estrategias seran visualizadas en el siguiente punto
Teniendo en cuenta todo el proceso llevado a cabo durante este informe y debido a que tenemos debidamente identificadas las variables que tienen mas peso para el proceso de rotacion de los empleados proponemos las siguientes acciones o estrategias
1.Horas_Extra : se deberia estudiar la posibilidad de realizar una disminucion de horas extras dentro de los diferentes cargos de la institucion, en caso de no poder realizar una disminucion en las horas extrar estudiar la posibilidad de tener otros tipos de compensaciones , que permitan que otras variables improtantes como Equilibrio_Trabajo_Vida mejoren para reducir la posibilidad de rotacion.
2.Equilibrio_Trabajo_Vida: se deben realizar procesos que permitan al colaborador una mejor distribucion del trabajo y vida personal, esto incluye flexibilidad de horarios , fomentar el uso de tiempo libre, Ofrecer políticas de licencia parental generosas, permisos de paternidad y maternidad, así como servicios de cuidado infantil o subsidios para ayudar a los empleados a equilibrar sus responsabilidades familiares con el trabajo, permitir un mejor manejo de la gestion de la carga laboral.
3. Antigüedad: mejorar el ambiente laboral y gratificante, este proceso se puede realizar por medio de una cultura organizacional solida, oprtunidades de crecimiento para los empleados y sus familias tanto a nivel profesional como personal, realizar reconocmientos periodicos a los mejores empleados y ofrecer bonos e incentivos por tiempo de antiguedad en la empresa, todo esto ayudaria que el empleado quiera estar un mayor tiempo con la institucion disminuyendo el porcentaje de rotacion.
4.Edad: se deben fortalecer estrategias que reten a los profesionales entre 26 y 36 años , y que les permita un crecicmiento personal ofreciendo temas tales como programas de desarrollo y crecimiento y capacitaciones en tecnologias y herramientas modernas.
5. Satisfación_Laboral: pensamos que de aplciarse las anteriores estrategias esta seria una de las variables que se veria afectada positivamente , esto debido a que debemso procurar que los empleados lleguen a un nivel 1 en la satisfaccion laboral y asi evitar una posibles rotacion