You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算两个DataFrame样本的成对Cohen's Kappa并构建结果矩阵

生成Cohen's Kappa分数矩阵并绘制分组热力图

1. 合并数据集

先把两个DataFrame合并到一起,方便统一处理所有样本:

import pandas as pd
from sklearn.metrics import cohen_kappa_score
import seaborn as sns
import matplotlib.pyplot as plt

# 原始数据
data1 = {'subject': ['A', 'B', 'C', 'D'],
         'group': ['red', 'red', 'blue', 'blue'],
         'lists': [[0, 1, 1], [0, 0, 0], [1, 1, 1], [0, 1, 0]]}
data2 = {'subject': ['a', 'b', 'c', 'd'],
         'group': ['red', 'red', 'blue', 'blue'],
         'lists': [[0, 1, 0], [1, 1, 0], [1, 0, 1], [1, 1, 0]]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

# 合并成一个数据集
combined_df = pd.concat([df1, df2], ignore_index=True)

2. 计算两两样本的Cohen's Kappa矩阵

创建一个以所有样本名为行和列的空矩阵,然后遍历每一对样本计算Kappa值:

# 提取所有样本名称
all_subjects = combined_df['subject'].tolist()
# 初始化空的Kappa矩阵
kappa_matrix = pd.DataFrame(index=all_subjects, columns=all_subjects)

# 遍历所有样本对计算Kappa分数
for i, row_subj in enumerate(all_subjects):
    # 获取当前行样本的lists数据
    row_data = combined_df.loc[combined_df['subject'] == row_subj, 'lists'].values[0]
    for j, col_subj in enumerate(all_subjects):
        # 获取当前列样本的lists数据
        col_data = combined_df.loc[combined_df['subject'] == col_subj, 'lists'].values[0]
        # 计算并赋值Kappa分数
        kappa_matrix.loc[row_subj, col_subj] = cohen_kappa_score(row_data, col_data)

# 转换为数值类型,方便后续绘图
kappa_matrix = kappa_matrix.astype(float)

运行后得到的kappa_matrix就是你需要的对称矩阵,每个单元格对应一对样本的一致性分数,值越接近1表示一致性越高,越接近-1表示一致性越低,0代表完全随机一致。

3. 按group分组绘制热力图

为了直观对比组内和组间的一致性,先按group排序样本,再用热力图展示,同时用线条分隔不同组:

# 按group排序样本(先red组,再blue组)
sorted_subjects = combined_df.sort_values('group')['subject'].tolist()
sorted_kappa = kappa_matrix.loc[sorted_subjects, sorted_subjects]

# 找到分组的分界点(red组有4个样本:A、B、a、b;blue组4个:C、D、c、d)
group_split_idx = len(combined_df[combined_df['group'] == 'red'])

# 绘制热力图
plt.figure(figsize=(10, 8))
heatmap = sns.heatmap(sorted_kappa, annot=True, cmap='coolwarm', vmin=-1, vmax=1)

# 添加分组分隔线
heatmap.hlines([group_split_idx], xmin=0, xmax=len(sorted_subjects), colors='black', linewidths=2)
heatmap.vlines([group_split_idx], ymin=0, ymax=len(sorted_subjects), colors='black', linewidths=2)

# 设置标题和标签
plt.title('Cohen\'s Kappa分数矩阵(按group分组)', fontsize=14)
plt.xlabel('样本', fontsize=12)
plt.ylabel('样本', fontsize=12)

plt.show()

热力图里,颜色越红表示一致性越高,越蓝表示一致性越低,黑色粗线清晰分隔了red和blue组,能快速观察组内、组间的一致性差异。

内容的提问来源于stack exchange,提问作者psychcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:00:26