
の続きです。前回は、説明変数を全部使ったモデル、具体的には rank:選手の個人成績の順位、point:得点、game:出場試合数、try:トライ数、goal:ゴール数、n:個人成績上位50位に入った選手の数を説明変数に取り入れたモデルと、シンプルなモデル、具体的には
goal と n だけのモデルで、どちらが未知のモデルに対して予測性能が良いかをLOOCVで確認しました。結果はシンプルなモデルのほうが良さそうということでした。
今回は実際に未知のデータ、2024-2025年のデータを使い確認しようと思います。

【公式】NTTジャパンラグビー リーグワン 個人ランキング(2024-25)
こちらのウェブサイトの個人成績と

【公式】NTTジャパンラグビー リーグワン 順位表(2024-25)
のサイトからデータをコピペしてExcelファイルに貼り付けて、Copilotに手伝ってもらい、以下のようなCSVファイルを作成しました。

このデータを使って、実際の順位を予測してみたいと思います。
まず、CSVファイルを読み込みます。

CSVファイルの2列目から8列目だけが必要なので、col_select = 2:8 としています。
このデータフレームを予測用に変換します。
まず。rank:個人成績順位を50位までにします。

target:チームの順位ごとの平均値のデータフレームに組み替えます。

はい。できました。それでは、第4回で作成した2つのモデル、全部の説明変数を使ったモデルとgoalとnをだけを使ったモデルで予測します。
はじめに2つのモデルを確認しておきましょう。

この2つのモデルをつかって、targetを予測します。

さあ、2つの予測値のRMSEを計算してみます。

シンプルなモデルのRMSEは2.2で小さいですね。第5回のLOOCVでの結果と同じく、未知のデータでは、goalとnだけを使うシンプルなモデルのほうが予測精度は良かったという結果でした。
最期に実際のチーム順位とモデルが予測したチーム順位を描いてみます。


散布図にするとわかりやすいですね。simpleモデルのほうが対角線に近いところに位置していることがわかります。
今回は以上です。
はじめから読むには、
です。
今回のコードは以下になります。
#
# 2024-2025シーズンのCSVファイルを読み込む
df_old_raw <- read_csv("league_one_2024_2025_season.csv",
col_select = 2:8)
df_old_raw
#
# rank:個人成績順位を50位までにする
df_old <- df_old_raw |>
filter(rank <= 50)
summary(df_old)
#
# target:チームの順位ごとの平均値のデータフレームにする
df_old <- df_old |>
group_by(target) |>
summarize(
across(rank:pg, mean),
n = n()
) |>
ungroup()
df_old
#
# 2つのモデルの確認
lm_mod_df2
#
lm_mod_df2_simple
#
# targetの予測
pred_full <- predict(lm_mod_df2, newdata = df_old)
pred_simple <- predict(lm_mod_df2_simple, newdata = df_old)
#
# RMSEの計算
sqrt(mean*1
sqrt(mean*2
#
# 実際の順位と予測の散布図
tibble(
actual = c(df_old$target, df_old$target),
estimate = c(pred_full, pred_simple),
model = c(rep("full", 12), rep("simple", 12))
) |>
ggplot(aes(x = actual, y = estimate, color = model)) +
geom_point(size = 5) +
geom_line(aes(group = model)) +
geom_abline() +
labs(title = "実際の順位とモデルの予測順位") +
theme_minimal()
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Long wide view of southern islands ocean, close up of blue morning glory flowers, #Pohoto です。)