R入門 (2)

 この記事は、R入門 (1) の続きです。以下、授業の補足資料です。

重回帰分析

 重回帰分析を用いると、任意のデータ(目的変数)がそれ以外のデータ(説明変数)とどのような関係にあるかを明らかにすることができます。以下では、Rにあらかじめ格納されているairqualityというデータセットを使い、オゾン濃度とそれ以外のデータの関係を記述してみましょう。

# Rに格納されているサンプルデータを使用
airquality
airquality[1, ] # 1行目のデータのみを表示
airquality[, 1] # 1列目のデータのみを表示
# 日付のデータを除外
airquality.2 <- airquality[, 1 : 4]
# データの視覚化
pairs(airquality.2)

# オゾン濃度とそれ以外のデータの関係を記述(重回帰分析)
lm.result <- lm(Ozone ~ ., data = airquality.2)
summary(lm.result) # 分析結果の確認

 実際のデータ解析では、単にデータの関係を記述するだけでなく、新しいデータの値を予測したりします。また、欠損値 (NA) を適切に処理したり、相関係数の高いデータ(のいずれか)を除外した分析を行います。従って、上記の例は、あくまでRの使い方を説明するための例だと思ってください。
 練習問題として、重回帰分析を用いて、気温 (Temp) とそれ以外のデータの関係を記述してみましょう。

判別分析

 判別分析とは、任意のデータ(目的変数)の属性をそれ以外のデータ(説明変数)を手がかりとして予測する手法です。以下では、Rにあらかじめ格納されているirisというデータセットを使い、がくの長さと幅、花弁の長さと幅からアヤメの種類を予測します。

# Rに格納されているサンプルデータを使用
iris
# がくの長さと幅、花弁の長さと幅の関係を視覚化(種類で色分け)
pairs(iris[, 1 : 4], col = iris[, 5])
# 奇数行と偶数行で、データを2つに分割
n <- seq(1, nrow(iris), by = 2) # 奇数のベクトルを生成
iris.A <- iris[n, ] # 奇数行のデータを変数に代入
iris.B <- iris[-n, ] # 偶数行のデータを変数に代入
iris.A # 分割したデータの確認
iris.B

# 奇数行のデータからアヤメの品種を予測するためのルールを発見し、偶数行のデータで検証(判別分析)
library(MASS) # パッケージの読み込み
lda.model <- lda(Species ~ ., data = iris.A) # 予測するためのルールを抽出
lda.result <- predict(lda.model, iris.B) # 偶数行のデータで検証
lda.tab <- table(iris.B$Species, lda.result$class) # 予測結果の答え合わせ
lda.tab # 答え合わせ結果の確認
sum(diag(lda.tab)) / sum(lda.tab) # 予測精度の計算

 練習問題として、電子メールの中で使われている単語や記号の頻度を用いて、そのメールがスパムかどうかの予測を行ってみましょう。使用するデータセットは、kernlabパッケージのspamです。インストールの手順は、以下のとおりです。

# kernlabパッケージのインストール
install.packages("kernlab", dependencies = TRUE)
# kernlabパッケージの読み込み
library(kernlab)
# spamデータの読み込み
data(spam)
# spamデータ(の冒頭6行)の確認
head(spam)

 では、このデータにおけるスパムメールか否か (type) という属性(目的変数)を、それ以外の全ての値(説明変数)を使って予測してみましょう。なお、予測にあたっては、データを奇数行と偶数行に分割しましょう。

決定木

 データを予測する手法は、他にも多く存在します。ここでは、決定木と呼ばれる手法を試してみましょう。この手法を用いると、どの説明変数をどのように使って目的変数の予測が行われているかが視覚化されるため、多くの分野で広く利用されています。

# rpartパッケージの読み込み
library(rpart)

# 決定木によるデータの予測と視覚化
rp.model <- rpart(Species ~ ., data = iris.A) # 奇数行のデータから予測するためのルールを抽出
print(rp.model, digit = 1) # 分析結果の確認
par(xpd = NA) # 描画時の無駄な余白を消す処理
plot(rp.model, minbranch = 3) # 視覚化(引数minbranchで枝の長さを指定)
text(rp.model, use.n = TRUE)
rp.result <- predict(rp.model, iris.B, type = "class") # 偶数行のデータで検証 
rp.tab <- table(iris.B$Species, rp.result) # 予測結果の答え合わせ
rp.tab # 答え合わせ結果の確認
sum(diag(rp.tab)) / sum(rp.tab) # 予測精度の計算

 決定木の場合も、実際のデータ解析では、もう少し複雑な処理を行います。また、より情報量の多い図を描画することも可能です。従って、上記の例は、あくまでRの使い方を説明するための例だと思ってください。
 練習問題として、上記の例とは逆に、偶数行のデータ (iris.B) から予測するためのルールを抽出し、奇数行のデータ (iris.A) で検証してみましょう。

広告を非表示にする