ピープルアナリティクス・ケーススタディ:ロジスティック回帰分析で離職リスク分析に挑戦!①
ロジスティック回帰分析とは
ピープルアナリティクスで離職リスク分析(どういう人が退職のリスクが高いかを過去のデータから導き出す。さらに予測モデルを作るものも)はポピュラーなものの一つです。
組織にとって社員の退職は大きな痛手ですし、事前にどういう人が退職しそうかということがわかれば、少なからず手を打つことができるかもしれません。
ということで、以前Plotly Expressを使ったPythonでのグラフの可視化でご紹介した、離職リスク分析(Turnover Analysis) のケーススタディを用いて実際の離職リスク分析を行っていきたいと思います。
データ分析のための元データもあり、ケーススタディとしてはもってこいですね。
こちらのケーススタディで利用されている分析手法が①ロジスティック回帰、②決定木分析です。
理由は扱いが簡単で、どの要因(統計的に言うと独立変数(従属変数)にあたる項目ですね)が退職に影響を与えているのかを説明しやすいからということでした。
実は、ロジスティック回帰は2年前ほどにPythonを使ったデータ分析講座で習った時にいまいちピンときませんでした。
単回帰や重回帰分析のようにX, Y で示される計算式だと何となく想像つくのですが、「0か1かで判断する回帰分析手法です」といわれてもピンとこないですよね。。
この分析を通じてやっとその便利さをわかったような気がします!
0か1かで判断するということは「2つの値に分ける」ということです。
例えば
*男性か女性か
*(ウィルスが)陰性か陽性か *今ホットトピックですが。。
*退職したか在籍中か
ちょうど前回のブログで前処理で0か1かにpythonで数値化する方法を書きましたが、「ダミー変数を考慮した分析ですと書いてあった本」*1もありました
ここではロジスティック回帰の根本的な原理については説明しませんが、以下のような前提を満たすことが必要です。
- 従属変数は2つの値であること(いわゆる0、1ですね)
- それぞれの観察データは独立していること(影響を与えないこと)
- 従属変数同士の値に相関性がないこと
- 独立変数とロジット変換した確率には直線的な関係があること
- サンプル数が多く必要:最低限必要なイベント発生(退職分析の場合退職者)=従属変数の数 × 10
最後の前提を考えると、変数を絞っていくということも重要ですね。実際ケーススタディの説明を見ていても、一度関係がありそうな従属変数群で分析を行って、さらに絞るという手法を使っています。
ただし、単回帰・重回帰分析と比べて、従属変数・独立変数が正規性に従わなくてもいい、残差のばらつきを考慮しなくてもいいなど、自由な部分もあります。
それにしてもそれぞれの分析手法での注意点はきちんとまとめていかないと分からなくなりますね。。😅
*1参考本
Pythonでのロジスティック回帰はやり方がいろいろあるが、一長一短。。
Pythonでのロジスティック回帰はいろいろな方法があります。おそらくもっとあるのでしょうが、statsmodelを使った事例とScikit-learnを使った事例を紹介します。
1.statsmodel.apiのロジット関数を使う
オリジナル文献:statsmodels.formula.api.logit — statsmodels
以下のような式で結果を出してくれます。
import statsmodels.formula.api as smf
import statsmodels.api as sm
logistic_model = sm.Logit(y, sm.add_constant(x)) *sm.add_constant(x)はxに定数項を追加するために必要
result=logistic_model.fit(disp=0)
print(result.summary())
*xは独立変数、yは従属変数です。以下同様
結果サンプル
利点
- それぞれの従属変数のp値も出してくれるため、どの変数が有効かどうかが一目でわかる=>次のロジスティック回帰分析をするために有効な数値
- 説明変数の列を式で明記しなくてもきちんと表示してくれる。
難点
- 予測モデルを作って検証することが難しそう。。できないことはないのでしょうが、次に紹介する、Sckit-learnのLogisticRegression関数よりずっとめんどくさそうです。(少なくとも今の私の時点ではできませんでした。。)
2.Scikit-learnのLogistic Regression関数を利用
オリジナル文献:sklearn.linear_model.LogisticRegression — scikit-learn 0.24.2 documentation
参考文献:Lec76-79_ロジスティック回帰 (tsjshg.info)
以下のような結果で出ます。
from sklearn.linear_model import LogisticRegression
logistic_model2=LogisticRegression()
result2= logistic_model2.fit(x, y)
summary2 =pd.DataFrame([x.columns, logistic_model2.coef_[0]]).T
summary2
statsmodelと数値の大小について傾向は似てると言えますが(特にp値的に有意なもの)、値が違いますね。。n参考文献にあるように機械学習だと考えると仕方がないのかしら。。
利点
- Accuracyスコアや予測モデルを作成していくことが簡単(作成したモデルのフィットがわかりやすい)
難点
- p値がでない。。
ロジスティック回帰の理解があいまいな中でこんなことをいうのはおこがましいかもしれませんが、各変数の有意性をstatsmodelで確かめ、変数を絞った後、Scikit-learnでモデルの正確性を確かめるというのが適切なのでしょうか。。
修業は続きます。