作者:暖倪2502938803 | 来源:互联网 | 2023-09-25 15:44
Python交叉分析学习笔记本文将介绍两种方法来进行交叉分析:1.独立T检验2.数据透视表。数据源:百度网盘,课程来源:慕课网数据源共包括10个变量,如下:satisfaction
Python交叉分析学习笔记
本文将介绍两种方法来进行交叉分析:1.独立T检验 2.数据透视表。
数据源:百度网盘,课程来源:慕课网
数据源
共包括10个变量,如下:satisfaction_level(满意度),last_evaluation(上司评价),number_project(项目数量),average_monthly_hours(每月工作市场),time_spend_company(在公司的时间),Work_accident(工作事故),left(离职率),promotion_last_5years(五年内是否晋升),department(部门),salary(工资高低)。
方法1:独立T检验
任意取数据中的两个属性,根据独立T检验结果,判断两者之间的关系。
1.导入数据
df=pd.read_csv(r'C:\Users\me\Desktop\HR.csv')
#‘r’在这里起转置作用
2.引入必要的模块
import pandas as pd
import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import seaborn as sns
3.数据清理
(1)去掉空值
df=df.dropna(how='any',axis=0)
#axis=0表示删除整行的数据,how=‘any’表示只要这一行有一个空值就需要删除整行
(2)去掉异常值
df=df[df['last_evaluation']<=1][df['salary']!='nme'][df['department']!='sale']
#根据异常值的判断,‘last_evaluation’应小于1,‘salary’应去掉‘nme’这个值,‘department’应去掉‘sale’这个值
4.判断各个部门的离职率是否存在差异
基本思路是对各个部门的离职分别,两两求T检验统计量,得出p值,目的是得到各个部门的离职分布。
dp_indices=df.groupby(by='department').indices
#基于‘department’分组,并得到索引
sales_values=df['left'].iloc[dp_indices['sales']].values
#取出‘sales’部门的值
technical_values=df['left'].iloc[dp_indices['technical']].values
#取出‘technical’部门的值
print(ss.ttest_ind(sales_values,technical_values)[1])
#输出T检验统计量,‘[1]’索引表示只取p值
5.两两变量间求p值
dp_keys=list(dp_indices.keys())
#取出indices的key,注意python3中需要加list才能变成数组
dp_t_mat=np.zeros([len(dp_keys),len(dp_keys)])
#建立矩阵,长和宽均为dp_keys的长度
for i in range(len(dp_keys)):
for j in range(len(dp_keys)):
p_value=ss.ttest_ind(df['left'].iloc[dp_indices[dp_keys[i]]].values,
df['left'].iloc[dp_indices[dp_keys[j]]].values)[1] #求独立T检验值
if p_value<0.05:
dp_t_mat[i][j]=-1 #判断条件,p<0.05,直接赋值-1
else:
dp_t_mat[i][j]=p_value #对矩阵进行赋值
sns.heatmap(dp_t_mat,xticklabels=dp_keys,yticklabels=dp_keys)
#画热力图
得出图表如下:
黑色部分代表p<0.5,表明各部门之间的离职率存在着显著差异,其他颜色部分代表未存在显著差异。
方法2:数据透视表方法
piv_tb=pd.pivot_table(df,values='left',index=['promotion_last_5years','salary'],
columns=['Work_accident'],aggfunc=np.mean)
#建立数据透视表,值为‘left’,横坐标为‘promotion_last_5years’和‘salary’,聚合方法为mean
得到的透视表如下:
行promotion_last_5years代表过去五年是否有晋升,0代表否,1代表是;列Work_accident代表是否有工作事故,0代表没有,1代表有,0.331728这个值比较大,需要重点关注,这个值表明过去五年没有工作事故,也没有晋升,但salary(工资)较低的这类人可能离职率更高。
下面根据数据透视表画热力图
sns.heatmap(piv_tb,vmin=0,vmax=1,cmap=sns.color_palette('Reds',n_colors=256))
#指定最小值为0,最大值为1,用seaborn中color_palette进行调色,代码详见seaborn官网
plt.show()
图表如下:
如上图所示,颜色越深的部分,离职率越高。