💭

Python で Krippendorff's alpha (クリッペンドルフのα係数) を計算する

2022/12/27に公開

Krippendorff's alpha はアノテータ間の agreement を計算する指標です。
alpha の値は完全にアノテーションが一致しているときに 1 を取り、全く無作為にアノテーションされているときに 0 を取ります(また、アノテータが不一致を起こしている時には負の値を取り得ます)。値が 1 に近い方がより信頼できるアノテーションということになります。

Krippendorff's alpha の特徴としては、

ことが挙げられます。

今回は、Krippendorff 先生本人が書いた論文の例 を Python の krippendorff ライブラリをもとに試してみます。

import numpy as np
import krippendorff

A. 欠損値のない名義尺度(特に2値ラベル)の場合

論文では 0.095 とあります。

reliability_data_str = (
    "0 1 0 0 0 0 0 0 1 0",
    "1 1 1 0 0 1 0 0 0 0"
)
reliability_data = [[np.nan if v == "*" else v for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="nominal")
0.09523809523809534

B. 欠損値のない名義尺度の場合

論文では 0.692 とあります。

reliability_data_str = (
    "a a b b d c c c e d d a",
    "b a b b b c c c e d d d"
)
reliability_data = [[np.nan if v == "*" else v for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="nominal")
0.6919642857142858

C. 欠損値のある名義尺度の場合

論文では 0.743 とあります。

reliability_data_str = (
    "1 2 3 3 2 1 4 1 2 * * *",
    "1 2 3 3 2 2 4 1 2 5 * 3",
    "* 3 3 3 2 3 4 2 2 5 1 *",
    "1 2 3 3 2 4 4 1 2 5 1 *"
)
reliability_data = [[np.nan if v == "*" else v for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="nominal")
0.743421052631579

D. 他の尺度の場合

C. のデータを順序尺度として見た場合

論文では 0.815 とあります。

reliability_data_str = (
    "1 2 3 3 2 1 4 1 2 * * *",
    "1 2 3 3 2 2 4 1 2 5 * 3",
    "* 3 3 3 2 3 4 2 2 5 1 *",
    "1 2 3 3 2 4 4 1 2 5 1 *"
)
reliability_data = [[np.nan if v == "*" else int(v) for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="ordinal")
0.8153875037548814

C. のデータを間隔尺度として見た場合

論文では 0.849 とあります。

reliability_data_str = (
    "1 2 3 3 2 1 4 1 2 * * *",
    "1 2 3 3 2 2 4 1 2 5 * 3",
    "* 3 3 3 2 3 4 2 2 5 1 *",
    "1 2 3 3 2 4 4 1 2 5 1 *"
)
reliability_data = [[np.nan if v == "*" else int(v) for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="interval")
0.8491071428571428

C. のデータを比例尺度として見た場合

論文では 0.797 とあります。

reliability_data_str = (
    "1 2 3 3 2 1 4 1 2 * * *",
    "1 2 3 3 2 2 4 1 2 5 * 3",
    "* 3 3 3 2 3 4 2 2 5 1 *",
    "1 2 3 3 2 4 4 1 2 5 1 *"
)
reliability_data = [[np.nan if v == "*" else int(v) for v in coder.split()] for coder in reliability_data_str]
krippendorff.alpha(reliability_data=reliability_data, level_of_measurement="ratio")
0.7974027747116121

以上のように、論文の値と計算が一致することが確認できました。

Discussion