Bing Image Creator で生成: Landscape of green grass fields, a few flowers, some white clouds in the blue sky, photo
の続きです。今回からは、Rで判別分析(Classification)をしてみようと思います。
まず、路線ごとの平均乗車人数を再確認します。
このlineを乗車人数の大きい路線と小さい路線に分けて、それを判別分析したいと思います。山手線、東海道線、東北線、中央線を一つのグループ、その他をもう一つのグループとしましょう。
Yamanote Line, Tokaido Line, Tohoku Line, Chuo Line ならば 1 として、そうでないならば 0 とするダミー変数を large という名前で作成しました。
実際にうまく作成できているか確認します。
はい、うまくダミー変数ができたようです。
line, station は不要な変数なので削除します。さらに後で処理がしやすいように、large を一番左にもってきます。
こんな感じのデータフレームになりました。large が 1 か 0 かをその他の変数を使って判別します。
あ、そういえば、total = pass + onetime ですから、この3つのうちどれか一つは必要ないですね。onetimeを削除して、onetime_ratioの名前をratioの変更しましょう。
データがどんな感じか把握したいので、totalとratioの散布図をlargeで色分けして作成してみます。
totalが大きいのは large = 1, ratio が小さいのは large = 0 という傾向のようですね。
totalとratioでは数値の範囲が大きく違っています。これは判別分析する際はよくないので、total, pass, ratio の3つの変数を最小値0、最大値1で標準化します。
largeはもともと、0 か 1ですが、total, pass, ratio も最小値 0、最大値 1になったことがわかります。large の平均は 0.4681 なので、だいだい半々ぐらいで 1 と 0 があることがわかります。
次は、この df3 をトレーニング用とテスト用のデータフレームにわけます。
トレーニング用を65%、テスト用を35%の比率で分けました。
summary()関数で二つのデータフレームを確認します。
両者で大きな違いは無いようです。
一応、t.test()関数で確認しておきます。
large の p-value は 0.3993 でした。
total の p-value は 0.1394 でした。
pass の p-value は 0.125 でした。
ratio の p-value は 0.8644 でした。
全ての変数で p-value は 0.05 よりも大きな値でしたので、df_train のデータから df_test の large を予測するモデルを作るのは問題ないようです。
今回は以上です。
次回は、
です。
初めから読むには、
です。
今回のコードは以下になります。
#
# line別の平均乗車人数の再確認
df |>
group_by(line) |>
summarize(avg = mean(total),
n = n()) |>
arrange(desc(avg))
#
# Yamonote Line, Tokaido Line, Tohoku Line, Chuo Line
# をlargeとしたダミー変数を作成する
df3 <- df |>
mutate(large = if_else(line %in% c("Yamanote Line", "Tokaido Line",
"Tohoku Line", "Chuo Line"), 1, 0))
#
# ダミー変数の確認
df3 |>
group_by(line) |>
summarize(avg = mean(total),
lagrge = mean(large)) |>
arrange(desc(avg))
#
# line, stationを削除して、largeを一番左にもってくる
df3 <- df3 |>
select(-line, -station) |>
relocate(large)
df3
#
# onetimeを削除して、onetime_ratioをratioに名前変更
df3 <- df3 |>
select(-onetime) |>
rename(ratio = onetime_ratio)
df3
#
# totalとratioの散布図(largeで色分け)
df3 |>
mutate(large = factor(large)) |>
ggplot(aes(x = total, y = ratio)) +
geom_point(aes(color = large), size = 3)
#
# total, pass, ratio を標準化
df3 <- df3 |>
mutate(
total = (total - min(total)) / (max(total) - min(total)),
pass = (pass - min(pass)) / (max(pass) - min(pass)),
ratio = (ratio - min(ratio)) / (max(ratio) - min(ratio))
)
summary(df3)
#
# トレーニング用とテスト用に分ける
set.seed(999)
index <- sample(1:nrow(df3), nrow(df3) * 0.65, replace = FALSE)
df_train <- df3[index, ]
df_test <- df3[-index, ]
#
# トレーニング用
summary(df_train)
#
# テスト用
summary(df_test)
#
# t.test() large
t.test(df_train$large, df_test$large)
#
# t.test() total
t.test(df_train$total, df_test$total)
#
# t.test() pass
t.test(df_train$pass, df_test$pass)
#
# t.test() ratio
t.test(df_train$ratio, df_test$ratio)
#