R言語、ためしてみた

By | 2015年8月25日

データサイエンティストもすなるR言語といふものを、私もしてみむとてするなり。
(紀貫之『土佐日記』のパクリ)

というわけで、昨今ビッグデータやデータマイニングやアナリティクスなどが流行している中で、とてもよく使われている解析環境に「R」いうのがあります。

Rは無償で利用でき、世界中のデータサイエンティストの間で広く使われているそうです。よく話題に上がるのでどういうものか興味あったのですが、実際に触ってみないとわからないだろうということで試してみることにしました。

まずはRと一応RStudioを入れておきました。RStudioは、Rを効率的に開発するための統合開発環境です。Rだけでも開発できますが、RStudioを入れておくとより円滑に開発できるそうです。
ちなみに、Windows / Mac OS/LinuxといったメジャーなOS用の環境が用意されています。私はMacを使っているのでMac版をインストールしておきました。

RStudioはこんな感じの画面です。

R Studio画面例

RStudio画面例

まずはいくつかのサイトを見て、R言語がどういうものなのかをサンプル組みながら学習してみました。

素人ながらの印象でいうと、配列・行列などの(R言語のいうところの)ベクトル処理がとてもやりやすい印象があります。複雑なモデルでもこのベクトルで表現できますし、他の言語ではfor文を組んでループさせて各要素をがしがし計算しなけばならないところを、R言語だと直感的にシンプルに計算できます。なるほど、これは統計向きですね。

さらにいうと、統計解析用の様々な関数が用意されていて、また出来上がった結果をグラフ化するのが非常に楽というのも印象的です。

いろいろサンプルを試してみて、インストール開始から2、3時間ほどである程度全容を把握できました。

一般のプログラミング言語でいう”Hello,world!”(”Hello,world!”という文字を画面に出力するためのプログラム。言語を学ぶ時の第一歩とされている。興味がある方はこちらを)相当のことをやってみようと色々考え、モンテカルロ法による円周率πの計算をやってみることにしました。(モンテカルロ法についてはこちらを)

それも単にπを求めるだけだとつまらないので、いくつかのテストケースから得られたデータを採取し、それをグラフ化しようと試みることにしました。

そうして作ったスクリプトがこちら。


#半径rの円の1/4の部分に対してn回試した結果を関数化
JYpie<-function(n,r){ 
   #整数で計算するバージョン(お蔵入り)
   #x<- round(runif(n)*r,digits=0)
   #y<- round(runif(n)*r,digits=0)

   #実数で計算するバージョン
   x<- runif(n)*r
   y<- runif(n)*r

   l<-sqrt(x^2+y^2)
   m<-sum(l<=r,TRUE)
   p<-4*m/n

   return(p)
}


#1000?10000を100刻みで計算した例
pp<-NULL
x<-seq(1000,100000,by=100)
for(i in x)  pp<-append(pp,JYpie(i,100))    
ans=cbind(x,pp)

#結果をプロット
plot(ans)
title("Monte Carlo method") 
abline(h = pi,col="red")


JYpie()という円周率πを求める関数を用意し、これをパラメータをかえてぐるぐる回して算出するという実験です。

こうして得られた結果をプロットしたのがこちら。

モンテカルロ法によるπの計算例

モンテカルロ法によるπの計算例

横軸は一度のモンテカルロ法の計算で用いた点の数、縦軸はそのときに得られたπの値で、赤の横線は実際のπの値です。

点の数を増やすごとにだんだんと実際のπの値に収束していく様がよくわかりますね。

これと同じことをExcelでやったことありますが、Excel使うよりR使ったほうが圧倒的に楽ですし思考を妨げない気がします。ロジックを考えたらそのロジックのまま実装できちゃうというか、余計なことを調整しなくてすっとできちゃう感じがします。

ちなみにモンテカルロ法によるπの計算、R言語でもっとシンプルに書いて実行した結果が下記です。(1,000,000個の点を打ってます)

モンテカルロ法によるπ算出(シンプル版)

モンテカルロ法によるπ算出(シンプル版)

このスクリプト、メンテナンス性がめちゃくちゃ悪いので、この書き方はあまり宜しくないですが、R言語の特性をよく活かした例といえます。

そういうわけで、他の言語をご存知な方であれば数時間あれば、ある程度のことはできるようになります。

 

ためしに実際のデータを流し込んでみて、2つの異なるグループの履修数の差をグラフ化してみました。

Rによる履歴解析例

Rによる履歴解析例

在籍年度をrow軸に、履修数をcolumn軸に設定し、2つのグループの履修の差を示したものです。詳細は省きますが、まあこうやって可視化もしやすいというわけです。

このあたりはほんの序の口、実際のRの真価はこういう可視化だけでなく統計解析にもあるでしょうから、これだけだと片手落ちでしょう。そういうものを理解した上でRを使い倒すといろんなことができそうです。

なるほど、こういうのを使ってラーニング・アナリティクスするんだなぁと、さわりを実感することができました。

 

個人的には学生時代に手にして興奮して遊び倒したMathematicaを思い出しました。
同じく学生の頃に学んだPrologやLISPにもちょっと似てるなぁとか思った次第です。
ちょっと懐かしくもなりました。

折を見てRを使ってみようと思います。

 

■関連情報