Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
── R CMD build ─────────────────────────────────────────────────────────────────
checking for file ‘/tmp/Rtmp99nIsf/remotes30d69a620bc/dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION’ ... ✔ checking for file ‘/tmp/Rtmp99nIsf/remotes30d69a620bc/dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION’
─ preparing ‘paqueteMODELOS’:
checking DESCRIPTION meta-information ... ✔ checking DESCRIPTION meta-information
─ checking for LF line-endings in source and make files and shell scripts
─ checking for empty or unneeded directories
─ building ‘paqueteMODELOS_0.1.0.tar.gz’
Warning: invalid uid value replaced by that for user 'nobody'
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
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
Warning in fun(libname, pkgname): couldn't connect to display ":0"
system might not have X11 capabilities; in case of errors when using dfSummary(), set st_options(use.x11 = FALSE)
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.
A continuación se describen los pasos que la gerencia ha propuesto para el análisis:
Los datos son:
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, …
Se estima que una persona en la medida que tiene mayor antigüedad en
una empresa, se estima que hay una mayor satisfacción por lo tanto una
menor probabilidad de cambiar de trabajo.
Se realiza grafico de cada una de las variables con el fin de conocer como es su distribución.
datos <- (rotacion)
#str(datos)
library(ggplot2)
ggplot(datos,aes(Rotación))+geom_bar(aes(fill=factor(Rotación)))
ggplot(datos,aes(Edad))+geom_bar()
ggplot(datos,aes(`Viaje de Negocios`))+geom_bar(aes(fill=factor(`Viaje de Negocios`)))
ggplot(datos,aes(Departamento))+geom_bar(aes(fill=factor(Departamento)))
ggplot(datos,aes(Distancia_Casa))+geom_bar(aes(fill=factor(Distancia_Casa)))
ggplot(datos,aes(Educación))+geom_bar(aes(fill=factor(Educación)))
ggplot(datos,aes(Campo_Educación))+geom_bar(aes(fill=factor(Campo_Educación)))
ggplot(datos,aes(Satisfacción_Ambiental))+geom_bar(aes(fill=factor(Satisfacción_Ambiental)))
ggplot(datos,aes(Genero))+geom_bar(aes(fill=factor(Genero)))
ggplot(datos,aes(Cargo))+geom_bar(aes(fill=factor(Cargo)))
ggplot(datos,aes(Satisfación_Laboral))+geom_bar(aes(fill=factor(Satisfación_Laboral)))
ggplot(datos,aes(Estado_Civil))+geom_bar(aes(fill=factor(Estado_Civil)))
#ggplot(datos,aes(Ingreso_Mensual))+geom_bar(aes(fill=factor(Ingreso_Mensual)))
ggplot(datos, aes(x = Ingreso_Mensual)) +
geom_histogram(bins = 10, fill = "skyblue", color = "black") + # Especificar el número de bins
labs(x = "Ingreso Mensual", y = "Frecuencia", title = "Histograma")
ggplot(datos,aes(Trabajos_Anteriores))+geom_bar(aes(fill=factor(Trabajos_Anteriores)))
ggplot(datos,aes(Horas_Extra))+geom_bar(aes(fill=factor(Horas_Extra)))
ggplot(datos,aes(Porcentaje_aumento_salarial))+geom_bar(aes(fill=factor(Porcentaje_aumento_salarial)))
ggplot(datos,aes(Rendimiento_Laboral))+geom_bar(aes(fill=factor(Rendimiento_Laboral)))
ggplot(datos,aes(Años_Experiencia))+geom_bar(aes(fill=factor(Años_Experiencia)))
ggplot(datos,aes(Capacitaciones))+geom_bar(aes(fill=factor(Capacitaciones)))
ggplot(datos,aes(Equilibrio_Trabajo_Vida))+geom_bar(aes(fill=factor(Equilibrio_Trabajo_Vida)))
#ggplot(datos,aes(Antigüedad))+geom_bar(aes(fill=factor(Antigüedad)))
ggplot(datos, aes(x = Antigüedad)) +
geom_histogram(bins = 5, fill = "skyblue", color = "black") + # Especificar el número de bins
labs(x = "Antigüedad", y = "Frecuencia", title = "Histograma")
ggplot(datos,aes(Antigüedad_Cargo))+geom_bar(aes(fill=factor(Antigüedad_Cargo)))
ggplot(datos,aes(Años_ultima_promoción))+geom_bar(aes(fill=factor(Años_ultima_promoción)))
ggplot(datos,aes(Años_acargo_con_mismo_jefe))+geom_bar(aes(fill=factor(Años_acargo_con_mismo_jefe)))
#head(rotacion)
#install.packages("table1")
library(table1)
##
## Attaching package: 'table1'
## The following objects are masked from 'package:summarytools':
##
## label, label<-
## The following objects are masked from 'package:base':
##
## units, units<-
require(table1)
table1(~.,data=rotacion)
| Overall (N=1470) |
|
|---|---|
| Rotación | |
| No | 1233 (83.9%) |
| Si | 237 (16.1%) |
| Edad | |
| Mean (SD) | 36.9 (9.14) |
| Median [Min, Max] | 36.0 [18.0, 60.0] |
| Viaje de Negocios | |
| Frecuentemente | 277 (18.8%) |
| No_Viaja | 150 (10.2%) |
| Raramente | 1043 (71.0%) |
| Departamento | |
| IyD | 961 (65.4%) |
| RH | 63 (4.3%) |
| Ventas | 446 (30.3%) |
| Distancia_Casa | |
| Mean (SD) | 9.19 (8.11) |
| Median [Min, Max] | 7.00 [1.00, 29.0] |
| Educación | |
| Mean (SD) | 2.91 (1.02) |
| Median [Min, Max] | 3.00 [1.00, 5.00] |
| Campo_Educación | |
| Ciencias | 606 (41.2%) |
| Humanidades | 27 (1.8%) |
| Mercadeo | 159 (10.8%) |
| Otra | 82 (5.6%) |
| Salud | 464 (31.6%) |
| Tecnicos | 132 (9.0%) |
| Satisfacción_Ambiental | |
| Mean (SD) | 2.72 (1.09) |
| Median [Min, Max] | 3.00 [1.00, 4.00] |
| Genero | |
| F | 588 (40.0%) |
| M | 882 (60.0%) |
| Cargo | |
| Director_Investigación | 80 (5.4%) |
| Director_Manofactura | 145 (9.9%) |
| Ejecutivo_Ventas | 326 (22.2%) |
| Gerente | 102 (6.9%) |
| Investigador_Cientifico | 292 (19.9%) |
| Recursos_Humanos | 52 (3.5%) |
| Representante_Salud | 131 (8.9%) |
| Representante_Ventas | 83 (5.6%) |
| Tecnico_Laboratorio | 259 (17.6%) |
| Satisfación_Laboral | |
| Mean (SD) | 2.73 (1.10) |
| Median [Min, Max] | 3.00 [1.00, 4.00] |
| Estado_Civil | |
| Casado | 673 (45.8%) |
| Divorciado | 327 (22.2%) |
| Soltero | 470 (32.0%) |
| Ingreso_Mensual | |
| Mean (SD) | 6500 (4710) |
| Median [Min, Max] | 4920 [1010, 20000] |
| Trabajos_Anteriores | |
| Mean (SD) | 2.69 (2.50) |
| Median [Min, Max] | 2.00 [0, 9.00] |
| Horas_Extra | |
| No | 1054 (71.7%) |
| Si | 416 (28.3%) |
| Porcentaje_aumento_salarial | |
| Mean (SD) | 15.2 (3.66) |
| Median [Min, Max] | 14.0 [11.0, 25.0] |
| Rendimiento_Laboral | |
| Mean (SD) | 3.15 (0.361) |
| Median [Min, Max] | 3.00 [3.00, 4.00] |
| Años_Experiencia | |
| Mean (SD) | 11.3 (7.78) |
| Median [Min, Max] | 10.0 [0, 40.0] |
| Capacitaciones | |
| Mean (SD) | 2.80 (1.29) |
| Median [Min, Max] | 3.00 [0, 6.00] |
| Equilibrio_Trabajo_Vida | |
| Mean (SD) | 2.76 (0.706) |
| Median [Min, Max] | 3.00 [1.00, 4.00] |
| Antigüedad | |
| Mean (SD) | 7.01 (6.13) |
| Median [Min, Max] | 5.00 [0, 40.0] |
| Antigüedad_Cargo | |
| Mean (SD) | 4.23 (3.62) |
| Median [Min, Max] | 3.00 [0, 18.0] |
| Años_ultima_promoción | |
| Mean (SD) | 2.19 (3.22) |
| Median [Min, Max] | 1.00 [0, 15.0] |
| Años_acargo_con_mismo_jefe | |
| Mean (SD) | 4.12 (3.57) |
| Median [Min, Max] | 3.00 [0, 17.0] |
Se hace verificación de los datos y se puede confirmar que no hay registros nulos.
# Para encontrar valores vacíos en todo el conjunto de datos
#install.packages("mice")
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
head(datos)
## # A tibble: 6 × 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
## # ℹ 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>
md.pattern(datos,rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## Rotación Edad Viaje de Negocios Departamento Distancia_Casa Educación
## 1470 1 1 1 1 1 1
## 0 0 0 0 0 0
## Campo_Educación Satisfacción_Ambiental Genero Cargo Satisfación_Laboral
## 1470 1 1 1 1 1
## 0 0 0 0 0
## Estado_Civil Ingreso_Mensual Trabajos_Anteriores Horas_Extra
## 1470 1 1 1 1
## 0 0 0 0
## Porcentaje_aumento_salarial Rendimiento_Laboral Años_Experiencia
## 1470 1 1 1
## 0 0 0
## Capacitaciones Equilibrio_Trabajo_Vida Antigüedad Antigüedad_Cargo
## 1470 1 1 1 1
## 0 0 0 0
## Años_ultima_promoción Años_acargo_con_mismo_jefe
## 1470 1 1 0
## 0 0 0
#install.packages("pROC")
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
Se hace evaluacion del valor p de la prueba Chi-cuadrado entre las variables vs la rotación para identificar las que mayor posibilidad tienen de incidencia en la rotación.
De las variables escogedas se hace analisis de cada una de ellas:
Se identifica que en valor de p es inferior a 5% por lo tanto habría correpondencia entre la rotación y el viaje de negocio.
a=table(datos$`Viaje de Negocios`,datos$Rotación)
summary(a)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 24.182, df = 2, p-value = 5.609e-06
prop.table(a,1)
##
## No Si
## Frecuentemente 0.7509025 0.2490975
## No_Viaja 0.9200000 0.0800000
## Raramente 0.8504314 0.1495686
# Graficar usando ggplot2
ggplot(datos, aes(x = `Viaje de Negocios`, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "Viaje de Negocios", y = "Rotación", title = "Análisis Bivariado: Viajes de negocio vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Igualmente se puede concluir que hay correspondencia entre el estado civil y la rotación, al tener un valor de p inferior a 5%.
b=table(datos$Estado_Civil,datos$Rotación)
summary(b)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 46.16, df = 2, p-value = 9.456e-11
prop.table(b,1)
##
## No Si
## Casado 0.8751857 0.1248143
## Divorciado 0.8990826 0.1009174
## Soltero 0.7446809 0.2553191
# Graficar usando ggplot2
ggplot(datos, aes(x = Estado_Civil, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "Estado Civil", y = "Rotación", title = "Análisis Bivariado: Estado Civil vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Igualmente se puede concluir que hay correspondencia entre las horas extras y la rotación, al tener un valor de p inferior a 5%.
c=table(datos$Horas_Extra,datos$Rotación)
summary(c)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 89.04, df = 1, p-value = 3.862e-21
prop.table(c,1)
##
## No Si
## No 0.8956357 0.1043643
## Si 0.6947115 0.3052885
# Graficar usando ggplot2
ggplot(datos, aes(x = Horas_Extra, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "Horas Extra", y = "Rotación", title = "Análisis Bivariado: Horas Extra vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Igualmente se puede concluir que hay correspondencia entre la edad y la rotación, al tener un valor de p inferior a 5%.
d=table(datos$Edad ,datos$Rotación)
summary(d)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 119.41, df = 42, p-value = 2.38e-09
## Chi-squared approximation may be incorrect
prop.table(d,1)
##
## No Si
## 18 0.50000000 0.50000000
## 19 0.33333333 0.66666667
## 20 0.45454545 0.54545455
## 21 0.53846154 0.46153846
## 22 0.68750000 0.31250000
## 23 0.71428571 0.28571429
## 24 0.73076923 0.26923077
## 25 0.76923077 0.23076923
## 26 0.69230769 0.30769231
## 27 0.93750000 0.06250000
## 28 0.70833333 0.29166667
## 29 0.73529412 0.26470588
## 30 0.85000000 0.15000000
## 31 0.73913043 0.26086957
## 32 0.81967213 0.18032787
## 33 0.79310345 0.20689655
## 34 0.88311688 0.11688312
## 35 0.87179487 0.12820513
## 36 0.91304348 0.08695652
## 37 0.88000000 0.12000000
## 38 0.96551724 0.03448276
## 39 0.85714286 0.14285714
## 40 0.91228070 0.08771930
## 41 0.85000000 0.15000000
## 42 0.95652174 0.04347826
## 43 0.93750000 0.06250000
## 44 0.81250000 0.18750000
## 45 0.95238095 0.04761905
## 46 0.87878788 0.12121212
## 47 0.87500000 0.12500000
## 48 0.89473684 0.10526316
## 49 0.91666667 0.08333333
## 50 0.83333333 0.16666667
## 51 0.89473684 0.10526316
## 52 0.83333333 0.16666667
## 53 0.89473684 0.10526316
## 54 1.00000000 0.00000000
## 55 0.86363636 0.13636364
## 56 0.78571429 0.21428571
## 57 1.00000000 0.00000000
## 58 0.64285714 0.35714286
## 59 1.00000000 0.00000000
## 60 1.00000000 0.00000000
d1=roc(datos$Rotación ~ datos$Edad)
## Setting levels: control = No, case = Si
## Setting direction: controls > cases
d1
##
## Call:
## roc.formula(formula = datos$Rotación ~ datos$Edad)
##
## Data: datos$Edad in 1233 controls (datos$Rotación No) > 237 cases (datos$Rotación Si).
## Area under the curve: 0.6343
ci.auc(d1)
## 95% CI: 0.5931-0.6756 (DeLong)
plot(d1)
# Graficar usando ggplot2
ggplot(datos, aes(x = Edad, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "Edad", y = "Rotación", title = "Análisis Bivariado: Edad vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Igualmente se puede concluir que hay correspondencia entre las satisfacción ambiental y la rotación, al tener un valor de p inferior a 5%.
e=table(datos$Satisfacción_Ambiental,datos$Rotación)
summary(e)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 22.504, df = 3, p-value = 5.123e-05
prop.table(e,1)
##
## No Si
## 1 0.7464789 0.2535211
## 2 0.8501742 0.1498258
## 3 0.8631347 0.1368653
## 4 0.8654709 0.1345291
e1=roc(datos$Rotación ~ datos$Satisfacción_Ambiental)
## Setting levels: control = No, case = Si
## Setting direction: controls < cases
e1
##
## Call:
## roc.formula(formula = datos$Rotación ~ datos$Satisfacción_Ambiental)
##
## Data: datos$Satisfacción_Ambiental in 1233 controls (datos$Rotación No) < 237 cases (datos$Rotación Si).
## Area under the curve: 0.427
ci.auc(e1)
## 95% CI: 0.3869-0.4672 (DeLong)
plot(e1)
# Graficar usando ggplot2
ggplot(datos, aes(x = Satisfacción_Ambiental, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "SAtisfacción Ambiental", y = "Rotación", title = "Análisis Bivariado: Satisfacción Ambiental vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Igualmente se puede concluir que hay correspondencia entre la antigüedad y la rotación, al tener un valor de p inferior a 5%.
f=table(datos$Antigüedad,datos$Rotación)
summary(f)
## Number of cases in table: 1470
## Number of factors: 2
## Test for independence of all factors:
## Chisq = 95.39, df = 36, p-value = 2.843e-07
## Chi-squared approximation may be incorrect
prop.table(f,1)
##
## No Si
## 0 0.63636364 0.36363636
## 1 0.65497076 0.34502924
## 2 0.78740157 0.21259843
## 3 0.84375000 0.15625000
## 4 0.82727273 0.17272727
## 5 0.89285714 0.10714286
## 6 0.88157895 0.11842105
## 7 0.87777778 0.12222222
## 8 0.88750000 0.11250000
## 9 0.90243902 0.09756098
## 10 0.85000000 0.15000000
## 11 0.93750000 0.06250000
## 12 1.00000000 0.00000000
## 13 0.91666667 0.08333333
## 14 0.88888889 0.11111111
## 15 0.95000000 0.05000000
## 16 0.91666667 0.08333333
## 17 0.88888889 0.11111111
## 18 0.92307692 0.07692308
## 19 0.90909091 0.09090909
## 20 0.96296296 0.03703704
## 21 0.92857143 0.07142857
## 22 0.93333333 0.06666667
## 23 0.50000000 0.50000000
## 24 0.83333333 0.16666667
## 25 1.00000000 0.00000000
## 26 1.00000000 0.00000000
## 27 1.00000000 0.00000000
## 29 1.00000000 0.00000000
## 30 1.00000000 0.00000000
## 31 0.66666667 0.33333333
## 32 0.66666667 0.33333333
## 33 0.80000000 0.20000000
## 34 1.00000000 0.00000000
## 36 1.00000000 0.00000000
## 37 1.00000000 0.00000000
## 40 0.00000000 1.00000000
f1=roc(datos$Rotación ~ datos$Satisfacción_Ambiental)
## Setting levels: control = No, case = Si
## Setting direction: controls < cases
f1
##
## Call:
## roc.formula(formula = datos$Rotación ~ datos$Satisfacción_Ambiental)
##
## Data: datos$Satisfacción_Ambiental in 1233 controls (datos$Rotación No) < 237 cases (datos$Rotación Si).
## Area under the curve: 0.427
ci.auc(f1)
## 95% CI: 0.3869-0.4672 (DeLong)
plot(f1)
# Graficar usando ggplot2
ggplot(datos, aes(x = Antigüedad, fill = Rotación)) +
geom_bar(position = "fill") +
labs(x = "Antigüedad", y = "Rotación", title = "Análisis Bivariado: Antigüedad vs Respuesta Binaria") +
scale_fill_manual(values = c("Si" = "blue", "No" = "red")) # Personalizar colores
Realiza la estimación de un modelo de regresión logístico en el cual la variable respuesta es rotacion (y=1 es si rotación, y=0 es no rotación) y las covariables las 6 seleccionadas en el punto 1. Interprete los coeficientes del modelo y la significancia de los parámetros.
# Encontrar los valores únicos del campo "campo1"
#valores_unicos <- unique(datos$Rotación)
# Mostrar los valores únicos
#print(valores_unicos)
Se hace la calculo de la regresión logist,con las 6 variables seleccionadas, en el caso de la variable dependiente (Rotación), se convierte el “Si” por 1 y el “No” por un 0.
# Usar ifelse para cambiar los valores
datos$Rotación <- ifelse(datos$Rotación == "Si", 1, 0)
# Seleccionar solo los primeros 5 campos
datos_subset <- subset(datos, select = c(Rotación,`Viaje de Negocios`,Estado_Civil,Horas_Extra,Edad ,Satisfacción_Ambiental,Antigüedad))
# Mostrar el resultado
print(datos_subset)
## # A tibble: 1,470 × 7
## Rotación `Viaje de Negocios` Estado_Civil Horas_Extra Edad
## <dbl> <chr> <chr> <chr> <dbl>
## 1 1 Raramente Soltero Si 41
## 2 0 Frecuentemente Casado No 49
## 3 1 Raramente Soltero Si 37
## 4 0 Frecuentemente Casado Si 33
## 5 0 Raramente Casado No 27
## 6 0 Frecuentemente Soltero No 32
## 7 0 Raramente Casado Si 59
## 8 0 Raramente Divorciado No 30
## 9 0 Frecuentemente Soltero No 38
## 10 0 Raramente Casado No 36
## # ℹ 1,460 more rows
## # ℹ 2 more variables: Satisfacción_Ambiental <dbl>, Antigüedad <dbl>
# Obtener un resumen de los valores de "campo1"
resumen_valores <- table(datos_subset$Rotación)
# Mostrar el resumen
print(resumen_valores)
##
## 0 1
## 1233 237
Se debe validan las variables y se evidencian que son significantes para la regresion logits, en el caso del estado civil hay mayor significancia cuando la persona es soltera, que cuando es Divorciada.
#modelo_logit <- glm(Rotación ~ Edad , data = datos_subset, family = "binomial")
modelo_logit <- glm(Rotación ~ `Viaje de Negocios`+ Estado_Civil + Horas_Extra + Satisfacción_Ambiental + Edad + Antigüedad, data = datos_subset, family = "binomial")
summary(modelo_logit)
##
## Call:
## glm(formula = Rotación ~ `Viaje de Negocios` + Estado_Civil +
## Horas_Extra + Satisfacción_Ambiental + Edad + Antigüedad,
## family = "binomial", data = datos_subset)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.790691 0.420476 1.880 0.060044 .
## `Viaje de Negocios`No_Viaja -1.378135 0.357943 -3.850 0.000118 ***
## `Viaje de Negocios`Raramente -0.659624 0.182160 -3.621 0.000293 ***
## Estado_CivilDivorciado -0.234413 0.229554 -1.021 0.307176
## Estado_CivilSoltero 0.848908 0.172368 4.925 8.44e-07 ***
## Horas_ExtraSi 1.523659 0.160336 9.503 < 2e-16 ***
## Satisfacción_Ambiental -0.341623 0.071347 -4.788 1.68e-06 ***
## Edad -0.041610 0.009406 -4.424 9.70e-06 ***
## Antigüedad -0.058887 0.017074 -3.449 0.000563 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1298.6 on 1469 degrees of freedom
## Residual deviance: 1077.8 on 1461 degrees of freedom
## AIC: 1095.8
##
## Number of Fisher Scoring iterations: 5
Se hace matriz para evaluar el modelo y el resultado es que (1260/1470) 85,7% coinciden entre la predicción y lo observado por lo tanto el modelo tiene un gran nivel de certeza.
predict1 = predict.glm(modelo_logit, newdata = datos_subset, type ="response")
ypred = ifelse(predict1 > 0.4, 1,0)
yobs = datos$Rotación
matrizc = table(yobs, ypred, dnn = c("observaciones", "predicciones"))
matrizc
## predicciones
## observaciones 0 1
## 0 1186 47
## 1 163 74
cat("R2 = ", sum(diag(matrizc)) / sum(matrizc))
## R2 = 0.8571429
boxplot(predict1)
install.packages("ROCR")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
library(ROCR)
pred = ROCR::prediction(predict1, datos$Rotación)
perf = performance(pred, "tpr", "fpr")
plot(perf)
abline(a=0, b=1, col="red")
grid()
ACLog1 = performance(pred, measure = "auc")@y.values[[1]]
cat("AUC = ", ACLog1,"n")
## AUC = 0.7809073 n
estimacion=(predict(modelo_logit,list(`Viaje de Negocios` ="Frecuentemente",Estado_Civil="Casado",Horas_Extra="No", Edad = 36, Satisfacción_Ambiental= 2,Antigüedad=6),type = "response"))*100
cat("Tasa Rotación: ", estimacion,"%")
## Tasa Rotación: 14.8826 %
La probabilidad de rotación de un empleado con las caracteristicas mencionadas es aproximadamente del 14,88 %. Cuando el estimado arroje una probabilidad del 50% se puede considerar una intervención para evitar que el empleado considere cambiar de empleo.
De acuerdo al analisis realizado a las variables seleccionadas se puede considerar:
Identificar aquellos empleados que siendo casados y tienen una mayor frecuencia de viajes, buscar alternativas para reducir la cantidad de viajes y validar cual de ellos puede ser cambiados por reuniones virtuales.
Los empleadors que son solteros, crear estrategias que hagan que la empresa sea atractiva de acuerdo a los intereses que se identifiquen.
Con respecto a las horas extras identificar que empleados tienen una mayor catidad y buscar alternativas para que sean tomadas por otros que tienen menos hora y estimar si la cantidad de horas extras justifica la contrataccion de otras personas.
Evaluar la satisfacción ambiental e identificar cuales son las causales que hacen que la evaluación sea baja, para eleborar un plan de acción para mejorar el ambiente ambiental.
Acercar a los jovenes e identificar sus intereses para reducir la posibilidad de rotación.