Rとデータマイニング入門
Rは5年以上前に、ちょこっと触ったのだけど
今や完全に忘却の彼方だったので、復習も兼ねて纏めてみた。
schemeの影響を受けてる為か関数型言語使いには優しい(^^;
(無限があったり個人的にはHaskellっぽいかなと。。)
R言語の特徴
- データマイニングに利用されるOSS言語
- 関連するアルゴリズム実装が豊富
- 動的型付け
- 高階関数
- 無限OK
- ベクトル(行列)処理に特化
- 行列計算は意外と速い
- 説明変数が多くても大丈夫(複雑なモデルでもOK)
- そこそこのデータ規模で威力を発揮
- TBクラスのデータは扱い切れない
などなど、、
TIPS
コーディング
普通はRを起動するのでしょうが、僕はEmacs & Rscriptでコーディングします。
a.r
#!/usr/bin/evn Rscript message("Hellow world !")
起動
bashからでも良いですが、emacsから'compile で起動すると楽かと。。
$ ./a.r
結果
./a.r Hellow world !
Emacs(R-mode)
ここからESSを拾ってきてR-modeを導入すると幸せになれるかも!
(add-to-list 'load-path "~/.emacs.d/ess") (setq auto-mode-alist (cons (cons "\\.r$" 'R-mode) auto-mode-alist)) (autoload 'R-mode "ess-site" "Emacs Speaks Statistics mode" t)
解凍してlisp以下を~/.emacs.d/essへコピーして~/.emacsに書くだけです。
Emacs使いなら何も問題ないかと。。
elcが入ってたので環境によっては消さないと駄目かも?
find ~/.emacs.d/ess -name '*.elc' | xargs -n 1 rm
ベクトル1
単純なベクトルを作る
c
#!/usr/bin/evn Rscript A<-c(1,2,3,4,5) print(A) print(length(A))
こっちでも可
A<-1:5 print(A) print(length(A))
結果
[1] 1 2 3 4 5 [1] 5
ちなみにprintは省略できる。
ラベリング
名前を付けておいた方が後から何かと楽になる。
A<-1:5 names(A)<-c("aa","bb","cc","dd","ee") print(A)
結果
aa bb cc dd ee 1 2 3 4 5
ベクトル2
2x5のベクトルを作って色々
matrix
B<-matrix(0:9,2,5) B[1,2]<-99 message("== dim(B) ==") dim(B) message("== B ==") B message("== B[1,] ==") B[1,] message("== B[,3] ==") B[,3] colnames(B)<-c('aa','bb','cc','dd','ee') rownames(B)<-c('XX','YY') message("== B(labeled) ==") B
結果
== dim(B) == [1] 2 5 == B == [,1] [,2] [,3] [,4] [,5] [1,] 0 99 4 6 8 [2,] 1 3 5 7 9 == B[1,] == [1] 0 99 4 6 8 == B[,3] == [1] 4 5 == B(labeled) == aa bb cc dd ee XX 0 99 4 6 8 YY 1 3 5 7 9
特徴的なのはこの辺りでしょう
- B[1,]
- 1番目のrowを示す
- B[,3]
- 3番目のcolumnを示す
- B[1,2]
- 上記2つが合わさる
ベクトルを纏めて扱う
Array , List , data.frame などがあるが省略!
ファイル操作
詳細は略!
- write
- ベクトルの状態で書き出す(read.tableで読む)
- write.table
- データフレームの状態で書き出す(read.table or scan で読む)
- save
- マーシャル書き出し(loadで読む)
詳しくはこちら
Rはこの辺り癖がある。
しかしファイル(&文字列)操作を頑張るなら他に幾らでも良い言語があるのでそちらでやるべき(と思う)
行列計算
詳しい話は面倒なので省略w
大学の講義でも思い出しながら・・・
元行列
message("== B ==") B<-matrix(0:35,5,5) colnames(B)<-c('C1','C2','C3','C4','C5') rownames(B)<-c('R1','R2','R3','R4','R5') B[1,2]<-99 B
== B == C1 C2 C3 C4 C5 R1 0 99 10 15 20 R2 1 6 11 16 21 R3 2 7 12 17 22 R4 3 8 13 18 23 R5 4 9 14 19 24
足し算
message("== B+matrix(100:129,5,5) ==") B+matrix(100:129,5,5)
== B+matrix(100:129,5,5) == C1 C2 C3 C4 C5 R1 100 204 120 130 140 R2 102 112 122 132 142 R3 104 114 124 134 144 R4 106 116 126 136 146 R5 108 118 128 138 148
スカラー値を掛ける
message("== B*2 ==") B*2
== B*2 == C1 C2 C3 C4 C5 R1 0 198 20 30 40 R2 2 12 22 32 42 R3 4 14 24 34 44 R4 6 16 26 36 46 R5 8 18 28 38 48
行列を掛ける1
message("== matrix(c(10,20,30,40,50),5,1)*c(1,2,3,4,5) ==") matrix(c(10,20,30,40,50),5,1)*c(1,2,3,4,5)
== matrix(c(10,20,30,40,50),5,1)*c(1,2,3,4,5) == [,1] [1,] 10 [2,] 40 [3,] 90 [4,] 160 [5,] 250
行列を掛ける2
message("== B*c(1,2,3,4,5) ==") B*c(1,2,3,4,5)
== B*c(1,2,3,4,5) == C1 C2 C3 C4 C5 R1 0 99 10 15 20 R2 2 12 22 32 42 R3 6 21 36 51 66 R4 12 32 52 72 92 R5 20 45 70 95 120
集約
Row毎に集計
message("== SUM col ==") apply(B,1,sum)
== SUM col == R1 R2 R3 R4 R5 144 55 60 65 70
Row毎に集計(平均)
message("== MEAN col ==") apply(B,1,mean)
== MEAN col == R1 R2 R3 R4 R5 28.8 11.0 12.0 13.0 14.0
column毎に集計
message("== SUM row ==") apply(B,2,sum)
== SUM row == C1 C2 C3 C4 C5 10 129 60 85 110
平均値との差
message("== MY row ==") my<-function(x){ x-mean(x) } apply(B,2,my)
== MY row == C1 C2 C3 C4 C5 R1 -2 73.2 -2 -2 -2 R2 -1 -19.8 -1 -1 -1 R3 0 -18.8 0 0 0 R4 1 -17.8 1 1 1 R5 2 -16.8 2 2 2
グラフ表示
Rには組み込み済みのデータセットが用意されている
- iris
- アヤメの3品種(setosa,versicolor,virginica)と茎や花の計測値150件
data(iris) iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa : 50 5.0 3.3 1.4 0.2 setosa 51 7.0 3.2 4.7 1.4 versicolor 52 6.4 3.2 4.5 1.5 versicolor : 100 5.7 2.8 4.1 1.3 versicolor 101 6.3 3.3 6.0 2.5 virginica 102 5.8 2.7 5.1 1.9 virginica : 150 5.9 3.0 5.1 1.8 virginica
これらのデータをプロットしてみる。
種で色分け
plot(iris[,1],iris[,3],pch = 21, cex=0.5,bg = c(2, 3, 4)[unclass(iris$Species)],col=c(2,3,4)[unclass(iris$Species)])
立体的にプロット
library(lattice) cloud(Sepal.Length ~ Petal.Length * Petal.Width, data = iris,groups=Species,pch=c(16,17,18),cex=0.5,bg = c(2, 3, 4),col=c(2,3,4)) cloud(Sepal.Length ~ Petal.Length * Petal.Width, data = iris,groups=Species,pch=c(16,17,18),cex=0.5,bg = c(2, 3, 4),col=c(2,3,4),screen=list(z=0,x=10,y=-15))
解析
次回に続く