Jリーグのチームの本当の強さをベイズモデリングで分析してみた

# はじめに

今年もJリーグが開幕しましたね！
で、このサッカーというスポーツはホームアドバンテージがかなり強く出るスポーツだと思っています。
CLなどのトーナメントでは、アウェイの点数は２倍にするなどそれを前提としたルールもあります。

私はどちらかというと野球(DeNA)ファンなのですが、野球はスタジアムの好みはあるものの、ホームアドバンテージが必ずしも有利になるということはないように思えます。
Deの守護神、山崎康晃は一時期ホーム以外は防御率０．００、だけどホームでは防御率６点以上ということにもなっていました（まあ狭いからという理由もありますけどね）

というわけでJリーグの各チームのうちホームアドバンテージを抜いても本当に強いチームはどこか？　また逆にホームの利を生かしているチームはどこか？というのをベイズモデリングをつかって分析したいと思います。

ちなみに今回の記事は以下のBlogを参考にさせていただいています。
当Blogコードをそのまま流用している箇所については、今回載せませんので合わせてご覧ください

[ベイズモデリングで男子プロテニスの強さを分析してみた](http://www.ie110704.net/2018/05/24/%E3%83%99%E3%82%A4%E3%82%BA%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E7%94%B7%E5%AD%90%E3%83%97%E3%83%AD%E3%83%86%E3%83%8B%E3%82%B9%E3%81%AE%E5%BC%B7%E3%81%95%E3%82%92%E5%88%86%E6%9E%90/)

# データ収集

さて分析するためには、まずデータが必要です。
そのためにはスクレイピングだ！！！・・・となるところですが、Jリーグには[J. League Data Site](https://data.j-league.or.jp/SFTP01/)というデータ提供サイトがあります。
さすがJリーグです、素晴らしい

そこでスクレイピングなどせずに、日程結果CSVをそのままDLします。
今回は2016-2018, J1/J2/ルヴァンカップに絞って利用します。
なおCSVには取得件数制限がありますので、何回かに分けて取得しています。

<img width="1034" alt="スクリーンショット 2019-03-22 23.46.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/b22a4bba-cdcb-5a3d-7669-f4c8992cec4c.png">

データとしてはこんな感じです。
欲しいホームアウェイ含めいろいろありますね。

<img width="1002" alt="スクリーンショット 2019-03-22 23.52.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/a7a247fa-283a-3be3-031e-0a32baf7e55e.png">

# 前処理

今回分析はホームアドバンテージを考慮した強さの分析にあります。
そこで今回はホームアウェイどちらが勝ったかを加えます。
また引き分けは除外データとして削除します。

以下がコードです。色々余計なものもありますが、見なかったことにしてください。。。

```python
df['score_arr'] = df['スコア'].str.split('-')

def func_cate(x):
    if  x[0] < x[1] :
        return 'A'
    elif x[0] > x[1] :
        return 'H'
    else:
        return 'D'

df['winner'] = df['score_arr'].apply(func_cate)
df.loc[df['winner'] == 'H', 'win_team'] = df['ホーム']
df.loc[df['winner'] == 'A', 'win_team'] = df['アウェイ']
df.loc[df['winner'] == 'D', 'win_team'] = 'DRAW'

df.loc[df['winner'] == 'H', 'lose_team'] = df['アウェイ']
df.loc[df['winner'] == 'A', 'lose_team'] = df['ホーム']
df.loc[df['winner'] == 'D', 'lose_team'] = 'DRAW'

df.drop(df.index[df['win_team'] == 'DRAW'], inplace=True)
```

結果がこちらです
後ろに追加カラムがありますね

<img width="1002" alt="スクリーンショット 2019-03-22 23.55.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/cf4b2025-74c7-122c-a851-c3d194a727a7.png">

# 分析モデル

このデータをベイズモデリングに投入し、分析していこうと思います。
今回はPyStanを使用しています。モデル式は以下の通りです。

```python
model = """
    data {
        int N;
        int G;
        int<lower=1, upper=N> LW[G, 3];
    }
    parameters {
        ordered[2] performance[G];
        vector<lower=0>[N] mu;
        vector<lower=0>[N] home;
        real<lower=0> s_mu; 
        real<lower=0> h_mu; 
        vector<lower=0>[N] s_pf;
    }
    model {
        for (g in 1:G)
            for (i in 1:2)
                if ((i == 1 && LW[g, 3] == 1) || (i == 2 && LW[g, 3] == 2))
                    performance[g, i] ~ normal(mu[LW[g, i]] + home[LW[g, i]], s_pf[LW[g, i]]);
                else
                    performance[g, i] ~ normal(mu[LW[g, i]], s_pf[LW[g, i]]);
        
        mu ~ normal(0, s_mu);
        home ~ normal(0, h_mu);
        s_pf ~ gamma(10, 10);
    }
"""
```

[参考サイト](http://www.ie110704.net/2018/05/24/%E3%83%99%E3%82%A4%E3%82%BA%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E7%94%B7%E5%AD%90%E3%83%97%E3%83%AD%E3%83%86%E3%83%8B%E3%82%B9%E3%81%AE%E5%BC%B7%E3%81%95%E3%82%92%E5%88%86%E6%9E%90/)のモデルを回収し、以下のように変更しています。



ホームの場合には、μにアドバンテージとなる値を追加し、平均を右に移動しています。
またホームアドバンテージは必ずプラスになると仮定しているため宣言部はvector<lower=0>[N] home;とlower=0の制限をつけています。

<img width="795" alt="スクリーンショット 2019-03-23 0.10.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/97004c03-744b-5cd6-b4db-8e83ea96edc0.png">

あとはこれに投入しStanを回すだけですね。

# 結果

まずこちらがホームアドバンテージのない純粋なチームの強さになります。
文字化けしているのはApple Gothicのせいなので脳内変換してください

<img width="948" alt="スクリーンショット 2019-03-23 0.11.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/bd2a7f49-7a5a-7312-118f-ce1a73ae536f.png">

割と上位のチームが上に出ている中、松本山雅が強く出ていますね。
今年からJ１にあがった松本山雅ですが今シーズン要注目かもしれません。

そしてこちらがホームアドバンテージの強さです

<img width="987" alt="スクリーンショット 2019-03-23 0.16.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/62468/d179cc83-0d37-a7b9-5c6e-61d7851bf616.png">

こちらは割と幅が広いですね。
(全体的に０にかかっているので真面目に検定すると全部無効になってしまいそうですが、、）

平均値で高いのは札幌でしょうか。
日ハムといい北海道のスポーツ熱は強いのでしょう。
吉原宏太がいたような時代から熱狂的な印象があり、かつ札幌というちょっと遠目のロケーションが有利に働いているのかもしれませんね。

# さいごに

今回は趣味として楽しく分析しただけのものですが、なかなか面白かったです
ベイズモデリングは自分でモデリングするため色々なことに適用できます
（Mー１で本当に面白かったのは誰？みたいなことをやっている方もいましたね）

今回のように色々な分析に使えるのでちょっとでも興味が湧きましたらぜひアヒル本あたりから勉強はしてはいかがでしょうか