検査者の信頼性を評価する方法：級内相関係数について

# はじめに
複数の評価者が同じ対象を評価した際の一致度や信頼性を測るための指標として、級内相関係数（Intraclass Correlation Coefficient：ICC）が利用されます。例えば、M-1グランプリの審査員が漫才グループのパフォーマンスを評価する場合、審査員間で評価がどれだけ一貫しているか、また評価の信頼性がどれだけ高いかを判別することができます。

本記事では、Rを用いたICCの分析例を紹介します。


# 利用するデータ 
~~どうせならいつぞやのM-1グランプリの結果を題材にして分析しようと思ったのですが、思ったより露骨な結果が出たので、別のデータを使います。~~
今回はサンプルデータを生成してICCの分析方法を紹介します。
シチュエーションとしてはM-1グランプリを想定し、10組の漫才グループ(a~j)に対して、7人の審査員(A~G)が評価を行うというものです。
また、審査員の一人である審査員Bは、評価に偏りがあるものとします。


```r
# ライブラリ読み込み
library(dplyr)
library(GGally)
library(purrr)

# ランダムシード設定
set.seed(42)

# 漫才グループ10組の真の点数を生成
true_score <- rnorm(n=10, mean=60, sd=10) |> round(digits = 0)

# 審査員ごとの評価にバラツつきを設定
adjustments <- rnorm(n=7, mean=0, sd=5) |> round(digits = 0)

# 真の点数をベースに、審査員ごとの点数を生成
score_data <- map_dfc(adjustments, ~ true_score + .x) |> 
  set_names(paste0("judge_", LETTERS[1:7])) |> 
  as.data.frame()
rownames(score_data) <- paste0("group_", letters[1:10])

# 各点数にランダムなノイズを追加し、さらに審査員Bに大きなノイズを追加
# 点数は整数にしておく
score_data <- score_data |> 
  mutate(across(everything(), ~. + rnorm(n(), mean=0, sd=5))) |> 
  mutate(judge_B =  judge_B + rnorm(n(), mean=0, sd=10)) |> 
  mutate(across(everything(), ~ round(., digits = 0)))

# 生成されたデータの表示
print(score_data)
```

生成されたデータは以下のようなマトリックスです。
```r
        judge_A judge_B judge_C judge_D judge_E judge_F judge_G
group_a      68      74      63      80      73      82      75
group_b      49      77      35      51      38      62      49
group_c      78      80      57      66      64      71      58
group_d      71      93      60      67      63      64      73
group_e      62      74      55      59      64      67      64
group_f      65      82      56      66      61      65      58
group_g      88      97      64      77      81      73      73
group_h      75      61      45      58      54      59      52
group_i      85      74      75      80      86      86      82
group_j      65      55      48      61      60      66      57
```

審査員間での相関も見ておきます。
```r
# 審査員間の相関行列を計算して可視化
ggcorr(score_data, label = TRUE)
```
全体的に審査員同士で相関がありますが、審査員Bだけ相関が低いデータとなっています。
![78ec6ddf-81ef-42ff-9ed1-f5fa9bd8d798.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466700/c000f3ab-b60e-1c81-0520-656210b4e7f2.png)

# ICCの実施
ここからICCを使用して審査員の信頼性を評価していきます。
ICCには複数の種類がありますが、今回はICC(3)を使用します。似た手法としてICC(2)とICC(3)がありますが、それぞれの違いは評価の一般化の可否にあります。ICC(2)はランダムに選ばれた評価者の結果を、同じ特性を持つ他の評価者にも一般化するために使用されます。一方、ICC(3)は特定の評価者のみに焦点を当て、その評価者の信頼性を評価するために使用されます。

今回は、評価者の評価を一般化することに対して興味がなく、各審査員の評価の一貫性を測定することが目的であるため、ICC(3)を使用します。

※ ICCごとの利用ガイドラインや数理面について詳しく知りたい方はこちらの論文がお勧めです
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4913118/pdf/main.pdf

RではpsychライブラリのICC()で結果を得られます。
```r
# ICCの結果確認
library(psych)
ICC(score_data)
```


```r
Call: ICC(x = score_data)

Intraclass correlation coefficients 
                         type  ICC    F df1 df2       p lower bound upper bound
Single_raters_absolute   ICC1 0.48  7.5   9  60 2.7e-07        0.28        0.74
Single_random_raters     ICC2 0.50 13.9   9  54 3.2e-11        0.28        0.75
Single_fixed_raters      ICC3 0.65 13.9   9  54 3.2e-11        0.45        0.84
Average_raters_absolute ICC1k 0.87  7.5   9  60 2.7e-07        0.73        0.95
Average_random_raters   ICC2k 0.87 13.9   9  54 3.2e-11        0.73        0.96
Average_fixed_raters    ICC3k 0.93 13.9   9  54 3.2e-11        0.85        0.97

 Number of subjects = 10     Number of Judges =  7
See the help file for a discussion of the other 4 McGraw and Wong estimates,
```
この結果から以下のようにICC(3)の結果のみ取り出します。
```r
# 全体のICC(3)を計算
whole_icc <- ICC(score_data)$results %>% 
  filter(type == "ICC3") %>% 
  pull(ICC)

print(whole_icc)
```
結果
```r
[1] 0.6474741
```
# 審査員別の信頼性を評価する
ICCは0から1の範囲の値をとり、1に近いほど評価者間の評価の信頼性が高いことを示します。言い換えると、信頼性の低い評価者がいなくなると、全体のICCの数値は高くなります。そこで、評価者を順に1人ずつ除外してICCを計算し、各評価者が全体の信頼性にどのように影響しているかを確認します。

```r
# 審査員を1人ずつ減らしてICC(3)を計算
judges <- colnames(score_data)
for (judge in judges) {
  ICC_res_tmp <- score_data %>% 
    select(- judge) %>% 
    ICC()
  ICC_res_tmp <- ICC_res_tmp$results %>% 
    filter(type == "ICC3") %>% 
    pull(ICC)
  
  ICC_score <- append(ICC_score, ICC_res_tmp)
}

# 各審査員のICC(3)スコアをデータフレームにまとめる
ICC_res <- data.frame(審判 = judges, ICC_score = ICC_score)

# 各審査員のICC(3)スコアを棒グラフで可視化し、全体のICC(3)を破線で表示
ggplot(ICC_res) +
  geom_bar(aes(x = 審判, y = ICC_score), stat = "identity") +
  geom_hline(yintercept = whole_icc, linetype = "dashed", color = "red", size = 1) +
  coord_flip() +
  xlab("") +
  theme(text = element_text(size = 12))
```

審査員を1人ずつ除外してICCを計算した結果がこちらです。例えば、judge_Aはその審査員を除外した時のICC(3)の値を示しています。
赤線は審査員全員のICCの値です。
![a818ea55-811f-41da-83dc-89af55ce44ea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466700/bfde787a-92a4-5437-1e15-d2fab1711582.png)


元々、審査員Bに大きなノイズを乗せたデータを生成していましたが、審査員Bを除外した時のICCが高くなっています。
つまり、審査員Bは信頼性の低い審査員といえます。
一方、審査員C、D、E、Gを除外した場合はICCの値が低下しているため、これらの審査員は信頼性が高いと判断できます。

# おわりに
今回はICCを用いて、M-1グランプリのような審査員が漫才グループに対して審査することを想定しましたが、例えば実務を想定すると、複数の検査機器の信頼性を評価する場合にも有用です。
検査機器の信頼性評価にはICC(2)を使用し、特定の年数が経過した後に信頼性が低下する場合、その年数を閾値として設定することで、信頼性の一般化を判断することも可能です。
数理的な面も含めてさらに詳しく知りたい方は、こちらの論文も見てください。ICC1, ICC2, ICC3のそれぞれのガイドラインについて言及されています。
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4913118/pdf/main.pdf