广告

Pandas 数据框间 Cohen's Kappa 一致性系数计算完整教程(含示例代码)

简介与目标

本教程概览

Pandas 数据框间 Cohen's Kappa 一致性系数计算完整教程(含示例代码) 将带你通过实际数据案例,学习如何在两个评定者(两列或两 DataFrame)的标签之间计算一致性。

在统计学中,Cohen's Kappa 是评价分类一致性的常用指标,考虑了随机一致性的影响。本文聚焦在 Pandas 环境中进行实现,便于数据分析师在日常工作中快速集成到数据处理管线中。

适用范围

当你需要衡量两个评定者对离散类别的判定一致性时,利用 Pandasscikit-learn 的工具,可以直接获得 Cohen's Kappa 的数值和权重版本,支持无权重、线性权重和平方权重。

准备阶段:数据结构与对齐

数据框对齐的要点

在进行一致性分析前,确保两个数据源的行一一对应,且缺失值得到妥善处理。对齐类别一致性 是结果正确的前提。若两边的记录顺序不一致,应先进行行对齐或按相同的主键进行合并,以避免错配导致的混淆矩阵偏差。

此外,缺失值处理也是关键环节。通常会选择丢弃含有缺失的样本,或将缺失视作一个单独的类别进行编码,避免影响后续的 kappa 计算。

示例数据生成

下面给出一个简化的示例数据结构,用于演示在 Pandas 环境中如何准备两位评定者的分级标签。你可以将其替换为你实际的数据框列。

import pandas as pd

# 示例数据:两位评定者对同一组对象的离散等级评定
data = {
    'rater1': ['Low', 'Medium', 'High', 'Medium', 'Low', 'High', 'Low'],
    'rater2': ['Low', 'Medium', 'Medium', 'High', 'Low', 'High', 'Low']
}
df = pd.DataFrame(data)
print(df)

在实际场景中,你可能要从 CSV、SQL 等来源加载数据,然后确保 两列对齐,并进行缺失值处理后再进入计算步骤。

方法一:直接使用 sklearn 计算

从 DataFrame 提取两列

第一种常见做法是将两个评定者的标签提取为独立的序列(Series)或数组,然后直接调用 scikit-learncohen_kappa_score 函数进行计算。

如果你的数据已经是整齐的结构,提取与对齐通常很直接,关键在于保证两者长度一致且类别标签可比对。Extract two rating vectors,再传入到计算函数中。

直接计算示例代码

以下示例展示了如何使用 cohen_kappa_score 计算未加权的 kappa,以及在需要时使用线性与平方权重的情况。

import pandas as pd
from sklearn.metrics import cohen_kappa_score

# 假设 df 为已对齐的 DataFrame,rater1 与 rater2 为两名评定者的标签
df = pd.DataFrame({
    'rater1': ['Low', 'Medium', 'High', 'Medium', 'Low', 'High', 'Low'],
    'rater2': ['Low', 'Medium', 'Medium', 'High', 'Low', 'High', 'Low']
})

y1 = df['rater1']
y2 = df['rater2']

# 无权重的 Cohen's Kappa
kappa_none = cohen_kappa_score(y1, y2, weights=None)
print('Cohen\\'s Kappa (no weights):', kappa_none)

# 线性权重,适用于有序类别
kappa_linear = cohen_kappa_score(y1, y2, weights='linear')
print('Cohen\\'s Kappa (linear weights):', kappa_linear)

# 二次权重(更强的惩罚对角错配,常用于更严格的评估)
kappa_quad = cohen_kappa_score(y1, y2, weights='quadratic')
print('Cohen\\'s Kappa (quadratic weights):', kappa_quad)

在上述代码中,y1y2 代表两位评定者的标签序列。输出将给出不同权重设置下的 Cohen's Kappa 值,便于你根据数据性质选择合适的权重。

方法二:通过混淆矩阵手动推导 Kappa

构建混淆矩阵

如果你更偏向于可解释性分析,可以通过生成混淆矩阵来直观看到评定者之间的分布关系。混淆矩阵 直接展示了各类别组合的计数,有助于理解偏离模式。

在 Pandas 中,可以使用 pd.crosstab 构建这种矩阵,并以 {row: rater1, column: rater2} 的形式呈现观测频次。

计算 Po、Pe 与 Kappa

完成混淆矩阵后,你可以手动计算 Po(观察一致性比例)、Pe(随机一致性比例)以及最终的 Kappa 值。公式如下:

import pandas as pd
import numpy as np

# 假设 df 已包含两列 rater1 与 rater2
confusion = pd.crosstab(df['rater1'], df['rater2'], dropna=False)

# 总样本数
n = confusion.values.sum()

# 观察一致性(对角线之和 / 总样本)
po = np.trace(confusion.values) / n

# 行边际和与列边际和
row_marginals = confusion.sum(axis=1).values
col_marginals = confusion.sum(axis=0).values

# 期望一致性 Pe = sum_i (row_i * col_i) / n^2
pe = (row_marginals * col_marginals).sum() / (n**2)

# Cohen's Kappa
kappa = (po - pe) / (1 - pe)
print('Po:', po, ' Pe:', pe, ' Kappa:', kappa)

上述方法的优点在于你可以清晰看到每个类别组合的贡献,并且不依赖外部库的默认实现,便于在对结果进行自定义解释时使用。若你需要权重化的版本,可以在混淆矩阵的基础上应用加权距离来近似计算。若使用 scikit-learn 以外的方法,请确保边界情况(如极端类别不均、缺失值)被妥善处理。

对数据类型的扩展与加权 Kappa

适用于序数数据的权重

当你的分类标签具有明确的顺序关系(如 0、1、2、3 或 Low/Medium/High 等),使用 加权 Kappa 能更合理地反映轻微错配的惩罚较低,而严重错配惩罚更高的场景。

sklearn 的实现中,通过参数 weights 可以选择 'linear''quadratic',以区分错配的距离大小。

代码示例:对有序标签使用加权 Kappa

下面的示例展示了如何在有序类别上应用线性权重与平方权重,以获得更符合直觉的评估结果。

import pandas as pd
from sklearn.metrics import cohen_kappa_score

# 例子中的类别按有序顺序排列
df = pd.DataFrame({
    'rater1': ['Low', 'Medium', 'High', 'Medium', 'Low', 'High', 'Low'],
    'rater2': ['Low', 'Medium', 'Medium', 'High', 'Low', 'High', 'Medium']  # 加入一个轻微错配
})

y1 = df['rater1']
y2 = df['rater2']

# 使用线性权重
kappa_linear = cohen_kappa_score(y1, y2, weights='linear')
print('Weighted Cohen\\'s Kappa (linear):', kappa_linear)

# 使用平方权重
kappa_quad = cohen_kappa_score(y1, y2, weights='quadratic')
print('Weighted Cohen\\'s Kappa (quadratic):', kappa_quad)

在有序情境下,加权 Kappa 能更细腻地反映错配强度,有助于对评定者的一致性进行更客观的评估。

实际应用中的常见坑与调试要点

数据清洗与对齐的常见问题

在将数据导入计算前,请务必完成 对齐缺失值处理类别编码一致性 的检查。若两边的类别集合不同,简单的对齐可能导致虚假低的 kappa 值,需统一标签集合或对缺失进行单独处理。

一个常见的错误是直接对两列存在缺失值的 DataFrame 进行计算,此时 NaN 会导致计算失败或得到不合理的结果。务必在计算前清洗或填充。

编码与标签的一致性

确保两个评定者的标签截至同一组类别。若一个评定者出现了未在另一列中出现的类别,请在计算前对 类别集合 进行对齐,或在计算时显式指定可用的标签集合。

缺失样本的处理策略

你可以选择丢弃包含缺失值的样本,或将缺失视为一个独立类别进行编码。不同策略会影响 Kappa 的数值,请在分析报告中记录数据清洗的策略。

常用实践的快速回顾

快速要点总结

要在 Pandas 环境中实现 Cohen's Kappa,你通常需要:对齐两组标签清洗缺失值、选择合适的计算方法(直接使用 cohen_kappa_score,或通过混淆矩阵手动推导),以及在有序数据上考虑 加权 Kappa 的选项。以上步骤能帮助你获得可信的评估结果。

通过前述示例代码,你可以直接将自己的数据替换进去,快速得到三种常用形式的系数:无权重、线性权重、平方权重,以便对比分析和报告撰写。

附录:快速参考清单

关键函数与对象

pandas:用于数据加载、清洗与对齐;pd.crosstab:生成混淆矩阵;scikit-learn:提供 cohen_kappa_score 的实现。

在你的笔记本或脚本中保存上述代码片段,可以快速复现你在 Pandas 数据框间 Cohen's Kappa 一致性系数计算完整教程(含示例代码)中的分析结果。

广告

后端开发标签