相关性分析——肯德尔系数(Tau-a与Tau-b)

一、解释

肯德尔系数(Kendall's Tau)是一种用于测量两个变量之间相关性的非参数统计量。

与皮尔逊相关系数不同,肯德尔系数不依赖于变量的分布假设,因此在处理非正态分布或存在离群点的数据时更为稳健。

肯德尔相关也是基于数据对象的秩来计算两个变量之间的相关性,因此很适用于具有等级的变量(排序型),这点和斯皮尔曼系数相似。

肯德尔系数的取值范围在 -1 和 1 之间,数值越大表示相关性越强,数值为正表示正相关,数值为负表示负相关。

肯德尔系数主要有两种变体:肯德尔 Tau-a 和肯德尔 Tau-b。Tau-a 适用于没有平局情况的数据集,而 Tau-b 则修正了平局的影响,适用于更广泛的数据场景。

1. 肯德尔 Tau-a

肯德尔 Tau-a 的计算公式如下:

${\tau_{a}=\frac{C-D}{\binom{n}{2}}=\frac{2(C-D)}{n(n-1)}}$

其中:

C是符合顺序对的数量(Concordant Pairs)。

D是不符合顺序对的数量(Discordant Pairs)。

n是样本的数量。

2. 肯德尔 Tau-b

肯德尔 Tau-b 的计算公式如下:

${\tau_{b}=\frac{C-D}{\sqrt{(C+D+T)(C+D+U)}}}$

其中:

Tx变量中的平局对数(Tied Pairs)。

Uy变量中的平局对数。

二、解释

符合顺序对(Concordant Pairs):如果对于任意两个观察值(x_{i},y_{i}),(x_{j},y_{j}),当x_{i}<x_{j}y_{i}<y_{j},或者当x_{i}>x_{j}y_{i}>y_{j},则称这对是符合顺序的。

不符合顺序对(Discordant Pairs):如果对于任意两个观察值 (x_{i},y_{i}),(x_{j},y_{j}) ,当x_{i}<x_{j}y_{i}>y_{j},或者当x_{i}>x_{j}y_{i}<y_{j} ,则称这对是不符合顺序的。

平局对(Tied Pairs):如果两个观察值在一个变量上相同,则称为平局对。

三、实例

1.二值化

        二值化(binarization)是将数据转换为两个值(通常是0和1)的过程。这个过程通常用于将连续变量转换为分类变量。例如,我们可以将一个特征的值与某个阈值进行比较,高于阈值的赋值为1,低于阈值的赋值为0。

        本次二值化体现在

        这两行代码MedInc 和 MedHouseVal 特征转换为二值化特征 HighMedInc 和 HighHouseVal:

        1.计算中位数:df['MedInc'].median() 和 df['MedHouseVal'].median() 分别计算收入和房价特征的中位数。

        2.二值化:(df['MedInc'] > df['MedInc'].median()).astype(int) 将收入高于中位数的赋值为1,低于或等于中位数的赋值为0。

        同样地,(df['MedHouseVal'] > df['MedHouseVal'].median()).astype(int) 对房价特征进行二值化。

import pandas as pd
import numpy as np
from scipy.stats import kendalltau

# 加载加利福尼亚房价数据集
from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing()
df = pd.DataFrame(data=housing.data, columns=housing.feature_names)
df['MedHouseVal'] = housing.target

# 创建一个有大量平局的特征,二值化特征
df['HighMedInc'] = (df['MedInc'] > df['MedInc'].median()).astype(int)
df['HighHouseVal'] = (df['MedHouseVal'] > df['MedHouseVal'].median()).astype(int)


# 使用NumPy向量化计算Tau-a
def kendall_tau_a(x, y):
    n = len(x)
    concordant = np.triu((x[:, None] - x) * (y[:, None] - y) > 0, k=1)
    discordant = np.triu((x[:, None] - x) * (y[:, None] - y) < 0, k=1)
    num_concordant = np.sum(concordant)
    num_discordant = np.sum(discordant)

    tau_a = (num_concordant - num_discordant) / (0.5 * n * (n - 1))
    return tau_a


# 计算Tau-a
tau_a = kendall_tau_a(df['HighMedInc'].values, df['HighHouseVal'].values)
# 计算Tau-b
tau_b, _ = kendalltau(df['HighMedInc'], df['HighHouseVal'], variant='b')

print("特征与目标变量的肯德尔Tau相关系数:")
print(f"HighMedInc 和 HighHouseVal - Tau-a: {tau_a:.4f}")
print(f"HighMedInc 和 HighHouseVal - Tau-b: {tau_b:.4f}")
2.运行结果
特征与目标变量的肯德尔Tau相关系数:
HighMedInc 和 HighHouseVal - Tau-a: 0.2420
HighMedInc 和 HighHouseVal - Tau-b: 0.4840

Process finished with exit code 0

        运行该代码,我们可以观察到Tau-a和Tau-b的值的差异。Tau-a忽略了平局的影响,而Tau-b则调整了平局的情况,所以此时Tau-b的结果会更准确地反映变量之间的真实关系。

        3.注意

        scipy.stats.kendalltau 函数没有直接支持 variant='a',所以程序通过手动计算来实现肯德尔tau-a。

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值