M-1グランプリ分析2022；山田邦子さんの評定やいかに

# まえふり

昨日のM-1も良かった・・・！
昨日はNHK大河ドラマ「鎌倉殿の13人」の最終回でもあったし，M-1の日でもあったので，夕方から万全を期してテレビの前に齧り付いてました。
テレビが面白くないと言われる昨今ではあるけど，あれだけお金をかけてCG,スタジオ，女優さんを揃えて面白コンテンツを作れるのは，やっぱり資本のあるテレビだなあと思ったり。賞金や名声を求めて，「面白いことをしよう」という人がたくさん出てくるというのはすごいものです。

さて，演者の人生が変わると言われている大会ですから，審査員がちゃんと審査していることが重要。みている人も「あの審査員はおかしい」とか「この審査員は偏っている」とか言い合って楽しんでいるわけですが，せっかくデータと技術があるので，この視聴者の感覚を検証してみましょう。

今回気になったのは，新しく審査員になった山田邦子さん。個人的な印象では，お笑い芸人というイメージがない。タレントさんで，笑いに理解が深い人だとは思うけど，舞台に立ってお客さんを笑わせるような，話芸の人というイメージがないというのが正直なところ。まあそれだけに，どういう感覚で評価するのかが実物だったわけです。今回は特に，最初に点数が公開される人で，最初の演者カベポスターに84点をつけて会場が響めきましたね。しかも二組目の真空ジェシカに95点とつけたので，「急に11点も上げて，評価軸がぶれているんじゃないか」と思われたに違いない。

そこで今回チェックするのは次の3つ。

1. 山田邦子の点数の振れ幅は異常だったのか
2. 山田邦子の評価は他の審査員と共通したところがないのか
3. 山田邦子の評価は他の審査員と比べてどこがどうちがうのか

これをデータに基づいてみてみたいと思います。

# データ

M-1の採点データは公開されているので，これをまとめたものをCSVにして[こちらのサイト](https://kosugitti.github.io/psychometrtics_syllabus/)に置いてあります。私の採点も入っているのはご愛嬌。分析に際しては使いませんので。

余談ですが，最近[Githubでもデータがあるのを見つけました](https://github.com/JaehyunSong/M-1_Grand_Pix)。今後はこっち使ってもいいかなあ。まあいいや。

# テーマ1. 山田邦子の点数の振れ幅は異常だったのか

これについては，[怖い本](https://amzn.to/3HMAfQr)の7人の科学者を参考に，次のようにモデル化しました。

演者$i$が評定者$j$に付けられた点数$Y_{ij}$をデータとして，これを演者の実力$\mu_i$と評定者の振れ幅$\sigma_j$から出てきていると考えます。すなわち，

$$ Y_{ij} \sim Normal(\mu_i,\sigma_j)$$

です。事前分布は$\mu_i \sim Normal(80,10), \sigma_j \sim cauchy(0,5)$としました。

Stanのコードを次のように書いてみました。
```{stan}
data{
    int L;
    int N; // number of players
    int M; // number of judges
    array[L] int PlayerID;
    array[L] int JudgesID;
    array[L] real Y;
}

parameters{
    array[N] real mu;
    array[M] real<lower=0> sigma;
}

model{
    for(l in 1:L){
        Y[l] ~ normal(mu[PlayerID[l]],sigma[JudgesID[l]]);
    }
    //prior
    mu ~ normal(80,10);
    sigma ~ cauchy(0,5);
}
```

で，データを与えて分析してみましょう。
データの加工はこんな感じ。

```{r dataHundling}
library(tidyverse)
library(cmdstanr)

dat <- read_csv("M1score2022.csv", na = ".") 
M1data <- dat %>%
  dplyr::select(-年代, -ネタ順, -小杉考司) %>%
  pivot_longer(-演者) %>%
  na.omit() %>%
  mutate(
    PlayerID = as.numeric(as.factor(演者)),
    JudgesID = as.numeric(as.factor(name))
  )
dataStan <- list(
  L = NROW(M1data), N = max(M1data$PlayerID), M = max(M1data$JudgesID),
  PlayerID = M1data$PlayerID,
  JudgesID = M1data$JudgesID,
  Y = M1data$value
)
```

さて，モデルのコンパイルと実行。

```{r modelCompile}
model <- cmdstanr::cmdstan_model("m1kuniko.stan")
fit <- model$sample(
  data = dataStan,
  chains = 4,
  parallel_chains = 4,
  iter_warmup = 1000,
  iter_sampling = 2500,
  refresh = 10000
)
```

結果はこちら。

![stan_result-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53345/b6a45fce-cbc6-02ef-8490-236fce76759f.png)


MAP推定値の大きさの順にならべてわかるように，山田邦子の評価のブレ幅はこれまでの審査員と比べても中程度です。確信区間はまだ1回,10人分しか評定してないから広いけど，それでもまっちゃんのMAPより小さいんじゃないかな。これを書いたコードはこんな感じです。

```{r stan_result}
Results <- fit$draws() %>%
  posterior::as_draws_df() %>%
  as_tibble() %>%
  bayestestR::describe_posterior(centrality = "MAP") %>%
  as.data.frame() %>%
  filter(str_detect(Parameter, "sigma")) %>%
  mutate(JudgesID = str_extract(Parameter, "[0-9]+") %>% as.numeric())
M1data %>%
  dplyr::select(name, JudgesID) %>%
  left_join(Results, by = "JudgesID") %>%
  dplyr::select(name, MAP, CI_low, CI_high) %>%
  ggplot(aes(x = reorder(name, MAP), y = MAP)) +
  geom_point() +
  geom_errorbar(aes(ymin = CI_low, ymax = CI_high)) +
  coord_flip()
```


つまり，*この程度のブレはよくあること*ですね。むしろサンド富澤，中川家礼二，大吉先生のようにあんまり点差をつけない人の方が，審査員としては貢献していないとも言えますわね。

## テーマ2. 山田邦子の評価は他の審査員と共通したところがないのか

山田邦子は独自の評価基準で，他の人とは違う物差しで見ていたのではないか。
これについてはある意味褒め言葉であって，むしろ誰もが同じ判断をするのであれば審査員は1人，あるいはAIでいいわけです。とはいえ，お笑いとは違う基準で評価されても困る。

てなことで，ここで求められている疑問を統計的な言葉で言うなら，「審査員の判断は1次元性を持っていたと言えるのか」でしょうか。

これについては因子分析をして，潜在的な次元数を見ればよろしい。ということで次のように計算してみました。

```{r faParallel}
dat %>%
  dplyr::filter(年代 == 22) %>%
  dplyr::select(中川礼二, 博多大吉, 塙宣之, 富澤たけし, 松本人志, 立川志らく, 山田邦子) %>%
  psych::fa.parallel(SMC = T, n.iter = 1) -> parallel.result
parallel.result$fa.values
```



![faParallel-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53345/af6d93c2-b894-0aa5-5165-1677b49e4b6b.png)


(余談)fa.parallelが全然収束しなかったのはなんでなんだろう。シミュレーションで収束しなかったのかしら。反復回数をなくす(1回)にしてあるのはそれ対策です。別の環境ではこの問題生じなかったんだけどな。むむむ。。。


さてまあ，このスクリープロットを見ても分かるとおり，圧倒的に第一因子が大きく，寄与率も30%は超えているので，心理学者なら一因子構造であると判断するでしょう。つまり，評定に個人差はもちろんあるけど(厳密に言えば，この場合演者に個人差があって，評定者の方ではないんだけど)，許容範囲内じゃないかなあ。


## 3. 山田邦子の評価は他の審査員と比べてどこがどうちがうのか

さて，ではみなさんどんな基準で審査してたんでしょうね。
評定者の評定パターンから，評定者の判断基準を探してみましょうか。
これには多次元尺度構成法が良さそうですね。

ということで，評定データを距離データに置き換えて，MDSにしてみましょう。
見せるために，次元は2次元に限定。

```{r}
dat %>%
  filter(年代 == 22) %>%
  dplyr::select(中川礼二, 博多大吉, 塙宣之, 富澤たけし, 松本人志, 立川志らく, 山田邦子) %>%
  t() %>%
  dist() %>%
  MASS::isoMDS(k=3) %>% 
  as.data.frame() %>% print %>% 
  rownames_to_column("Rater") %>% 
  ggplot(aes(x=points.1,y=points.2,label=Rater))+
  xlab("dim1")+ylab("dim2")+
  geom_point()+geom_label() +
  geom_text_repel(family="HiraKakuProN-W3")
```

![unnamed-chunk-3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53345/ebf60bf8-3823-5449-66bc-67ebac6adf74.png)

おほー。確かにこれを見ると，山田邦子と立川志らくがぶっとんでんなあw
間とって塙，邦ちゃんの対極に礼二，志らくの対極に大吉先生ですか。
東西の笑い，毒と薬，いろいろな次元が見えてきそうです。それにしても，左下にある程度クラスターができているところをみると，西の漫才，吉本の漫才ですこし価値観が固定しているような気配。

他の人たちがこの空間を「歪めている」とみるか，「広げてくれている」とみるか，それは見る人のお気持ちで。
なんであれ，楽しませてくれるプレイヤーとジャッジ，番組に感謝しかないなあ。


ウエストランドおめでとう！俺はさや香が好きだったよ！肉うどんもまた会えるのを楽しみにしています！

メリークリスマス＆良いお年を。