Informe de Modelos Lineales Generalizados

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

1. Contexto

Problema: Rotación de cargo

“Tomada de pixabay.com”
“Tomada de pixabay.com”

Enunciado

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.


2. Seleccion de Variables

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.

3.Analisis Únivariado

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:

  1. Satisfación_Laboral
  2. Horas_Extra
  3. Equilibrio_Trabajo_Vida
  4. Edad
  5. Trabajos_Anteriores
  6. Antigüedad

#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

4.Analisis bivariado

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:

  1. la variable satisfaccion_laboral nos permite visualizar que la gran mayoria de casos que rotaron estan entre los valores 1 y 3 con un total de 185 y solo 52 se fueron del nivel 4, lo caul indica que a mayor nivel de satisfaccion laborar menor es la cantidad de empleados que rotan. 2.dentro de la hora extra podemos observar que hay un patron esto debido a que si tenemos en cuenta que si tomamos unicamente los valores por cada columna podemos observar que aquellas personas que no tiene horas extas solamente el 10.4% tienen rotacion (Total de Registros 1054(944+110), resitros que rotaron 110) mientras que en para aquellas personas que tiene horas extras el porcentaje de rotacion es del 30.52% (Total de Registros 416(289+127), resitros que rotaron 127) , es decir que aquillas personas que tiene horas extra tiene 3 veces mas posibilidades de realizar rotacion de cargo. 3.como podemos observar en la variable equilibrio_trabajo_vida, es muy poco el porcentaje de personas que rotan en caso de estar en el nivel mas alto de satisfaccion, esto debido a que se tiene 237 (25+58+127+27) registros que rotarion y solo 27 se fueron en valor mas alto de equilibrio_trabajo_vida el 11.39% y si lo analizamos teniendo en cuenta la cantida de registros que hay por cada nivel el nivel 1 tiene un porcentaje de rotacion del 31.25% (formula%=(25*100)/(55+25)) mientras que los otros niveles tiene valroes de rotacion entre 10 y 14%

5.1 . comparacion con hipotesis

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

6.Estimacion Del Modelo

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

6.1. Analisis de la estimacion del modelos

Teiendo en cuenta los resultados obtenidos en los procesos anteriores podemos llegar a las siguientes conclusiones:

  1. las variables significativas del modelo segun el metodo Stepwise son :+ Horas_ExtraSi,+ Edad_esc, + Trabajos_Anteriores_esc,+ Equilibrio_Trabajo_Vida1,+ Satisfación_Laboral4,
  1. 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

  2. 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

  3. 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

  4. 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

7.Evaluacion

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

8.Predicciones

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

Conclusiones

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