題目: 幫助 HR 做員工去留分析
第一步:處理資料
1. 引入基礎資料
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
df = pd.read_csv('/Users/rachel/Downloads/py-master/ML/7_logistic_reg/Exercise/HR_comma_sep.csv')
df.head()
輸出:
上表中的各個列就是對員工多維度的資料統計, 最終體現員工去留的就是 left
列, left
列的值只有 0 和 1, 0 表示留下, 1 表示離開.
首先根據現有資料分析哪些維度會對員工的去留(也就是 left
列的值)產生比較大的影響.
2. 檢視整個表中員工的去留人數分別是多少
// 檢視資料中離開員工的人數
left = df[df.left==1]
left.shape
輸出:
(3571, 10)
dataframe 的 shape 屬性可以檢視整個 dataframe 共有多少行多少列,所以這裡就是 3571行 * 10列。也即是說,共有 3571位員工離開。
// 檢視資料中留下員工的人數
retained = df[df.left==0]
retained.shape
輸出:
(11428, 10)
表示共有 11428 位員工留下來。
3. 分析真正影響員工去留的欄位
根據 left 欄位進行分組, 並取平均值
df.groupby('left').mean()
輸出:
利用 pandas 的 crosstab 函式分析 salary 對 left 值的影響, 再以柱形圖輸出
pd.crosstab(df.salary, df.left).plot(kind='bar')
從結果可以看出高工資的人留下來的佔比比較大.
利用 pandas 的 crosstab 函式分析 Department 對 left 值的影響, 再以柱形圖輸出
pd.crosstab(df.Department, df.left).plot(kind='bar')
從結果可以看出部門對 left 值的影響不是很明顯
以上分析了各個欄位對 left 值的影響, 最後總結以下幾個欄位對 left
值的影響比較大, 所以後面將通過這些欄位來訓練資料模型。
4. 保留有用欄位生成新的 dataframe
df_new = df[['satisfaction_level', 'average_montly_hours', 'Work_accident', 'promotion_last_5years', 'salary']]
df_new.head()
輸出:
5. 通過 pandas 的 get_dummies 函式把 salary 列數字化
salary_dummies = pd.get_dummies(df.salary, prefix='salary')
df_with_dummies = pd.concat([df_new, salary_dummies], axis='columns')
df_with_dummies.head()
輸出:
// 去掉 salary 列
df_with_dummies.drop('salary', axis='columns', inplace=True)
df_with_dummies.head()
輸出:
// 去掉 salary_medium 列
df_with_dummies.drop('salary_medium',axis='columns', inplace=True)
df_with_dummies.head()
輸出:
6. 準備用於訓練模型的資料
X = df_with_dummies
X.head()
輸出:
y = df.left
y.head()
輸出:
0 1
1 1
2 1
3 1
4 1
Name: left, dtype: int64
第二步:訓練模型
1. 取出 20% 資料做測試用
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
2. 使用 LogisticRegression 訓練模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
3. 分析模型準確度
model.score(X_test, y_test) // 輸出 0.7773333333333333