Pages

2012年6月3日日曜日

Webな統計分析環境 RStudio とMongodb

さくらVPS に、NoSQLデータベース Mongodbをデータの取得・保存先に使い、統計分析を行う為の環境を用意した。
  • 統計解析ツール R
  • データベース Mongodb
  • Rとmongodbを連携させるためのRライブラリ rmongodb
  • R利用のためのユーザインターフェース R Studio
最終的に目指しているのは、データを自動で定期的にmongodbにため込み、RStudioで適宜分析する環境だ。
インターネットのデータ -- (Spidering Tool) -- mongodb -- rmongodb -- R -- R Studio

R & R Studioのインストール

既に拡張パッケージ EPEL(Extra Packages for Enterprise Linux)を利用して入れば、Rのインストールはyumを使うだめの簡単作業だ。
http://fedoraproject.org/wiki/EPEL
依存しているパッケージが20ぐらいあったような。
R Studioは、統計解析ソフトRのためのIDE(統合開発環境)だ。Rの為のEclipseやVisualStudioと言ったところか。サーバ版をインストールした。
http://rstudio.org/
# Rをインストールする
# EPELを使っていることが前提  
  $ sudo yum install R
# RStudioのrpmパッケージを取得し、インストール
  $ wget http://download2.rstudio.org/rstudio-server-0.96.228-x86_64.rpm
  $ sudo rpm -Uvh rstudio-server-0.96.228-x86_64.rpm 
インストールすると、サーバが起動し、起動スクリプトもセットされる。RStudioは、初期設定ポートが8787なので、8787ポートは開けてあげること。 http://yoursite.com:8787/ にアクセスするとログイン画面が表示されるはず。ユーザ情報は、Linuxユーザ情報をそのまま利用している。




rmongodb

Mongodbのインストールは、随分前にインストールしていたので、省略。yumでインストール出来たはず。コンパイルとか、随分とインストールに時間が掛かったような記憶がある。
rmongodbは、Rのライブラリで、Rに、mongodbへの接続機能を追加するものだ。R本体はデータの取得先に対する機能は充実しておらず、その当たりはライブラリで頑張ってくださいと言う姿勢らしい。
githubで公開しているrmongodbは、上手くコンパイル出来なかった。CRAN(the Comprehensive R Archive Network)から取得すると上手くらしい。
# mongodbとRを接続するためのライブラリ rmongodbをインストールする
# githubに配布されているものは、なぜかインストールに失敗するので、CRANから取得しインストール
 $ wget http://cran.r-project.org/src/contrib/rmongodb_1.0.3.tar.gz 
 $ sudo R CMD INSTALL rmongodb_1.0.3.tar.gz 

R Studioを実行してみる

まず、コマンドラインからrmongodbが動作するか確認してみた。
> R                 # コマンドラインからRを起動
(途中省略)
> library(rmongodb) # rmongodbをロードする
rmongodb package (mongo-r-driver) loaded
Use 'help("mongo")' to get started.

R Studioから、同じ事をやってみる。
  1. http://yoursite.com:8787/ にアクセス
  2. linuxユーザでログイン
  3. 右下のペインのPackages タブを選択
  4. rmongodb にチェックを入れる
すると、右のコンソールに上記のコマンドラインと同じメッセージが表示される。(当たり前だけど)
なかなか、使い勝手がよさそう。




Mongodbへのデータ登録と取得

サンプルソースをみて、Rからmongodbを利用する方法など確認してみた。
# insert
mongo <- mongo.create()                            # 接続
if (mongo.is.connected(mongo)) {                   # 接続確認
    buf <- mongo.bson.buffer.create()              # bson用の1レコードバッファをR内に用意
    mongo.bson.buffer.append(buf, "name", "baker") # レコードバッファに属性と値をセット
    mongo.bson.buffer.append(buf, "age", 50L)
    b <- mongo.bson.from.buffer(buf)               # レコードバッファをbson形式に変更
    mongo.insert(mongo, "test.people", b)          # db:test, collection:peopleに追加
}

# select
mongo <- mongo.create()
if (mongo.is.connected(mongo)) {
    buf <- mongo.bson.buffer.create()
    mongo.bson.buffer.append(buf, "age", 18L)
    query <- mongo.bson.from.buffer(buf)

    # Find the first 100 records
    #    in collection people of database test where age == 18
    # queryの内容は、{age:18L}
    # レコードコレクションに対するカーソルが提供される
    cursor <- mongo.find(mongo, "test.people", query, limit=100L)
    # Step though the matching records and display them
    # nextメソッドで、カーソルを順に動かしていく
    while (mongo.cursor.next(cursor))
        print(mongo.cursor.value(cursor))
    mongo.cursor.destroy(cursor)                  # カーソルの開放
    # 現在、100件も入っていないので表示されませんが :-p
}
実際にMongodbにデータが格納されていることを、mongodbのクライアントソフトmongoで確認してみる。
# mongo (クライアントソフトから実行結果を確認してみる)
> show dbs     # データベース一覧をみる
admin
error_logger
local
test
> use test     # データベース test に移動
switched to db test
> show collections   # 現在のデータベース内のコレクションをみる
foo
people
system.indexes
users
> db.people.find()   # test.people を全件検索してみる
{ "_id" : ObjectId("4fcb042f3eee4d39039e1b87"), "name" : "baker", "age" : 50 }
> 

0 件のコメント:

コメントを投稿