
今回からしばらくは、UCI Machine Learning Repository の
Realinho, V., Vieira Martins, M., Machado, J., & Baptista, L. (2021).
Predict Students' Dropout and Academic Success [Dataset].
UCI Machine Learning Repository.
https://doi.org/10.24432/C5MC89.
のデータを分析したいと思います。

# Instances が4424で、#features が36なので、37 x 4424 = 163,688 のデータベースですね。
サイトからダウンロードしたCSVファイルは下の図のような感じです。

変数名は、もともと、Marital status のように、アンダースコア _ がなかったりしていたので、R で読み込むときに、おかしな変数名にならないように、手作業で調整しました。37個も変数があったので疲れました。
これをRに読み込ませますが、その前に tidyverse パッケージの読み込みをします。

; で区切られたファイルなので、read.table() 関数で読み込みました。

glimpse() 関数で読み込まれたデータを確認します。

問題なく読み込まれました。
Target, これが被説明変数ですが、これは文字列で、その他は整数型か数値型です。
はじめに Targetの分布を確認します。

Dropout が1421, Enrolled が794, Graduate が2209です。結構な人数が Dropout してますね。今回は、Enrolled は考慮せず、Dropout か Guraduate かを判断することにします。

Target という変数名を Dropout という変数名に変え、ファクター型にします。

これで、とりあえず、予測モデル構築の準備はできました。
ほんとうは下の図のように、整数型の変数は、カテゴリカル変数なのでですが、

一番はじめのモデルは、これらも数値型とみましてモデルを構築してみます。
はじめに、tidymodelsパッケージの読み込みをします。

トレーニング用データとテスト用データに分けます。

一番初めのモデルは単純なロジスティクス回帰モデルです。単純なロジスティクス回帰モデルは、パラメータのチューニングは必要ありませんから、レシピ作成(recipe()関数) >> モデル作成(logistic_reg()関数) >> ワークフロー作成(workflow()関数) >> 学習(fit()関数)まで一気にやってしまいます。

predict()関数でテスト用のデータで予測します。2値の分類問題ですがから、予測結果は実際のクラスと確率の2種類があります。

conf_mat()関数で混合行列を作りましょう。

おお~!結構当たっていますね!accuracy()関数で正解率を、sens()関数で感度を、specificityで特異度を計算します。

正解率が92.6%です。なかなかいいですね!
ROC AUCをroc_auc()関数で計算します。

0.956です。
最後にROC曲線を描いて終わります。

カテゴリカルな意味の変数を連続数値とみなして作った単純なロジスティクス回帰モデルでも92.6%の正解率でしたから、カテゴリカルな変数はカテゴリカル変数として正しくモデルを構築すれば、もっと高い正解率が得られそうですね。
今回は以上です。
次回は
です。
今回のコードは以下になります。
#
# tidyverseパッケージの読み込み
library(tidyverse)
#
# データの読み込み
df_raw <- read.table(file = "dropout.csv",
header = TRUE,
sep = ";")
#
# データの確認
glimpse(df_raw)
#
# Targetの分布
df_raw |>
count(Target)
#
# Enrolledを除外する
df <- df_raw |>
filter(Target != "Enrolled")
df |>
count(Target)
#
# TargetをDropoutなら1、そうでないなら0のダミー変数にする
df <- df |>
mutate(Target = if_else(Target == "Dropout", 1, 0))
df |>
count(Target)
#
# TargetをDropoutに名前を変え、ファクター型にする
df <- df |>
rename(Dropout = Target) |>
mutate(Dropout = factor(Dropout))
#
# tidynodelsパッケージの読み込み
library(tidymodels)
#
# トレーニング用データ、テスト用データ
set.seed(1010)
split <- initial_split(df, prop = 0.7, strata = Dropout)
train_data <- training(split)
test_data <- testing(split)
#
# glm
# レシピ作成(_rec)
glm_rec <- recipe(Dropout ~ ., data = train_data) |>
step_normalize(all_predictors())
#
# glm
# モデル作成(_mod)
glm_mod <- logistic_reg() |>
set_engine("glm") |>
set_mode("classification")
#
# glm
# ワークフロー作成(_wf)
glm_wf <- workflow() |>
add_recipe(glm_rec) |>
add_model(glm_mod)
#
# glm
# 学習(_fit)
glm_fit <- fit(glm_wf, data = train_data)
#
# glm
# テスト用のデータで予測(_pred)
glm_pred <- test_data |>
select(Dropout) |>
bind_cols(predict(glm_fit, new_data = test_data, type = "class"),
predict(glm_fit, new_data = test_data, type = "prob")) |>
as_tibble()
glm_pred
#
# glm
# 混同行列(_cm)
glm_cm <- conf_mat(glm_pred, truth = Dropout, estimate = .pred_class)
glm_cm
#
# glm
# その他評価
accuracy(glm_pred, truth = Dropout, estimate = .pred_class) # 正解率
sens(glm_pred, truth = Dropout, estimate = .pred_class) # 感度
spec(glm_pred, truth = Dropout, estimate = .pred_class) # 特異度
#
#
# glm
# ROC AUC(_auc)
roc_auc(glm_pred, truth = Dropout, .pred_0)
#
# ROC曲線(_roc)
glm_roc <- roc_curve(glm_pred, truth = Dropout, .pred_0)
glm_roc |>
ggplot(aes(x = 1 - specificity, y = sensitivity)) +
geom_line(color = "blue") +
geom_abline(linetype = "dashed", color = "gray50") +
labs(
title = "ROC Curve",
x = "1 - Specificity (False Positive Rate)",
y = "Sensitivity (True Positive Rate)"
) +
theme_bw()
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Beautiful green grass fields, filled with a lot of various color flowers, blue sky, can be used PC wallpaper, Photo です。)