Сивакумар V

Заявление о проблеме

Ежегодно многие компании нанимают определенное количество сотрудников. Компании вкладывают время и деньги в обучение этих сотрудников, не только это, но также существуют программы обучения внутри компаний для существующих сотрудников. Целью этих программ является повышение эффективности своих сотрудников. Но какое место в этом занимает HR Analytics? и речь идет только о повышении эффективности сотрудников?

HR Аналитика

Аналитика человеческих ресурсов (HR-аналитика) - это область в области аналитики, которая относится к применению аналитических процессов к отделу человеческих ресурсов организации в надежде улучшить производительность сотрудников и, следовательно, получить лучшую окупаемость инвестиций. HR-аналитика занимается не только сбором данных об эффективности сотрудников. Вместо этого он направлен на обеспечение понимания каждого процесса путем сбора данных и последующего их использования для принятия соответствующих решений о том, как улучшить эти процессы.

Убыль в HR

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

Как истощение влияет на компании? и как HR Analytics помогает анализировать истощение? Здесь мы обсудим первый вопрос, а для второго вопроса мы напишем код и попытаемся понять процесс шаг за шагом.

Истощение, влияющее на компании

Серьезной проблемой при высокой текучести кадров является высокая стоимость этого для организации. Объявления о вакансиях, процессы приема на работу, оформление документов и обучение новых сотрудников - это некоторые из распространенных расходов, связанных с потерей сотрудников и их заменой. Кроме того, регулярная текучесть кадров не позволяет вашей организации со временем увеличивать свою коллективную базу знаний и опыта. Это особенно важно, если ваш бизнес ориентирован на клиентов, поскольку клиенты часто предпочитают общаться со знакомыми людьми. Ошибки и проблемы более вероятны, если у вас постоянно появляются новые работники.

Импорт библиотек

# Анализ данных и управление библиотеками
import pandas as pd
import numpy as np

#Visulizing library
import matplotlib.pyplot as plt
import seaborn as sns

# Подавить предупреждение
импортировать предупреждения
warnings.filterwarnings («игнорировать»)

Библиотека #MachineLearning
из sklearn.model_selection import train_test_split
из sklearn.preprocessing import power_transform

#model
from sklearn.linear_model import LogisticRegression

#metrics
из sklearn.metrics импортировать confusion_matrix, classification_report, precision_score

# очистка и обработка данных
из scipy.stats import boxcox, zscore

Получение данных

df = pd.read_csv (‘WA_Fn-UseC_-HR-Employee-Attrition.csv’)
pd.set_option (‘display.max_columns’, None)
df.head ()

Анализ данных

Форма набора данных

df.shape
(1470, 35)

Наблюдение за набором данных

  • Целевая переменная - истощение.
  • Контролируемая логистическая проблема

Проверка типа данных

df.shape
(1470, 35)
Age                          int64
Attrition                   object
BusinessTravel              object
DailyRate                    int64
Department                  object
DistanceFromHome             int64
Education                    int64
EducationField              object
EmployeeCount                int64
EmployeeNumber               int64
EnvironmentSatisfaction      int64
Gender                      object
HourlyRate                   int64
JobInvolvement               int64
JobLevel                     int64
JobRole                     object
JobSatisfaction              int64
MaritalStatus               object
MonthlyIncome                int64
MonthlyRate                  int64
NumCompaniesWorked           int64
Over18                      object
OverTime                    object
PercentSalaryHike            int64
PerformanceRating            int64
RelationshipSatisfaction     int64
StandardHours                int64
StockOptionLevel             int64
TotalWorkingYears            int64
TrainingTimesLastYear        int64
WorkLifeBalance              int64
YearsAtCompany               int64
YearsInCurrentRole           int64
YearsSinceLastPromotion      int64
YearsWithCurrManager         int64
dtype: object

Проверка нулевых значений

df.isnull (). сумма ()

Age                         0
Attrition                   0
BusinessTravel              0
DailyRate                   0
Department                  0
DistanceFromHome            0
Education                   0
EducationField              0
EmployeeCount               0
EmployeeNumber              0
EnvironmentSatisfaction     0
Gender                      0
HourlyRate                  0
JobInvolvement              0
JobLevel                    0
JobRole                     0
JobSatisfaction             0
MaritalStatus               0
MonthlyIncome               0
MonthlyRate                 0
NumCompaniesWorked          0
Over18                      0
OverTime                    0
PercentSalaryHike           0
PerformanceRating           0
RelationshipSatisfaction    0
StandardHours               0
StockOptionLevel            0
TotalWorkingYears           0
TrainingTimesLastYear       0
WorkLifeBalance             0
YearsAtCompany              0
YearsInCurrentRole          0
YearsSinceLastPromotion     0
YearsWithCurrManager        0
dtype: int64

Заключительное замечание EDA

df.describe()

Наблюдение:

  • Категорический выброс столбца, который мы не должны рассматривать
  • Distancehome, Ежемесячный доход, Среднее количество компаний, среднее значение, показывающее асимметрию данных
  • Нам нужно проверить выброс другим способом

Проверка выброса

df.iloc[:,:].plot(kind='box',subplots=True,layout=(4,10))
plt.subplots_adjust(top=2,bottom=1.25,right=1.5)
plt.show()

Трубопровод предварительной обработки

Унивариантный анализ

sns.countplot(df.Attrition)
sns.countplot(df.Department)

Удаление выброса из данных

from scipy.stats import zscore,boxcox
z=np.abs(zscore(df))
z

Все строки удаляются, поэтому нам нужно сохранить набор данных с выбросами.

Проверка асимметрии

df.skew()
Age                         0.413286
Attrition                   1.844366
BusinessTravel             -1.439006
DailyRate                  -0.003519
Department                  0.172231
DistanceFromHome            0.958118
Education                  -0.289681
EducationField              0.550371
EmployeeCount               0.000000
EmployeeNumber              0.016574
EnvironmentSatisfaction    -0.321654
Gender                     -0.408665
HourlyRate                 -0.032311
JobInvolvement             -0.498419
JobLevel                    1.025401
JobRole                    -0.357270
JobSatisfaction            -0.329672
MaritalStatus              -0.152175
MonthlyIncome               1.369817
MonthlyRate                 0.018578
NumCompaniesWorked          1.026471
Over18                      0.000000
OverTime                    0.964489
PercentSalaryHike           0.821128
PerformanceRating           1.921883
RelationshipSatisfaction   -0.302828
StandardHours               0.000000
StockOptionLevel            0.968980
TotalWorkingYears           1.117172
TrainingTimesLastYear       0.553124
WorkLifeBalance            -0.552480
YearsAtCompany              1.764529
YearsInCurrentRole          0.917363
YearsSinceLastPromotion     1.984290
YearsWithCurrManager        0.833451
dtype: float64

Согласно предположению, асимметрия больше 0,5 и меньше -0,5 считается аномальным распределением.

Построение моделей машинного обучения

Разделение данных

x = df.drop («Истощение», ось = 1)

y = df ["Истощение"]

Удаление асимметрии

df_x = power_transform(x)
df_x = pd.DataFrame(df_x)

Standard_Scalar

from sklearn.preprocessing import StandardScaler
scalar = StandardScaler()
x = scalar.fit_transform(x)

Поиск наилучшего случайного состояния для получения модели с хорошей точностью

maxAccu = 0
maxRS = 0
for i in range(1,200):
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.23,random_state=i)
    LR =LogisticRegression()
    LR.fit(x_train,y_train)
    pred = LR.predict(x_test)
    acc = accuracy_score(y_test,pred)
    if acc > maxAccu:
        maxAccu = acc
        maxRS = i
print(f"Best accuracy is {maxAccu} and best random state {maxRS}")
Best accuracy is 0.9144542772861357 and best random state 120

# Разделение тестовых и обучающих данных
x_train, x_test, y_train, y_test = train_test_split (x, y, test_size = 0.23, random_state = 120)

# Размер набора данных для обучения и тестирования
print («X_train», x_train.shape)
print («y_train», y_train.shape)
print («x_test», x_test.shape)
print («y_test», y_test.shape)

X_train (1131, 34)
y_train (1131,)
x_test (339, 34)
y_test (339,)

Создание моделей машинного обучения

Модель логистической регрессии

# Checking the accuracy of the value ,confusion matrix,classification report
def metrics_model(y_test,pred):
    print("Accuracy score is",accuracy_score(y_test,pred))
    print("."*80)
    print("Confusion matrix value is:\n",confusion_matrix(y_test,pred))
    print("."*80)
    print(classification_report(y_test,pred))
lg = LogisticRegression()
lg.fit(x_train,y_train)
pred =lg.predict(x_test)
metrics_model(y_test,pred)
Accuracy score is 0.9144542772861357
................................................................................
Confusion matrix value is:
 [[293   3]
 [ 26  17]]
................................................................................
              precision    recall  f1-score   support

           0       0.92      0.99      0.95       296
           1       0.85      0.40      0.54        43

    accuracy                           0.91       339
   macro avg       0.88      0.69      0.75       339
weighted avg       0.91      0.91      0.90       339

Регрессия дерева решений

from sklearn.tree import DecisionTreeRegressor
dcr = DecisionTreeRegressor()
dcr.fit(x_train,y_train)
prec = dcr.predict(x_test)
metrics_model(y_test,prec)
Accuracy score is 0.7964601769911505
................................................................................
Confusion matrix value is:
 [[253  43]
 [ 26  17]]
................................................................................
              precision    recall  f1-score   support

           0       0.91      0.85      0.88       296
           1       0.28      0.40      0.33        43

    accuracy                           0.80       339
   macro avg       0.60      0.63      0.61       339
weighted avg       0.83      0.80      0.81       339
Accuracy score is 0.7964601769911505
................................................................................
Confusion matrix value is:
 [[253  43]
 [ 26  17]]
................................................................................
              precision    recall  f1-score   support

           0       0.91      0.85      0.88       296
           1       0.28      0.40      0.33        43

    accuracy                           0.80       339
   macro avg       0.60      0.63      0.61       339
weighted avg       0.83      0.80      0.81       339
Accuracy score is 0.7964601769911505
................................................................................
Confusion matrix value is:
 [[253  43]
 [ 26  17]]
................................................................................
              precision    recall  f1-score   support

           0       0.91      0.85      0.88       296
           1       0.28      0.40      0.33        43

    accuracy                           0.80       339
   macro avg       0.60      0.63      0.61       339
weighted avg       0.83      0.80      0.81       339
Accuracy score is 0.7964601769911505
................................................................................
Confusion matrix value is:
 [[253  43]
 [ 26  17]]
................................................................................
              precision    recall  f1-score   support

           0       0.91      0.85      0.88       296
           1       0.28      0.40      0.33        43

    accuracy                           0.80       339
   macro avg       0.60      0.63      0.61       339
weighted avg       0.83      0.80      0.81       339

Гиперпараметрическая настройка

from sklearn.model_selection import GridSearchCV
params = {'criterion':["mse", "friedman_mse", "mae"],'splitter': ["best", "random"]}
dcrh = GridSearchCV(DecisionTreeRegressor(),params,cv=5)
dcrh.fit(x_train,y_train)
dcrh.best_params_
dcr = DecisionTreeRegressor(criterion='mse',splitter='random')
dcr.fit(x_train,y_train)
prec = dcr.predict(x_test)
metrics_model(y_test,prec)
Accuracy score is 0.7817109144542773
................................................................................
Confusion matrix value is:
 [[247  49]
 [ 25  18]]
................................................................................
              precision    recall  f1-score   support

           0       0.91      0.83      0.87       296
           1       0.27      0.42      0.33        43

    accuracy                           0.78       339
   macro avg       0.59      0.63      0.60       339
weighted avg       0.83      0.78      0.80       339

Заключительные замечания.

Модель классификации дерева решений дает хорошую точность.

Метрики: Кривая AUC ROC

from sklearn.metrics import roc_curve,roc_auc_score,plot_roc_curve
Y_pred_pb =lg.predict_proba(x_test)[:,1]
fpr,tpr,thereshold = roc_curve(y_test,Y_pred_pb)
roc_auc_score(y_test,Y_pred_pb)
plot_roc_curve(dcr,x_test,y_test)

Сохранение модели

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

Библиотека Joblib используется для сохранения объекта модели классификации дерева решений.

import joblib
#First Method
joblib.dump(lg,"HR_Analytics.obj")
#loding model to file
job=joblib.load("HR_Analytics.obj")
job