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

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

賃金構造基本調査のデータ分析 6 - 線形モデルで予測 - tidymodels パッケージを利用して

www.crosshyou.info

の続きです。前回は tidymodels の initial_split() 関数でデータをトレーニング用とテスト用に分けました。今回は線形モデルを一つ作って簡単な予測をしてみます。

線形モデルは、linear_reg() で定義します。

そして、set_engine() でどの計算エンジンを使うかを指定します。

一番簡単な、lm を使います。

まあ、もともと linear_reg() の初期設定の計算エンジンは lm なので、set_engine() で指定しなくても大丈夫です。

translate() 関数を使うと、このモデルがどうなっているかわかります。

stats パッケージの lm() 関数を使っていて、フォーミュラ、データ、ウェイトは未定だとわかります。

それでは、線形モデルで saraly を予測してみます。まずはモデルを作成します。

fit() 関数でモデルの係数を推計します。

extract_fit_engine() 関数を使うと、推計結果がわかります。

さらに、vcov() 関数を使うと、

分散共分散マトリックスがわかります。

また、tidy() 関数でモデルの推計結果をデータフレームで表示します。

statistics の列の値が t値です。切片以外の変数の t値はみな絶対値で 2 よりも大きいですから、有意な変数だとわかります。

この lm_fit をつかって、df_test の saraly を予測してみます。predict() 関数を使います。

tidymodels のパッケージでの predict() はデータフレームで結果が返りますので、

元のデータフレームに合体できます。

データフレームになっているので、グラフも簡単にできます。

モデルの予測が実際の saraly と一致していたら、黒点は赤い直線の上にプロットされます。これを見ると、saraly 600 よりも大きいところは上手く予測できていない感じです。

最後に RMSE(Root Mean Square Error)を計算しましょう。

RMSEは57.4でした。予測の誤差の平均が5万7400円ということですね。

次回以降の予測モデルでは、この 57.4 よりも小さい値を目指していきたいと思います。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには、

www.crosshyou.info

です。

 

今回のコードは、

#
# 線形モデル
linear_reg()
#
# 計算エンジンを指定
linear_reg() |> set_engine("lm")
#
# translate()
linear_reg() |> set_engine("lm") |> 
  translate()
#
# 線形モデルを作成
lm_model <- linear_reg() |> 
  set_engine("lm")
#
# fit() で係数を推定
lm_fit <- lm_model |> 
  fit(saraly ~ ., data = df_training)
lm_fit
#
# extract_fit_engine()
lm_fit |> extract_fit_engine()
#
# |> vcov()
lm_fit |> extract_fit_engine() |> vcov()
#
# tidy()
lm_fit |> tidy()
#
# df_test の saraly を予測
predict(lm_fit, new_data = df_test)
#
# df_test の saraly と結合
df_test |> select(saraly) |> 
  bind_cols(predict(lm_fit, new_data = df_test)) |> 
  bind_cols(predict(lm_fit, new_data = df_test, type = "pred_int"))
#
# グラフ
df_test |> select(saraly) |> 
  bind_cols(predict(lm_fit, new_data = df_test)) |> 
  ggplot(aes(x = saraly, y = .pred)) +
  geom_point() +
  geom_abline(intercept = 0, slope = 1, color = "red") +
  coord_cartesian(xlim = c(100, 800), ylim = c(100, 800))
#
#
# RMSEの計算
df_test |> select(saraly) |> 
  bind_cols(predict(lm_fit, new_data = df_test)) |> 
  summarize(RMSE = sqrt(mean((saraly - .pred)^2)))
#


(冒頭の画像は Bing Image Creator で生成しました。プロンプトは "Landscape, light tone, blue sky, red flowers, photo" です。)