2012/03/04

ROracle: OCI based Oracle database interface for R

先日、ROracleがOCIベースに変更されたようなので、気になって入れてみました。

そもそも、私自身、Rから積極的にOracleを使おうと考えてなかった(それほど、大量データを扱わない)のですが、Oracleにあるデータをサクっと抽出してサラっと分析できると便利だろうと思います。ROracle自体はCRAN(The Comprehensive R Archive Network)にソースの状態で置かれているので別途コンパイルが必要です。以下、R(および必要であればRStudio)とROracleのコンパイル方法をまとめておきます。

* 基本的にはココをベースにしています。(http://cran.r-project.org/web/packages/ROracle/INSTALL)

まず、R自身をインストールしないと話は始まらないので以下からダウンロードします。
(私はWindows版2.14.2をダウンロードしてインストールしました)

http://cran.r-project.org/

続いてGUIツール(コンソールだけで良ければ必要ありません)もインストールしておきます。(v0.95)

http://rstudio.org/download/desktop

また、Windows環境でmake等のツールが必要になるのでcygwinを含めた一式(Rのバージョンに合わせて)Rtoolsをダウンロードしてインストールしておきます。

http://cran.r-project.org/bin/windows/Rtools/

あと、Oracleのinstant client(basicとSDK)を以下に配置しておきます。(どうもパスは固定のようです。32bitの方はx64の部分をx32としてください)
C:\instantclient\x64\instantclient_11_2

最後にROracleをダウンロードしておきます。

http://cran.r-project.org/web/packages/ROracle/index.html

では、コマンドプロンプト(RStudioではシェル)を起動して
* パスは適宜読み替えてください

C:\> PATH=%PATH%;C:\Rtools\bin;C:\Rtools\MinGW64\bin
C:\> R CMD INSTALL --build ROracle_1.1-1.tar.gz

これでC:\にROracle_1.1-1.zipというパッケージが作成されます。

今度はRのコンソールから

> install.packages("DBI")
> install.packages("png")
> install.packages("C:/ROracle_1.1-1.zip", contriburl = NULL)

以上でコンパイルとインストールはおしまい。あとは適当に使ってみます。
手元にあるデータがSwingbenchのSHスキーマだったので、salesテーブルから各月毎の売上高(ちょっと怪しいですが)を計上してみます。

> # ROracleのロード
> library(ROracle)
> # ドライバーの設定
> drv <- dbDriver("Oracle")
> # SQL*Plusライクに接続
> conn <- dbConnect(drv,"sh","<password>","//<hostname>/<service_name>")
> # SQLを実行し、フェッチしてdata変数に格納
> data <- fetch(res <- dbSendQuery(conn, "select /*+ parallel(48) use_hash(s, p) */ sum(s.AMOUNT_SOLD * p.PROD_LIST_PRICE) SOLD from sales s, products p where s.PROD_ID=p.PROD_ID group by to_char(s.TIME_ID, 'yyyymm') order by 1"))
> # 時系列オブジェクトに変換
> tmp <- ts(data,start=c(1995,1),frequency=12)
> # とりあえずプロットしてみる
> ts.plot(tmp)

結果、こんな感じのチャートが出来上がります。エクセルで、データの加工と分析も良いのですが、Rで分析するとデータを別の切り口で見ることが可能です。ご興味のある方は是非お試しください。 * ちなみに私はRに関しては素人同然なのですが、これを機に再度勉強しようと思っています。


0 コメント:

コメントを投稿