R 多変量解析 - eiichiromomma/CVMLAB GitHub Wiki

(R) 多変量解析

難しい話はさておき、分類や評価を目的とする項目と、多数の特徴値について解析する方法。

目的

  • ある層別変数と特徴値群の関係を見出す
  • 特徴値群を学習用、テスト用に分けて分類を行ない、特徴値の有用性について検討する

層別変数の中身はA, B, C, Dといった文字列でも1, 1.5, 2, 2.5といった数値でも構わない。 但し回帰分析は量的データでなければ行う意味は無い。

解析項目

  • z,zzz:解析を行なうデータ
  • z$mygroup, zzz$myfactor:層別変数

(但し表記はattach(z); attach(zzz)済みとする。)

必要なパッケージ

  • lattice
  • mvpart
  • MASS
  • nnet
  • kernlab

が必要

散布図行列

所謂XYプロット。これを層別変数を色分けしてにプロットする。

splom(~ z,groups=mygroup)

パラレルプロット

層別に特徴値がどう分布しているかが分かり易い。

parallel(z,col=as.integer(as.numeric(z$mygroup) *2),lty=as.integer(as.numeric(z$mygroup) *2))

as.numericとしているのはmygroupが文字の場合もあるため。2倍してるのは.5区切りのデータを使ってた名残り。

クロス相関

層別変数及び、特徴値群それぞれの相関を求める。 相関はあくまでも線形の対応かを表わすに過ぎない点に注意。

c<-cor(z,method="spearman")
s<-symnum(abs(cor(z,method="spearman")),cutpoints=seq(0,1,0.2),symbols=c(" ",".","-","+","*"))
print(list(c,s))

相関が高くなるにつれて" ",".","-","+","*"と変化する。 書籍「Rで学ぶデータマイニング」P206に記載の偏相関でも同様に使える。

重回帰分析(1次)、AICによる変数選択

1次の重回帰分析

d1<-lm(z$mygroup ~ .,data=z)
d1s<-summary(d1)
d2<-step(d1)
d2s<-summary(d2)
print(list(d1,d1s,d2,d2s))

重回帰分析(2次)、AICによる変数選択

相互作用項を考慮した重回帰分析

d1<-lm(z$mygroup~.^2,data=z)
d1s<-summary(d1)
d2<-step(d1)
d2s<-summary(d2)
print(list(d1,d1s,d2,d2s))

回帰木

ツリー状に分類の条件を表示する。 初めに複雑度cpのグラフが表示されるので、赤丸の最適値を入力すると、その値を用いて回帰木を作成する。 nsplitはノードの数。分類数に応じて変えると良い。

result<-rpart(zzz$myfactor~.,data=zzz,control=rpart.control(cp=0.01,nsplit=10))
plotcp(result)
mycp <- as.numeric(readline("enter newcp :"))
result<-rpart(zzz$myfactor~.,data=zzz,control=rpart.control(cp=mycp,nsplit=10))
plot.new()
par(xpd=T)
print(plot(result,uniform=T,branch=0.7,margin=0.05))
text(result,use.n=T,all.leaves=F)

学習とテスト用データの作成

データの2/3を学習用、残りをテスト用としてx,yに収める。

tmp<-sample(seq(1,dim(zzz)[1]),dim(zzz)[1]*2/3)
x<-zzz[tmp,]
y<-zzz[-tmp,]

以後の分類結果は全て分類表として示される。

回帰木による分類

result<-rpart(myfactor~.,data=x,control=rpart.control(cp=0.01,nsplit=10))
plotcp(result)
mycp <- as.numeric(readline("enter newcp :"))
result<-rpart(myfactor~.,data=x,control=rpart.control(cp=mycp,nsplit=10))
result2<-predict(result,y,type="class")
print(table(y$myfactor,result2))

判別分析による分類

result<-lda(myfactor~.,data=x)
result2<-predict(result,y)$class
print(table(y$myfactor,result2))

2次の判別分析による分類

result<-qda(myfactor~.,data=x)
result2<-predict(result,y)$class
print(table(y$myfactor,result2))

Neural Networkによる分類

sizeが隠れ層の層数なので、複雑さに応じて増減すると良い。

result<-nnet(myfactor~.,size=15,data=x)
result2<-predict(result,y,type="class")
print(table(y$myfactor,result2))

Support Vector Machineによる分類

マージン等の項目は試行錯誤が必要。

result<-ksvm(myfactor~.,data=x)
result2<-predict(result,y)
print(table(y$myfactor,result2))

とりあえず解析したい人向け関数

拡張子の.txtを削除して保存(Windowsの場合はサクラエディタや秀丸エディタでSJISに変換すること)し、Rで

source("testfunc.R")

とする。 層別変数以外は量的データであることが前提。質的データが紛れている場合はsubset関数で解析したい変数と層別変数を抽出してから解析すること。

※かなり適当に作ったのでバグが潜んでいる可能性あり

使い方

analyze.mygname(z,filename="myfile", gname="mygname", directory="mydata", numfactor=TRUE,out=FALSE)

*z:データフレーム *filename:結果を出力する場合の接頭句。日付やデータ名を指定。文字型なので""で囲む *gname:層別変数の"名前"。文字型 *directory:結果を出力する場合の保存先ディレクトリ名。自動作成、エラーチェックはしないので予め作成しておく *out:TRUEにすると諸々のデータを出力する。

使用例

データirisを解析 グラフはwin.metafileでemfファイルにしているので、Windows以外の環境の場合はソース中のwin.metafileをpostscriptに置き換えて拡張子をepsに置き換えると良い。

> source("testfunc.R")
> data(iris)
> names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
> analyze.mygname(iris,gname="Species")

"test"ディレクトリに解析結果を"iris.result.ほげほげ"という形で保存する場合。 > analyze.mygname(iris,filename="iris.result",gname="Species",directory="test",out=T)

参考文献

上記の内容は

  • 「RとS-PLUSによる多変量解析」
  • 「Rで学ぶデータマイニング」

の内容に基いて書いた事が多いので、詳しくは書籍を参照。