stats.rankdata

stats.rankdata(即 scipy.stats.rankdata)是一个把原始数据转换成秩次(rank)的函数,常用于计算非参数统计量(如 Spearman ρ、Mann-Whitney U、Kruskal-Wallis H 等)之前的数据预处理。


📌 基本语法

from scipy.stats import rankdata

ranks = rankdata(a, method='average')
参数 含义
a 一维数组或列表,待排序的数据
method 遇到并列值(tie)时如何分配秩次,共 5 种策略(见下)

🔍 method 选项

method 遇到并列值时的处理方式 示例(值 3 出现 2 次)
'average' 取平均秩次 2.5, 2.5
'min' 取最小秩次 2, 2
'max' 取最大秩次 3, 3
'dense' 并列后下一个秩次仅+1 2, 2,然后下一个是 3
'ordinal' 忽略并列,按出现顺序给秩次 2, 3

✅ 示例

from scipy.stats import rankdata

x = [10, 20, 20, 30]

print("average:", rankdata(x, method='average'))  # [1.  2.5 2.5 4. ]
print("min    :", rankdata(x, method='min'))      # [1 2 2 4]
print("max    :", rankdata(x, method='max'))      # [1 3 3 4]
print("dense  :", rankdata(x, method='dense'))    # [1 2 2 3]
print("ordinal:", rankdata(x, method='ordinal'))  # [1 2 3 4]

🎯 实战场景

1. 计算 Spearman 相关系数前先做秩转换

from scipy.stats import rankdata, spearmanr

x = [1, 2, 3, 4, 5]
y = [5, 6, 7, 8, 7]

# 等价于直接 spearmanr(x, y),但这里展示手动秩转换
rx = rankdata(x, method='average')
ry = rankdata(y, method='average')

rho, p = spearmanr(rx, ry)
print("Spearman ρ =", rho)

2. 处理缺失值

import numpy as np
x = [3, np.nan, 1, 2]
mask = ~np.isnan(x)
ranks_valid = rankdata(np.array(x)[mask])
print(ranks_valid)  # [2. 1. 3.]

⚠️ 注意事项

  1. 输入必须是一维;二维数组请按行/列循环或用 np.apply_along_axis
  2. 默认 method='average',与 R 的 rank(..., ties.method = "average") 一致。
  3. 若数据量很大且存在大量并列值,method='dense' 可节省内存(秩次连续)。

如果你有并列值很多或需要按列批量排名的场景,贴出代码片段,我可以帮你优化。

posted @ 2025-08-26 16:01  数理生风  阅读(62)  评论(0)    收藏  举报