基于之前的理论学习来进行属性间的数据分析
1.交叉分析
我们得到一张数据表,直观最有的两个分析切入点:
1)从列的角度进行分析,分析每个属性的特点并进行归纳和总结;
2)从行的角度进行分析(从案例的角度),尤其当数据有了标注了的时候,以标注为关注点,案例分析越多,也就越接近数据整体的质量。
这两种分析忽略了数据属性间的关联性,有时并不能得到最为真实客观的结论。故用到
交叉分析含义较广,到涉及的分析方法也。比较多如:
1)我们可以取两列(两个属性)根据我们学到的假设检验的方法判断他们之间是否有联系;
2)也可以直接以一个(或几个)属性为行,另一个(或几个)属性为列做出个交叉表(透视表),可以根据这个分析两个或多个属性间的关系。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as ss
#使用独立t检验方法看下各个部门离职率是否有明显差异
#基本思路:得到各个部门的离职分布,然后两两间求他们的t检验统计量,并求出P值。
df = pd.read_csv("./HR.csv")
# 记得使用数据前先进行预处理
df =df.dropna(how="any",axis=0)
df =df[df["satisfaction_level"]<1][df["salary"]!='nme'][df["department"]!= 'sale']
# indices得到分组后的索引
dp_indices = df.groupby(by="department").indices
# iloc根据标签的所在位置,从0开始计数,选取列
# values取值
sales_values=df["left"].iloc[dp_indices["sales"]].values
technical_values= df["left"].iloc[dp_indices["technical"]].values
# 打印出它的t统计量,只打印它的P值
print(ss.ttest_ind(sales_values,technical_values)[1])
#怎么两两求P值?
#注意:python3中所有的keys得加个list才能转换为数组
dp_keys=list(dp_indices.keys())
# 初始化个矩阵,宽高都是dp_keys的长度
dp_t_mat=np.zeros([len(dp_keys),len(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]
if p_value<0.05:
dp_t_mat[i][j]=-1
else:
dp_t_mat[i][j]=p_value
sns.heatmap(dp_t_mat,xticklabels=dp_keys,yticklabels=dp_keys)
plt.show()
# 颜色越深,越接近0,他们之间离职率是没有关系的(有显著差异的)
#不是黑的则离职率没有显著差异