前言
交叉分析是属性间的数据分析。本次实验中我们主要分析离职率(“left”)与各部门(“depar”)之间的关系,各部门之间的离职率是否有明显的差异,使用到的是独立t检验方法。
本篇文章中需要用到的库如下:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as ss
import seaborn as sns
操作步骤如下:
一、读取数据
df=pd.read_csv("./data/HR.csv")
需要注意的是这里的HR.csv中的异常值已经删除了。
二、按部门分组并获取部门对应的值,进行独立t检验
pd_indices=df.groupby(by="department").indices # indices的使用会在本篇末补充
salary_values=df["left"].iloc[pd_indices["salary"]].values
print(salary_values)
techinical_values=df["left"].iloc[pd_indices["techinical"]].values
print(techinical_values)
print(ss.ttest_ind(salary_valuea,techinical_values)[1]) # 只需要p值所以加了一个索引
到此步运行结果为:
三、如何两两之间求均值?
构建矩阵,双重循环遍历
dp_keys=list(dp_indices.keys())
dp_t_mat=np.zeros([len(dp_keys),len(dp_keys)]) # 生成一个dp_keys*dp_keys的矩阵
for i in range(dp_keys):
for j in range(dp_keys):
r_values=ss.ttest_ind(df["left"].iloc[dp_indices[dp_keys[i]]].values,df["left"].iloc[pd_indices[dp_keys[j]]].values)
dp_t_mat[i][j]=p_values
sns.heatmap(dp_t_mat,xticklabels=dp_keys,yticklabels=dp_keys)
plt.show()
输出结果为:
由此可以看出颜色越深,离职率与部门之间是没有关系的,即部门之间的离职率没有显著差异。
交叉分析的另一种方式:透视表
piv_tv=pd.pivot_table(df,values="left",index=["promotion_last_5years","salary"],columns=["Work_accident"],aggfunc=np.mean)
print(piv_tv)
sns.heatmap(piv_tv,vmin=0,vmax=1,cmap=sns.color_palette("Reds",n_colors=200))
plt.show()
输出结果如下:
可以看出有一个数据相较而言是比较大的,即0.331728,表示过去五年没有晋升,薪资水平为low,且没有工作事故的离职率较高。
补充
测试数据 test
test数据为HR中的极小部分数据,以此展示比较清晰的方法使用。
indices
可以看出indices就是将分类“department”中的每一个元素的索引返回,即IT位于5,6,7,8,9,13的位置。
iloc和loc
iloc是靠行数索引
loc是靠定义的索引来索引
values
以列表的方式返回数据。
有帮助的话,点个赞再走吧~
转载:https://blog.csdn.net/Yeexxxx___/article/details/115681122
查看评论