一致度を測るカッパ係数

ペットの里親の見つかりやすさを予測するKaggleコンペで、評価指標として二次の重み付けカッパ係数(quadratic weighted kappa)が用いられていたので、カッパ係数について改めて調べてまとめました。

www.kaggle.com

カッパ係数とはなにか

カッパ係数(Cohen's kappa coefficient)は、複数の質的データがあった時に、その類似度を表す統計量です。 この時カッパ係数は、データが偶然一致する確率も考慮して計算を行うので、偶然性を排除した一致度を計算することができます。

計算方法

カッパ係数κは以下の定義によって計算されてます。


\begin{align}
\kappa =\frac{P_{o} - P_{e}}{1-P_{e}}
\end{align}

P_0は観測された(observed)一致率を表し、P_eは偶然一致する期待値(expected by chance)を表します。

式の意味としては、偶然一致する割合をそれぞれ引いた上で、判定としてどれくらい一致しているかを表していることになります。

上記の定義式よりカッパ係数は負になることがあり、その場合一致度は見られず、ランダムな場合よりも悪いことを意味します。

計算例

もう少し具体例を通して、カッパ係数を計算をしてみましょう。

ここでは、カレーと寿司がそれぞれ好きかどうかを100人にアンケートして、カレーと寿司の好き嫌いの一致度を計算します。

つまり、カレーが好きな人は寿司が好きで、カレーが嫌いな人は寿司も嫌いという傾向があるかどうかを確認するということになります。

アンケートの結果が以下のような場合を仮定します。

寿司
好き 嫌い
カレー 好き 20 10 30
嫌い 30 40 70
50 50 100

カレーは100人中30が好き、70人が嫌いで、寿司は好きと嫌いが半々ずつとなり、カレー・寿司両方好き・嫌いが一致した人数は好きが20人で、嫌いが40人という結果だったとします。

それでは一致度を計算してみましょう

① 好き嫌いが偶然一致する確率 P_{e} の計算

上記のアンケートの回答をした結果偶然回答が一致する場合が考えられます。 偶然一致する確率は、それぞれの割合から同じ判断になる確率を求めれば良いことになります

 \begin{align}偶然一致する確率 P_e &= 好きが一致する確率 + 嫌いが一致する確率 \\\ &=  寿司が好きな確率 \times カレーが好きな確率 + 寿司が嫌いな確率 \times カレーが嫌いな確率 \\\ &= \frac{30}{100} \times \frac{50}{100} + \frac{70}{100} \times \frac{50}{100} \\\ &=0.15 + 0.35 \\\ &= 0.5
\end{align}

② 好き嫌いが一致した確率 P_{o} の計算

これは単純に全体で好き嫌いが一致した割合を求めます。

 \begin{align}回答が一致した確率 P_o &= 好きが一致した確率 + 嫌いが一致した確率\\\ &= \frac{20}{100} + \frac{40}{100} \\\ &= 0.6 \end{align}

③ カッパ係数を求める

上記の定義に従って計算を行います。

\kappa = \frac{0.6 - 0.5}{1-0.5} = 0.2

カッパ係数は最大1を取る値で、0.2という結果なので、カレーの好き嫌いと寿司の好き嫌いにはわずかの一致度が見られるという結論になりました。

重み付けカッパ係数

先程の例では好きと嫌いの2択による名義尺度における一致度の計算を行いました。

単純にを好き・嫌いの2択ではなく、1~5の好き嫌いの度合いで表した時のような順序尺度におけるカッパ係数のことを重み付きカッパ係数(weighted kappa coefficient)と呼びます。

順序尺度で類似度を表現した場合、カレーと寿司の評価が1と5の場合よりも2と3の場合の方が評価が似ているといえます。

完全に評価が一致している場合を1、最も評価が隔たっている場合を0とするような重みをつけ、完全に評価が一致しないケースも考慮して一致度を計算したのが、重み付けカッパ係数です。

重み付けカッパ係数の計算方法

重みの計算方法は一次の重みと二次の重みの二種類があります。

一次の重みの計算はスコアの差は絶対値で計算がされます。

 w_{ij} = 1 - \frac{|c_i-c_j|}{c_c-c_1}

c_cは5段階評価ならば5になり、c_i, c_jは同じ人のそれぞれの評価となります。 この時それぞれの評価が2と3の場合重みは  1- \frac{2-3}{5-1} = 0.75となります。

また、二次の重みの場合は各評価の差を自乗することに重みを計算します。

 w_{ij} = 1 - \frac{(c_i-c_j)^2}{(c_c-c_1)^2}

同様にそれぞれの評価が2と3の場合重みは  1- \frac{ ( 2-3 ) ^ 2}{ ( 5-1 ) ^ 2} = 0.9375 となり、評価が近い場合一次の重みより大きい重みとなるように計算されます。

これらの重みを各回答に掛け合わせ、先ほどと同様に計算することで重み付けカッパ係数を計算することが出来ます。

 \kappa = \frac{P_o - P_e}{1 - P_e} = \frac{\sum_{i,j}w_{i,j}O_{i,j} - \sum_{i,j}w_{i,j}E_{i,j}}{ 1 - \sum_{i,j}w_{i,j}E_{i,j}}

ここで、 w_{i,j} は一次 or 二次の重み、  O_{i,j}E_{i,j}はそれぞれ観測、予測された確率の行列を表します

重み付けカッパ係数の計算例

100人に対してカレーと寿司に対して好き・普通・嫌いという3段階でアンケートを行い、重み付けカッパ係数を計算します。ここでは、二次の重みを用いてカッパ係数を算出します。

アンケートの結果は下記のような結果になったと仮定します。

寿司
好き 普通 嫌い
カレー 好き 40 28 2 70
普通 7 10 3 20
嫌い 3 2 5 10
50 40 10 100

①重み付けスコアを計算する

二次の重みの場合の各スコアにおける重みを計算すると下記の用になります

寿司
好き 普通 嫌い
カレー 好き 1.0 0.75 0
普通 0.75 1.0 0.75
嫌い 0 0.75 1.0

②偶然一致する確率の行列 P_{e} の計算

カレーと寿司のそれぞれの評価数から回答が偶然一致する確率を計算します。

寿司とカレーが偶然一致する確率は、カレーが好きな人は100人中70人、寿司が好きな人は100人中50人なので、  \frac{70}{100} \times \frac{50}{100} = 0.35 と計算されます。 同様に、各条件について計算を行うと下記のようになります。

寿司
好き 普通 嫌い
カレー 好き 0.35 0.28 0.07
普通 0.1 0.08 0.02
嫌い 0.05 0.04 0.01

③実際に一致した確率の行列 P_{e} の計算

それぞれの条件で実際に一致した確率は単純に全体の数で割ったものになります。

寿司
好き 普通 嫌い
カレー 好き 0.40 0.28 0.02
普通 0.07 0.10 0.03
嫌い 0.03 0.02 0.05

④重み付けカッパ係数を計算する

重み付けカッパ係数は先程のアンケートの結果と重み付けスコアの行と列が一致する部分をかけ合わせたものの和として計算を行います。


\begin{align}
 \kappa &= \frac{P_o - P_e}{1 - P_e} \\\
&= \frac{\sum_{i,j}w_{i,j}O_{i,j} - \sum_{i,j}w_{i,j}E_{i,j}}{ 1 - \sum_{i,j}w_{i,j}E_{i,j}} \\\
&= \frac{0.85 - 0.77}{1 - 0.77} \\\
&= 0.35
\end{align}

重み付けカッパ係数としては0.35となり、概ね一致していると言える結果となりました。

まとめ

カッパ係数と重み付けカッパ係数の定義を紹介し、例を通してそれぞれのカッパ係数を計算しました。

WEBで色々探すと、間違っていたり、具体的な計算例まで乗っていない場合があるので、何かの参考になれば幸いです。

以上、お疲れ様でした。

参考文献

https://en.wikipedia.org/wiki/Cohen%27s_kappa

http://vassarstats.net/kappaexp.html

https://bellcurve.jp/statistics/blog/14200.html

https://www.medcalc.org/manual/kappa.php

http://www.stats-guild.com/analytics/5396