M-1グランプリの得点を偏差値の観点で比較してみる

みなさん、昨年のM-1グランプリは視聴されましたか？あれは果たして漫才なのか？？という議論がSNS上を賑わせたとか賑わせていないとか。それはさておき、一昨年（2019年）のM-1グランプリで、ミルクボーイさんがM-1史上最高得点を叩き出したということで話題になりました。審査員全員が97点以上をつけるという圧倒的な得点（681点/700点）で、結果的に最終決戦でも審査員票7票中6票を獲得されて見事優勝されました。それまでの記録は2004年のアンタッチャブルさんで、673点/700点でした。

さて、ふと気になったのは681点と673点という点数を、単純に比較できるものなのか？ということです。どちらが面白いのかという比較は、そもそも15年もの時間が空いていますし、審査員の顔ぶれも全く違うので比べようもないのですが、得点の基準（開催から間もない頃のM-1グランプリは、全体的に得点が低い傾向がありました）も得点のばらつきも違う中で、単純に得点の大小ではなく、他に何かしらの指標で得点を比較する方法はないか……ということで、『偏差値』を取り上げてみたいと思います。

この記事の趣旨は、アンタッチャブルさんとミルクボーイさんの比較ではなく、偏差値というものについて紹介することです。

---

## 偏差値の定義

偏差値は統計学の用語で、データの値が平均50、標準偏差10のデータに変換した結果の値を意味します。平均と標準偏差（データのばらつき）を同じ値に揃えるため、平均や標準偏差が異なるデータの比較に使うことができます。ただし、データの分布が正規分布に近いことが前提となるので、極端な分布に従うデータの場合には、適切な指標にはならないことに注意が必要です。今回お題としたM-1グランプリの決勝戦は、参加者が9人ないし10人であるため、必ずしも適切な状況設定とは言えませんが、細かい部分にはある程度目を瞑っていただきたいと思います。

さて、偏差値を数式で表すと以下のようになります。

```math
T_{i} = \frac{10 \left( x_{i} - \mu \right)}{\sigma} + 50, \quad \mu = \frac{1}{N} \sum _{i} x_{i}, \quad \sigma = \sqrt{\frac{1}{N} \sum _{i} \left( x_{i} - \mu \right) ^{2}} . 
```

$x_{i}$は得点を表し、$\mu$は全得点の平均、$\sigma$は全得点の標準偏差です。$T_{i}$がある得点$x_{i}$を偏差値に変換した値です。得点がぴったり平均値に一致すれば、偏差値は50になります。また、得点が平均点よりも標準偏差$\sigma$だけ高ければ偏差値は60、$\sigma$だけ低ければ40になります。

## M-1グランプリのスコアを偏差値に変換する

それでは、実際にM-1グランプリの得点を偏差値に変換してみましょう。まずは2019年の結果です。得点はソート済みです。

```python
scores = [681, 660, 654, 652, 649, 639, 638, 637, 632, 616]
```

Pythonならば、`numpy` ライブラリを使ってしまえば簡単なのですが、まずは定義通りに自分で計算してみましょう。

### 平均値

```python
avg = 0.0
for score in scores:
  avg += float(score)

avg /= len(scores) 
```

結果は以下の通りです。

```
>>> avg
645.8
```

### 標準偏差

次に計算した平均値を使って標準偏差を計算します。平方根を取る必要があるので、 `numpy` ライブラリを使います。

```python
import numpy as np

var = 0.0
for score in scores:
  var += (score - avg) ** 2

var /= len(scores)
std = np.sqrt(var)
```

結果は以下の通りです。

```
>>> std
16.791664598841887
```

### 偏差値

平均と標準偏差を計算できたので、あとは定義に従って偏差値を計算します。

```python
std_scores = []
for score in scores:
  value = 10 * (score - avg) / std + 50
  std_scores.append(value)
```

結果は以下の通りになりました。

```
>>> std_scores
[70.96278173780804, 58.45657672377485, 54.88337529119394, 53.692308147000304, 51.905707430709846, 45.95037170974166, 45.35483813764484, 44.75930456554802, 41.78163670506393, 32.253099551514836]
```

---

## 結果

2004年の得点も同様に計算し、結果を比較してみましょう。以下は、2004年の得点です。余談ですが、第1回大会2001年は10組でしたが、2002年以降はしばらく決勝戦の参加者は敗者復活組を加えて9組でした。

```python
scores = [673, 639, 634, 615, 615, 603, 587, 583, 582]
```

偏差値に変換した結果は以下の通りです。

```
>>> std_scores
[70.46491218, 58.55946897, 56.8086685, 50.15562671, 50.15562671, 45.95370558, 40.35114407, 38.95050369, 38.6003436]
```

得点1位の偏差値を比べると以下のようになります（小数点第2位を四捨五入）。

||2004|2019|
|---:|:---|:---|
|得点|673|681|
|偏差値|70.5|71.0|

2004年は平均点が低く673点という得点は圧倒的なようにも見えましたが、得点のばらつきの大きさを考慮して偏差値換算した結果、70.5というスコアになりました。非常に僅差ではありますが、M-1史上最高得点となったミルクボーイさんの得点は、偏差値換算した結果でもアンタッチャブルさんのスコアを上回りました。

---

## おまけ

2004年と2019件のM-1グランプリの結果のみを比較してみましたが、実は他の年度の得点1位が偏差値換算では1位という可能性もあります。興味のある方は確かめてみてください（ ~~丸投げ~~ ）。

念押ししておきますが、偏差値による比較でどちらが面白いとかそんなことを言うつもりは毛頭ありません。2004年も2019年も生放送で見ていましたが、どちらの漫才もとても面白かったです。ついでに言いますと、アンタッチャブルさんがコンビ復活したことは本当に嬉しかったです[^1]。

[^1]: ラジオも復活してくれないかな。

なお、`numpy` ライブラリを使うと平均や標準偏差は簡単に計算できるという紹介を最後にしておきたいと思います。

```python
import numpy as np

scores = np.array([673, 639, 634, 615, 615, 603, 587, 583, 582])
std_scores = 10 * (scores - np.average(scores)) / np.std(scores) + 50
```

```
>>> std_scores
array([70.96278174, 58.45657672, 54.88337529, 53.69230815, 51.90570743, 45.95037171, 45.35483814, 44.75930457, 41.78163671, 32.25309955])
```