用Python去计算:方差var、协方差cov、相关系数
2021-05-18 本文已影响0人
土豆干锅
方差
定义
方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。
概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。
在许多实际问题中,研究方差即偏离程度有着重要意义。
使用numpy计算
>>> a=np.random.randint(10,size=10)
>>> a
array([3, 6, 2, 8, 9, 7, 5, 6, 9, 8])
>>> np.var(a) #样本总方差
5.21
>>> np.var(a, ddof = 1) # 计算样本方差
5.788888888888889
>>> b=np.random.randint(10,size=10)
>>> b
array([9, 8, 4, 2, 3, 2, 0, 8, 1, 4])
>>> c=(a,b)
>>> c
(array([3, 6, 2, 8, 9, 7, 5, 6, 9, 8]), array([9, 8, 4, 2, 3, 2, 0, 8, 1, 4]))
>>> np.var(c) # 计算所有元素方差
8.36
>>> np.var(c, axis = 0) # 计算每一列的方差
array([ 9. , 1. , 1. , 9. , 9. , 6.25, 6.25, 1. , 16. ,
4. ])
>>> np.var(c, axis = 1) # 计算每一行的方差
array([5.21, 9.09])
使用pandas计算
pandas 中的 var 函数可以得到样本方差(不是总体方差)
>>> import pandas as pd
>>> df = pd.DataFrame(np.array([[85, 76, 90], [82, 90, 88], [84, 88, 78]]), columns=['a', 'b', 'b'], index=['x', 'y', 'z'])
>>> df
a b b
x 85 76 90
y 82 90 88
z 84 88 78
>>> df.var() # 显示每一列的方差
a 2.333333
b 57.333333
b 41.333333
dtype: float64
>>> df.var(axis = 1) # 显示每一行的方差
x 50.333333
y 17.333333
z 25.333333
dtype: float64
协方差COV
定义
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
协方差自然是由方差衍生而来的,方差反应的是一个变量(一维)的离散程度,到二维了,我们可以对每个维度求其离散程度,但我们还想知道更多。我们想知道两个维度(变量)之间的关系,直观的举例就是身高和体重(青少年),我们采集到的数据里面有一种固有的性质,那就是身高越高的样本似乎总有着更大的体重,那我们如何衡量这种关系呢,单独求两个方差是不行的。因此协方差应运而生,它的公式也与方差极度同源,方差是每个样本减去均值的平方后去平均(n-1),协方差就把平方的2拆成1+1,就是x减去x的平均,乘以,y减去y的平均,最后对整体取平均。
协方差的效果是:协方差的值如果为正值,则说明两者是正相关的 (数值越大,相关性越强),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”。
使用numpy
>>> X = np.array([171, 184, 210, 198, 166, 167])
>>> Y = np.array([78, 77, 98, 110, 80, 69])
>>> np.cov(X,Y)
array([[328.66666667, 228.73333333],
[228.73333333, 237.46666667]])
#输出一个2*2的协方差矩阵
# 328.66666667是X与X的协方差
# 228.73333333是X和Y的协方差
# 237.46666667是Y和Y的协方差
使用panda
>>> X = np.array([171, 184, 210, 198, 166, 167])
>>> Y = np.array([78, 77, 98, 110, 80, 69])
>>> x1=pd.DataFrame(X)
>>> y1=pd.DataFrame(Y)
>>> x1[0].cov(x1[0])
328.6666666666667
>>> x1[0].cov(y1[0])
228.73333333333332
>>> y1[0].cov(y1[0])
237.46666666666667
相关系数
定义
相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,是研究变量之间线性相关程度的量,一般用字母 r 表示。由于研究对象的不同,相关系数有多种定义方式,较为常用的是皮尔逊相关系数。
使用numpy
>>> X = np.array([171, 184, 210, 198, 166, 167])
>>> Y = np.array([78, 77, 98, 110, 80, 69])
# 得到相关性矩阵
>>> np.corrcoef(X,Y)
array([[1. , 0.81874809],
[0.81874809, 1. ]])
使用pandas
>>> x1=pd.DataFrame(X)
>>> y1=pd.DataFrame(Y)
>>> z=pd.concat([x1,y1],axis=1)
>>> z
0 0
0 171 78
1 184 77
2 210 98
3 198 110
4 166 80
5 167 69
# 得到相关性矩阵
>>> z.corr()
0 0
0 1.000000 0.818748
0 0.818748 1.000000