目录
1、背景
2、连续变量的相关分析
2.1 使用条件
2.2 使用系数 pearson
2.2.1 系数计算逻辑
2.2.2 系数公式
2.2.3 结果解释
2.3 应用案例
2.4 相关系数的显著性检验
2.4.1 显著性检验案例
3、等级变量的相关分析
3.1 适用条件
3.2 使用系数 spearmanr
3.2.1 系数使用公式
4、连续变量&分类变量 相关分析
4.1 二列相关适用条件
4.2 二列相关公式
4.3 点二列相关适用条件
4.4 点二列相关公式
4.5 代码实现
5、类别变量相关分析
5.1 适用条件
5.2 使用卡方进行相关分析
用于考察变量间数量关联密切程度的统计分析方法,比如身高越高,体重一般会越大。
几乎所有涉及到多个变量的假设检验方法,都可以被看做是这些变量间的关联性分析。
1、t检验:分组变量与连续因变量间的关联性分析
2、卡方检验:行、列分类变量间的关联性分析
3、聚类分析:案例间的关联性分析
4、多变量回归:因变量和一组自变量间的关联性分析
以下是常见的相关分析以及代码实现:
两个变量都是连续正态连续变量,且两者之间呈线性关系。备注:在进行相关分析之前进行图表展示以查看数据是否为线性分布
# 图表展示的代码
import matplotlib.pyplot as plt
plt.scatter(x,y) #使用散点图
plt.show()
计算两个变量的协方差,协方差可以放映两个随机变量的相关程度,但是可能存在二维空间中分布的一些数据,变量之间相关程度较小,但是数据分布的比较离散,这样会导致求出的协方差值较大,只用协方差就不合理,所以pearson相关系数是在协方差的基础上除以两个随机变量的标准差。
该系数结果是一个-1到1之间的值,绝对值越大表明相关性越强,正数为正相关,负数为相关,相关系数为0,表明它们之间不存在线性相关关系。
#调用代码
np.corrcoef(a)#可计算行与行之间的相关系数,
np.corrcoef(a,rowvar=0)#用于计算各列之间的相关系数
#应用案例
import numpy as np
data = np.array([[10, 10, 8, 9, 7],
[4, 5, 4, 3, 3],
[3, 3, 1, 1, 1]])
np.corrcoef(data)
#输出结果,可见第一组数据和第三组数据相关性挺高
'''
array([[ 1. , 0.64168895, 0.84016805],
[ 0.64168895, 1. , 0.76376262],
[ 0.84016805, 0.76376262, 1. ]])
'''
np.corrcoef(data,rowvar=0) #用于计算列之间的相关系数
#输出结果
'''
array([[ 1. , 0.98898224, 0.9526832 , 0.9939441 , 0.97986371],
[ 0.98898224, 1. , 0.98718399, 0.99926008, 0.99862543],
[ 0.9526832 , 0.98718399, 1. , 0.98031562, 0.99419163],
[ 0.9939441 , 0.99926008, 0.98031562, 1. , 0.99587059],
[ 0.97986371, 0.99862543, 0.99419163, 0.99587059, 1. ]])
'''
假设:
H0:=0
H1:0
使用t检验统计量
import numpy as np
import scipy.stats as stats
import scipy
x = [10.35, 6.24, 3.18, 8.46, 3.21, 7.65, 4.32, 8.66, 9.12, 10.31]
y = [5.1, 3.15, 1.67, 4.33, 1.76, 4.11, 2.11, 4.88, 4.99, 5.12]
correlation,pvalue = stats.stats.pearsonr(x,y)
print ('correlation',correlation) #correlation 0.989176319869
print ('pvalue',pvalue) #pvalue 5.92687594648e-08 拒绝原假设,接受备择假设
等级顺序或者等距等比数据,数据总体分布不是正态分布,数据容量可能大于30。比如数据呈现幂函数关系。
其中n为等级个数;d为二列成对变量的等级差数
x = [10.35, 6.24, 3.18, 8.46, 3.21, 7.65, 4.32, 8.66, 9.12, 10.31]
y = [5.13, 3.15, 1.67, 4.33, 1.76, 4.11, 2.11, 4.88, 4.99, 5.12]
correlation,pvalue = stats.stats.spearmanr(x,y) #使用斯皮尔曼计算相关性
print ('correlation',correlation) #correlation 1.0
print ('pvalue',pvalue) #pvalue 6.64689742203e-64 p值
1、两个变量都是连续正态分布变量;
2、变量之间是线性相关;
3、其中一个变量被人为的划分为二分变量,比如及格与不及格
4、样本容量应当大于80
案例如:10名考生成绩,包括总分和一道问道题,求问答题的区分度(6分以上为通过,包括6分)
其中一个变量为正态连续性变量,另一个是真正的二分名义变量(如男女)
x = [1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0] #第一个变量为bool值
y = [84,82,76,60,72,74,76,84,88,90,78,80,92,94,96,88,90,78,76,74]
stats.pointbiserialr(x, y) # PointbiserialrResult(correlation=0.7849870641173371, pvalue=4.1459279734903919e-05)
两个变量都是按性质分为几种类别,比如一个变量是性别男女,一个变量是按照成绩分为优秀、良好、差。
代码实现
#使用scipy 实现案例
s1 = ['及格','不及格','及格','及格','及格','及格','及格','及格','不及格']
s2 = ['有','没有','没有','没有','没有','没有','没有','没有','没有']
tbl = pd.crosstab(s1, s2) #数据汇总
ss.contingency.expected_freq(tbl) #期望频数
ss.contingency.margins(tbl) #列联表边际汇总
ss.chi2_contingency(tbl, False) #卡方检验