Сивакумар 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