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

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

UCI Machine Learning Repository の Wholesale customers のデータの分析3 - ロジスティクス回帰で分類

(Bing Image Creator で生成: Closeup of red Cilvia miniata flowers, blue sky background, photo )

 

www.crosshyou.info

の続きです。

前回まででデータの前処理は終わりましたので、これからは分類にチャレンジしてみます。はじめに、Region が Other の観測データを除いたデータフレームを作成します。

この Region が Lisbon か Oporto かどうかを分類します。

Region が Lisbon なら1、そうでないなら0のダミー変数を作成します。

Region はもう必要ないので除外します。

Lisbon を一番左側にもってきます。

この df_2 をトレーニング用とテスト用にわけます。

テスト用とトレーニング用で、Lisbon の比率に大きな違いがないことを確認します。

トレーニング用のほうは Lisbon の比率は 0.6216で、テスト用のほうは 0.62でした。

ほぼ同じですね。

glm() 関数でロジスティクス回帰モデルを生成します。

このモデルは、有意でない変数が多数含まれていますので、step() 関数で不要な変数を削除します。

predict() 関数をつかってテスト用のデータの予測をします。

table() 関数を使って予測結果をみます。

正解率は、

48% でした。

簡素化したモデルでの予測はどうでしょうか?

正解率は、

56%でした。

ロジスティクス回帰モデルでは、あまりうまく分類はできないようです。

今回は以上です。

次回は

www.crosshyou.info

です。

 

初めから読むには、

www.crosshyou.info

です。

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

#
# Region が Lisbon と Oporto だけのデータフレームを作成
df_2 <- df |> 
  filter(Region != "Other")
summary(df_2)
#
# Region が Lisbon なら 1, そうでないなら Oporto のダミー変数を作成
df_2 <- df_2 |> 
  mutate(Lisbon = if_else(Region == "Lisbon", 1, 0))
table(df_2$Lisbon)
#
# Region を削除
df_2 <- df_2 |> 
  select(-Region)
df_2
#
# Lisbon を一番左にもってくる
df_2 <- df_2 |> 
  relocate(Lisbon)
df_2
#
# df_2 をトレーニング用とテスト用にわける
set.seed(321)
index <- sample(1:nrow(df_2), 0.6 * nrow(df_2), replace = FALSE)
df_2train <- df_2[index, ]
df_2test <- df_2[-index, ]
#
# df_2train と df_2test の Lisbon の比較
t.test(df_2train$Lisbon, df_2test$Lisbon)
#
# ロジスティクス回帰モデル
logit_mod <- glm(Lisbon ~ (.)^2, data = df_2train,
                 family = binomial)
summary(logit_mod)
#
# logit_mod を簡素化
logit_mod2 <- step(logit_mod, trace = FALSE)
summary(logit_mod2)
#
# logit_mod で予測
logit_pred <- predict(logit_mod, df_2test,
                      type = "response") |> 
  round(0)
#
# 予測結果
table(logit_pred,df_2test$Lisbon)
#
# 正解率
(10 + 14) / length(logit_pred)
#
# logit_mod2 で予測
logit_pred2 <- predict(logit_mod2, df_2test,
                       type = "response") |> 
  round(0)
#
# 予測結果
table(logit_pred2, df_2test$Lisbon)
#
# 正解率
(10 + 18) / length(logit_pred2)
#