www.crosshyou.info

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

J. Leagueのデータの分析 - R言語で「攻撃は最大の防御なり」か「防御は最大の攻撃なり」かを調べる。

UnsplashWesley Tingeyが撮影した写真 

今回は、J. Leagueのデータを分析してみます。勝ち点と得点、失点の関係を調べます。

まず、データをJ. Leagueの公式サイトから取得しました。

J. League Data Site (j-league.or.jp)

Webスクレイピングできればいいのですが、そこまでの技術が無いのでコピペしてExcelに貼り付けました。

こんな感じでまとめました。

これを、R言語で分析します。

まず、必要なライブラリを読み込みます。

tidyverseパッケージはRを使うときはとりあえず読み込んでおいたほうがいいですよね。modendiveパッケージは、現在、読んでいるデータ分析の本、Statistical Inference via Data Science (moderndive.com)のパッケージです。今回はこの本の内容を参考にして分析します。readxlパッケージはExcelのデータを読み込むときに使います。

では、read_xlsx()関数でデータ読み込みます。

glimpse()関数でデータが読み込まれたかどうか見てみます。

無事に読み込みできたようです。日本語のチーム名が何故か文字化けしてしまうんですよね。。今回はチーム名は分析には使わないので大丈夫です。

変数を簡単に説明します。year: 西暦、rank: 順位、name: 英語のチーム名、team: 日本語のチーム名、point: 勝点、game: 試合数、win: 勝数、lose: 敗数、tile: 引分数、goal_get: 得点、goal_give: 失点、get_give: 得失点差、です。

今回の分析では、pointが被説明変数で、goal_getとgoal_giveが説明変数です。

point, goal_get, goal_giveの基本データをみてみます。summary()関数を使います。

pointの平均値は46.65, goal_getとgoal_giveの平均値は46.16と同じです。

最小値は、pointは14, goal_getは16, goal_giveは24。

最大値は、pointは92, goal_getは88, goal_giveは88となっています。

3つの値の範囲はだいたい同じですね。

この3つの変数の相関係数を見てみます。cor()関数を使います。

pointとgoal_getは0.77の相関係数なので、比較的強い正の相関です。

pointとgoal_giveは-0.70の相関なので、比較的強い負の相関です。

goal_getとgoal_giveは-0.25の相関なので、比較的弱い負の相関です。

この結果は直感と矛盾しませんね、得点が多ければ勝点は多く、失点が多ければ勝点は少なく、得点が多ければ失点は少ない、勝点が多ければ得点は多く、勝点が少なければ失点は多く、失点が少なければ得点が多い、ということです。

plot()関数で散布図を描いてみます。

pointとgoal_get, pointとgoal_giveは相関が強く、goal_getとgoal_giveは相関が弱いことがわかります。

それでは、lm()関数で回帰分析をしてみます。

続いて、moderndiveパッケージのget_regression_table()関数で結果を表示します。

goal_getの係数は0.688でgoal_giveの係数は-0.656です。

つまり、goal_giveが変わらないとすると、1点得点すると勝点が0.688増えるということ、goal_getが変わらないとすると、1点失点すると勝点が0.656減るということです。

ということは、1得点(=勝点0.688) > 1失点(=勝点0.656)ということなので、「攻撃は最大の防御なり」ですね。

以上の結果はJ. League全部のチームの結果です。もしかしたら、上位チームと下位チームでは違うかもしれません。勝数のほうが敗数よりも多いチームは、1, そうでないときは0というダミー変数を作って、これを回帰モデルに加えてみましょう。

まずは、ダミー変数を作成します。

こうして作成した、winnerを加えた回帰モデルを作成します。

結果をget_regression_table()関数でみてみます。

すこしややこしいですが winner = 1 のときとwinner = 0 のときでわけて考えます。

winner = 1, つまり勝ち越しチームは

point = 40.1 + 9.23 + (0.594 + 0.022) * goal_get - (0.507 + 0.13) * goal_give

= 49.33 + 0.616 * goal_get - 0.520 * goal_give となります。

winner = 0, つまり負け越しチームは、

point = 40.1 + 0.594 * goal_get - 0.507 + goal_give となります。

どちらの場合でも、goal_getの係数の絶対値ほうがgoal_giveの係数の絶対値よりも大きいですから、1得点の価値のほうが1失点の価値よりも大きいことがわかりました。

今度は、J. Leagueの開催された年を前半、後半に区切ったダミー変数を作成して、分析してみましょう。

まずは、前半の年なら1のダミー変数を作成します。

回帰モデルを作成します。

結果をget_regression_table()関数で表示します。

old_year = 1 のときと、old_year = 0 のときでわけて推計式を考えます。

old_year = 1 のとき、

point = 46.6 - 4.03 + (0.707 - 0.029) * goal_get - (0.687 - 0.079) * goal_give

= 43.57 + 0.736 * goal_get - 0.608 * goal_give

old_year = 0 のとき、

point = 46.6 + 0.707 * goal_get - 0.687 * goal_give

です。どちらのケースでもgoal_getの係数の絶対値のほうがgola_giveの係数の絶対値よりも大きいですね。1得点の価値のほうが1失点の価値よりも大きいです。

以上の分析結果から、J. Leagueでは「攻撃は最大の防御なり」ということが言えるようです。