小言_互联网的博客

Python交叉分析学习笔记

246人阅读  评论(0)

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()

图表如下:
如上图所示,颜色越深的部分,离职率越高。


转载:https://blog.csdn.net/weixin_41593976/article/details/102156982
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场