变量间的关系有两类,一类是变量间存在完全确定的关系,即函数关系(y=2x+1),另一类是变量间不存在完全的确定关系,不能用准确的数学公式来表示出来,这些变量间存在具有十分密切的关系,但是不能由一个或者几个变量的值精准的计算出来另一个变量的值,我们称这些变量间的关系为相关关系。
相关变量间的关系有两种:
一种是平行关系,即两个或者多个变量相互影响;对应的分析方法:相关分析。
另一种是依存关系,即一个变量的变化受另一个或多个变量的影响;对应的分析方法:回归分析。
如何去衡量两个变量或者多个变量间的相关程度呢?
需要引入线性相关系数ρ来衡量两变量的相关关系和密切程度,给定二元总体(X,Y)。
总体相关系数ρ定义为两个变量X、Y之间的协方差和两者标准差乘积的比值,如下:
其中在-1至+1之间波动,其绝对值越接近1,两个变量间的直线相关性越密切,越接近0,两变量越不相关。
由于在现实问题中,我们多数都是采取抽样的方式去调查,所以我们很多时候都是用样本的线性相关系数(Peason相信系数)公式:
根据公式,直接可以在python中是实现:
def lxy(self,x,y): #求x与y的离均差乘积之和
lxy=0
for i in range(len(x)):
lxy += (x[i] - np.mean(x)) *(y[i]-np.mean(y))
return lxy
def lxx(self,x):#求x的离均差平方和
lxx=0
for i in range(len(x)):#求和
lxx+=(x[i]-np.mean(x))**2
return lxx
def lyy(self,y):#求y的离均差平方和
lyy=0
for i in range(len(y)):#求和
lyy+=(y[i]-np.mean(y))**2
return lyy
def cor(self,x,y):#计算相关系数
cor=self.lxy(x,y) / np.sqrt(self.lxx(x) * self.lyy(y))
return cor
为了进一步确认相关系数拟合的是否合理,需要利用t检验来进行判断。
计算相关系数r的t值:
r=相关系数
n=样本容量
这里的判断需要查t界值表。
代码如下:
def Ttest(self):#求统计量t
t=self.cor(x,y)/np.sqrt((1-self.cor(x,y)*self.cor(x,y))/(len(x)-2))
return t
全部代码如下:
import numpy as np
class oneCorrelation:
def __init__(self,x,y):
self.x=x
self.y=y
self.n=len(x)
def lxy(self,x,y):
lxy=0
for i in range(len(x)):
lxy += (x[i] - np.mean(x)) *(y[i]-np.mean(y))
return lxy
def lxx(self,x):
lxx=0
for i in range(len(x)):
lxx+=(x[i]-np.mean(x))**2
return lxx
def lyy(self,y):
lyy=0
for i in range(len(y)):
lyy+=(y[i]-np.mean(y))**2
return lyy
def cor(self,x,y):
cor=self.lxy(x,y) / np.sqrt(self.lxx(x) * self.lyy(y))
return cor
def Ttest(self):
t=self.cor(x,y)/np.sqrt((1-self.cor(x,y)*self.cor(x,y))/(len(x)-2))
return t
x=(171,175,159,155,152,158,154,164,168,166,159,164)
y=(57,64,41,38,35,44,41,51,57,49,47,46)
C=oneCorrelation(x,y)
print("lxx:%f"%C.lxx(x))
print("lyy:%f"%C.lyy(y))
print("lyy:%f"%C.lxy(x,y))
print("相关系数:%f"%C.cor(x,y))
print('t统计量:%f'%C.Ttest())
输出结果:
lxx:556.916667
lyy:813.000000
lyy:645.500000
相关系数:0.959303
t统计量:10.742976