【时间序列分析】皮尔森相关系数理论基础及python代码实现
文章目录
- 1. 定义
- 2. 物理意义
- 3. 局限性
- 4. 皮尔森相关系数的实际应用
- 5. python代码实现
- 5.1 numpy.corrcoef() 计算皮尔森相关系数
- 5.2 自己实现皮尔森相关系数
皮尔森相关系数(Pearson Correlation Coefficient),又称 皮尔逊相关系数,是衡量两个变量之间线性相关程度的一种统计量。它的值介于 -1 和 1 之间,表示两个变量之间的线性关系强度和方向。
1. 定义
皮尔森相关系数 r r r 的数学定义如下:
r = ∑ ( X i − X ˉ ) ( Y i − Y ˉ ) ∑ ( X i − X ˉ ) 2 ∑ ( Y i − Y ˉ ) 2 r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2 \sum (Y_i - \bar{Y})^2}} r=∑(Xi−Xˉ)2∑(Yi−Yˉ)2∑(Xi−Xˉ)(Yi−Yˉ)
其中:
- X i X_i Xi 和 Y i Y_i Yi 是数据集中的第 i i i 个数据点
- X ˉ \bar{X} Xˉ 和 Y ˉ \bar{Y} Yˉ 分别是变量 X X X 和 Y Y Y 的样本均值
- 分子部分是 X X X 和 Y Y Y 之间的协方差
- 分母部分是 X X X 和 Y Y Y 的标准差的乘积
对于协方差理解可以参考:https://blog.csdn.net/qq_42761751/article/details/144507606?sharetype=blogdetail&sharerId=144507606&sharerefer=PC&sharesource=qq_42761751&spm=1011.2480.3001.8118
2. 物理意义
皮尔森相关系数的物理意义是衡量两个变量之间的线性关系强度。它的取值范围为 [ − 1 , 1 ] [−1,1] [−1,1],具体含义如下:
- r = 1 r=1 r=1 : 完全正线性相关,表示两个变量之间存在完美的正相关关系,即当一个变量增加时,另一个变量也按固定比例增加
- r = − 1 r=-1 r=−1 :完全负线性相关,表示两个变量之间存在完美的负相关关系,即当一个变量增加时,另一个变量按固定比例减少
- r = 0 r=0 r=0 : 没有线性关系,两个变量之间没有线性依赖关系,但这不意味着它们完全没有关系,可能存在非线性关系
- 0 < r < 1 0<r<1 0<r<1 : 正相关关系,随着一个变量的增加,另一个变量也倾向于增加, r r r 越接近 1,线性关系越强
- − 1 < r < 0 -1<r<0 −1<r<0 : 负相关关系,随着一个变量的增加,另一个变量倾向于减少, r r r 越接近 -1,负线性关系越强
3. 局限性
尽管皮尔森相关系数非常有用,但它也存在一些局限性:
-
只考虑线性关系: 皮尔森相关系数只能捕捉变量之间的线性关系,无法有效处理非线性关系。若两个变量之间存在非线性关系,皮尔森相关系数可能会低估它们之间的关联程度,甚至得出接近于 0 的值,这时需要使用其他方法。
例如: 考虑一个二次关系 y = x 2 y=x^2 y=x2 即使数据点之间的关系是非常紧密的,但皮尔森相关系数可能接近 0,因为该关系不是线性的。 -
对异常值敏感: 皮尔森相关系数对异常值非常敏感。如果数据集中的某个或某些点与其他数据点相差过大,它们可能会显著影响相关系数,导致误导性的结论。因此,在使用皮尔森相关系数时,需要特别注意数据中的异常值,最好先进行数据清洗和异常值检测。
-
假设正态分布: 皮尔森相关系数假设数据呈正态分布。如果数据严重偏离正态分布,相关系数的计算和解释可能不可靠。
4. 皮尔森相关系数的实际应用
皮尔森相关系数广泛应用于统计分析和数据科学中,常见的应用场景包括:
-
金融分析: 评估股票、债券或其他资产之间的相关性。例如,通过计算不同股票之间的皮尔森相关系数,可以帮助投资者构建多样化的投资组合,以降低风险。
-
健康研究: 分析不同生理指标之间的关系。例如,研究体重和血压之间的相关性,或者分析不同药物治疗效果的相关性。
-
社会科学: 研究教育水平和收入之间的关系,或者考察人们的生活满意度与其他社会因素之间的关联。
-
机器学习与数据挖掘: 皮尔森相关系数可用于特征选择,评估各个特征与目标变量之间的线性相关性,从而筛选出最相关的特征,提高模型性能。
5. python代码实现
5.1 numpy.corrcoef() 计算皮尔森相关系数
import numpy as npX = np.array([1,2,3,4,5])
Y = np.array([5,4,3,2,1])# 皮尔森相关系数在[0,1]位置
r = np.corrcoef(X,Y)[0,1]
print(r)
5.2 自己实现皮尔森相关系数
import numpy as npX = np.array([0,1,0,3])
Y = np.array([0,1,1,1])# 计算均值
mean_X = np.mean(X)
mean_Y = np.mean(Y)# 计算协方差的分子
covariance = np.sum((X-mean_X)*(Y-mean_Y)) / len(X)# 计算标准差
std_X = np.std(X)
std_Y = np.std(Y)# 计算皮尔森相关系数
r = covariance / (std_X*std_Y)
print(r)