数据样本和分析结果
本学渣补充数学知识点:
1 Pearson Correlation(皮尔逊相关系数),详见
这里我自己先创建一个表格,
重点关注A和B,因为我输入的时候是线性相关的,
CDE 三个栏完全随机,
F 和 G 有一定相关性,但是不如A和B那么明显,
H,I,J 也是乱输入的完全随机。
给出两个代码结果,分别是
给出显著性和不给出显著性的运行结果:
运行一下看看:
不给出显著性的结果:
给出显著性的结果:
两个图对比发现图二多了一些星星
代表相关性等级,F和G 的相关性没有A和B高,这和我之前预想的结果一样。
代码的讲解
下面用到的基础知识和函数参数补充:
- pandas——相关系数函数corr(),可选参数(不加默认第一个)代表不同的相关性系数。
本例代码中用法按默认来的, df_coor=df.corr()返回值是一个相关系数的矩阵
API详见 - 相关系数的数学公式补充
- plt.figure()参数 说明
- 注意 重点: plt.gca() 获取当前坐标轴,目的是为了便于下一步的移动,效果如下图,感觉秀婷学姐的图可以用这个函数画,具体怎么移动的代码,详见知乎大佬,我下个代码专门琢磨一下帮秀婷学姐搞一搞
- np.zeros_like(),返回一个和传入的矩阵 形状一样,但是值全为0的矩阵,详见
- np.triu_indices_from(mask):返回方阵的上三角矩阵的索引,API详见,具体用法
- np.flipud() 用于翻转列表,将矩阵进行上下翻转,详见
- np.rot90()将矩阵img逆时针旋转90°
- sns.heatmap()这里的参数除了data以外,其他的都有默认值,所以首先会用基础的,知道怎么传递data是第一步。详见
- 补充一个sns.heatmap()函数用到的参数mask:用于突出显示某些数据,详见
- ax1.tick_params()参数,both 是指对横轴和纵轴都操作,后面的参数是长度,其余参数详见
mask那一坨代码完成了两件事:
1 去重
2 去掉一半的矩阵,如果不去掉的效果类似这样
或者这样
去掉一半显得更加简洁明了
附代码和运行结果
代码:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import pearsonr
import matplotlib as mpl
def cm2inch(x,y):
return x/2.54,y/2.54
size1 = 10.5
#这块设置字体的,人家设置的本来已经很漂亮了,暂时不关注
mpl.rcParams.update(
{
'text.usetex': False,
'font.family': 'stixgeneral',
'mathtext.fontset': 'stix',
"font.family":'serif',
"font.size": size1,
"font.serif": ['Times New Roman'],
}
)
fontdict = {'weight': 'bold','size':size1,'family':'SimHei'}
#这个地方,放你的Excel文件路径
fp = r'E:\data\test.xlsx'
#这个地方放你的表格里面sheet名称,默认是‘sheet1’,一般不用修改
df = pd.read_excel(fp,sheet_name='Sheet1',header = 0)
#这个函数可选参数为你要使用的相关系数,返回一个含有相关系数的矩阵
df_coor=df.corr()
#指定画图的尺寸,详见博客
fig = plt.figure(figsize=(cm2inch(16,12)))
#plt.gca( )中完成,gca就是get current axes的意思
#先获取当前轴,便于下一步移动,作出你想要的效果。
ax1 = plt.gca()
#构造mask,去除重复数据显示
#返回一个类似形状的元素全为0的矩阵,详见博客
mask = np.zeros_like(df_coor)
print('step1')
print(mask)
#把这个全0元素矩阵的上三角部分赋值为1(也就是true)
mask[np.triu_indices_from(mask)] = True
#用一个mask2 来接收 这个 上三角元素都为1的矩阵
print('step2')
print(mask)
mask2 = mask
# 从这开始 我也看不懂了 每一步都知道啥意思,但是连起来就不知道了
#但是不影响,每次运行完 我加一个print语句输出这个mask是啥,这样就清晰了
mask = (np.flipud(mask)-1)*(-1)
print('step3')
print(mask)
mask = np.rot90(mask,k = -1)
print('step4-------')
print(mask)
im1 = sns.heatmap(df_coor,annot=True,cmap="RdBu"
, mask=mask#构造mask,去除重复数据显示
,vmax=1,vmin=-1
, fmt='.2f',ax = ax1)
ax1.tick_params(axis = 'both', length=0)
#此处填写保存文件的路径
plt.savefig(r'E:\data\r_demo.png',dpi=600)
plt.show()
运行结果:
step1
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
step2
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[0. 0. 1. 1. 1. 1. 1. 1. 1. 1.]
[0. 0. 0. 1. 1. 1. 1. 1. 1. 1.]
[0. 0. 0. 0. 1. 1. 1. 1. 1. 1.]
[0. 0. 0. 0. 0. 1. 1. 1. 1. 1.]
[0. 0. 0. 0. 0. 0. 1. 1. 1. 1.]
[0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
step3
[[ 1. 1. 1. 1. 1. 1. 1. 1. 1. -0.]
[ 1. 1. 1. 1. 1. 1. 1. 1. -0. -0.]
[ 1. 1. 1. 1. 1. 1. 1. -0. -0. -0.]
[ 1. 1. 1. 1. 1. 1. -0. -0. -0. -0.]
[ 1. 1. 1. 1. 1. -0. -0. -0. -0. -0.]
[ 1. 1. 1. 1. -0. -0. -0. -0. -0. -0.]
[ 1. 1. 1. -0. -0. -0. -0. -0. -0. -0.]
[ 1. 1. -0. -0. -0. -0. -0. -0. -0. -0.]
[ 1. -0. -0. -0. -0. -0. -0. -0. -0. -0.]
[-0. -0. -0. -0. -0. -0. -0. -0. -0. -0.]]
step4-------
[[-0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[-0. -0. 1. 1. 1. 1. 1. 1. 1. 1.]
[-0. -0. -0. 1. 1. 1. 1. 1. 1. 1.]
[-0. -0. -0. -0. 1. 1. 1. 1. 1. 1.]
[-0. -0. -0. -0. -0. 1. 1. 1. 1. 1.]
[-0. -0. -0. -0. -0. -0. 1. 1. 1. 1.]
[-0. -0. -0. -0. -0. -0. -0. 1. 1. 1.]
[-0. -0. -0. -0. -0. -0. -0. -0. 1. 1.]
[-0. -0. -0. -0. -0. -0. -0. -0. -0. 1.]
[-0. -0. -0. -0. -0. -0. -0. -0. -0. -0.]]