基于python的kaggle练习(二)——员工离职预测
程序员文章站
2024-03-22 09:02:46
...
前沿
目前社会上呈现出一种公司招不到人,大批失业人员的矛盾现象,且大部分公司的离职率居高不下,很多入职没多久就辞职,所花费的培训招聘等资源都浪费了。为了弄清楚公司员工离职原因,通过kaggle上某一家企业员工离职的真实数据来对离职率进行分析建模。
一、初识数据
1、数据来源
数据来源:https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1
2、载入数据
import pandas as pd
import numpy as np
data=pd.read_csv('/Desktop/数据分析/HR_comma_sep.csv')
data.shape
数据共有10列,14999行数据。
3、特征说明
二、 数据描述性分析
1、查看数据前5行
data.head()
2、查看数据类型
data.dtypes
3、数据描述性统计
data.describe()
data['left'].value_counts()/data['left'].count()
员工对公司的满意度: 范围 0.09~1, 中位数0.640, 均值0.613, 总体来说员工对公司较满意。
最新考核评估: 范围 0.36~1, 中位数0.720, 均值0.716, 员工考核平均水平中等偏上。
项目数: 范围 2~7个, 中位数4, 均值3.8, 平均参加项目数为4个。
平均每月工作时长: 范围96~310小时, 中位数200, 均值201。
工作年限: 范围2~10年, 中位数3, 均值3.5。
4、数据缺失值
data.isnull().any()
通过上述可以发现,数据都没有缺失值。
三、可视化分析
1、公司的满意程度对离职的影响
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.family'] = ['Arial Unicode MS'] #mac和windows有区别
plt.rcParams['axes.unicode_minus']=False #可以显示负数
sns.boxplot(data['left'],data['satisfaction_level'])
对比员工对公司的满意度评分,离职员工的评分明显偏低,且离职人员对公司满意度整体波动较大,大部分都在0.4左右,甚至有一部分0.2以下的低水平。
2、绩效评估对离职的影响
sns.boxplot(data['left'],data['last_evaluation'])
3、平均每月工作时长对离职的影响
sns.boxplot(data['left'],data['average_montly_hours'])
4、薪资水平对离职的影响
table=pd.crosstab(data.salary,data.left)
table.div(table.sum(1).astype(float), axis=0).plot(kind='bar', stacked=True)
plt.xlabel('Salary Level')
5、职业对离职的影响
table=pd.crosstab(data.sales,data.left)
table.div(table.sum(1).astype(float), axis=0).plot(kind='bar', stacked=True)
plt.xlabel('sales Level')
6、参加过的项目数对离职的影响
pd.crosstab(data.number_project,data.left).plot(kind='bar')
7、工作年限对离职的影响
pd.crosstab(data.time_spend_company,data.left).plot(kind='bar')
8、是否发生过过错对离职的影响
pd.crosstab(data.Work_accident,data.left).plot(kind='bar')
9、五年内是否升职对离职的影响
pd.crosstab(data.promotion_last_5years,data.left).plot(kind='bar')
四、数据预处理
1、薪资水平为定序变量, 因此将其字符型转化为数值型。
data['salary']=data['salary'].map({"low": 0, "medium": 1, "high": 2})
data['salary'].unique()
2、岗位是定类型变量, 对其进行one-hot编码。
data_one_hot=pd.get_dummies(data,prefix='sales')
3、划分数据集
from sklearn.model_selection import train_test_split
x=data.drop(['left'],axis=1)
y=data['left']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)
由于后续会进行多个模型的预测,因此提前划分数据集。
4、标准化处理
逻辑回归模型需要变量是标准化后数据。
from sklearn.preprocessing import StandardScaler
x_train1=x_train
x_test1=x_test
std=StandardScaler()
x_train1=std.fit_transform(x_train1)
x_test1=std.fit_transform(x_test1)
五、模型
a、逻辑回归模型
1、训练模型
from sklearn.linear_model import LogisticRegression
lg = LogisticRegression()
lg.fit(x_train1, y_train)
print("训练集准确率: ", lg.score(x_train1, y_train))
print("测试集准确率: ", lg.score(x_test1, y_test))
2、梯度下降优化算法
lg=LogisticRegression(solver='saga')
lg.fit(x_train1,y_train)
y_predict=lg.predict(x_test)
print("训练集准确率",lg.score(x_train1,y_train))
print("测试集准确率",lg.score(x_test1,y_test))
3、采用10折交叉验证确定c的最优值
from sklearn.linear_model import LogisticRegressionCV
Cs = 10**np.linspace(-10, 10, 400)
lr_cv = LogisticRegressionCV(Cs=Cs, cv=10, penalty='l2', solver='saga', max_iter=10000, scoring='accuracy')
lr_cv.fit(x_train1, y_train)
print(lr_cv.C_)
4、用最优的c=25.52908068,进行预测
LR = LogisticRegression(solver='saga', penalty='l2', C=25.52908068)
print(LR.fit(x_train1, y_train))
print("训练集准确率: ", LR.score(x_train1, y_train))
print("测试集准确率: ", LR.score(x_test1, y_test))
5、模型的准确率和召回率
from sklearn.metrics import classification_report
y_predict=LR.predict(x_test1)
print("准确率",lg.score(x_train1,y_train))
print("召回率:",classification_report(y_test,y_predict,target_names=["a","b"]))
b、朴素贝叶斯模型
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
#构建高斯朴素贝叶斯模型
gnb = GaussianNB()
gnb.fit(x_train, y_train)
print("训练集准确率: ", gnb.score(x_train, y_train))
print("测试集准确率: ", gnb.score(x_test, y_test))
X_train_pred =gnb.predict(x_train)
X_test_pred = gnb.predict(x_test)
print('训练集混淆矩阵:')
print(metrics.confusion_matrix(y_train, X_train_pred))
print('测试集混淆矩阵:')
print(metrics.confusion_matrix(y_test, X_test_pred))
print('训练集:')
print(classification_report(y_train, X_train_pred))
print('测试集:')
print(classification_report(y_test, X_test_pred))
c、决策树模型
from sklearn.tree import DecisionTreeClassifier as DTC
DTC1 = DTC().fit(x_train,y_train)
DTC1.score(x_test,y_test)
准确率:0.98133333333333328
d、模型评估——ROC曲线
from sklearn import metrics
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
%matplotlib inline
#将逻辑回归模型和高斯朴素贝叶斯模型预测出的概率均与实际值通过roc_curve比较返回假正率, 真正率, 阈值
lr_fpr, lr_tpr, lr_thresholds = roc_curve(y_test, LR.predict_proba(x_test)[:,1])
gnb_fpr, gnb_tpr, gnb_thresholds = roc_curve(y_test, gnb.predict_proba(x_test)[:,1])
#分别计算这两个模型的auc的值, auc值就是roc曲线下的面积
lr_roc_auc = metrics.auc(lr_fpr, lr_tpr)
gnb_roc_auc = metrics.auc(gnb_fpr, gnb_tpr)
plt.figure(figsize=(8, 5))
plt.plot([0, 1], [0, 1],'--', color='r')
plt.plot(lr_fpr, lr_tpr, label='LogisticRegression(area = %0.2f)' % lr_roc_auc)
plt.plot(gnb_fpr, gnb_tpr, label='GaussianNB(area = %0.2f)' % gnb_roc_auc)
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.title('ROC')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.legend()
plt.show()