見出し画像

[M-1 2026年] その問題、数理モデルが解決します!?

今年もM-1グランプリめちゃくちゃ面白かったですね!
優勝したたくろうやエバース,ママタルトなどなど全組面白かった…!
(個人的には,めぞんめちゃくちゃ面白かったので来年も期待しています)


M-1を見終えて…

M-1グランプリを終えて,有働さんのニューズ番組に出るたくろうを見ながら思ったことがあります.それは……..

「めちゃくちゃ数理モデルにできそう!!!」

この本を読んだことで,すべてをモデル化できるかと考える癖が身についていたようで,どのような数理モデルが当てはまりそうか考えてみました.

注意:どの採点に文句があるというわけではなく知っているモデルを試してみたいという単純なモチベーションで記事を書いています

どんな数理モデルが解決する?

今回は,

  1. 出場者の実力

  2. 採点者の癖

  3. 誤差

以上の3つが関与しているとして,ベイズ推定の枠組みでこの3つをモデル化してみようと思いました.

その前にGoogleで「ベイズ推定 M-1 得点」と検索すると以下の記事がありましたので,車輪のなんちゃらという気持ちで書いています.

モデル作成

今回はpyMCで作成しています.
少し気にした/している部分を下に示します:

  • 尤度をTruncatedNormalにして100点を超えないよう制限

  • 全体平均を経験ベイズ的に決定しています

  • 標準偏差は広め?

マイナス側は0で切ってもよかったですが,ひとまず上側だけ制限をしています.

式で表すとこういう感じ,小文字yが得点を表し,iが漫才師のインデックス,jが採点者のインデックスを表す.μは平均

MCMCを回す

上記のモデルでMCMCを回してみました.

Python: 3.12.8
pandas: 2.2.3
numpy: 2.2.3
pymc: 5.21.1
arviz: 0.21.0
with pm.Model() as model_pm:

    # ---- 事前分布 ----
    mu = pm.Normal("mu", mu=93, sigma=5)

    sig_manzai = pm.HalfCauchy("sig_manzai", beta=5)
    sig_saiten = pm.HalfCauchy("sig_saiten", beta=5)
    s = pm.HalfCauchy("s", beta=15)

    manzai = pm.Normal("manzai",mu=0,sigma=sig_manzai,shape=N)

    saiten = pm.Normal("saiten",mu=0,sigma=sig_saiten,shape=M)

    # ---- 線形予測子 ----
    mu_ij = mu + manzai[data.idX] + saiten[data.idY]

    # ---- 尤度(Normal)----
    y = pm.TruncatedNormal(
    "y",
    mu=mu_ij,
    sigma=s,
    upper=100,
    observed=data.score
    )


    # ---- MCMC ----
    idata_pm = pm.sample(
        tune=2000,
        draws=2000,
        target_accept=0.9,
        random_seed=42,
        chains=4
    )

indexのidXは出場者,idYは採点者それぞれに固有のindexをつけています.
数値データは得点に対してidXとidYを行に持つ形で成形しました.

データの成形

事後分布の確認

平均に対しての出場者と採点者の事後分布を載せています.


出場者の実力?(α)


採点者の癖?(β)

例えば,最高得点だったエバースを見てみるとαが大きい方にふれている様子が観られます.

さいごに

今回は2025年の得点をベイズ推定でモデル化してみました.
知識的につたない部分も多いと思うのでご指摘あればコメントいただければと思います!

いいなと思ったら応援しよう!