数据预处理——相关性分析详解
什么是相关性分析?
在数据预处理阶段,相关性分析是一项关键任务。它帮助我们理解特征之间的关系,从而为后续建模提供指导。本篇文章将详细介绍 卡方测试、皮尔逊相关系数 和 协方差,并结合案例逐步解析每种方法的应用。
1. 相关性分析的意义
相关性分析用于衡量数据特征之间的关联程度。高相关性可能表明一个特征可以解释另一个特征的变化,而低相关性或无相关性意味着两者之间缺乏统计关系。
- 正相关:一个特征增加,另一个特征也增加。
- 负相关:一个特征增加,另一个特征减少。
- 无相关:特征间无显著关系。
相关性与因果性
需注意,相关性不等于因果性。即使两个变量相关,也不一定存在直接因果关系。
2.常见的相关性分析方法:
- 卡方( χ 2 \chi^2 χ2)测试:分析离散变量之间是否存在显著关系。
- 皮尔逊相关系数:衡量连续变量之间的线性相关性。
- 协方差:分析两个变量的变化方向是否一致。
相关性分析的作用
相关性分析的主要目的是通过特征之间的关联性来帮助决策,例如:
-
特征选择
- 去除冗余特征,简化数据结构。
- 提高模型的训练效率和性能。
-
数据降维
- 当特征间相关性较强时,可通过主成分分析(PCA)等方法将高维特征降至低维,减少数据维度。
-
识别异常
- 通过相关性分析,发现数据中存在的不合理关联或异常模式。
方法一:卡方测试(Chi-Square Test)
1. 什么是卡方测试?
卡方测试是一种非参数统计检验,用于判断两个离散变量之间是否存在显著关系。
例如,我们可以用卡方测试来分析“性别”和“是否喜欢某款游戏”是否相关。
2. 公式解释
卡方(
χ
2
\chi^2
χ2)统计量的公式为:
χ
2
=
∑
(
O
−
E
)
2
E
\chi^2 = \sum \frac{(O - E)^2}{E}
χ2=∑E(O−E)2
- ( χ 2 \chi^2 χ2):卡方统计量,表示实际观测值和期望值之间的差异程度。
- ( O O O):实际观测值(Observed Value)。
- (
E
E
E):期望值(Expected Value),计算公式为:
E = 行合计总计 × 列合计总计 总样本数 E = \frac{\text{行合计总计} \times \text{列合计总计}}{\text{总样本数}} E=总样本数行合计总计×列合计总计
当( χ 2 \chi^2 χ2)值越大,表明实际观测值与期望值之间的差距越大,两变量的关联性越强。
3. 案例分析
问题:性别(男/女)与是否喜欢某款游戏(是/否)是否存在显著关系?
数据如下:
性别 | 喜欢 | 不喜欢 | 总计 |
---|---|---|---|
男 | 250 | 200 | 450 |
女 | 50 | 1000 | 1050 |
总计 | 300 | 1200 | 1500 |
第一步:计算期望值
使用公式 E = 行合计总计 × 列合计总计 总样本数 E = \frac{\text{行合计总计} \times \text{列合计总计}}{\text{总样本数}} E=总样本数行合计总计×列合计总计计算:
- 男且喜欢:
E = 450 × 300 1500 = 90 E = \frac{450 \times 300}{1500} = 90 E=1500450×300=90 - 男且不喜欢:
E = 450 × 1200 1500 = 360 E = \frac{450 \times 1200}{1500} = 360 E=1500450×1200=360 - 女且喜欢:
E = 1050 × 300 1500 = 210 E = \frac{1050 \times 300}{1500} = 210 E=15001050×300=210 - 女且不喜欢:
E = 1050 × 1200 1500 = 840 E = \frac{1050 \times 1200}{1500} = 840 E=15001050×1200=840
期望值表格如下:
性别 | 喜欢 | 不喜欢 |
---|---|---|
男 | 90 | 360 |
女 | 210 | 840 |
第二步:计算卡方统计量
χ 2 = ( 250 − 90 ) 2 90 + ( 200 − 360 ) 2 360 + ( 50 − 210 ) 2 210 + ( 1000 − 840 ) 2 840 \chi^2 = \frac{(250 - 90)^2}{90} + \frac{(200 - 360)^2}{360} + \frac{(50 - 210)^2}{210} + \frac{(1000 - 840)^2}{840} χ2=90(250−90)2+360(200−360)2+210(50−210)2+840(1000−840)2
Python实现
import numpy as np
from scipy.stats import chi2_contingency
# 实际观测值
observed = np.array([[250, 200], [50, 1000]])
# 卡方检验
chi2, p, dof, expected = chi2_contingency(observed)
print(f"卡方统计量: {chi2:.2f}") #504.77
结果解读
- χ 2 \chi^2 χ2 = 504.77:值很大说明性别与游戏喜好存在显著关系。
方法二:皮尔逊相关系数(Pearson Correlation Coefficient)
1. 什么是皮尔逊相关系数?
皮尔逊相关系数是衡量两个连续变量之间线性相关程度的指标,其值介于 − 1 -1 −1 和 1 1 1 之间:
- ( r > 0 r > 0 r>0):正相关,值越接近 (1),正相关越强。
- ( r < 0 r < 0 r<0):负相关,值越接近 (-1),负相关越强。
- ( r = 0 r = 0 r=0):两个变量之间没有线性相关。
注意:皮尔逊相关系数只衡量线性相关性,不适用于非线性关系。
2. 公式及解释
皮尔逊相关系数的公式为:
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 \cdot \sum (Y_i - \bar{Y})^2}}
r=∑(Xi−Xˉ)2⋅∑(Yi−Yˉ)2∑(Xi−Xˉ)(Yi−Yˉ)
- ( r r r):皮尔逊相关系数。
- ( X i X_i Xi)、( Y i Y_i Yi):变量 ( X X X) 和 ( Y Y Y) 的样本值。
- ( X ˉ \bar{X} Xˉ)、( Y ˉ \bar{Y} Yˉ):变量 ( X X X) 和 ( Y Y Y) 的均值。
- 分子:两个变量的中心化偏差的乘积之和,表示变量之间的协同变化。
- 分母:变量 ( X X X) 和 ( Y Y Y) 的标准差乘积,用于归一化,确保结果在 ( [ − 1 , 1 ] [-1, 1] [−1,1]) 范围内。
简化理解:皮尔逊相关系数描述了变量 ( X X X) 和 ( Y Y Y) 偏离均值的方向和程度是否一致。如果 ( X X X) 和 ( Y Y Y) 同时偏高或偏低,相关系数趋近于 ( 1 1 1);若 ( X X X) 偏高时 ( Y Y Y) 偏低,则趋近于 ( − 1 -1 −1)。
3. 案例分析
问题:学生的数学成绩和物理成绩是否存在线性相关性?
数据如下:
学生 | 数学 | 物理 |
---|---|---|
A | 85 | 90 |
B | 92 | 88 |
C | 78 | 85 |
D | 80 | 82 |
E | 95 | 92 |
第一步:计算均值
X
ˉ
=
85
+
92
+
78
+
80
+
95
5
=
86
\bar{X} = \frac{85 + 92 + 78 + 80 + 95}{5} = 86
Xˉ=585+92+78+80+95=86
Y
ˉ
=
90
+
88
+
85
+
82
+
92
5
=
87.4
\bar{Y} = \frac{90 + 88 + 85 + 82 + 92}{5} = 87.4
Yˉ=590+88+85+82+92=87.4
第二步:计算分子部分
∑ ( X i − X ˉ ) ( Y i − Y ˉ ) = ( 85 − 86 ) ( 90 − 87.4 ) + ( 92 − 86 ) ( 88 − 87.4 ) + ⋯ \sum (X_i - \bar{X})(Y_i - \bar{Y}) = (85 - 86)(90 - 87.4) + (92 - 86)(88 - 87.4) + \cdots ∑(Xi−Xˉ)(Yi−Yˉ)=(85−86)(90−87.4)+(92−86)(88−87.4)+⋯
第三步:计算分母部分
∑ ( X i − X ˉ ) 2 ⋅ ∑ ( Y i − Y ˉ ) 2 \sqrt{\sum (X_i - \bar{X})^2 \cdot \sum (Y_i - \bar{Y})^2} ∑(Xi−Xˉ)2⋅∑(Yi−Yˉ)2
4. 用 Python 实现
import numpy as np
# 数据
math = [85, 92, 78, 80, 95]
physics = [90, 88, 85, 82, 92]
# 计算均值
mean_math = np.mean(math)
mean_physics = np.mean(physics)
# 计算分子
numerator = sum((x - mean_math) * (y - mean_physics) for x, y in zip(math, physics))
# 计算分母
denominator = np.sqrt(sum((x - mean_math)**2 for x in math) * sum((y - mean_physics)**2 for y in physics))
# 计算皮尔逊相关系数
r = numerator / denominator
print(f"皮尔逊相关系数: {r}") #0.80
结果解读
- ( r = 0.80 r = 0.80 r=0.80):数学成绩与物理成绩之间具有强正相关性。
方法三:协方差(Covariance)
1. 什么是协方差?
协方差用于衡量两个变量的变化方向是否一致:
- 协方差 ( > 0 > 0 >0):两个变量同向变化。
- 协方差 ( < 0 < 0 <0):两个变量反向变化。
- 协方差 ( = 0 = 0 =0):两个变量无相关性。
2. 公式解释
协方差的计算公式为:
Cov
(
X
,
Y
)
=
∑
(
X
i
−
X
ˉ
)
(
Y
i
−
Y
ˉ
)
n
−
1
\text{Cov}(X, Y) = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{n - 1}
Cov(X,Y)=n−1∑(Xi−Xˉ)(Yi−Yˉ)
- ( Cov ( X , Y ) \text{Cov}(X, Y) Cov(X,Y)):协方差。
- ( X i , Y i X_i, Y_i Xi,Yi):变量 ( X X X) 和 ( Y Y Y) 的具体取值。
- ( X ˉ , Y ˉ \bar{X}, \bar{Y} Xˉ,Yˉ):变量 ( X X X) 和 ( Y Y Y) 的均值。
- ( n n n):样本数量。
3. 案例分析
Python实现
# 计算协方差
cov_matrix = np.cov(math, physics)
print(f"协方差矩阵:\n{cov_matrix}") #协方差矩阵:[[54.5 23.5][23.5 15.8]]
print(f"协方差:\n{cov_matrix[0, 1]}") #协方差: 23.5
np.cov()
是同时处理多组数据,计算所有变量两两之间的协方差。因此,它返回的是一个协方差矩阵。
- 如果输入是两个变量(如 ( X X X) 和 ( Y Y Y)),那么结果是 ( 2 × 2 2 \times 2 2×2) 的矩阵:
Cov = [ Var ( X ) Cov ( X , Y ) Cov ( Y , X ) Var ( Y ) ] \text{Cov} = \begin{bmatrix} \text{Var}(X) & \text{Cov}(X, Y) \\ \text{Cov}(Y, X) & \text{Var}(Y) \end{bmatrix} Cov=[Var(X)Cov(Y,X)Cov(X,Y)Var(Y)]
结果解读
协方差矩阵的非对角线元素即为数学和物理成绩的协方差。正值表示同向变化,负值表示反向变化。
协方差: 23.5,表示数学成绩提升的同时,物理成绩也会提升。
总结
方法 | 适用场景 | 输出结果 |
---|---|---|
卡方测试 | 分类变量 | ( χ 2 \chi^2 χ2) 值 |
皮尔逊系数 | 连续变量 | ( r r r) 值 [ − 1 , 1 -1, 1 −1,1] |
协方差 | 连续变量 | 协方差值,表示变化方向一致性 |
通过这些方法,我们可以有效分析变量之间的关系,为特征选择、降维和建模提供科学依据。