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で学ぶデータマイニング」
の内容に基いて書いた事が多いので、詳しくは書籍を参照。