特征工程——相关性分析(皮尔逊和斯皮尔曼)

1.皮尔逊相关系数

实现原理

皮尔逊相关系数是用来衡量两个变量之间线性相关程度的统计量,记作 eq?r,其取值范围为 [-1, 1]。公式如下:

eq?r%20%3D%20%5Cfrac%7B%5Csum%20%28x_i%20-%20%5Cbar%7Bx%7D%29%28y_i%20-%20%5Cbar%7By%7D%29%7D%7B%5Csqrt%7B%5Csum%20%28x_i%20-%20%5Cbar%7Bx%7D%29%5E2%20%5Csum%20%28y_i%20-%20%5Cbar%7By%7D%29%5E2%7D%7D

其中:

eq?x_%7Bi%7D%2Cy_%7Bi%7D是两个变量的观测值

eq?%5Cbar%7Bx%7D%2C%5Cbar%7By%7D是两个变量的均值

取值范围

eq?r=1:完全正相关,两个变量完全线性相关,且方向相同。

eq?r=-1:完全负相关,两个变量完全线性相关,但方向相反。

eq?r=0:不相关,两个变量没有线性关系。

计算过程

1.计算变量eq?xeq?y的均值eq?%5Cbar%7Bx%7D%2C%5Cbar%7By%7D

2.对每对观测值(eq?x_%7Bi%7D%2Cy_%7Bi%7D)计算各自与均值的差eq?x_%7Bi%7D-%5Cbar%7Bx%7D%2Cy_%7Bi%7D-%5Cbar%7By%7D

3.计算这些差值的乘积之和,eq?%5CSigma

4.分别计算这些差值的平方和,eq?%5CSigma

5.最后:(步骤 3 的结果)除以(步骤 4 的结果的平方根)。

数据集

假设我们有以下数据集:

特征 a: [1, 2, 3, 4, 6, 10]

特征 b: [89, 100, 119, 150, 188, 200]

代码实现
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 数据集(有线性关系)
data = {
    'a':[1, 2, 3, 4, 6, 10],
    'b':[89, 100, 119, 150, 188, 200]
}

# 创建DataFrame
df = pd.DataFrame(data)

# 计算皮尔逊相关系数矩阵
corr_matrix = df.corr(method='pearson')

# 打印相关系数矩阵
print("皮尔逊相关系数矩阵:")
print(corr_matrix)

# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix Heatmap')
plt.show()

运行结果

b09a5a3e902241739344fb4ce25d56f0.png

特征 a 和 b: 相关系数为 0.94,表示两者之间存在较强的正相关关系。

适用范围

1.线性关系:皮尔逊相关系数仅适用于测量两个变量之间的线性关系。如果两个变量之间存在非线性关系,皮尔逊相关系数可能无法准确反映其相关性。

2.连续变量:皮尔逊相关系数适用于连续型数据(如测量值、比率等),不适用于分类数据或秩次数据。

3.正态分布:理想情况下,变量应当服从正态分布,或者至少满足对称分布。

4.无异常值:皮尔逊相关系数对异常值非常敏感,异常值可能会显著影响相关系数的大小和方向。

2.斯皮尔曼相关系数

秩次

假设我们有一组数据,秩次就是将这些数据按大小顺序排列,并赋予每个数据点一个唯一的排序位置(即排名)。例如,如果我们有一组数据 [3,1,4,1,5],对其进行排序后得到 [1,1,3,4,5],其秩次就为 [2.5,2.5,1,3,4]。

为什么存在2.5呢?如果有相同的值(称为“平秩”),则这些值的秩次是它们排序位置的平均值。

实现原理

斯皮尔曼相关系数是衡量两个变量排序后之间相关程度的非参数统计量,记作eq?r_%7Bs%20%7D ,其取值范围为 [-1, 1]。公式如下:

eq?r_s%20%3D%201%20-%20%5Cfrac%7B6%20%5Csum%20d_i%5E2%7D%7Bn%28n%5E2%20-%201%29%7D

其中:

eq?R%28x_%7Bi%7D%29%2CR%28y_%7Bi%7D%29分别是eq?x_%7Bi%7D%2Cy_%7Bi%7D的秩次。

eq?d_%7Bi%7D是每对数据点的秩次差,即eq?d_%7Bi%7D%3DR%28x%29-R%28y%29

eq?n是观测值的数量。

取值范围

eq?r_%7Bs%20%7D=1:完全正相关,两个变量的排序完全一致。

eq?r_%7Bs%20%7D=-1:完全负相关,两个变量的排序完全相反。

eq?r_%7Bs%20%7D=0:不相关,两个变量的排序无关。

计算过程

假设我们有以下数据集:

eq?xeq?y
8692
9798
8596
9291
99100

1.排序并赋秩次

eq?xeq?yeq?R%28x%29eq?R%28y%29
869222
979844
859613
929131
9910055

2.计算秩次差

eq?xeq?yeq?R%28x%29eq?R%28y%29eq?d_%7Bi%7Deq?%3DR%28x%29-R%28y%29eq?d_%7Bi%7D%5E%7B2%7D
86922200
97984400
859613-24
92913124
991005500

3.计算差的平方和

eq?%5CSigma%20d_%7Bi%7D%5E%7B2%7D​=0+0+4+4+0=8

4.代入公式

eq?n%3D5

计算得eq?r_%7Bs%7Deq?%3D0.6

0.6即为皮尔曼系数。

代码实现
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import spearmanr

# 生成示例数据
np.random.seed(0)
data = {
    'Variable1': np.random.randint(1, 100, 50),
    'Variable2': np.random.randint(1, 100, 50),
    'Variable3': np.random.randint(1, 100, 50),
    'Variable4': np.random.randint(1, 100, 50),
    'Variable5': np.random.randint(1, 100, 50)
}

# 将数据转换为 DataFrame
df = pd.DataFrame(data)

# 计算斯皮尔曼相关系数矩阵
corr_matrix = df.corr(method='spearman')

# 创建热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, vmin=-1, vmax=1)
plt.title("Spearman Rank Correlation Heatmap")
plt.show()

5a62524793a1455ba8ca873e2fc8d2b5.png

适用范围

1.单调关系:斯皮尔曼秩相关系数适用于测量两个变量之间的单调关系,无论这种关系是线性还是非线性。只要一个变量增加(或减少),另一个变量也相应增加(或减少),斯皮尔曼秩相关系数就可以有效地衡量这种关系。

2.连续或离散变量:斯皮尔曼秩相关系数适用于连续型数据和秩次数据(如等级、排名)。

3.非正态分布:斯皮尔曼秩相关系数不要求数据服从正态分布,因此适用于数据分布不明或非正态分布的情况。

4.对异常值不敏感:由于斯皮尔曼秩相关系数基于秩次而非具体数值,它对异常值不太敏感。

3.机器学习应用

皮尔逊相关系数的应用

特征选择线性回归:在构建线性回归模型时,皮尔逊相关系数可以帮助识别与目标变量高度线性相关的特征。这有助于去除冗余特征并提高模型性能。降维:在高维数据中,皮尔逊相关系数可    以用来识别和移除高度相关的特征对,从而减少特征空间的维度。

多元线性回归预测建模:在多元线性回归中,皮尔逊相关系数可以用于评估每个独立变量与目标变量之间的线性关系,从而选择最相关的特征用于建模。

协同过滤推荐系统用户相似度计算:在基于用户的协同过滤推荐系统中,皮尔逊相关系数可以用来计算用户之间的相似度。例如,Netflix和亚马逊等平台可以使用皮尔逊相关系数来推荐用户可能喜欢的电影或商品。

时间序列分析交叉相关性:在时间序列分析中,皮尔逊相关系数可以用于计算两个时间序列之间的相关性,以识别潜在的时序关系。

斯皮尔曼秩相关系数的应用

特征选择非线性关系的识别:在构建机器学习模型时,斯皮尔曼秩相关系数可以帮助识别与目标变量存在单调关系的特征,即使这种关系不是线性的。例如,在决策树和随机森林等非线性模型中,斯皮尔曼秩相关系数可以用于判断特征的重要性。

异常检测鲁棒性分析:由于斯皮尔曼秩相关系数对异常值不敏感,它可以用于检测数据集中存在的异常模式。例如,在金融数据分析中,斯皮尔曼秩相关系数可以用来识别异常交易行为。

分类问题秩次特征的使用:在分类任务中,斯皮尔曼秩相关系数可以用于处理秩次特征,例如排名数据。它可以帮助识别特征与类别标签之间的单调关系。

生物信息学基因表达分析:在生物信息学中,斯皮尔曼秩相关系数可以用于分析基因表达数据,识别基因之间的关联关系。对于理解基因调控网络和发现潜在的生物标记具有重要意义。

金融分析股票回报分析:在金融市场中,斯皮尔曼秩相关系数可以用来分析不同股票的回报率之间的相关性,尤其是在市场波动较大或存在异常值的情况下。

### 使用Python进行斯皮尔曼皮尔逊相关性分析并绘制热力图 为了执行斯皮尔曼皮尔逊相关性分析,并创建相应的热力图,可以利用`pandas`库来处理数据以及`seaborn``matplotlib`来进行可视化。下面展示了具体实现方式。 #### 数据准备与读取 首先加载所需的数据集。这里假设有一个Excel文件作为输入源: ```python import pandas as pd data = pd.read_excel('path_to_your_file.xlsx') df = data.iloc[:, :] print(df.head()) ``` 此部分代码用于导入外部表格数据至Pandas DataFrame对象中以便后续操作[^2]。 #### 计算相关矩阵 对于不同类型的关联度量——即皮尔逊(Pearson)斯皮尔曼(Spearman),可以通过指定参数`method`给`corr()`函数完成计算: - **Pearson** (线性关系): `df.corr(method='pearson')` - **Spearman** (秩次序关系): `df.corr(method='spearman')` 例如,要获取基于斯皮尔曼等级的相关系数表,则可如下编写: ```python correlation_matrix_spearman = df.corr(method='spearman') print(correlation_matrix_spearman) ``` 这会输出一个包含各特征之间斯皮尔曼相关性的新DataFrame。 #### 绘制热力图 一旦得到了相关矩阵之后,就可以借助Seaborn库轻松地将其转换成直观易懂的颜色编码图表形式—热力图(Heatmap): ```python import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(10, 8)) sns.heatmap(correlation_matrix_spearman, annot=True, cmap="coolwarm", fmt='.2f', linewidths=.5) plt.title("Spearman Correlation Heatmap") plt.show() ``` 上述脚本片段定义了一个适当大小的画面窗口,并通过设置参数如颜色映射(`cmap`)、显示数值标签(`annot`)等来自定义最终呈现效果;最后调用`.show()`方法展示图形界面下的图像。 同样的过程也适用于构建皮尔逊相关的热力图,只需更改传递给`corr()`函数的`method`参数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值