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

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

2009年の東京都の駅の乗車人数のデータの分析5 - Rで判別分析(Classification)をするためのデータの準備

Bing Image Creator で生成: Landscape of green grass fields, a few flowers, some white clouds in the blue sky, photo

www.crosshyou.info

の続きです。今回からは、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 を予測するモデルを作るのは問題ないようです。

今回は以上です。

次回は、

www.crosshyou.info

です。

初めから読むには、

www.crosshyou.info

です。

 

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

#
# 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)
#