

今回からしばらくは、UCI Machine Learning RepositoryにあるSpambaseのデータセットで分類の練習をしてみたいと思います。
Hopkins, M., Reeber, E., Forman, G., & Suermondt, J. (1999).
Spambase [Dataset].
UCI Machine Learning Repository.
https://doi.org/10.24432/C53G6X.
57の特徴量、4601の観察数があるデータです。
ダウンロードしたデータは、こんなのでした。

拡張子が.data のテキストファイルです。変数名がなくて、データの区切りは、, (コンマ)です。
変数名のファイルもダウンロードしました。

この画像の一番下にある word_freq_make: continuous とあるところの word_freq_make が変数名です。
できるかどうかわかりませんが、この2つのファイルを R に読み込んで、変数名をデータフレームに適用してみたいと思います。
まず、なにはともあれ tidyverse パッケージの読み込みをしておきます。

データのファイル名は spambase.data という名前です。

R for Data Science (2e) にある read_delim() という関数を使ってみます。 "," (コンマ)で区切ってあるので、delim = "," にしました。変数名が無いので、col_names = FALSE にしました。

上手く読み込んでくれたみたいです。
View() 関数でみてみます。


うまく読み込めました。
次は問題の spambase.names.txt ファイルです。

ファイルのウィンドウの下を見ると、word_freq_make: は42行目から始まっているようです。skip = 41, delim = ":" で読み込んでみます。

上手く読み込みできたか head() 関数で確認します。

あれ、一番初めは word_freq_make のはずなのに、読み込まれていませんね。 skip = 41が間違っていたようです。read_delim() 関数のヘルプを見ると、skip_empty_rows = FALSE にしてやらないとダメのようです。
もう一度、やってみます。

うーん、まだ order から始まってますね。。skip = の数を試行錯誤するしかないようです。

skip = 33 でうまく読み込みできたようです。
この names データフレームの X1 変数を df_raw データフレームの変数名にしてやります。

glimpse() 関数で変数名が上手く置き換わったか確認します。
(中略)

一番最後の列が target の変数で、1なら spam mail, 0なら普通のメール、ということです。
NAとなっているので spam に変えます。ついでに、一番左にもってきます。

na.omit() 関数で NA のある行を削除します。

これでデータの準備は整いました。最後に spam の割合を確認します。

スパムメールの割合は約4割ですね。
今回は以上です。
次回は
です。
今回のコードは以下になります。
#
# tidyverse パッケージの読み込み
library(tidyverse)
#
# spambase.data ファイルの読み込み
df_raw <- read_delim("spambase.data", delim = ",", col_names = FALSE)
#
# データの確認
View(df_raw)
#
# spambase.names.txt ファイルの読み込み
names <- read_delim("spambase.names.txt", delim = ":", col_names = FALSE,
skip = 41)
#
# データの確認
head(names, 20)
#
# 再度 spambase.names.txt ファイルの読み込み
names <- read_delim("spambase.names.txt", delim = ":", col_names = FALSE,
skip = 41, skip_empty_rows = FALSE)
#
# 再度データの確認
head(names, 20)
#
# 試行錯誤 spambase.names.txt ファイルの読み込み
names <- read_delim("spambase.names.txt", delim = ":", col_names = FALSE,
skip = 33, skip_empty_rows = FALSE)
#
# 試行錯誤データの確認
head(names, 20)
#
# df_raw の変数名を変更
colnames(df_raw) <- names$X1
#
# df_raw の確認
glimpse(df_raw)
#
# NA の変数名を spam に変更
colnames(df_raw)[is.na(colnames(df_raw))] <- "spam"
#
# spam を一番上にもってくる
df <- df_raw |> relocate(spam)
df
#
# NA のある行を削除
df <- na.omit(df)
#
# spam の割合
df |>
summarize(average = mean(spam))
#
(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは、Natural season landscape of warm spring, close up of yellow Cytisus scoparius flowers, photo です。)