Ваши сотрудники уйдут?

Исчезновение сотрудников - это постепенное сокращение численности персонала, которое происходит по мере того, как сотрудники выходят на пенсию или увольняются и не заменяются. Уход сотрудников может дорого обойтись предприятиям. Компания теряет продуктивность сотрудников и их знания.

Термины текучесть кадров / отток и убыль - это термины, связанные с человеческими ресурсами, которые часто путают. И текучесть кадров, и их выбытие происходят, когда сотрудник увольняется из компании. Переход, однако, происходит в результате нескольких различных действий, таких как увольнение, увольнение, отставка или отказ. Убыток происходит, когда сотрудник выходит на пенсию или когда работодатель сокращает должность. Большая разница между ними заключается в том, что при текучести кадров компания ищет кого-то, кто заменит сотрудника. Но в случае выбытия работодатель оставляет эту вакансию незаполненной или отменяет эту должность. - LinkedIn

Средняя стоимость текучести кадров составляет: 20% годовой заработной платы сотрудников на средних должностях (от 30 000 до 50 000 долларов в год). Например, стоимость замены оплачиваемого сотрудника в размере 30 000 долларов составит 6 000 долларов.

Исследование Центра американского прогресса показало, что текучесть кадров часто оценивается от 100% до 300% базовой зарплаты заменяемого сотрудника, в зависимости от заработной платы и роли сотрудника.

Большинство бизнес-целей, связанных с оттоком сотрудников, - это попытаться ответить на следующие вопросы:

  1. Как уменьшить отток сотрудников?
  2. Почему хорошие сотрудники уходят из компании?
  3. Можем ли мы предсказать, какие сотрудники с наибольшей вероятностью уйдут?

Итак, все это просто для того, чтобы показать, насколько ценным является сотрудник, независимо от того, будет ли эта должность сотрудника заполнена или нет. В этой статье я покажу вам, как предсказать, может ли сотрудник уволиться из компании.

Если вы предпочитаете не читать эту статью и хотите ее видеопрезентацию, вы можете проверить Видео YouTube. В нем подробно рассматривается все, что описано в этой статье, и он поможет вам легко начать программировать собственную модель машинного обучения, даже если на вашем компьютере не установлен язык программирования Python. Или вы можете использовать оба в качестве дополнительных материалов для изучения машинного обучения!

Программирование:

Первое, что мне нравится делать перед написанием единственной строчки кода, - это добавлять в комментарии описание того, что делает код. Таким образом, я могу оглянуться на свой код и точно знать, что он делает.

# Description: This program predicts employee attrition.

Затем импортируйте несколько библиотек, которые будут использоваться в этой программе.

#Import Libraries
import numpy as np
import pandas as pd
import seaborn as sns

Загрузите данные.

#Load the data 
from google.colab import files # Use to load data on Google Colab 
uploaded = files.upload() # Use to load data on Google Colab

Сохраните данные во фрейме данных и распечатайте первые 7 строк данных.

#Store the data into the df variable
df = pd.read_csv('WA_Fn-UseC_-HR-Employee-Attrition.csv') 
df.head(7) #Print the first 7 rows

Получите количество строк и столбцов в данных.

#Get the number of rows and number of columns in the data
df.shape

Это 1470 строк данных или сотрудников в наборе данных и 35 столбцов или точек данных для каждого сотрудника. Получите типы данных каждого столбца.

#Get the column data types
df.dtypes

Подсчитайте количество пустых значений в каждом столбце.

#Count the empty (NaN, NAN, na) values in each column
df.isna().sum()

Похоже, у них нет отсутствующих данных, поскольку все столбцы возвращают значение 0. Давайте дважды проверим набор данных на наличие отсутствующих значений.

#Another check for any null / missing values
df.isnull().values.any()

Просмотрите некоторую базовую статистику о данных, такую ​​как процентиль, среднее, максимальное, минимальное и т. Д.

#View some basic statistical details like percentile, mean, standard deviation etc.
df.describe()

Подсчитайте количество уволенных сотрудников, количество сотрудников, которые остались (нет) и количество сотрудников, которые покинули (да) компанию.

#Get a count of the number of employee attrition, the number of employees that stayed (no) and the number that left (yes)
df['Attrition'].value_counts()

Теперь, когда у нас есть счетчик, давайте взглянем на него.

#Visualize this count 
sns.countplot(df['Attrition'])

Покажите количество сотрудников, которые ушли и остались в компании по возрасту.

#Show the number of employees that left and stayed by age
import matplotlib.pyplot as plt
fig_dims = (12, 4)
fig, ax = plt.subplots(figsize=fig_dims)

#ax = axis
sns.countplot(x='Age', hue='Attrition', data = df, palette="colorblind", ax = ax,  edgecolor=sns.color_palette("dark", n_colors = 1));

Интересно то, что вы можете увидеть возраст с наибольшим количеством увольнений сотрудников - это возраст 29 и 31 год. Возраст с наибольшим удержанием - это возраст 34 и 35 лет.

Распечатайте все типы данных объекта и распечатайте их уникальные значения.

#Print all of the object data types and their unique values
for column in df.columns:
    if df[column].dtype == object:
        print(str(column) + ' : ' + str(df[column].unique()))
        print(df[column].value_counts())
        print("_________________________________________________________________")

Я не думаю, что некоторые столбцы в наборе данных понадобятся для обучения модели машинного обучения, например, присвоение номера сотруднику (который представляет собой всего лишь идентификацию номера).

Столбцы StandardHours, Over18 и EmployeeCount содержат только одно значение в каждой строке, поэтому эти столбцы не будут добавлять в модель никакой дополнительной информации. Мы удалим эти столбцы из набора данных.

#Remove unneeded columns

#Remove the column EmployeeNumber
df = df.drop('EmployeeNumber', axis = 1) # A number assignment 
#Remove the column StandardHours
df = df.drop('StandardHours', axis = 1) #Contains only value 80 
#Remove the column EmployeeCount
df = df.drop('EmployeeCount', axis = 1) #Contains only the value 1 
#Remove the column EmployeeCount
df = df.drop('Over18', axis = 1) #Contains only the value 'Yes'

Получите корреляцию столбцов.

#Get the correlation of the columns
df.corr()

Давайте лучше визуализируем корреляцию с помощью тепловой карты.

#Visualize the correlation
plt.figure(figsize=(14,14))  #14in by 14in
sns.heatmap(df.corr(), annot=True, fmt='.0%')

Теперь подготовим данные для модели. Сначала мы преобразуем нечисловые столбцы в числовые столбцы.

#Transform non-numeric columns into numerical columns
from sklearn.preprocessing import LabelEncoder

for column in df.columns:
        if df[column].dtype == np.number:
            continue
        df[column] = LabelEncoder().fit_transform(df[column])

Затем я собираюсь создать новый столбец для хранения значений возраста. Это только для того, чтобы поместить значения возраста в конец набора данных. Затем я удалю возраст столбца из передней части набора данных, чтобы целевой столбец был первым.

И последнее, но не менее важное, я покажу новый набор данных.

#Create a new column at the end of the dataframe that contains the same value 
df['Age_Years'] = df['Age']
#Remove the first column called age 
df = df.drop('Age', axis = 1)
#Show the dataframe
df

Разделите данные на независимые «X» и зависимые «Y» наборы данных.

#Split the data into independent 'X' and dependent 'Y' variables
X = df.iloc[:, 1:df.shape[1]].values 
Y = df.iloc[:, 0].values 

Просто чтобы вы знали, что вы можете посмотреть код здесь и данные здесь.
Теперь я хочу разделить набор данных на 75% наборов данных для обучения и 25% для тестирования.

# Split the dataset into 75% Training set and 25% Testing set
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)

Теперь давайте воспользуемся классификатором случайного леса, чтобы извлечь уроки из обучающих данных и посмотреть, насколько они точны.

#Use Random Forest Classification algorithm
  from sklearn.ensemble import RandomForestClassifier
  forest = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state = 0)
  forest.fit(X_train, Y_train)

Теперь получите точность модели.

#Get the accuracy on the training data
forest.score(X_train, Y_train)

Покажите матрицу неточностей и точность модели.

#Show the confusion matrix and accuracy for  the model on the test data
#Classification accuracy is the ratio of correct predictions to total predictions made.
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(Y_test, forest.predict(X_test))
  
TN = cm[0][0]
TP = cm[1][1]
FN = cm[1][0]
FP = cm[0][1]
  
print(cm)
print('Model Testing Accuracy = "{}!"'.format(  (TP + TN) / (TP + TN + FN + FP)))
print()# Print a new line

Модель правильно определила 86,41% сотрудников, уволившихся из компании.

Давайте посмотрим, что модель считает важными функциями.

# Return the feature importances (the higher, the more important the feature).
importances = pd.DataFrame({'feature':df.iloc[:, 1:df.shape[1]].columns,'importance':np.round(forest.feature_importances_,3)}) #Note: The target column is at position 0
importances = importances.sort_values('importance',ascending=False).set_index('feature')
importances

У них много возможностей, на которые стоит обратить внимание, возможно, лучше всего увидеть визуализацию данных.

#Visualize the importance
importances.plot.bar()

Месячный доход, по-видимому, является наиболее важной характеристикой, за которой следуют возраст человека, дневная ставка и ежемесячная ставка. Увидев этот результат, я хочу увидеть, не уйдут ли люди с более высоким доходом с меньшей вероятностью, чем люди с более низким доходом.

Я также мог бы провести дополнительный анализ возраста сотрудников, поскольку кажется, что это может быть определенный возрастной диапазон, из которого сотрудник, скорее всего, уволится.

Может быть, с помощью некоторого дополнительного анализа данных и настройки программы я смогу улучшить производительность и точность этой модели.

Если вам интересно узнать больше о машинном обучении, чтобы сразу приступить к работе с проблемами и примерами, я настоятельно рекомендую вам ознакомиться с Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных технологий. Системы ». Это отличная книга, которая поможет новичкам научиться писать программы машинного обучения и понять концепции машинного обучения.

Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем

Спасибо за прочтение этой статьи, надеюсь, она будет вам полезна! Если вам понравилась эта статья и вы нашли ее полезной, пожалуйста, оставьте несколько аплодисментов, чтобы выразить свою признательность. Продолжайте обучение, и если вам нравится машинное обучение, математика, информатика, программирование или анализ алгоритмов, посетите и подпишитесь на мои каналы YouTube (randerson112358 и compsci112358).

Другие источники:

  1. Scikit-Lea
  2. Kaggle
  3. Построение модели оттока сотрудников на Python для разработки стратегического плана удержания