协方差和相关性的计算方法详解
协方差和相关性的计算方法详解
协方差和相关性是统计学中用于描述变量之间关系的重要概念。本文将详细介绍协方差和相关性的计算方法及其应用场景,并通过Python代码示例帮助读者更好地理解这些概念。
1.1 教程概述
- 什么是相关性?
- 测试数据集
- 协方差
- 皮尔逊相关系数
1.2 什么是相关性?
变量之间的关系可能由多种原因引起:
- 一个变量可能由另一个变量引起或依赖于另一个变量
- 一个变量可能与另一个变量有轻微关联
- 两个变量可能依赖于一个未知的第三个变量
相关性可以是正的,这意味着两个变量同向变化;也可以是负的,这意味着当一个变量的值增加时,另一个变量的值减少。相关性也可以是零,这意味着变量之间没有关系。
- 正相关:两个变量同向变化
- 零相关:变量变化之间没有关系
- 负相关:变量反向变化
某些算法的性能会因为两个或多个变量之间存在紧密关系(多重共线性)而恶化。
1.3 测试数据集
在介绍相关性方法之前,我们先定义一个用于测试的方法。我们将生成1,000个样本,其中包含两个具有强正相关的变量。第一个变量将从均值为100、标准差为20的正态分布中随机抽取。第二个变量将是第一个变量加上均值为50、标准差为10的高斯噪声。我们将使用randn()
函数来生成随机高斯值,然后将结果乘以我们自己的标准差并加上均值,以将值转换到所需的范围内。伪随机数生成器被设置种子,以确保每次运行代码时都能获得相同的数字样本。
# 生成相关变量
from numpy import mean
from numpy import std
from numpy.random import randn
from numpy.random import seed
from matplotlib import pyplot
# 设置随机数生成器种子
seed(1)
# 准备数据
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# 汇总
print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1)))
print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2)))
# 绘图
pyplot.scatter(data1, data2)
pyplot.show()
运行示例首先打印每个变量的均值和标准差。创建了两个变量的散点图。因为我们构造了数据集,所以我们知道这两个变量之间存在关系。这在我们查看生成的散点图时很明显,我们可以看到一个上升趋势。
1.4 协方差
变量之间可能存在线性关系。这是一种在两个数据样本中始终一致的加性关系。这种关系可以用两个变量之间的协方差来总结。它被计算为每个样本值的乘积的平均值,其中值已被中心化(减去了均值)。样本协方差的计算公式如下:
协方差计算中的均值使用表明需要每个数据样本具有高斯或类似高斯的分布。协方差的符号可以解释为两个变量是否同向变化(正)或反向变化(负)。协方差的大小不容易解释。协方差值为零表示两个变量完全独立。cov()
NumPy函数可以用来计算两个或多个变量之间的协方差矩阵。
我们可以计算测试问题中两个变量的协方差矩阵。完整的示例如下:
# 计算两个变量之间的协方差
from numpy.random import randn
from numpy.random import seed
from numpy import cov
# 设置随机数生成器种子
seed(1)
# 准备数据
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# 计算协方差矩阵
covariance = cov(data1, data2)
print(covariance)
协方差矩阵的对角线包含每个变量与其自身的协方差。矩阵中的其他值表示两个变量之间的协方差;在这种情况下,剩余的两个值相同,因为我们只计算了两个变量的协方差。协方差作为统计工具单独使用时存在一个问题是,它很难解释。这导致我们转向下一个皮尔逊相关系数。
1.5 皮尔逊相关系数
皮尔逊相关系数(以卡尔·皮尔逊命名)可以用来总结两个数据样本之间线性关系的强度。皮尔逊相关系数计算为两个变量的协方差除以每个数据样本的标准差的乘积。这是对两个变量之间协方差的标准化,以给出可解释的分数。
计算中的均值和标准差使用表明需要两个数据样本具有高斯或类似高斯的分布。计算结果,相关系数可以解释为理解关系。系数返回一个介于-1和1之间的值,表示从完全负相关到完全正相关的相关性范围。值为0表示没有相关性。必须解释该值,通常低于-0.5或高于0.5的值表示显著的相关性,低于这些值的值表明相关性较弱。见下表帮助解释相关系数。
皮尔逊相关是一个统计假设检验,它假设两个样本之间没有关系(零假设)。p值可以解释如下:
- p值 ≤ alpha:显著结果,拒绝零假设,存在某种关系(H1)。
- p值 > alpha:不显著结果,未能拒绝零假设,没有关系(H0)。
pearsonr()
SciPy函数可以用来计算两个具有相同长度的数据样本之间的皮尔逊相关系数。我们可以计算测试问题中两个变量之间的相关性。完整的示例如下:
# 计算两个变量之间的皮尔逊相关系数
from numpy.random import randn
from numpy.random import seed
from scipy.stats import pearsonr
# 设置随机数生成器种子
seed(1)
# 准备数据
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# 计算皮尔逊相关系数
corr, p = pearsonr(data1, data2)
# 显示相关系数
print('皮尔逊相关系数: %.3f' % corr)
# 解释显著性
alpha = 0.05
if p > alpha:
print('无相关性(未能拒绝H0)')
else:
print('存在相关性(拒绝H0)')
运行示例计算并打印皮尔逊相关系数,并解释p值。我们可以看到,两个变量是正相关的,相关系数为0.888。这表明存在较高的相关性(正如我们预期的那样)。