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

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

ラグビー リーグワン のデータの分析5 - LOOCVでどちらのモデルが良いかを判断する。

www.crosshyou.info

の続きです。前回データフレームを作り直して、個々の選手の成績をチームごとに平均値にして、このデータフレームからチームの順位を予測するモデルを作成しました。

一つは全ての説明変数を使用したモデル、もう一つは有意な説明変数だけに絞り込んだモデルです。

今回は、将来、順位を予測するときにどちらのモデルを使うのが適切かを調べます。

Copilotをはじめ、ChatGpt, Gemini, Grok, Claudに、
「あなたは、スポーツ統計解析の専門家です。
観測数が12の、特徴量が7個のデータフレームを与えられて、チームの順位を予測する線形モデルを作りました。
一つ目は、7個の特徴量をすべて使うモデル、
二つ目は、7個の中から5%水準で有意な特徴、2個だけを使うモデル、
今度の新しいシーズンで順位を予測するとき、どちらのモデルを使うほうが良いかを調べたいと思います。
どのような手法で、2つのモデルの優劣を調べるのがいいですか?」
と聞いてみました。全ての生成AIがLOOCVを提案しました。

例えば、Copilotだとこんな感じでした。

ということで、今回はLOOCV(Leave-One-Out Cross-Validation)をやってみます。1つだけデータフレームから除外して、残りのデータでモデルの係数を推測し、そのモデルの予測値と除外した実際の値を比較する、という方法です。

まず、RMSEを格納する箱を作ります。

そうしたら、for loopで12回、学習 > 予測 > 誤差を確認 を実行します。

警告メッセージがでましたが、Copilotに聞くと致命的な問題ではないようです。

なので、このまま進めます。

結果は単純に絶対値の平均値を比較すればOKです。

となりました。rmse_simple のほうが値が小さいですので、goal と n の数だけのモデルのほうが、未知のデータを使った場合の予測性能は良さそうです。

今回は以上です。

はじめから読むには、

www.crosshyou.info

です。

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

#
# LOOCVをするfor loop
#
# RMSEを入れる箱を作る
rmse_full <- numeric(12)
rmse_simple <- numeric(12)
#
for (i in 1:12) {
  # トレーニング用データ
  df_train <- df2[-i, ]
  
  # テスト用データ
  df_test <- df2[i, ]
  
  # モデルをフィット
  model_full <- lm(target ~ ., data = df_train)
  model_simple <- lm(target ~ goal + n, data = df_train)
  
  # 予測
  predict_full <- predict(model_full, newdata = df_test)
  predict_simple <- predict(model_simple, newdata = df_test)
  
  # RMSE
  rmse_full[i] <- predict_full - df2$target[i]
  rmse_simple[i] <- predict_simple - df2$target[i]
}
#
# rmseの平均値
mean(abs(rmse_full))
mean(abs(rmse_simple))
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Natural Landscape Photograph, Long Wide View, Full of Flowers on the Ground,   Close-up of one red Dalya Flower です。)

 

ラグビー リーグワン のデータの分析4 - データフレームを作り直す。

www.crosshyou.info

の続きです。前回は、GAM(Generalized Additive Model)で予測モデルを作成しました。あまり良いモデルではありませんでした。そもそもとして、個人の成績からチームの予測をするモデルは難しそうです。最下位のチームに一番活躍した選手がいる、というケースもありますからね。

そこで、今回は、チームごとに個々の選手の成績をまとめて、平均値を算出して、そのデータフレームで予測モデルを作ってみます。

このように、新しくデータフレームを作りました。targetがチームの順位ですからtargetごとの平均値をとれば、それがチームごとの平均値になりますね。

このデータフレームを使って予測モデルを作ります。

まず、lm()関数で線形モデルをつくります。

Multiple R-squared: 0.9183, p-value: 0.0457 となりましたので、かなり当てはまりが良いモデルになりました。

実際の値と予測値の散布図を描いてみます。

前々回、前回の散布図より当てはまりがよくなったことがわかります。

lm_mod_df2から不要な変数を取り除いて、より単純なモデルを作ります。

update()関数でp値の高い変数を一つずつ外していきます。

goalとnが残りました。成績上位50人に入る人数が多いほど(nが大きいほど)、ゴールの点数の平均値が高いほど(goalが大きいほど)、targetは小さくなる(順位が良くなる)ということですね。

全部の変数を使ったモデルはMultiple R-squared:  0.9183で、Adjusted R-squared: 0.7754、p-value: 0.0457でした。

簡素化したモデルはMultiple R-squared: 0.6404で、Adjusted R-squared: 0.5604で全部の変数を使ったモデルよりは悪い値ですが、p-value: 0.01003 でp値は改善しました。

最後に実際の値と予測値のサンプルを作成します。

こちらの散布図のほうが予測はうまくできていないです。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# targetごとの平均値のデータフレームにする
df2 <- df |> 
  group_by(target) |> 
  summarize(
    across(rank:pg, mean),
    n = n()
  ) |> 
  ungroup()
df2
#
# このtargetを被説明変数にする
# 線形モデル
lm_mod_df2 <- lm(target ~ ., data = df2)
summary(lm_mod_df2)
#
# 予測値の実際の値の散布図
tibble(
  actual = df2$target,
  estimate = predict(lm_mod_df2)
) |> 
  ggplot(aes(x = actual, y = estimate)) + 
  geom_point() +
  labs(title = "線形モデル") +
  geom_abline(color = "red") +
  theme_minimal()
#
# より単純なモデル
lm_mod_df2_simple <- update(lm_mod_df2, . ~ . - game)
summary(lm_mod_df2_simple)
#
lm_mod_df2_simple <- update(lm_mod_df2_simple, . ~ . - rank)
summary(lm_mod_df2_simple)
#
lm_mod_df2_simple <- update(lm_mod_df2_simple, . ~ . - point)
summary(lm_mod_df2_simple)
#
lm_mod_df2_simple <- update(lm_mod_df2_simple, . ~ . - try)
summary(lm_mod_df2_simple)
#
lm_mod_df2_simple <- update(lm_mod_df2_simple, . ~ . - pg)
summary(lm_mod_df2_simple)
#
# 予測値の実際の値の散布図
tibble(
  actual = df2$target,
  estimate = predict(lm_mod_df2_simple)
) |> 
  ggplot(aes(x = actual, y = estimate)) + 
  geom_point() +
  labs(title = "簡素化線形モデル") +
  geom_abline(color = "red") +
  theme_minimal()
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Landscape of natural vast grass field, full of many AJISAI flowers, close up of one red and blue marble AJISAI flower, photo です。)

 

読書記録 - 「地域と人口減少の経済学 スマート・シュリンクという選択肢」 小峰 隆夫 著 (中公新書)

2026年5月に発行された新刊です。著者の小峰隆夫さんは経済企画庁や国土庁などで地域振興政策に取り組まれていたというこです。

本書でいいたいことは、日本の人口減少はもうどうしようもないのだから、人口が減少していくという前提で地域の活性化政策を考えるべきだ、ということだと理解しました。

この本の帯には「常識破りの解」と書かれていますが、私の意見ではこれは誇大広告だと思いました。日本の人口が1億人を割り込むだろうというのは常識だと思いました。人口が減少しても、一人当たりのGDPが増えたり、その他のウェル・ビーイングが改善するのであれば心配ない、ということも常識の範囲内だと思いました。

地域の活性化の施策には「劇場型」と「共有型」という2つのタイプがあるという分類は面白いと思いました。

「劇場型」は他の地域から視察団がいっぱいくるけれども、政策を真似ることはできないタイプのもの、高山市の古くからの街並みを生かした観光、廃校寸前の高校を生まれ変わらせた島根県海士街町、サテライトオフィスで企業誘致に成功した徳島県神山町などです。

「共有型」はそのような派手な政策をではないが、どの地域でも真似できるようなもので、行動経済学の「ナッジ」という知見をいかして効率よく行政を回していくことなどが紹介されています。この「共有型」の政策をいろいろな地方自治体が採用していくのが良いようです。

 

読書記録 - 「社会の価値の測り方: 「見える化」で地域を豊かにする」 枝廣 淳子 著 (岩波新書)

2026年1月20日発行です。星の王子様のセリフに「ほんとうに大切なものは目に見えない」という言葉がありますが、その目に見えない大切なものをいろいろ工夫して目に見えるようにすると、とてもいいことがある、という本です。

製品・商品のライフサイクルまるごとで温暖化ガスやその他の廃棄物、消費エネルギーを「見える化」するライフサイクルアセスメント(LCA)や、地域経済がどのような構造になっているかを「見える化」する地域産業関連表などの活用事例を紹介しています。

「見える化」したあとにどのような行動変化を起こすのかが大切だと思いました。世の中にはまだまだ「見える化」が必要な分野、領域があると思いました。

 

ラグビー リーグワン のデータの分析3 - GAM(Generalized Additive Model)での予測

www.crosshyou.info

の続きです。前回の線形モデルではあまり良い予測はできなかったので、今回はGAM(Generalized Additive Model)を試してみます。

まず、mgcvパッケージの読み込みをします。

学習します。

tryやpgは有意な変数ですね。

予測値と実際の値の散布図を描いてみます。

線形モデルと同じような散布図ですね。

交互作用を加えてみます。

交互作用の項、te()のところを見ると、あまり改善していないようです。

散布図を描いてみます。

気持ちよくなった程度でしょうか。。。

GAM(Generalized Additive Model)でも個人の成績からチームの順位を予測するのは難しそうです。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# GAM(Generalized Additive Model)
# パッケージの読み込み
library(mgcv)
#
# 学習
gam_mod <- gam(target ~ s(rank) + s(point) + s(game) + s(try) + s(goal) + s(pg),
               data = df)
summary(gam_mod)
#
# 予測値と実際の値の散布図
tibble(
  target = df$target,
  estimate = predict(gam_mod)
) |> 
  ggplot(aes(x = target, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  labs(title = "GAM") +
  theme_minimal()
#
# 交互作用を加えたモデル
gam_mod2 <- update(gam_mod, . ~ . + te(try, pg) + te(point, try) + 
                     te(point, pg), data = df)
summary(gam_mod2)
#
# 予測値と実際の値の散布図
tibble(
  target = df$target,
  estimate = predict(gam_mod2)
) |> 
  ggplot(aes(x = target, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  labs(title = "GAM(交互作用を加えたモデル)") +
  theme_minimal()
#

(冒頭の画像は Bing Image Creator で生成しました。プロンプトは Landscape of natural foreign vast grass field, there are a lot of red flowers and yellow flowers, close up of one large  Rhododendron degronianum flower( Azuma-Shakunage in Japanese), photo です)

 

 

ラグビー リーグワン のデータの分析2 - 線形モデルでの予測

www.crosshyou.info

の続きです。前回はCSVファイルのデータをRに読み込ませるところまでやりました。

今回は試しに線形モデルを作ってみます。

モデル全体のp-valueは0.1022となりました。個々の変数の係数を見ると、p-valueが0.05以下のものはありません。線形モデルではターゲットを上手く予測できない感じですね。

実際のtargetとモデルの予測値を散布図にしてみましょう。

う~ん、ダメだこりゃって感じですね。

二乗項や交互作用も加えてみます。

モデル全体のp-valueは0.2084と悪化してしまいました。

散布図を描いてみます。

代わり映えしないですね。。

線形モデルで個人成績からその個人が所属するチームの順位を予測するのは難しいようです。

今回は以上です。

次回は

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

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

#
# linear model
lm_mod <- lm(target ~ ., data = df)
#
# lm_modのサマリー
summary(lm_mod)
#
# 実際のtargetと予測値の散布図
tibble(
  target = df$target,
  estimate = predict(lm_mod)
) |> 
  ggplot(aes(x = target, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  theme_minimal()
#
# 二乗項、交互作用も加える
lm_mod2 <- lm(target ~ rank + I(rank^2) + point + I(point^2) + game +
                I(game^2) + try + I(try^2) + goal + I(goal^2) + pg +
                I(pg^2) + point:try + try:goal + goal:pg, data = df)
#
# lm_mod2のサマリー
summary(lm_mod2)
#
# 散布図
tibble(
  target = df$target,
  estimate = predict(lm_mod2)
) |> 
  ggplot(aes(x = target, y = estimate)) +
  geom_point() +
  geom_abline(color = "red") +
  labs(title = "二乗項と交互作用を加えたモデル") +
  theme_minimal()
#

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Natural wild field landscape, full of purple Nemophila flowers, close up of a Nemophila flower, blue sky, a small spring, photo です。)

 

読書記録 - 「世界秩序 グローバル化の夢と挫折」 田所 昌幸 著 (中公新書)

2025年9月25日が初版で、私が手にしたのは2026年1月25日再販のものでしたので、結構売れていると思います。

1999年にアメリカの有名ジャーナリスト、トーマス・フリードマンがグローバル化が進む世界で良い生活がしたいなら、アメリカ流の政治経済モデル、つまり「黄金の拘束衣」をまとう以外に道は無い、といってから四半世紀がたちました。

今はこのアメリカ流の政治経済モデルが黄金でもなんでもないということが明らかになっています。このような認識のもとでこの本は、過去からの世界のグローバル化、世界秩序の在り方をたどっていって、これからの世界秩序はどうなるかを考察しています。

ローマ帝国やジンギスカンのモンゴルの大帝国などの話から大英帝国、アメリカの帝国についての話があります。多くの帝国に共通していることは、帝国の外の民族を取り込むときに、どの程度まで帝国流のやり方を強制するか、もともとの民族のやり方を容認するるか、このバランスが上手だったときは帝国は繁栄して、下手だったとき帝国は衰退していくと読んでいて思いました。

日本はアメリカや中国のように大国ではありません。でも、G7の国の中ではアメリカについで2番目に人口があるので小国でもありません。アメリカの影響から完全に逃れることはできませんが、すべてアメリカの言いなりになる必要もありません。日本は日本で味方の国を増やし、敵対する国を減らしていく、というのが大切だと思いました。