El presente trabajo pretende analizar el impacto de los agentes que dejan la compañía Manpower, denominados Leavers, en el costo de las campañas de reclutamiento, teniendo en cuenta los recursos atribuídos para cada agente que se representará en la variable Rate, y considerando el tenure de los mismos para ver la relación entre estas variables, y así poder generar conclusiones que permitan generar estrategias para la optimización de recursos basados en la retención de agentes.
Para realizar este análisis, importamos el dataset Leavers que corresponde a los agentes que salieron de la compañía y el dataset headcount que contiene información sobre las nuevos agentes contratados en la empresa.
library(readxl)
Lee los datos de la hoja ‘leavers’ del archivo Excel
Leavers <- read_excel("C:/Users/ASUS/Downloads/Headcount_VRG_LATAM_1_.xlsx", sheet = "Leavers", skip = 2)
## New names:
## • `` -> `...1`
## • `45407` -> `45407...3`
## • `45407` -> `45407...4`
## • `` -> `...5`
## • `` -> `...6`
## • `` -> `...7`
## • `` -> `...8`
## • `` -> `...9`
## • `` -> `...10`
## • `` -> `...11`
## • `` -> `...12`
## • `` -> `...13`
## • `` -> `...14`
## • `` -> `...15`
## • `` -> `...16`
## • `` -> `...17`
## • `` -> `...18`
Extrae los nombres de las columnas de los datos
nombres_columnas <- as.character(Leavers[1, ]) # Accedemos a la fila 4 para obtener los nombres de las columnas
Asignación de los nombres de las columnas al dataframe de Leavers
names(Leavers) <- nombres_columnas
Leavers <- Leavers[-1, ]
Ahora extraemos el segundo dataset de Headcount
head_count <- read_excel("C:/Users/ASUS/Downloads/Headcount_VRG_LATAM_1_.xlsx", sheet = "VRG Headcount")
head_count
## # A tibble: 181 × 19
## N Start_Date Tenure_Months Name Tittle Program_Supported
## <dbl> <dttm> <dbl> <chr> <chr> <chr>
## 1 1 2021-05-03 00:00:00 35.7 Manuel Alej… Recru… MP High Volume
## 2 2 2021-06-28 00:00:00 33.9 Valeria Enr… Recru… MP High Volume
## 3 3 2021-07-12 00:00:00 33.4 Cinthya Ste… Recru… MP High Volume
## 4 4 2021-08-25 00:00:00 31.9 Junior Alon… Recru… MP High Volume
## 5 5 2021-12-06 00:00:00 28.5 Grecia Hele… Recru… MP High Volume
## 6 6 2021-12-06 00:00:00 28.5 Claudia Ale… Recru… MP High Volume
## 7 7 2021-12-13 00:00:00 28.3 Sara Correa… Recru… MP Skilled Tech
## 8 8 2021-12-20 00:00:00 28.0 Iveet Allis… Recru… MP High Volume
## 9 9 2021-12-20 00:00:00 28.0 Juan José R… Recru… MP High Volume
## 10 10 2021-12-20 00:00:00 28.0 Karla Rocio… Recru… MP High Volume
## # ℹ 171 more rows
## # ℹ 13 more variables: Team_Lead <chr>, Email_Address <chr>, Extension <chr>,
## # `US ID` <chr>, `.com Email Address` <chr>, City <chr>, Country <chr>,
## # Month <dbl>, Year <dbl>, Country_ID <chr>, Phone_Number <dbl>, DOB <chr>,
## # Rate <dbl>
Dentro del summary, encontramos que existen 18 variables con información de los nuevos agentes contratados, donde las variables que serán analizadas son el rol del agente contratado denominado como “Tittle”, el team lead, el programa soportado, el tiempo en la campaña representado por el “tenure”, y el valor de los recursos asignados que se representa como “Rate”.
summary(head_count)
## N Start_Date Tenure_Months
## Min. : 1 Min. :2021-05-03 00:00:00.00 Min. : 0.200
## 1st Qu.: 46 1st Qu.:2023-05-09 00:00:00.00 1st Qu.: 4.470
## Median : 91 Median :2023-09-04 00:00:00.00 Median : 7.270
## Mean : 91 Mean :2023-07-16 08:53:02.31 Mean : 8.921
## 3rd Qu.:136 3rd Qu.:2023-11-27 00:00:00.00 3rd Qu.:11.200
## Max. :181 Max. :2024-04-03 00:00:00.00 Max. :35.730
##
## Name Tittle Program_Supported Team_Lead
## Length:181 Length:181 Length:181 Length:181
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Email_Address Extension US ID .com Email Address
## Length:181 Length:181 Length:181 Length:181
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## City Country Month Year
## Length:181 Length:181 Min. : 1.000 Min. :2021
## Class :character Class :character 1st Qu.: 3.000 1st Qu.:2023
## Mode :character Mode :character Median : 7.000 Median :2023
## Mean : 6.133 Mean :2023
## 3rd Qu.: 9.000 3rd Qu.:2023
## Max. :12.000 Max. :2024
##
## Country_ID Phone_Number DOB Rate
## Length:181 Min. :3.003e+09 Length:181 Min. :1977
## Class :character 1st Qu.:3.103e+09 Class :character 1st Qu.:1977
## Mode :character Median :3.144e+09 Mode :character Median :1977
## Mean :3.130e+09 Mean :2064
## 3rd Qu.:3.179e+09 3rd Qu.:2089
## Max. :3.244e+09 Max. :2313
## NA's :144
Procedemos a crear un subset con la función select para filtrar el dataset con la información que consideramos más relevante para efectos de este análisis.
head_count <- subset(head_count, select= c(1,3,5:7,19))
head_count
## # A tibble: 181 × 6
## N Tenure_Months Tittle Program_Supported Team_Lead Rate
## <dbl> <dbl> <chr> <chr> <chr> <dbl>
## 1 1 35.7 Recruiter A MP High Volume Cinthya Oré Chávez 1977
## 2 2 33.9 Recruiter D MP High Volume Cinthya Oré Chávez 2313
## 3 3 33.4 Recruiter C MP High Volume Cinthya Oré Chávez 2201
## 4 4 31.9 Recruiter D MP High Volume Cinthya Oré Chávez 2313
## 5 5 28.5 Recruiter B MP High Volume Cinthya Oré Chávez 2089
## 6 6 28.5 Recruiter B MP High Volume Cinthya Oré Chávez 2089
## 7 7 28.3 Recruiter D MP Skilled Tech Nelly Gomez 2313
## 8 8 28.0 Recruiter C MP High Volume Cinthya Oré Chávez 2201
## 9 9 28.0 Recruiter D MP High Volume Cinthya Oré Chávez 2313
## 10 10 28.0 Recruiter B MP High Volume Cinthya Oré Chávez 2089
## # ℹ 171 more rows
Posteriormente, realizamos un análisis exploratorio de los dataframes por medio de la creación diferentes gráficos para poder tener una visualización del comportamiento de los datos.
Primero creamos histogramas para visualizar el número de agentes por programa soportado, team lead y por campaña.
1. gráfica de número de agentes por cargo
library(ggplot2)
ggplot(head_count, aes(x=Tittle)) +
geom_histogram(stat = "count")+
labs(x= "Cargo del empleado", y= "número de empleados",
title= "número de agentes por cargo")
## Warning in geom_histogram(stat = "count"): Ignoring unknown parameters:
## `binwidth`, `bins`, and `pad`
2. gráfica de número de agentes asigandos a cada team lead
# Crear la gráfica y rotar las etiquetas del eje x
ggplot(head_count, aes(x = Team_Lead)) +
geom_bar() + # Utilizamos geom_bar() en lugar de geom_histogram() para contar las frecuencias
labs(x = "Team Lead", y = "Número de empleados", title = "Número de agentes por Team Lead") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
3. gráfica de número de agentes asigandos a cada programa
ggplot(head_count, aes(x=Program_Supported)) +
geom_histogram(stat = "count")+
labs(x= "Programa", y= "número de empleados",
title= "número de agentes por Programa")
## Warning in geom_histogram(stat = "count"): Ignoring unknown parameters:
## `binwidth`, `bins`, and `pad`
A continuación, crearemos un histograma de dipersión usando la
probabilidad de ocurrencia de los eventos, para verificar en donde se
condensa una mayor densidad en esta probabilidad (PDF)
hist(as.numeric(head_count$Rate, freq= FALSE))
lines(density(head_count$Rate), col=4)
Analizamos cruzaremos las variables numéricas de tenure y rate a traves
de un Boxplot, para poder analizar el comportamiento y la relación entre
estas variables, necesárias para poder comenzar a visualizar el costo
por agente de acuerdo al tenure.
# Crear una copia del dataset original
head_count_copy <- head_count
# Crear una nueva columna que represente las categorías de tenure en la copia del dataset
head_count_copy$Tenure_Group <- cut(head_count_copy$Tenure_Months,
breaks = c(-Inf, 10, 20, Inf),
labels = c("0-10", "10-20", ">20"))
# Graficar un boxplot de la tasa (Rate) por las categorías de tenure
ggplot(head_count_copy, aes(x = as.factor(Tenure_Group), y = Rate, fill = Tenure_Group)) +
geom_boxplot() +
labs(x = "Tenure", y = "Rate", title = "Rate por tenure")
El Boxplot permite identificar que no existen agentes de tenure entre 10 y 20 meses, debido a que hubo un periodo en el que no se realizaron contrataciones. Además, se evidencia una concentración de datos en el tercer quartil del boxplot rojo debido a que el rate minimo de los agentes es de 1977 USD. El boxplot azul ya tiene una distribución de datos equitativa entre los diversos cuartiles con un rate mayor a 2100.
A continuación realizamos la instalación de librerías de análisis estadístico.
library(MASS)
library(survival)
library(fitdistrplus)
# Ajustar la distribución binomial a los datos
fit <- fitdist(head_count$Rate, "pois")
# Graficar la distribución ajustada
plot(fit)
Con la distribución binomial se evidencia que la PDF tiene una probabilidad baja de ocurrencia para la variable de rate por encima de los 2.150 USD.
library(rriskDistributions)
new_data <- fit.cont(head_count$Rate)
##
## Begin fitting distributions ---------------------------------------
## * fitting normal distribution ... OK
## * fitting Cauchy distribution ... failed
## * fitting logistic distribution ... OK
## * fitting beta distribution ... failed
## * fitting exponential distribution ... failed
## * fitting chi-square distribution ... OK
## * fitting uniform distribution ... OK
## * fitting gamma distribution ... OK
## * fitting lognormal distribution ... OK
## * fitting Weibull distribution ... OK
## * fitting F-distribution ... OK
## * fitting Student's t-distribution ... OK
## * fitting Gompertz distribution ... failed
## * fitting triangular distribution ... failed
## End fitting distributions -----------------------------------------
## logL AIC BIC Chisq(value) Chisq(p) AD(value) H(AD)
## Normal -1116.08 2236.16 2242.56 104.47 0 20.80 rejected
## Logistic -1113.53 2231.06 2237.46 77.73 0 18.84 rejected
## Chi-square -1199.14 2400.28 2403.48 423.11 0 62.19 NULL
## Uniform NULL NULL NULL 68.88 NULL Inf NULL
## Gamma -1112.17 2228.34 2234.74 106.03 0 20.48 rejected
## Lognormal -1110.29 2224.59 2230.98 107.00 0 20.35 rejected
## Weibull -1145.81 2295.63 2302.02 78.40 0 21.69 rejected
## F -1966.22 3936.44 3942.84 8173.42 0 91.38 NULL
## Student -2092.93 4187.87 4191.07 16550.40 0 170.25 NULL
## KS(value) H(KS)
## Normal 0.31 rejected
## Logistic 0.28 rejected
## Chi-square 0.44 rejected
## Uniform 0.28 rejected
## Gamma 0.31 rejected
## Lognormal 0.31 rejected
## Weibull 0.28 rejected
## F 0.67 rejected
## Student 0.83 rejected
##
## Chosen continuous distribution is: NA
## Fitted parameters are:
## [1] NA
#La siguiente función permite ver las diferentes distribuciones estadísticas aplicadas
#sin embargo solo sirve en un entorno local de R
#require(rriskDistributions)
#new_data <- fit.cont(head_count$Rate)
Con la función anterior, se puede evindeciar que los datos se ajustan mejor en distribuciones estadísticas lognormal y Chi-Square, en donde los datos se condensan mayormente en los rates más bajos, lo cual es un comportamiento esperado teniendo en cuenta el rate equivalente a los recursos destinados por agente, en donde existe mayor número de agentes en cargos con recursos más limitados.
A continuación se analiza el otro dataframe Leavers, para analizar la distribución de datos en relación a la variable de tenure en leavers:
hist(as.numeric(Leavers$Tenure_Months), freq= FALSE)
Con el histograma anterior, se puede evidenciar que el comportamiento en la concentración de datos de tenure para el dataset de Leavers, es similar al comportamiento de rate por agente del dataset de Headcount, en donde existe mayor número de agentes en cargos con tenure menor que dejan la compañía, por lo cual existe un gran número de agentes en donde se deja la compañía en un plazo menor de 5 meses.
A continuación, entramos en el análisis de datos más relevante teniendo en cuenta los objetivos y el alcance propuesto en el proyecto, en donde se pretende analizar el costo promedio de los intervalos más impactados por Leavers, que en este caso corresponde a los Leavers con tenure entre 0 y 5 meses, 5 y 10 meses, y 10 y 15 meses.
Para esto, analizaremos el costo promedio con base en el rate destinado a cada agente, segmentando por los intervalos mencionados anteriormente:
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#PRIMERO CREAR SUBSETS PARA VERIFICAR LOS DATOS DE LEAVERS CON BASE EN LOS INTERVALOS DE MESES
# Crear subset de 0 a 5 meses
subset_0_to_5_L <- filter(Leavers, Tenure_Months >= 0 & Tenure_Months <= 5)
# Crear subset de 5 a 10 meses
subset_5_to_10_L <- filter(Leavers, Tenure_Months > 5 & Tenure_Months <= 10)
subset_punto_critico <- filter(Leavers, Tenure_Months >= 0 & Tenure_Months <= 10)
# Crear subset de 5 a 10 meses
subset_5_to_10_L <- filter(Leavers, Tenure_Months > 5 & Tenure_Months <= 10)
# Crear subset de 10 a 15 meses
subset_10_to_15_L <- filter(Leavers, Tenure_Months > 10 & Tenure_Months <= 15)
#SEGUNDO CREAR SUBSETS PARA FILTRAR LOS DATOS DE HEAD_COUNT CON BASE EN LOS INTERVALOS DE MESES
# Crear subset_H de 0 a 5 meses
subset_0_to_5_H <- filter(head_count, Tenure_Months >= 0 & Tenure_Months <= 5)
# Crear subset_H de 5 a 10 meses
subset_5_to_10_H <- filter(head_count, Tenure_Months > 5 & Tenure_Months <= 10)
# Crear subset_H de 10 a 15 meses
subset_10_to_15_H <- filter(head_count, Tenure_Months > 10 & Tenure_Months <= 15)
#FINALMENTE, UNA VEZ QUE TEMOS FILTRADOS LOS DATOS DE LOS DOS CONJUNTOS DE DATAFRAMES CON BASE EN EL TENURE, PROCEDEMOS A HALLAR EL RATE PROMEDIO PARA EL INTERVALO DE DATOS EN EL CONJUNTO DE DATASET
mean(subset_0_to_5_H$Rate)
## [1] 1998.538
summary(subset_0_to_5_H$Rate)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1977 1977 1977 1999 1977 2313
mean(subset_5_to_10_H$Rate)
## [1] 2063.481
summary(subset_5_to_10_H$Rate)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1977 1977 1977 2063 2089 2313
mean(subset_10_to_15_H$Rate)
## [1] 2093.87
summary(subset_10_to_15_H$Rate)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1977 2089 2089 2094 2089 2313
summary(subset_punto_critico)
## NA Start_Date Tenure_Months Name
## Min. : 1.0 Length:31 Length:31 Length:31
## 1st Qu.: 9.5 Class :character Class :character Class :character
## Median : 31.0 Mode :character Mode :character Mode :character
## Mean : 44.0
## 3rd Qu.: 72.0
## Max. :111.0
## Tittle Program Team_Leader Email_Address
## Length:31 Length:31 Length:31 Length:31
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Extension U.S ID .com Email Address Location
## Length:31 Length:31 Length:31 Length:31
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Country ID Last_date Rehire External/Internal
## Length:31 Length:31 Length:31 Length:31
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Voluntary/Involuntary Reason
## Length:31 Length:31
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Conclusiones
La visualización de datos por medio de los histogramas permitió verificar que los datos de tenure y rate en los dataset de head_count y leavers, tienen una distribución asimétrica positiva. Esto refleja que hay pocos agentes con un tenure y rates altos, en comparación con una concentración más grande de valores bajos.
El boxplot reflejó que dentro de los dos primeros intervalos de tenure de 0 a 10 meses son un intervalo crítico, debido a que existe la mayor concentración de datos, en donde el rate asignado está entre 1.977 USD y 2.100 USD, con un promedio de 1.999 USD por agente.
Con base en esta concentración de datos, se identificó que si se tiene en cuenta el rate promedio segmentado por agentes con tenure entre 0 y 10 meses, se estima que el costo total ajustado con base en el rate promedio para los leavers de entre 0 y 10 meses de tenure fue de USD 118.620, que fue caculado multiplicando el rate promedio para agentes con tenure de entre 0 y 10 meses, y el número total de agentes que dejaron la compañía antes de cumplir los 10 meses.
Las estrategias de retención de la companía deben enfocarse en una campaña de retención de los agentes en los primeros 10 meses tenure debido a que la mayor cantidad de leavers se encuentran en este intervalo, generando un gran impacto en los costos de contratación de la campaña.