相关性分析和多变量数据分析,相关性分析之PredictivePowerScore
相关性分析和多变量数据分析,相关性分析之PredictivePowerScoreimport numpy as np from scipy.stats import pearsonr x = np.random.uniform(-1 1 100000) print(pearsonr(x x ** 2)) # output: # (0.0020775478403054566 0.511199686284783) Kendall秩相关系数在统计学中,肯德尔相关系数是以 Maurice Kendall 命名的,并经常用希腊字母τ(tau)表示其值。肯德尔相关系数是一个用来测量两个随机变量相关性的统计值。一个肯德尔检验是一个无参数假设检验,它使用计算而得的相关系数去检验两个随机变量的统计依赖性。肯德尔相关系数的取值范围在-1到1之间,当τ为1时,表示两个随机变量拥有一致的等级相关性;当τ为-1时,表示两个随机变量拥有完全相反的等级相关性;当τ为0时,表示两个随机变
常用相关性分析方法
在分析特征间相关性时,常使用的方法是 pandas.DataFrame.corr :
DataFrame.corr(self method=’pearson’ min_periods=1)
其中包含的方法主要为:
- pearson:Pearson相关系数
- kendall:Kendall秩相关系数
- Spearman:Spearman等级相关系数
Pearson相关系数
Pearson相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关(这个变量下降,那个就会上升), 1表示完全的正相关,0表示没有线性相关。
Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。 Scipy的pearsonr方法 能够同时计算相关系数和p-value。
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0 1 size)
print("Lower noise" pearsonr(x x np.random.normal(0 1 size)))
print("Higher noise" pearsonr(x x np.random.normal(0 10 size)))
# output:
# Lower noise (0.7182483686213842 7.324017312997672e-49)
# Higher noise (0.05796429207933815 0.31700993885325246)
这个例子中,我们比较了变量在加入噪音之前和之后的差异。当噪音比较小的时候,相关性很强,p-value很低。
Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近0。
import numpy as np
from scipy.stats import pearsonr
x = np.random.uniform(-1 1 100000)
print(pearsonr(x x ** 2))
# output:
# (0.0020775478403054566 0.511199686284783)
Kendall秩相关系数
在统计学中,肯德尔相关系数是以 Maurice Kendall 命名的,并经常用希腊字母τ(tau)表示其值。肯德尔相关系数是一个用来测量两个随机变量相关性的统计值。一个肯德尔检验是一个无参数假设检验,它使用计算而得的相关系数去检验两个随机变量的统计依赖性。肯德尔相关系数的取值范围在-1到1之间,当τ为1时,表示两个随机变量拥有一致的等级相关性;当τ为-1时,表示两个随机变量拥有完全相反的等级相关性;当τ为0时,表示两个随机变量是相互独立的。
原始的 Kendall 秩相关系数定义在一致对 (concordant pairs) 和分歧对 (discordant pairs) 的概念上。所谓一致对,就是两个变量取值的相对关系一致;分歧对则是指它们的相对关系不一致。这么说有点难以理解,简单的说就是将两个变量进行排序,判断两者的排序值是否一致。如果一致则为1,如果倒叙则为-1。 Scipy的scipy.stats.kendalltau 提供的秩相关的检测方法:
from scipy.stats import kendalltau
x1 = [12 2 1 12 2]
x2 = [1 4 7 1 0]
tau p_value = kendalltau(x1 x2)
print(tau p_value)
# output
# -0.4714045207910316 0.2827454599327748
肯德尔相关系数与斯皮尔曼相关系数对数据条件的要求相同。针对非线性数据有一定的误差。
Spearman等级相关系数
在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho)表示其值。斯皮尔曼等级相关系数用来估计两个变量X、Y之间的相关性,其中变量间的相关性可以使用单调函数来描述。如果两个变量取值的两个集合中均不存在相同的两个元素,那么,当其中一个变量可以表示为另一个变量的很好的单调函数时(即两个变量的变化趋势相同),两个变量之间的ρ可以达到 1或-1。
斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。对于服从Pearson相关系数的数据亦可计算Spearman相关系数,但统计效能要低一些。Pearson相关系数的计算公式可以完全套用 Spearman相关系数计算公式,但公式中的x和y用相应的秩次代替即可。 scipy.stats.spearmanr :
from scipy.stats import spearmanr
x1 = [1 2 3 4 5]
x2 = [5 6 7 8 7]
rho p_value = spearmanr(x1 x2)
print(rho p_value)
# output
# 0.8207826816681233 0.08858700531354381
相关性检测 Python 实战:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_excel("data/train.xlsx")
plt.figure(figsize=(15 13))
sns.heatmap(df.corr(method="pearson") annot=True vmin=-1 vmax=1 cmap='coolwarm' fmt=".2f")
plt.title("pearson")
plt.savefig('corr_pearson.png')
plt.figure(figsize=(15 13))
sns.heatmap(df.corr(method="kendall") annot=True vmin=-1 vmax=1 cmap='coolwarm' fmt=".2f")
plt.title("kendall")
plt.savefig('corr_kendall.png')
plt.figure(figsize=(15 13))
sns.heatmap(df.corr(method="spearman") annot=True vmin=-1 vmax=1 cmap='coolwarm' fmt=".2f")
plt.title("spearman")
plt.savefig('corr_spearman.png')
相关性分析Predictive Power Score(PPS)
常用相关性分析存在的问题
1、有许多非线性的关系是分数根本无法检测到的,比如下图:
2、计算出来的矩阵是对称的,即a与b的相关性同b与a的相同。更多的时候,关系是不对称的。一个有3个唯一值的列永远不可能完美地预测另一个有100个唯一值的列。 但事实可能恰恰相反。 显然,不对称很重要,因为它在现实世界中非常普遍。
Predictive Power Score (PPS)的实现逻辑
假设我们有两个列,想要计算 a 预测 b 的预测能力得分。 在这种情况下,我们将 b 视为目标变量,将 a 视为(唯一)特性。 我们现在可以计算一个交叉验证的决策树,并计算一个合适的评估度量。 当目标是数值时,我们可以使用决策树回归模型计算平均绝对误差(MAE)。 当目标是分类的,我们可以使用一个决策树分类器,并计算加权 F1。 你也可以使用其他的分数,比如 ROC 等。
PPS使用示例(Python)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import ppscore as pps
df = pd.read_excel("data/train.xlsx")
plt.figure(figsize=(15 13))
sns.heatmap(pps.matrix(df) annot=True vmin=0 vmax=1 cmap='Blues' fmt=".2f")
plt.title("Predictive Power Score")
plt.savefig('corr_pps.png')
执行结果: