💭
Python で Krippendorff's alpha (クリッペンドルフのα係数) を計算する
Krippendorff's alpha はアノテータ間の agreement を計算する指標です。
alpha の値は完全にアノテーションが一致しているときに 1 を取り、全く無作為にアノテーションされているときに 0 を取ります(また、アノテータが不一致を起こしている時には負の値を取り得ます)。値が 1 に近い方がより信頼できるアノテーションということになります。
Krippendorff's alpha の特徴としては、
- アノテータが3人以上いても使える
- データが名義尺度・順序尺度・間隔尺度・比例尺度のどれでも使える
- 欠損値があっても使える
ことが挙げられます。
今回は、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