# Cargar los datos
data("rotacion")
# Visión general de los datos
head(rotacion)
Iniciaremos el analisis con una revision de los datos y limpieza de los mismos.
dim(rotacion)
## [1] 1470 24
Contamos con 1470 filas y 24 variables o columnas.
colSums(is.na(rotacion)) %>% as.data.frame()
No existen valores nulos
Para iniciar el analisis de las variables, primero conocemos sus tipos.
str(rotacion)
## tibble [1,470 × 24] (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 ...
## $ Viaje de Negocios : chr [1:1470] "Raramente" "Frecuentemente" "Raramente" "Frecuentemente" ...
## $ Departamento : chr [1:1470] "Ventas" "IyD" "IyD" "IyD" ...
## $ Distancia_Casa : num [1:1470] 1 8 2 3 2 2 3 24 23 27 ...
## $ Educación : num [1:1470] 2 1 2 4 1 2 3 1 3 3 ...
## $ Campo_Educación : chr [1:1470] "Ciencias" "Ciencias" "Otra" "Ciencias" ...
## $ Satisfacción_Ambiental : num [1:1470] 2 3 4 4 1 4 3 4 4 3 ...
## $ Genero : chr [1:1470] "F" "M" "M" "F" ...
## $ Cargo : chr [1:1470] "Ejecutivo_Ventas" "Investigador_Cientifico" "Tecnico_Laboratorio" "Investigador_Cientifico" ...
## $ Satisfación_Laboral : num [1:1470] 4 2 3 3 2 4 1 3 3 3 ...
## $ Estado_Civil : chr [1:1470] "Soltero" "Casado" "Soltero" "Casado" ...
## $ 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 ...
## $ Horas_Extra : chr [1:1470] "Si" "No" "Si" "Si" ...
## $ Porcentaje_aumento_salarial: num [1:1470] 11 23 15 11 12 13 20 22 21 13 ...
## $ Rendimiento_Laboral : num [1:1470] 3 4 3 3 3 3 4 4 4 3 ...
## $ 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 ...
## $ Equilibrio_Trabajo_Vida : num [1:1470] 1 3 3 3 3 2 2 3 3 2 ...
## $ 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 ...
Seleccione 3 variables categóricas (distintas de rotación) y 3 variables cuantitativas, que se consideren estén relacionadas con la rotación.
Nota: Debes justificar porque estas variables están relacionadas y que tipo de relación se espera entre ellas (Hipótesis).
1. Genero
Segun información de la OIT, existe una brecha entre los salarios de hombre y mujeres, de igual forma los hombres tienden a ganar más dinero desarrollando los mismos trabajos que las mujeres, es importante analizar si esta tendencia pueda verse reflejada en una mayor rotacion de los hombres por la facilidad de conseguir nuevos empleos.
2. Estado civil
Se espera que las personas en estado civil casado, pueden tener tendencia a la conservación y busqueda de una mayor estabilidad laboral, por las responsabilidades adquiridas y porque es más probable que tengan hijos. Las persona solteras pueden tener un grado de responsabilidad menor y facilidad para asumir riesgos en los cambios de empleos.
3. Horas extras
Las personas que realizan horas extras pueden presentar un agotamiento mayor, sin embargo, se debe analizar la remuneracion de las mismas, ya que en ocasiones esto le puede representar a las personas incluso un incentivo economico muy atractivo, siempre y cuando no sea muy continuo.
1. Edad.
Es valido pensar que las personas más jovenes tienden a tener una mayor rotación, principalmente porque sus salarios pueden ser más bajos y tambien tienen mayores posibilidades de conseguir nuevas oportunidades laborales.
2. Ingreso mensual.
Consideramos la hipotesis de que las personas con mejores remuneraciones tienden a rotar menos, una persona que reciba una compensacion justa por el trabajo que realiza, probablemente no busque cambiar de empleo constantemente.
3. Años de experiencia
Finalmente es valido pensar que las personas con una mayor experiencia roten menos, puede ser que logren una mejor a adaptación a la cultura organizacional y encontraron un balance en sus vidas.
Realiza un análisis univariado (caracterización) de la información contenida en la base de datos rotacion.
Nuestra base de datos cuenta con una mayoria de hombres (882) y mujeres (588).
library(plotly)
summarytools::freq(rotacion$Genero)
## Frequencies
## rotacion$Genero
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## F 588 40.00 40.00 40.00 40.00
## M 882 60.00 100.00 60.00 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
# Calcular las frecuencias y los porcentajes
frecuencia_genero <- table(rotacion$Genero)
porcentajes <- prop.table(frecuencia_genero) * 100
# Crear el gráfico de torta con plotly
fig <- plot_ly(
labels = names(porcentajes), # Etiquetas de cada sección
values = porcentajes, # Valores porcentuales
type = "pie", # Tipo de gráfico
textinfo = 'label+percent', # Información mostrada en el gráfico
hoverinfo = 'text', # Información mostrada al pasar el mouse
text = paste(names(porcentajes), ": ", format(porcentajes, digits = 2), "%") # Texto personalizado al pasar el mouse
)
# Personalizar el título del gráfico
fig <- fig %>% layout(title = "Distribución por Género")
# Mostrar el gráfico
fig
La base de datos cuenta con una mayoria de personas casadas (673) que representan el 45.78%, seguido de personas solteras (470) representando el 31.97% y finalmente los divorciados son (327) representando el 22.24%.
library(plotly)
summarytools::freq(rotacion$Estado_Civil)
## Frequencies
## rotacion$Estado_Civil
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ---------------- ------ --------- -------------- --------- --------------
## Casado 673 45.78 45.78 45.78 45.78
## Divorciado 327 22.24 68.03 22.24 68.03
## Soltero 470 31.97 100.00 31.97 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
# Calcular las frecuencias y los porcentajes
frecuencia_ecivil <- table(rotacion$Estado_Civil)
porcentajes2 <- prop.table(frecuencia_ecivil) * 100
# Crear el gráfico de torta con plotly
fig <- plot_ly(
labels = names(porcentajes2), # Etiquetas de cada sección
values = porcentajes2, # Valores porcentuales
type = "pie", # Tipo de gráfico
textinfo = 'label+percent', # Información mostrada en el gráfico
hoverinfo = 'text', # Información mostrada al pasar el mouse
text = paste(names(porcentajes2), ": ", format(porcentajes2, digits = 2), "%") # Texto personalizado al pasar el mouse
)
# Personalizar el título del gráfico
fig <- fig %>% layout(title = "Distribución por Estado Civil")
# Mostrar el gráfico
fig
En la base de datos encontramos que 1054 personas, es decir, el 71.7% no realizan horas extras, mientras que 416 o el 28.3% si las realizan.
library(plotly)
summarytools::freq(rotacion$Horas_Extra)
## Frequencies
## rotacion$Horas_Extra
## Type: Character
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
## No 1054 71.70 71.70 71.70 71.70
## Si 416 28.30 100.00 28.30 100.00
## <NA> 0 0.00 100.00
## Total 1470 100.00 100.00 100.00 100.00
# Calcular las frecuencias y los porcentajes
frecuencia_hextra <- table(rotacion$Horas_Extra)
porcentajes3 <- prop.table(frecuencia_hextra) * 100
# Crear el gráfico de torta con plotly
fig <- plot_ly(
labels = names(porcentajes3), # Etiquetas de cada sección
values = porcentajes3, # Valores porcentuales
type = "pie", # Tipo de gráfico
textinfo = 'label+percent', # Información mostrada en el gráfico
hoverinfo = 'text', # Información mostrada al pasar el mouse
text = paste(names(porcentajes3), ": ", format(porcentajes3, digits = 2), "%") # Texto personalizado al pasar el mouse
)
# Personalizar el título del gráfico
fig <- fig %>% layout(title = "Distribución por Horas Extra")
# Mostrar el gráfico
fig
Explorando la base de datos completa, encontramos que la edad media es de 36.9 años, un minimo de 18 años y la persona de mayor edad tiene 60 años.
# Descripción estadística de Edad
descr_edad <- descr(rotacion$Edad)
print(descr_edad)
## Descriptive Statistics
## rotacion$Edad
## N: 1470
##
## Edad
## ----------------- ---------
## Mean 36.92
## Std.Dev 9.14
## Min 18.00
## Q1 30.00
## Median 36.00
## Q3 43.00
## Max 60.00
## MAD 8.90
## IQR 13.00
## CV 0.25
## Skewness 0.41
## SE.Skewness 0.06
## Kurtosis -0.41
## N.Valid 1470.00
## Pct.Valid 100.00
# Histograma de Edad
hist_edad <- plot_ly(data = rotacion, x = ~Edad, type = 'histogram', name = 'Edad') %>%
layout(title = "Histograma de Edad", xaxis = list(title = "Edad"), yaxis = list(title = "Frecuencia"))
# Boxplot de Edad
box_edad <- plot_ly(data = rotacion, y = ~Edad, type = 'box', name = 'Edad') %>%
layout(title = "Boxplot de Edad", yaxis = list(title = "Edad"))
# Mostrar gráficos
subplot(hist_edad, box_edad, nrows = 1, titleX = TRUE, titleY = TRUE) %>%
layout(title = "Análisis de la Variable Edad")
En la base de datos general encontramos con respecto a los ingresos mensuales que la media es de $6.502, el minimo se ubica en $1.009 y el ingreso más alto es de $19.999.
# Descripción estadística de Ingreso_Mensual
descr_ingreso <- descr(rotacion$Ingreso_Mensual)
print(descr_ingreso)
## Descriptive Statistics
## rotacion$Ingreso_Mensual
## N: 1470
##
## Ingreso_Mensual
## ----------------- -----------------
## Mean 6502.93
## Std.Dev 4707.96
## Min 1009.00
## Q1 2911.00
## Median 4919.00
## Q3 8380.00
## Max 19999.00
## MAD 3260.24
## IQR 5468.00
## CV 0.72
## Skewness 1.37
## SE.Skewness 0.06
## Kurtosis 0.99
## N.Valid 1470.00
## Pct.Valid 100.00
# Histograma de Ingreso_Mensual
hist_ingreso <- plot_ly(data = rotacion, x = ~Ingreso_Mensual, type = 'histogram', name = 'Ingreso Mensual') %>%
layout(title = "Histograma de Ingreso Mensual", xaxis = list(title = "Ingreso Mensual"), yaxis = list(title = "Frecuencia"))
# Boxplot de Ingreso_Mensual
box_ingreso <- plot_ly(data = rotacion, y = ~Ingreso_Mensual, type = 'box', name = 'Ingreso Mensual') %>%
layout(title = "Boxplot de Ingreso Mensual", yaxis = list(title = "Ingreso Mensual"))
# Mostrar gráficos
subplot(hist_ingreso, box_ingreso, nrows = 1, titleX = TRUE, titleY = TRUE) %>%
layout(title = "Análisis de la Variable Ingreso Mensual")
En la compañia se encuentra una media de años de experiencia de 11.2 años y un maximo de 40 años de experiencia.
# Descripción estadística de Años_Experiencia
descr_experiencia <- descr(rotacion$Años_Experiencia)
print(descr_experiencia)
## Descriptive Statistics
## rotacion$Años_Experiencia
## N: 1470
##
## Años_Experiencia
## ----------------- ------------------
## Mean 11.28
## Std.Dev 7.78
## Min 0.00
## Q1 6.00
## Median 10.00
## Q3 15.00
## Max 40.00
## MAD 5.93
## IQR 9.00
## CV 0.69
## Skewness 1.11
## SE.Skewness 0.06
## Kurtosis 0.91
## N.Valid 1470.00
## Pct.Valid 100.00
# Histograma de Años_Experiencia
hist_experiencia <- plot_ly(data = rotacion, x = ~Años_Experiencia, type = 'histogram', name = 'Años de Experiencia') %>%
layout(title = "Histograma de Años de Experiencia", xaxis = list(title = "Años de Experiencia"), yaxis = list(title = "Frecuencia"))
# Boxplot de Años_Experiencia
box_experiencia <- plot_ly(data = rotacion, y = ~Años_Experiencia, type = 'box', name = 'Años de Experiencia') %>%
layout(title = "Boxplot de Años de Experiencia", yaxis = list(title = "Años de Experiencia"))
# Mostrar gráficos
subplot(hist_experiencia, box_experiencia, nrows = 1, titleX = TRUE, titleY = TRUE) %>%
layout(title = "Análisis de la Variable Años de Experiencia")
Realiza un análisis de bivariado en donde la variable respuesta sea rotacion codificada de la siguiente manera (y=1 es si rotación, y=0 es no rotación). Con base en estos resultados identifique cuales son las variables determinantes de la rotación e interpretar el signo del coeficiente estimado. Compare estos resultados con la hipotesis planteada en el punto 2.
Para la variable “Genero”, el p-valor es mayor a 0.0 esto indica que no existe una asociación significativa entre el género y la rotación de empleados. En otras palabras, el género no parece influir significativamente en la rotación de empleados.
Para las variables “Horas_Extra” y “Estado_Civil”, el p-valor es mucho menor que 0.05, esto significa que hay una asociación estadísticamente significativa entre Hora_Extra y Estado_Civil con la rotación de empleados. Es probable que los empleados que realizan horas extra tengan una tendencia diferente en la rotación comparado con aquellos que no las realizan. De igual forma ocurre con el estado civil indicando diferencias en la rotación según si los empleados están casados, solteros, etc.
# Convertir la lista en un dataframe
chi_results_df <- bind_rows(chi_results_list)
# Mostrar el dataframe con los resultados
print(chi_results_df)
## Variable p_value statistic expected.F expected.M expected.No
## 1 Genero 2.905724e-01 1.116967 493.2 739.8 NA
## 2 Genero 2.905724e-01 1.116967 94.8 142.2 NA
## 3 Horas_Extra 8.158424e-21 87.564294 NA NA 884.0694
## 4 Horas_Extra 8.158424e-21 87.564294 NA NA 169.9306
## 5 Estado_Civil 9.455511e-11 46.163677 NA NA NA
## 6 Estado_Civil 9.455511e-11 46.163677 NA NA NA
## expected.Si expected.Casado expected.Divorciado expected.Soltero
## 1 NA NA NA NA
## 2 NA NA NA NA
## 3 348.93061 NA NA NA
## 4 67.06939 NA NA NA
## 5 NA 564.4959 274.27959 394.22449
## 6 NA 108.5041 52.72041 75.77551
Se evidencia una pequeña diferencia en el genero, donde los hombre tienden a tener una mayor rotacion que las mujeres, en este caso los hombres presentan un 17% de la rotacion y las mujeres un 15%, sin embargo no es muy fuerte.
library(plotly)
library(dplyr)
# Codificar la variable de rotación
rotacion$Rotacion_bin <- ifelse(rotacion$Rotación == "Si", 1, 0)
# Crear tabla de contingencia para la variable "Genero"
tabla_genero <- table(rotacion$Rotacion_bin, rotacion$Genero)
# Calcular porcentajes
total_genero <- colSums(tabla_genero)
porcentaje_no_rotacion <- round((tabla_genero[1, ] / total_genero) * 100, 1)
porcentaje_rotacion <- round((tabla_genero[2, ] / total_genero) * 100, 1)
# Crear etiquetas combinadas (frecuencia + porcentaje)
etiquetas_no_rotacion <- paste0(tabla_genero[1, ], " (", porcentaje_no_rotacion, "%)")
etiquetas_rotacion <- paste0(tabla_genero[2, ], " (", porcentaje_rotacion, "%)")
# Gráfico de barras apiladas para "Género" con etiquetas de frecuencia y porcentaje
bar_genero <- plot_ly(
x = colnames(tabla_genero), # Etiquetas del eje x
y = tabla_genero[1, ], # Frecuencia de No Rotación
type = 'bar',
name = 'No Rotación',
marker = list(color = 'rgba(255, 0, 0, 0.6)'),
text = etiquetas_no_rotacion, # Etiquetas de datos (frecuencia + porcentaje No Rotación)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
add_trace(
y = tabla_genero[2, ], # Frecuencia de Rotación
name = 'Rotación',
marker = list(color = 'rgba(0, 255, 0, 0.6)'),
text = etiquetas_rotacion, # Etiquetas de datos (frecuencia + porcentaje Rotación)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
layout(
title = "Rotación vs Género", # Título del gráfico
xaxis = list(title = "Género"), # Título del eje x
yaxis = list(title = "Frecuencia"), # Título del eje y
barmode = 'stack' # Tipo de gráfico de barras apiladas
)
# Mostrar el gráfico
bar_genero
Confirmamos la hipotesis del punto 1, donde indicamos que las personas solteras podrian tener una rotacion mayor, sin embargo, las persona divorciadas tienen menor rotacion que los casados, distinto a lo indicado en la hipotesis.
library(plotly)
library(dplyr)
# Codificar la variable de rotación
rotacion$Rotacion_bin <- ifelse(rotacion$Rotación == "Si", 1, 0)
# Crear la tabla de contingencia
tabla_Estado_Civil <- table(rotacion$Rotacion_bin, rotacion$Estado_Civil)
# Gráfico de barras apiladas con etiquetas de datos
bar_Estado_Civil <- plot_ly(
x = colnames(tabla_Estado_Civil), # Etiquetas del eje x
y = tabla_Estado_Civil[1, ], # Frecuencia de No Rotación
type = 'bar',
name = 'No Rotación',
marker = list(color = 'rgba(255, 0, 0, 0.6)'),
text = tabla_Estado_Civil[1, ], # Etiquetas de datos (frecuencia)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
add_trace(
y = tabla_Estado_Civil[2, ], # Frecuencia de Rotación
name = 'Rotación',
marker = list(color = 'rgba(0, 255, 0, 0.6)'),
text = tabla_Estado_Civil[2, ], # Etiquetas de datos (frecuencia)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
layout(
title = "Rotación vs Estado Civil", # Título del gráfico
xaxis = list(title = "Estado Civil"), # Título del eje x
yaxis = list(title = "Frecuencia"), # Título del eje y
barmode = 'stack' # Tipo de gráfico de barras apiladas
)
# Mostrar el gráfico
bar_Estado_Civil
Confirmamos lo indicado en la hipotesis donde se indicó que las personas que hacen horas extras tienden a tener una mayor rotacion. Del conjunto de personas que hicieron horas extras, el 31% presentó rotación.
library(plotly)
library(dplyr)
# Codificar la variable de rotación
rotacion$Rotacion_bin <- ifelse(rotacion$Rotación == "Si", 1, 0)
# Crear la tabla de contingencia
tabla_Horas_Extra <- table(rotacion$Rotacion_bin, rotacion$Horas_Extra)
# Gráfico de barras apiladas con etiquetas de datos
bar_Horas_Extra <- plot_ly(
x = colnames(tabla_Horas_Extra), # Etiquetas del eje x
y = tabla_Horas_Extra[1, ], # Frecuencia de No Rotación
type = 'bar',
name = 'No Rotación',
marker = list(color = 'rgba(255, 0, 0, 0.6)'),
text = tabla_Horas_Extra[1, ], # Etiquetas de datos (frecuencia)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
add_trace(
y = tabla_Horas_Extra[2, ], # Frecuencia de Rotación
name = 'Rotación',
marker = list(color = 'rgba(0, 255, 0, 0.6)'),
text = tabla_Horas_Extra[2, ], # Etiquetas de datos (frecuencia)
textposition = 'auto' # Posición automática de las etiquetas
) %>%
layout(
title = "Rotación vs Horas Extra", # Título del gráfico
xaxis = list(title = "Horas Extra"), # Título del eje x
yaxis = list(title = "Frecuencia"), # Título del eje y
barmode = 'stack' # Tipo de gráfico de barras apiladas
)
# Mostrar el gráfico
bar_Horas_Extra
Para la “Edad”, el p-valor es mucho menor que 0.05, lo que indica una diferencia estadísticamente significativa en las edades promedio entre los empleados que no rotan (Grupo 0) y los que sí lo hacen (Grupo 1). En promedio, los empleados que no rotan son mayor edad (38 años) que aquellos que rotan (34 años), lo que sugiere que los empleados mayores tienden a quedarse más tiempo en la empresa, mientras que los más jóvenes son más propensos a rotar.
Para el “Ingreso_Mensual”, el p-valor es menor que 0.05. Los empleados que no rotan tienen un ingreso mensual promedio significativamente más alto (6832.74) comparado con los que rotan (4787.09). Esto sugiere que los empleados con salarios más bajos podrían ser más propensos a la rotación.
Para “Años_Experiencia”, el p-valor es muy bajo. Los empleados que no rotan tienen, en promedio, más años de experiencia (11.86) en comparación con los que rotan (8.24). Esto podría indicar que a mayor experiencia tienden a tener una menor rotación.
# Convertir la lista en un dataframe
results_df <- bind_rows(results_list)
# Mostrar el dataframe con los resultados
print(results_df)
## Variable p_value statistic conf_int_low conf_int_high
## t...1 Edad 1.371249e-08 5.829150 2.619728 5.289170
## t...2 Ingreso_Mensual 4.433589e-13 7.482622 1508.243516 2583.050149
## t...3 Años_Experiencia 1.159817e-11 7.019179 2.604401 4.632019
## mean_diff
## t...1 3.954449
## t...2 2045.646832
## t...3 3.618210
Con respecto a la edad, confirmamos que la rotacion tiende a presentarse en personas de menor edad, en el grafico anterior vemos que la media es de 32 años mientras que las personas que no rotan tienen una media de 36 años.
library(plotly)
# Crear boxplot para Edad
box_edad <- plot_ly(data = rotacion,
x = ~factor(Rotacion_bin),
y = ~Edad,
type = 'box',
name = 'Edad',
marker = list(color = 'rgba(60, 179, 113, 0.6)')) %>%
layout(title = "Rotación vs Edad",
xaxis = list(title = "Rotación (0=No, 1=Sí)"),
yaxis = list(title = "Edad"))
box_edad
Confirmamos tambien que las personas que presentaron rotación tenian una media de salarios menor a las personas que no rotaron, la media de las personas que no rotaron se ubica en $5204 y las que si lo hicieron en 3202. Lo que se podria traducir en la busqueda de mejores oportunidades laborales mejor remuneradas.
# Crear boxplot para Ingreso Mensual
box_ingreso <- plot_ly(data = rotacion,
x = ~factor(Rotacion_bin),
y = ~Ingreso_Mensual,
type = 'box',
name = 'Ingreso Mensual',
marker = list(color = 'rgba(30, 144, 255, 0.6)')) %>%
layout(title = "Rotación vs Ingreso Mensual",
xaxis = list(title = "Rotación (0=No, 1=Sí)"),
yaxis = list(title = "Ingreso Mensual"))
box_ingreso
Se observa una mayor rotacion en las personas con menos años de experiencia, la media de las personas que no rotaron tienen una media de 10 años de experiencia y las que si lo hicieron tienen una media de 7 años.
# Crear boxplot para Años de Experiencia
box_experiencia <- plot_ly(data = rotacion,
x = ~factor(Rotacion_bin),
y = ~Años_Experiencia,
type = 'box',
name = 'Años de Experiencia',
marker = list(color = 'rgba(220, 20, 60, 0.6)')) %>%
layout(title = "Rotación vs Años de Experiencia",
xaxis = list(title = "Rotación (0=No, 1=Sí)"),
yaxis = list(title = "Años de Experiencia"))
box_experiencia
Realice una partición en los datos de forma aleatoria donde 70% sea un set para entrenar el modelo y 30% para prueba. Estime un modelo logístico con la muestra del 70%. Muestre los resultados.
# Codificar la variable de rotación
rotacion$Rotacion_bin <- ifelse(rotacion$Rotación == "Si", 1, 0)
# Dividir los datos en conjuntos de entrenamiento y prueba
set.seed(123)
train_index <- sample(seq_len(nrow(rotacion)), size = 0.7 * nrow(rotacion))
train_set <- rotacion[train_index, ]
test_set <- rotacion[-train_index, ]
# Modelo logístico
modelo <- glm(Rotacion_bin ~ Genero + Horas_Extra + Estado_Civil +
Edad + Ingreso_Mensual + Años_Experiencia,
data = train_set, family = binomial(link="logit"))
# Resumen del modelo
summary(modelo)
##
## Call:
## glm(formula = Rotacion_bin ~ Genero + Horas_Extra + Estado_Civil +
## Edad + Ingreso_Mensual + Años_Experiencia, family = binomial(link = "logit"),
## data = train_set)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.655e-01 4.785e-01 -1.182 0.2373
## GeneroM 3.172e-02 1.917e-01 0.165 0.8686
## Horas_ExtraSi 1.392e+00 1.901e-01 7.321 2.47e-13 ***
## Estado_CivilDivorciado -4.162e-01 2.842e-01 -1.465 0.1430
## Estado_CivilSoltero 8.502e-01 2.038e-01 4.173 3.01e-05 ***
## Edad -3.450e-02 1.527e-02 -2.260 0.0238 *
## Ingreso_Mensual -9.652e-05 3.919e-05 -2.463 0.0138 *
## Años_Experiencia -1.364e-02 2.510e-02 -0.543 0.5869
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 896.03 on 1028 degrees of freedom
## Residual deviance: 755.80 on 1021 degrees of freedom
## AIC: 771.8
##
## Number of Fisher Scoring iterations: 5
Horas Extra y Estado Civil (Soltero) son los factores más fuertes y significativos que incrementan la probabilidad de rotación.
Edad y Ingreso Mensual tienen un efecto significativo, pero reducen la probabilidad de rotación.
Género, Estado Civil (Divorciado), y Años de Experiencia no muestran efectos significativos sobre la rotación.
Evaluar el poder predictivo del modelo con base en la curva ROC y el AUC en el set de datos de prueba.
# Predicciones en el conjunto de prueba
test_set$predicted_probs <- predict(modelo, test_set, type = "response")
roc_curve <- roc(test_set$Rotacion_bin, test_set$predicted_probs)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
# Gráfico de la curva ROC
plot(roc_curve, main = "Curva ROC")
auc(roc_curve) # Calcular el AUC
## Area under the curve: 0.7093
Un AUC de aproximadamente 0.70 sugiere que el modelo logra clasificar correctamente en el 70.93% de los casos, indica que el modelo tiene una capacidad de discriminación moderada.
La curva ROC muestra que el modelo tiene una tendencia razonable a separar correctamente los casos de rotación de los que no, pero no es un desempeño sobresaliente. La curva está por encima de la línea diagonal, lo que indica que el modelo es mejor que el azar.
En las conclusiones adicione una discución sobre cuál sería la estrategia para disminuir la rotación en la empresa (con base en las variables que resultaron significativas en el punto 3).
Con base a las variables que resultaron significativas en el análisis de regresión logística, la estrategia para disminuir la rotación en la empresa debe centrarse en abordar los factores que influyen fuertemente en la decisión de los empleados de abandonar la organización. Teniendo en cuenta las variables más significativas, tales como las horas extras, la edad o los años de experiencia, se deberían implementar programas enfocados a la retención del talento, desarrollo personal, ascensos por resultados y mentorías enfocados en los empleados más jóvenes, ya que son los más propensos a rotar. Adicionalmente, se pueden ofrecer beneficios no económicos, tales como bonos de alimentación, servicios de salud privados, áreas de trabajo cómodas, almuerzo en la empresa, entre otros, con el objetivo de mejorar el bienestar de los empleados.
Otra acción importante sería revisar las políticas salariales, ya que el salario es un factor que puede motivar a los empleados a buscar nuevas oportunidades. La empresa podría considerar ajustes salariales basados en el desempeño y comparaciones de mercado para asegurarse de que los paquetes de compensación sean competitivos. De esta manera, se atacan las causas fundamentales que influyen en la rotación, promoviendo la retención y mejorando la satisfacción general del personal.