Predicción de la fuga de trabajadores con el método KNN

En este trabajo utilizo el método K-Nearest Neighbours para predecir qué empleados tienen más probabilidades de abandonar la empresa en función de una serie de características cuantitativas y cualitativas como el nivel de satisfacción del trabajador, el número de proyectos en los que está involucrado, si ha sido promocionado en los últimos años, etc. Con métodos como este es posible detectar a tiempo qué trabajadores tienen intención de abandonar la empresa y poder evitar la fuga de capital humano.


El método KNN (K-Nearest Neighbours) ordena los datos de entrenamiento en un espacio N-dimensional, donde N es el número de características de los empleados utilizadas para hacer la clasificación. Cuando se quiere estimar a qué clase pertenece un nuevo elemento, dadas sus características, se sitúa el nuevo elemento en el espacio N-dimensional y se eligen los k elementos (de los datos de entrenamiento) que se encuentran más cerca. "Los vecinos más cercanos". Después se clasifica el elemento en la clase más común entre estos k elementos elegidos.

Para construir el modelo utilizo el dataset 'Human Resources Analytics', el cual consta de 14999 observaciones de 10 variables de los empleados y ex-empleados de una empresa. En el trabajo Análisis de la base de datos 'Human Resources Analytics muestro que las variables se descomponen en 5 variables cuantitativas, 3 variables binarias y 2 variables categóricas, siendo la variable 'left' la variable que se va a tratar de predecir en función del resto de variables.

Ajustes en el dataset

Tras hacer algunos cambios en el dataset, como eliminar los 1282 outliers, corregir la clase de las variables que estaban mal clasificadas, o transformar la variable 'department' en 9 variables binarias queda un dataset de 13717 observaciones.


satisfaction_level last_evaluation number_project average_montly_hours time_spend_company Work_accident left promotion_last_5years salary accounting hr IT management marketing product_mng RandD sales support technical
1 Min. :0.0900 Min. :0.3600 Min. :2.000 Min. : 96.0 Min. :2.000 Min. :0.0000 NO_LEFT:10355 Min. :0.0000 Min. :1.000 Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.00000 Min. :0.0000 Min. :0.0000 Min. :0.0000
2 1st Qu.:0.4400 1st Qu.:0.5600 1st Qu.:3.000 1st Qu.:156.0 1st Qu.:3.000 1st Qu.:0.0000 LEFT : 3362 1st Qu.:0.0000 1st Qu.:1.000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.00000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
3 Median :0.6400 Median :0.7200 Median :4.000 Median :198.0 Median :3.000 Median :0.0000 Median :0.0000 Median :2.000 Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000 Median :0.00000 Median :0.0000 Median :0.0000 Median :0.0000
4 Mean :0.6117 Mean :0.7143 Mean :3.783 Mean :200.6 Mean :3.165 Mean :0.1416 Mean :0.0175 Mean :1.579 Mean :0.05191 Mean :0.05045 Mean :0.08289 Mean :0.03558 Mean :0.05577 Mean :0.06029 Mean :0.05358 Mean :0.2726 Mean :0.1518 Mean :0.1852
5 3rd Qu.:0.8100 3rd Qu.:0.8700 3rd Qu.:5.000 3rd Qu.:245.0 3rd Qu.:4.000 3rd Qu.:0.0000 3rd Qu.:0.0000 3rd Qu.:2.000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:0.00000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
6 Max. :1.0000 Max. :1.0000 Max. :7.000 Max. :310.0 Max. :5.000 Max. :1.0000 Max. :1.0000 Max. :3.000 Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.00000 Max. :1.0000 Max. :1.0000 Max. :1.0000

En el dataset aparecen primero las observaciones de los trabajadores que han abandonado la empresa (left=LEFT) y después el resto (left=NO_LEFT). Para evitar problemas a la hora de dividir en dataset 'ccds' en datos de entrenamiento y datos de test, creo un nuevo dataframe con las observaciones mezcladas aleatoriamente.


En la tabla de arriba se puede ver que las variables numéricas tienen rangos diferentes. En el método knn esto puede provocar que las variables que tienen valores más bajos influyan menos en la función de distancia euclidea y, por tanto, que el método infravalore estas variables. Una solución para este problema es normalizar todas la variables numéricas para que tengan el mismo rango. Aprovecho también para quitar la variable objetivo 'left'


El nuevo dataframe ccds_n contiene las variables explicativas del modelo normalizadas, con un rango de 0 a 1. La razón por la que separo la variable 'left' es porque la función knn que emplearé requiere que se introduzcan por separado los datos de las variables explicativas y de la variable endógena.

División del dataframe en datos de entrenamiento y testeo

A continuación divido el dataframe normalizado ccds_n en una parte para entrenamiento (ccds_train) y otra para testear el modelo (ccds_train). Realizo lo mismo con los datos de la variable 'left' usando el dataframe ccds_r. He dejado entorno al 20% de los datos para testear el modelo.

Método de validación del modelo

Utilizo el paquete 'caret' para validar el modelo. Empleo el método de validación k-fold cross-validation, con 10 grupos, que dan lugar a 10 subsets de validación.

Definición y validación del modelo

Como el método knn no generaliza hasta que se intruducen los valores de entrada para hacer la predicción, sólo hay que definir los distintos valores de k con los que se quiere validar el modelo. Concretamente, valido el modelo para valores de 1 a 30.

La función train() genera el modelo knn con los datos de entrenamiento, los valores de k y el método de validación definidos.

El modelo model_knn estima la precisión del modelo para cada valor de k con el método de validación 10-fold CV. El resultado se ve en el gráfico siguiente.


Figura 1. Precisión para cada valor de k calculada con el método 10-fold Cross Validation

La precisión estimada usando el método de validación k-fold CV sobreestima la precisión real del modelo, pero es un buen método para estimar el valor de k que maximiza la precisión del modelo.

Como se puede ver en el gráfico, la máxima precisión se consigue con un valor de k=1. Lo habitual en los modelos knn es que el valor de k óptimo sea mayor que 1 y que la forma del gráfico sea en forma de U invertida debido al trade-off que existen entre el sesgo del modelo y su varianza. Valores muy bajos de k reducen la precisión del modelo al aumentar mucho la varianza del modelo, mientras que valores muy altos aumentan mucho su sesgo, reduciendo también la precisión del modelo. En este caso, el hecho de que el valor óptimo de k parezca ser k=1 puede ser a que la base de datos utilizada es simulada y hay suficiente poco ruido en los datos como para que un valor bajo de k no esté aumentando la varianza del modelo.

Testeo del modelo

Lo último que queda es testear el modelo con el subconjunto de datos ccds_test para ver la precisión con la que el modelo es capaz de predecir si los empleados abandonarán o no la empresa.

Le paso al modelo los datos de los trabajadores que quiero predecir y él automáticamente realiza la predicción utilizando el valor de k que mejor precisión ha obtenido en la validadición (k=1).


Para calcular la precisión del modelo, defino una función que devuelva el porcentaje de predicciones correctas, comparando las predicciones realizadas por el modelo 'ccds_test_pred' con los valores reales de los trabajadores almacenados en 'ccds_test_labels'.

[1] "97.2%"


El modelo ha predicho correctamente el 97,2% de las decisiones de los trabajadores sobre si quedarse en la empresa o irse.

Para concretar un poco, en la tabla siguiente aparecen el número de predicciones correctas e incorrectas para las dos clases.

Figura 2. Tabla de contingencia

Se puede ver que de los 644 trabajadores que abandonan la empresa, el modelo predice correctamente 618 (96%). Y de los 2099 que no abandona la empresa, el modelo predice correctamente 2047 (97.5%).

Esta web utiliza cookies para obtener datos estadísticos de la navegación de sus usuarios. Si continúas navegando se considera que aceptas su uso. Más información Cerrar