欢迎光临
我们一直在努力

一文读懂从相关性到一致性:Pearson、ICC 及“兄弟指标”全解(含手算示例 + Python 代码)

适用场景:人–人一致性、LLM-as-a-judge、人–模型评分对齐、主观打分可靠性分析 目标:别再用“Pearson 很高”来证明“一致性很强”,也别把 ICC 当成万能指标。


目录

  • 1. 引言:相关 ≠ 一致

  • 2. 指标全景与对比表

  • 3. 指标逐个讲清楚(含手算 + 代码)

    • 3.1 Pearson correlation ®
    • 3.2 Spearman rank correlation (ρ)
    • 3.3 Kendall’s tau (τ)
    • 3.4 MAE / RMSE
    • 3.5 CCC(Concordance Correlation Coefficient)
    • 3.6 ICC(Intraclass Correlation Coefficient)
    • 3.7 Cohen’s Kappa / Fleiss’ Kappa(分类一致性)
  • 4. 如何选指标 + 常见误用清单


1. 引言:相关 ≠ 一致

在很多实验中(尤其是 LLM-as-a-judge、人–模型评分对齐),我们都会遇到类似结构:

  • 一组对象(papers / responses / samples)
  • 多个评估者(human1, human2, LLM-judge…)
  • 每个对象被打一个分(连续或离散)

一个看似自然、却经常被误用的做法是:用 Pearson correlation 来证明“评分一致”。

一个典型但危险的例子

  • 人类评分:X = [1,2,3,4]
  • LLM 评分:Y = [11,12,13,14]

这两组数据:

  • 趋势完全一致(一起涨)
  • 但 LLM 比人类 系统性高 10 分

结果是:

  • Pearson = 1.0
  • 但绝对一致性 非常差

结论:

高相关 ≠ 高一致。 选错指标,会回答错问题。


2. 指标全景与对比表

指标核心回答的问题看趋势看绝对值典型用途
Pearson r 线性相关强不强 ✅ ❌ 趋势一致性
Spearman ρ 排序一致不一致 ✅ ❌ 量表 / 排名
Kendall τ 成对排序一致比例 ✅ ❌ 排序更严谨
MAE / RMSE 平均差多少 ❌ ✅ 误差大小
CCC 既相关又贴近 y=x 吗 ✅ ✅ 相关 + 无偏
ICC 评分能否互换/可靠性 ✅ ✅ 人–人/人–模型一致
Kappa 分类一致性(超过随机) ❌ ✅ 标签一致

3. 指标逐个讲清楚(含手算 + 代码)

为统一说明,下面使用两套示例数据:

  • 数据集 A(相关高但不一致) X = [1,2,3,4], Y = [11,12,13,14]
  • 数据集 B(存在局部评分差异) X = [1,2,3,4,5], Y = [1,2,2,4,5]

3.1 Pearson correlation ®

定义

r

=

C

o

v

(

X

,

Y

)

σ

X

σ

Y

r = \\frac{\\mathrm{Cov}(X,Y)}{\\sigma_X \\sigma_Y}

r=σX​σY​Cov(X,Y)​

其中:

  • (\\mathrm{Cov}(X,Y) = \\frac{1}{n-1}\\sum (x_i-\\bar{x})(y_i-\\bar{y}))
  • (\\sigma_X = \\sqrt{\\frac{1}{n-1}\\sum (x_i-\\bar{x})^2})
手算示例(数据集 A)
  • (\\bar{x}=2.5, \\bar{y}=12.5)

  • 去均值后:

    • x−x̄ = [-1.5,-0.5,0.5,1.5]
    • y−ȳ = [-1.5,-0.5,0.5,1.5]
  • 协方差:(5/3=1.6667)

  • 标准差:(\\sigma_X=\\sigma_Y=\\sqrt{5/3})

r

=

1.6667

1.29099

×

1.29099

=

1.0

r = \\frac{1.6667}{1.29099\\times1.29099} = 1.0

r=1.29099×1.290991.6667​=1.0

趋势完美一致,但并不代表数值一致。

Python 代码

import numpy as np
from scipy.stats import pearsonr

X = np.array([1,2,3,4])
Y = np.array([11,12,13,14])
print(pearsonr(X, Y))


3.2 Spearman rank correlation (ρ)

定义

对数据排序后,再计算 Pearson:

ρ

=

r

(

r

a

n

k

(

X

)

,

r

a

n

k

(

Y

)

)

\\rho = r(\\mathrm{rank}(X), \\mathrm{rank}(Y))

ρ=r(rank(X),rank(Y))

示例(数据集 B)
  • X ranks = [1,2,3,4,5]
  • Y ranks(2 与 2 为 tie) = [1,2.5,2.5,4,5]
Python 代码

from scipy.stats import spearmanr
X = [1,2,3,4,5]
Y = [1,2,2,4,5]
print(spearmanr(X, Y))


3.3 Kendall’s tau (τ)

定义(直觉)

比较任意样本对 ((i,j)):

  • 若 ((x_i-x_j)(y_i-y_j)>0):一致对(concordant)
  • 若 <0:不一致对(discordant)

τ

=

C

−

D

(

n

2

)

\\tau = \\frac{C – D}{\\binom{n}{2}}

τ=(2n​)C−D​

Python 代码

from scipy.stats import kendalltau
X = [1,2,3,4,5]
Y = [1,2,2,4,5]
print(kendalltau(X, Y))


3.4 MAE / RMSE

定义

M

A

E

=

1

n

∑

∣

x

i

−

y

i

∣

,

R

M

S

E

=

1

n

∑

(

x

i

−

y

i

)

2

\\mathrm{MAE} = \\frac{1}{n}\\sum |x_i – y_i|, \\quad \\mathrm{RMSE} = \\sqrt{\\frac{1}{n}\\sum (x_i-y_i)^2}

MAE=n1​∑∣xi​−yi​∣,RMSE=n1​∑(xi​−yi​)2

​

示例(数据集 B)
  • 差值:[0,0,1,0,0]
  • MAE = 0.2
  • RMSE ≈ 0.447
Python 代码

import numpy as np
X = np.array([1,2,3,4,5])
Y = np.array([1,2,2,4,5])
mae = np.mean(np.abs(X–Y))
rmse = np.sqrt(np.mean((X–Y)**2))
print(mae, rmse)


3.5 CCC(Concordance Correlation Coefficient)

定义

C

C

C

=

2

σ

X

Y

σ

X

2

+

σ

Y

2

+

(

μ

X

−

μ

Y

)

2

\\mathrm{CCC} = \\frac{2\\sigma_{XY}}{\\sigma_X^2 + \\sigma_Y^2 + (\\mu_X – \\mu_Y)^2}

CCC=σX2​+σY2​+(μX​−μY​)22σXY​​

手算示例(数据集 A)
  • ((\\mu_X-\\mu_Y)^2 = 100)
  • (\\sigma_X2=\\sigma_Y2=1.6667)
  • (\\sigma_{XY}=1.6667)

C

C

C

≈

3.3334

103.3334

≈

0.032

\\mathrm{CCC} \\approx \\frac{3.3334}{103.3334} \\approx 0.032

CCC≈103.33343.3334​≈0.032

Pearson = 1,但 CCC 极低 → 存在严重系统偏差。

Python 代码

import numpy as np

def ccc(x, y):
x = np.asarray(x); y = np.asarray(y)
mx, my = x.mean(), y.mean()
vx, vy = x.var(ddof=1), y.var(ddof=1)
cov = np.cov(x, y, ddof=1)[0,1]
return (2*cov) / (vx + vy + (mx – my)**2)

print(ccc([1,2,3,4],[11,12,13,14]))


3.6 ICC(Intraclass Correlation Coefficient)

核心思想

将总变异分解为:

  • 对象之间的差异
  • 评估者 / 误差引入的差异
一种常见形式(two-way mixed, absolute agreement, single measure)

I

C

C

=

M

S

S

−

M

S

E

M

S

S

+

(

k

−

1

)

M

S

E

+

k

(

M

S

R

−

M

S

E

)

n

ICC = \\frac{MS_S – MS_E}{MS_S + (k-1)MS_E + \\frac{k(MS_R-MS_E)}{n}}

ICC=MSS​+(k−1)MSE​+nk(MSR​−MSE​)​MSS​−MSE​​

其中 MS 来自两因素 ANOVA。

Python 代码(含中间量)

import numpy as np

def icc_a1_two_way_mixed_absolute(X):
X = np.asarray(X, dtype=float)
n, k = X.shape
mean_subject = X.mean(axis=1, keepdims=True)
mean_rater = X.mean(axis=0, keepdims=True)
mean_total = X.mean()

SS_S = k * np.sum((mean_subject – mean_total)**2)
SS_R = n * np.sum((mean_rater – mean_total)**2)
SS_T = np.sum((X – mean_total)**2)
SS_E = SS_T – SS_S – SS_R

MS_S = SS_S / (n – 1)
MS_R = SS_R / (k – 1)
MS_E = SS_E / ((n – 1) * (k – 1))

icc = (MS_S – MS_E) / (MS_S + (k – 1)*MS_E + (k*(MS_R – MS_E))/n)
return icc

X = np.array([[1,11],[2,12],[3,13],[4,14]])
print(icc_a1_two_way_mixed_absolute(X))


3.7 Cohen’s Kappa / Fleiss’ Kappa(分类一致性)

Cohen’s Kappa(两评审者)

κ

=

p

o

−

p

e

1

−

p

e

\\kappa = \\frac{p_o – p_e}{1 – p_e}

κ=1−pe​po​−pe​​

Python 代码

from sklearn.metrics import cohen_kappa_score
A = [1,1,1,1,1,0,0,0,0,0]
B = [1,1,1,1,0,1,1,0,0,0]
print(cohen_kappa_score(A, B))


4. 如何选指标 + 常见误用清单

4.1 选型速查

目标推荐指标
趋势是否一致 Pearson / Spearman / Kendall
数值是否可互换 ICC + CCC
平均差距 MAE / RMSE(补充)
分类一致性 Kappa

4.2 常见误用(审稿人最爱抓)

  • 用 Pearson 证明“一致性”
  • 只报 MAE/RMSE 就声称可靠
  • 使用 ICC 却不说明类型
  • ordinal 评分用 Pearson 不解释
  • 4.3 LLM-as-a-judge 的稳妥组合

    Pearson + ICC + CCC +(可选)MAE/RMSE

    5. 附:一键算全套指标

    import numpy as np
    from scipy.stats import pearsonr, spearmanr, kendalltau

    def ccc(x, y):
    x = np.asarray(x); y = np.asarray(y)
    mx, my = x.mean(), y.mean()
    vx, vy = x.var(ddof=1), y.var(ddof=1)
    cov = np.cov(x, y, ddof=1)[0,1]
    return (2*cov) / (vx + vy + (mx – my)**2)

    def mae_rmse(x, y):
    x = np.asarray(x); y = np.asarray(y)
    mae = np.mean(np.abs(x – y))
    rmse = np.sqrt(np.mean((x – y)**2))
    return mae, rmse

    def icc_a1_two_way_mixed_absolute(X):
    X = np.asarray(X, dtype=float)
    n, k = X.shape
    mean_subject = X.mean(axis=1, keepdims=True)
    mean_rater = X.mean(axis=0, keepdims=True)
    mean_total = X.mean()

    SS_S = k * np.sum((mean_subject – mean_total)**2)
    SS_R = n * np.sum((mean_rater – mean_total)**2)
    SS_T = np.sum((X – mean_total)**2)
    SS_E = SS_T – SS_S – SS_R

    MS_S = SS_S / (n – 1)
    MS_R = SS_R / (k – 1)
    MS_E = SS_E / ((n – 1) * (k – 1))

    icc = (MS_S – MS_E) / (MS_S + (k – 1)*MS_E + (k*(MS_R – MS_E))/n)
    return icc

    # Example
    X = np.array([1,2,3,4,5])
    Y = np.array([1,2,2,4,5])

    print("Pearson:", pearsonr(X, Y)[0])
    print("Spearman:", spearmanr(X, Y)[0])
    print("Kendall:", kendalltau(X, Y)[0])
    print("CCC:", ccc(X, Y))
    print("MAE/RMSE:", mae_rmse(X, Y))

    # ICC needs matrix form: n_subjects x k_raters
    M = np.vstack([X, Y]).T
    print("ICC(A,1):", icc_a1_two_way_mixed_absolute(M))

    赞(0)
    未经允许不得转载:171主机测评 » 一文读懂从相关性到一致性:Pearson、ICC 及“兄弟指标”全解(含手算示例 + Python 代码)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址