如何计算两个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
相关产品推荐
相关产品推荐

