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

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

2010年から2024年のプロ野球の成績のデータの分析 7 - セリーグ・パリーグを分類する - ロジスティクス回帰で分類

gl

www.crosshyou.info

の続きです。今回はセリーグ・パリーグを分類するということをやってみます。

まず、分類用のデータフレームを作成しましょう。

最初にtidymodelsパッケージの読み込みをしておきます。

tidymodels_prefer()関数でtidymodelsパッケージの関数を優先するようにしておきました。

使用するデータフレームは、team、est_win_rate, spreadはいらないので、削除します。そのあと、initial_split()関数、testing()関数、training()関数でトレーニング用のデータフレームとテスト用のデータフレームを作成します。

train_dataがトレーニング用のデータフレーム、test_dataがテスト用のデータフレームです。

それぞれのleagueの比率を確認しておきます。

両方のデータフレームともに、セリーグ・パリーグの球団数は 1:1 で同じ比率ですね。

まず、分類方法の基本としてロジスティクス回帰でやってみます。

まずはモデルを設定します。

次に、レシピを設定します。

文字列のデータ、今回はyearだけですが、それはstep_dummy()関数でダミー変数にしておきます。

数値型のデータは、step_normalize()関数で標準化(平均値0、標準偏差1)しておきます。

次にワークフローを作ります。

fit()関数でモデルをフィットします。

predict()関数でtest_dataのデータを使って予測します。

正解率をみてみます。

正解率は 72.2%です。

AUCを計算します。

AUCは0.824でした。

ROC曲線を描いてみます。

最後にモデルの係数を確認します。

three_base: 三塁打のp値が一番小さいですね。
セリーグ・パリーグの三塁打を比較してみます。

パリーグのほうが三塁打が多いことがわかります。

今回は以上です。

次回は

www.crosshyou.info

です。

はじめから読むには、

www.crosshyou.info

です。

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

#
# tidymodelパッケージの読み込み
library(tidymodels)
tidymodels_prefer()
#
# セリーグ・パリーグ分類用のデータフレームを作る
set.seed(7)
baseball_split <- df |> 
  select(-team, -est_win_rate, -spread) |> 
  initial_split(prop = 0.8, strata = league)
train_data <- training(baseball_split)
test_data <- testing(baseball_split)
#
# leagueの比率
train_data |> 
  group_by(league) |> 
  summarize(n = n())
#
test_data |> 
  group_by(league) |> 
  summarize(n = n())
#
# glmでロジスティクス回帰
# モデルの設定
glm_model <- logistic_reg(mode = "classification") |> 
  set_engine("glm")
glm_model
#
# glmでロジスティクス回帰
# レシピの設定
glm_recipe <- recipe(league ~ ., data = train_data) |> 
  step_dummy(all_nominal_predictors()) |> 
  step_normalize(all_numeric_predictors())
glm_recipe
#
# glmでロジスティクス回帰
# ワークフローの構築
glm_wf <- workflow() |> 
  add_model(glm_model) |> 
  add_recipe(glm_recipe)
glm_wf
#
# glmでロジスティクス回帰
# モデルをフィット
glm_fit <- fit(glm_wf, train_data)
#
# glmでロジスティクス回帰
# test_dataで予測
glm_preds <- predict(glm_fit, new_data = test_data, type = "prob") |> 
  bind_cols(predict(glm_fit, new_data = test_data)) |> 
  bind_cols(test_data |> select(league))
glm_preds
#
# glmでロジスティクス回帰
# 正解率
accuracy(glm_preds, truth = league, estimate = .pred_class)
#
# glmでロジスティクス回帰
# AUC
roc_auc(glm_preds, truth = league, .pred_C)
#
# glmでロジスティクス回帰
# ROC曲線
roc_curve(glm_preds, truth = league, .pred_C) |> 
  autoplot()
#
# glmでロジスティクス回帰
# モデルの係数の確認
glm_fit |> 
  extract_fit_parsnip() |> 
  tidy() |> 
  arrange(p.value)
#
# glmでロジスティクス回帰
# セリーグ・パリーグの三塁打の比較
df |> 
  ggplot(aes(x = three_base, y = league)) + 
  geom_boxplot(aes(group = league))
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは photograph of close up of violet morning glory flowers, flowering on a large lake side, under the blue sky. です。)