Rで何かをしたり、読書をするブログ

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

2010年から2024年のプロ野球の成績のデータ分析 4 - 線形回帰分析で勝率と関係のある変数を確認する。

www.crosshyou.info

今回は、勝率と関係のある変数を線形回帰分析で確認してみます。

lm() 関数で線形モデルを推定します。

基点となら線形モデルということで、lm_base という名前で保存します。

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

p値が0.05以下の変数は、dasu, tokuten, saves, kanpu, inningsでした。

dasu: 打数、tokuten: 得点、saves: セーブ数、kanpu: 完封勝数は納得ですが、innings: 投球回というのは謎ですね。投球回が1増えると、勝率が0.25も上がるという推定結果です。

このモデルをよく見ると、batting_rate: 打率 の係数が -5.24 と打率が高ければ勝率が下がる、という常識の感覚とは正反対の推計結果です。

ちょっと、前提条件のモデルが悪い気がします。

よく考えて、変数を選びましょう。例えば、saves: セーブ数や kanpu: 完封勝数は勝利したときにしか記録されませんから、これを説明変数に入れるのは適切ではないかもしれません。innings: 投球回もよくわからないのではずします。

lm_base2という名前で線形モデルを推計してみます。

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

p値が 0.05 以下なのは、bougyo: 防御率と sanshin: 三振の2つだけです。

batting_rate: 打率の係数は 9.1 とプラスになったので、打率が高いほど勝率が上がる、という常識の感覚と一致しました。

この lm_base2 を step() 関数を使って、有意でない変数を削除してみます。

lm_simple という名前で保存しました。

有意な変数は、batting_rate: 打率、tokuten: 得点、hit: 安打数、bougyo: 防御率、sanshin: 三振数です。hit: 安打の係数の符号がマイナスなのがちょっと不思議ですが、他の係数の符号のプラス・マイナスは納得です。

batting_rate: 打率の係数が7.02 ということは、打率が 0.01 上がると、勝率が7.02 * 0.01 = 0.07 上がるということですね。

bougyo: 防御率の係数は、 -0.078 ということは、防御率を 1 下げると、勝率が 0.078上がるということですね。

勝率、打率、防御率のサマリーを確認します。

勝率0.5、打率0.2516の平均チームが打率を0.01上げると勝率が0.57になります。0.57は3rd Qu. よりも良い成績になりますね。そして打率も0.2616になって3rd Qu. よりも良い成績になります。

勝率0.5、防御率3.522の平均チームが防御率を1下げると、勝率は0.578になります。これも3rd Qu. よりも良い成績になりますね。そして防御率も2.522になって1st Qu. よりも良い成績になります。

さらに、勝率0.5, 打率0.2516, 防御率3.522の平均チームが打率を0.01上げて、防御率を1下げると、勝率は 0.5 + 0.073 + 0.078 = 0.651 になります。

優勝チームの平均勝率が 0.5955, 3rd Qu. は 0.6292, 最高は 0.6670 ですから、0.651 の勝率だと優勝の可能性がかなり高いですね。

ということで今回は、やっぱり打率、防御率は勝率に直結するんだな、ということを確認できたところで終わりにしたいと思います。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# team, league, year を除いた線形モデル
lm_base <- lm(win_rate ~ batting_rate + dasu + tokuten + hit + two_base +
                three_base + hr + daten + steal + bougyo + saves + kanto +
                kanpu + innings + sanshin + shitten, data = df)
#
# summary()
summary(lm_base)
#
# team, league, year, save, kanpu, innings を除外したモデル
lm_base2 <- lm(win_rate ~ batting_rate + dasu + tokuten + hit + two_base +
                 three_base + hr + daten + steal + bougyo + kanto + sanshin +
                 shitten, data = df)
#
# summary()
summary(lm_base2)
#
# 有意でない変数を除外
lm_simple <- step(lm_base2, trace = FALSE)
summary(lm_simple)
#
# 勝率と打率と防御率のサマリー
df |> select(win_rate, batting_rate, bougyo) |> 
  summary()
#
# 優勝チームの勝率のサマリー
df_raw |> 
  filter(game_sa == -1) |> 
  select(win_rate) |> 
  summary()
#

(冒頭の画像は Bing Image Creator で生成しました。プロンプトは Close up of nature red Erythria flowers, on the vast green grass fields along a large river, under the blue shiny sky, photo です。)