はじめに
従業員の業績評価は、個々の成長はもとより、組織全体の進歩に寄与する要素です。適切な評価は、モチベーションの向上、キャリアパスの策定、そして人材の適正配置といった戦略的人事決定に不可欠です。今回のブログでは、プログラミング言語Pythonの力を借りて、これらの評価がどのように行われ、分析され、そして組織の決定に影響を与えるのかを探究します。
目的
この分析の目的は、人事評価データを通じて、昇進者の共通点や特徴を明らかにし、人事の意思決定プロセスにおける透明性と公平性を向上させるための洞察を得ることです。
実行環境
Python 3.7.12
kaggle notebook
実装したコード
!pip install japanize-matplotlib
import japanize_matplotlib
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import plotly.express as px
from plotly.offline import init_notebook_mode
init_notebook_mode(connected=True)
df=pd.read_csv("/kaggle/input/employees-evaluation-for-promotion/employee_promotion.csv")
読み込んだデータを表示
df.head()
データに含まれる数値的特徴の統計情報
df.describe()
データフレームの構造を把握(欠損値を探しデータの補完)
df.info()
データフレーム内の各列の欠損値の個数を算出
df.isnull().sum()
欠損値を近くの値をもとに推測して補完しもう一度欠損値を算出
df.interpolate(inplace=True)
df.isnull().sum()
ここで補完できないデータが存在したので強制的に削除
df.dropna(inplace=True)
df.isnull().sum()
ここから各カラムと昇進の関係性を可視化
従業員の学歴、受賞歴
px.pie(df,values='awards_won',names='education',template='plotly_dark')
従業員の数と受賞歴
plt.figure(figsize=(6,6))
sns.barplot(x='education',y='employee_id',hue='is_promoted',data=df)
plt.show()
従業員の男女比率
sns.countplot(x='gender',data=df,palette='Greens_d')
男女別の年齢による昇進
plt.figure(figsize=(17,6))
sns.violinplot(x='age',y='gender',hue='is_promoted',data=df)
plt.show()
*男性は30歳くらいが多く、女性は35歳くらいが多くなってます。なぜか年齢による違いがあるようです。
部門別に昇進した人
px.pie(df,values='is_promoted',names='department',template = 'plotly_dark')
*部門別で人数の偏りがあるので割合にはかなりの誤差が見られます
データの相関性
df.corr()
わかりやすくグラフ化
plt.figure(figsize=(12,7))
sns.heatmap(df.corr(),annot=True,cmap='Blues')
plt.show()
*色の濃い部分が関係性が強くなります。年齢(age)と勤続年(lenge_of_service)の数値が高くなってます。
予測
df.head()
予測に必要のないと思われるカラムを削除します
df.drop('employee_id',axis=1,inplace=True)
df.drop('region',axis=1,inplace=True)
df.drop('department',axis=1,inplace=True)
*社員id(employee_id)、各支店(region)、部署(department)
df.head()
*カラムから削除したテーブルデータ
機械学習アルゴリズムで利用可能な形式(数値)に変換
from sklearn.preprocessing import LabelEncoder
l=LabelEncoder()
for i in df.columns:
if df[i].dtype == 'object':
df[i]=l.fit_transform(df[i])
カラム内を可視化
import matplotlib.pyplot as plt
for i in range(len(df.columns)):
print(df.columns[i])
df[df.columns[i]].hist()
plt.show()
データセットを特徴量(features)とターゲット変数(target variable)に分割
x=df.drop('is_promoted',axis=1)
y=df['is_promoted']
*
特徴量(x)とターゲット変数(y)のデータセットをトレーニングセットとテストセットに分割
from sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.30)
異なる特徴量が異なる範囲の値を共通のスケールに正規化する(各特徴量の最小値が0、最大値が1)
from sklearn.preprocessing import MinMaxScaler
mms=MinMaxScaler(feature_range=(0,1))
xtrain=mms.fit_transform(xtrain)
xtest=mms.fit_transform(xtest)
xtrain=pd.DataFrame(xtrain)
xtest=pd.DataFrame(xtest)
異なる機械学習モデルの評価指標を格納するための構造を定義
R= {'Model':[],'Accuracy':[],'Recall':[],'Precision':[],'F1':[]}
機械学習モデルのパフォーマンスを比較するため視覚化するデータフレームを作成
Results=pd.DataFrame(R)
Results.head()
機械学習のアルゴリズム(データから学習しタスクを実行するための予測モデルを構築)
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
lr=LogisticRegression()
dc=DecisionTreeClassifier()
rf=RandomForestClassifier()
kc= KNeighborsClassifier()
model=[lr,dc,rf,kc]
for models in model:
models.fit(xtrain,ytrain)
ypred=models.predict(xtest)
print('Model :',models)
print('-----------------------------------------------------------------------------------------------------------------------')
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score,recall_score,f1_score,precision_score
print('confusion matrix :',confusion_matrix(ytest,ypred))
print('classification report:',classification_report(ytest,ypred))
print('accuracy :',round(accuracy_score(ytest,ypred),2))
print('precision :',round(precision_score(ytest,ypred),2))
print('recall :',round(recall_score(ytest,ypred),2))
print('f1 :',round(f1_score(ytest,ypred),2))
print()
R={'Model':models,
'Accuracy':round(accuracy_score(ytest,ypred),2),
'Recall':round(recall_score(ytest,ypred),2),
'Precision':round(precision_score(ytest,ypred),2),
'F1':round(f1_score(ytest,ypred),2)
}
Results=Results.append(R,ignore_index=True)
LogisticRegression (ロジスティック回帰):
これは分類問題に使用される線形モデルで、特に二値分類問題に適しています。
出力は0と1の間の確率として得られ、特定の閾値(通常は0.5)を超えると、対象がクラス1に属すると予測されます。
DecisionTreeClassifier (決定木分類器):
決定木は、データを分類するために学習した一連の質問に基づいてモデルを構築します。
このモデルは、非線形関係にも適応でき、特徴量のスケーリングを必要としません。
RandomForestClassifier (ランダムフォレスト分類器):
ランダムフォレストは、多数の決定木を構築し、各木の予測の平均を取ることによって動作します(分類の場合は「多数決」方式)。
これにより、個々の決定木の過剰適合を防ぎ、より堅牢で精度の高いモデルが生成されます。
KNeighborsClassifier (k近傍分類器):
k近傍法は、与えられたデータポイントに最も近いk個のトレーニングサンプルを見て、それらの多数決に基づいてクラスを予測します。
この方法は非常に直感的であるが、大きなデータセットや高次元データセットでは計算コストが高くなる可能性があります。
分析結果の比較
Accuracy: モデルの正確さ(accuracy)を表す指標で、全予測のうち正しい予測の割合を示します。
Recall: 再現率(recall)または真陽性率(sensitivity)とも呼ばれ、実際の陽性サンプルのうち正しく陽性と予測されたサンプルの割合です。
Precision: 精度(precision)とは、陽性と予測されたサンプルのうち実際に陽性であるサンプルの割合です。
F1: F1スコアは、精度と再現率の調和平均を取ったもので、精度と再現率のバランスを示します。
勾配ブースティングマシン(Gradient Boosting Machines, GBM)
*上記のコードとは別により良い精度を求めて!
勾配ブースティングマシン(Gradient Boosting Machines, GBM)は、アンサンブル学習アルゴリズムの一種であり、特に教師あり学習の文脈で使用されます。アンサンブル学習は、複数の予測モデルを組み合わせて、単一のモデルよりも優れた予測を行う手法です。勾配ブースティングは、このアプローチの中でも特に強力な手法の一つとされています。
GBMは、弱い予測モデル(通常は決定木)の集合を段階的に構築します。各ステップで、現在のアンサンブルがデータに対してどのように間違った予測をしているか(すなわち、残差)に基づいて、新しいモデルが追加されます。この新しいモデルは、前のモデルの予測の誤差を最小化するように訓練されます。このプロセスは反復的に行われ、各反復で予測性能を少しずつ改善していきます。
勾配ブースティングの「勾配」という用語は、各ステップで予測の残差に対して勾配降下法を用いることから来ています。勾配降下法は、予測誤差を減少させるためにモデルのパラメータを更新するための一般的な最適化手法です
#必要なモジュールのインストール
!pip install LightGBM
import numpy as np
import pandas as pd
import lightgbm as lgb
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
import seaborn as sns
#XGBoostで学習するためのデータ形式に変換
dtrain = lgb.Dataset(xtrain, ytrain)
dvalid = lgb.Dataset(xtest, ytest)
#モデルパラメータの設定
params = {'objective':'multiclass','num_class':2,'metric' : {'multi_error'}}
model = lgb.train(params,dtrain)
#予測の実行と書き出し
pred_prob = model.predict(xtest)
pred = np.argmax(pred_prob,axis = 1)
print(pred)
#日本語対応
sns.set(font=['Meiryo','Yu Gothic'])
print('confusion matrix :',confusion_matrix(ytest,ypred))
print('classification report:',classification_report(ytest,ypred))
print('accuracy :',round(accuracy_score(ytest,ypred),2))
print('precision :',round(precision_score(ytest,ypred),2))
print('recall :',round(recall_score(ytest,ypred),2))
print('f1 :',round(f1_score(ytest,ypred),2))
print()
# 性能向上に寄与する度合いで重要度をプロット
lgb.plot_importance(model, height = 0.5, figsize = (8,16))
GBMの主な特徴は以下のとおりです
強力な予測能力:GBMは弱いモデルを多数組み合わせることで、非常に強力な予測モデルを構築できます。
柔軟性:回帰、分類、ランキングなど、さまざまな種類の予測問題に対応できます。
最適化:損失関数を最小化するように設計されており、カスタム損失関数を使用することもできます。
過学習の抑制:学習率(shrinkage)やサブサンプリング(stochastic boosting)などのテクニックを使用することで、過学習を抑制することができます。
予測結果
各カラムにおける重要度
性能向上に寄与する度合いで重要度をプロット
lgb.plot_importance(model, height = 0.5, figsize = (8,16))