まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:r

IBM Bluemix から提供されている解析用 DBaaS の dashDB には R Studio 環境が付属しています(オープンソース製品としての R Studio 環境がセットアップ済みの状態から使えます)。個人的にもよく使ってます。



特に今回のように R Studio 環境を紹介するようなブログを書いていると、R Studio のスクリーンショットを撮りたくなることも珍しくないのですが、色々使った後の R Studio コンソール画面(下図の画面左半分)はごちゃごちゃしていたり、そもそも見せたくない内容が含まれていたりします。このコンソール部分をクリアする方法が分かっていなかったのですが、キーボードの Ctrl + L でクリアできることを知りました:
2016110201


色々操作した後に Ctrl + L すると、コンソールがクリアされます:
2016110202


それ以外にもこの辺りのショートカットが便利そうです:
- Ctrl + 1 : ソースエディタに移動
- Ctrl + 2 : コンソールに移動





 

Python から R 言語を呼び出して実行する手順をまとめました。システムは CentOS 6.x を想定しています。


具体的には Python の PypeR ライブラリを使います。なので Python と R 言語と PypeR ライブラリをインストールすることになります。ただそれだけではまだ色々不便なので、numpy や pylab などの PypeR と一緒によく使うライブラリとまとめて環境を用意して使うことにします。

まず以下の手順を実行する上で前提となるライブラリ類と Python3 をまとめて導入しておきます。
# rpm -ivh http://mirror.yandex.ru/fedora/russianfedora/russianfedora/free/el/releases/6/Everything/x86_64/os/puias-release-6-2.R.noarch.rpm
# yum install -y python3.x86_64 python3-devel.x86_64 python3-tools.x86_64 freetype* libpng-devel libjpeg-devel lapack-devel

次に pip をインストールします:
# curl -kL https://bootstrap.pypa.io/get-pip.py | python

導入した pip を使って PypeR などのライブラリをインストールします(numpy や scipy などは結構時間がかかります):
# pip install numpy
# pip install pyper
# pip install pandas
# pip install scipy
# pip install pylab

最後に R 言語環境をインストールします:
# yum install R

これで全ての環境が整いました。では R 言語と導入したライブラリを使って動かす、以下の様な Python スクリプトを用意して実行してみます(なお、この Python スクリプトはここで紹介されているものです):
# -*- coding:utf-8 -*-

import numpy
import pandas
import pylab
import pyper

n = 200
# データの生成
score_x = numpy.random.normal(171.77, 5.54, n)
score_y = numpy.random.normal(62.49, 7.89, n)

score_x.sort()
score_x = numpy.around(score_x + numpy.random.normal(scale=3.0, size=n), 2)
score_y.sort()
score_y = numpy.around(score_y + numpy.random.normal(size=n), 2)

# 散布図を描く
pylab.scatter(score_x, score_y, marker='.', linewidths=0)
pylab.grid(True)
pylab.xlabel('X')
pylab.ylabel('Y')

# Rで回帰分析
df = {'X': score_x, 'Y': score_y}
df = pandas.DataFrame(df)

r = pyper.R(use_pandas='True')

# Rへデータ渡す
r.assign('df', df)

# Rのコマンド実行
print(r("summary(df)"))
r("result <- lm(Y~X, data=df)")
print(r("summary(result)"))

#予測区間と信頼区間を算出するため
new_x = numpy.arange(155, 190, 0.1)
new_df = pandas.DataFrame({'X': new_x})
r.assign('new', new_df)

# 予測区間(R)
r("prediction <- predict(result, new, interval='prediction')")
# 信頼区間(R)
r("confidence <- predict(result, new, interval='confidence')")

# Python側にとってくる
lm_result = r.get('result$fitted.values')
prediction = pandas.DataFrame(r.get('prediction'))
confidence = pandas.DataFrame(r.get('confidence'))

# 回帰直線, 予測区間, 信頼区間を描く
pylab.plot(score_x, lm_result, 'r', linewidth=2)

pylab.plot(new_x, prediction[1], 'g', linewidth=1)
pylab.plot(new_x, prediction[2], 'g', linewidth=1)

pylab.plot(new_x, confidence[1], 'c', linewidth=1)
pylab.plot(new_x, confidence[2], 'c', linewidth=1)

pylab.show()

この内容を例えば python01.py という名前で保存し、python で実行すると以下の青字部分のような出力が確認できます:
# python3 python01.py

try({summary(df)})
       X               Y
 Min.   :153.2   Min.   :41.81
 1st Qu.:167.1   1st Qu.:57.49
 Median :171.3   Median :63.45
 Mean   :171.4   Mean   :63.28
 3rd Qu.:176.3   3rd Qu.:68.39
 Max.   :186.8   Max.   :80.02

try({summary(result)})

Call:
lm(formula = Y ~ X, data = df)

Residuals:
   Min     1Q Median     3Q    Max
-8.389 -2.431 -0.233  2.405 10.974

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -106.42882    6.72661  -15.82   <2e-16 ***
X              0.99004    0.03921   25.25   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.67 on 198 degrees of freedom
Multiple R-squared:  0.763,     Adjusted R-squared:  0.7618
F-statistic: 637.5 on 1 and 198 DF,  p-value: < 2.2e-16

Python スクリプト内で指定されている PypeR や Pylab などのライブラリが正しく読み込まれて実行することができました。

(参考)
https://gist.github.com/mia-0032/6378324

IBM Bluemix 内で利用可能な統計解析用の DBaaS である dashDB は、標準機能の一部として R 言語の実行環境である R Studio を内蔵しています:
http://www.ibm.com/software/data/dashdb/


この R Studio に dashDB 内のデータを呼び出した上で R 言語を使ってデータの解析を行う(具体的にはデータ間の相関関係を調べる)という一連の手順を紹介します。

この手順を行う上で、まず IBM Bluemix 上で dashDB を使えるようにすることと、dashDB 内に解析に使えるようなデータが格納されている必要があります。先日の別ブログでラズベリーパイのセンサーデータ(CPU温度、CPU負荷率など)を取得して、dashDB 内のテーブルに格納する、という手順を紹介しているので、実際にデータを取得して試してみたい、という方はこちらのエントリを参照してください:
Node-RED(QuickStart) のデータを dashDB に格納する


なお、ラズベリーパイを所有していないとか、或いはデータを集めるのが面倒、という場合は、実際に上記の方法で集めたデータを github 上に公開しておきましたので、こちらのデータを dashDB にインポートして使ってください(ちなみにこのデータはラズベリーパイに実際に負荷を与えて CPU 温度や CPU 負荷に変化を起こした時の、ある意味で解析しやすいデータになっています)。以下その手順を紹介します:

まずは github 上の以下のサイトから CSV データをダウンロードしてください:
https://raw.githubusercontent.com/dotnsf/RPDATA/master/RPDATA.csv
(上記 URL を開いて、内容を「名前を付けて保存」してください。ファイル名は RPDATA.csv としてください)

次に IBM Bluemix から dashDB のウェブコンソールからテーブル一覧を開きます。その手順は上述の「Node-RED(QuickStart) のデータを dashDB に格納する」のリンク先を参照してください。

テーブル一覧画面で "Add Table" ボタンをクリックします:
2015121501


"Create a table" ダイアログで作成する RPDATA テーブルの定義を指定します。DDL に以下の内容を指定して "Run DDL" ボタンをクリックします:
2015121508
CREATE TABLE "RPDATA"
(
  "ID" VARCHAR(20),
  "CPUTEMP" DOUBLE,
  "CPULOAD" DOUBLE,
  "SINE"  DOUBLE
);

成功すると "DDL ran successfully" というメッセージが表示されます:
2015121503


成功したらテーブル一覧に RPDATA テーブルが追加されているはずなので確認してみます。下図のような定義内容で追加されているはずです(ただしこの時点ではデータの中身は空です):
2015121507

(注 このテーブルのスキーマ名(上記画面では Schema で指定されている DASH104338)はこの後で R Studio からこのデータを呼び出す時に必要になるので、メモするなどして控えておいてください)


続けて中身となるデータもインポートしましょう。画面左メニューから "Load" - "Load from Desktop" を選択します:
2015121505


インポートデータを指定します。"Browse files" ボタンをクリックしてダウンロードした RPDATA.csv ファイルを指定します。また "Does row one contain the column names?" には "Yes"、Separator character には "comma" を指定します。一番下の "Does the file has columns that contains dates or times?(ファイルには日付や日時のデータを含むか?)" という質問には "No" を選択して "Load file" をクリックします:
2015121506


ファイルが読み込まれ、ロードされる予定のデータのプレビューが行われます。中身を確認して "Next" をクリックします:
2015121507


次にロード先テーブルを指定します。既に目的のテーブル(RPDATA)は作成済みなので、"Load into an existing table" を選択して "Next" をクリックします:
2015121508


テーブルの指定画面で RPDATA を選択し、"Append new data into the table"(テーブルにデータを追加する)を選択して "Finish" ボタンをクリックします:
2015121509


データのロードが実行されます。この CSV のロードが全て成功すると 189 行のデータレコードが作成されます。"Number of rows read = 189" で "Number of rows rejected = 0 " と表示されていれば全てのデータが正しく読み込まれてインポートされたことになります。画面下部にはインポートされたデータの一部がプレビューされています:
2015121510


改めてテーブル一覧に戻って RPDATA テーブルを選び、"Browse Data" タブを選択すると、インポートされた 189 行のレコードデータが確認できます:
2015121511


これで実際にデータを取得しなくても、動いていたデータの dashDB へのインポートが完了しました。では dashDB に格納されたデータを R Studio に呼び出して解析処理を行ってみます。なお、以下はここで CSV からインポートして作成した RPDATA を使って解析処理を行うため、実行結果は CSV からインポートした場合と同じものになるはずです(実際に皆さんのラズベリーパイのデータを取得した場合は異なる解析結果になると思います。実行手順の参考として確認してください)。

まずは R Studio にログインするための接続情報を確認しましょう。dashDB ウェブコンソール画面の左メニューから "Connect" - "Connection information" を選択します:
2015121501


データベースや R Studio に接続するための接続情報が表示されます。特にこの中で User IDPassword が必要になるので、どこかにメモしておきましょう:
2015121502


では改めて R Studio 画面に向かいます。dashDB ウェブコンソール画面の左メニューから "Analytics" - "R Scripts" を選択します:
2015121503


R Scripts 実行画面が表示されますが、ここは飛ばして R Studio を起動するので "R Studio" と書かれたボタンをクリックします:
2015121504


初回は R Studio にログインするための Username と Password が求められます。先程メモした接続情報の内容を入力します(必要であれば Stay signed in にチェックを入れて次回以降のログインを不要にします)。最後に "Sign in" ボタンをクリックして R Studio を起動します:
2015121505


以下の様な R Studio の画面が表示されれば成功です。これで dashDB から R Studio の呼び出しに成功しました:
2015121506


R Studio 画面左側の Console に R 言語を入力してデータの解析を行います。まずは以下の3行を1行ずつ入力していきます(青字が実行コマンド、赤字はコメント):
> mycon <- idaConnect("BLUDB", "", "") BLUEDB(dashDB)に接続
> idaInit(mycon) 初期化
> mydata <- as.data.frame(ida.data.frame('"DASHXXXXXX"."RPDATA"')[ ,c('ID','CPUTEMP','CPULOAD','SINE')])
 ↑スキーマ名とテーブル名、テーブル内の列名を指定して全データを指定し、mydata という名前の変数に代入

この3行を実行した時点で、RPDATA テーブルの内容が mydata という R 言語の変数に代入されています。画面右上部にも mydata 変数の中身(の一部)が確認できるようになっています:
2015121509



この状態からは普通に R 言語と mydata 変数を使って、統計計算を行っていくことができます。なので R 言語に詳しい人であれば好きに使っていただいて構いません。 以降はあまり詳しくない人のためにもう少し続けます。まずはデータのサマリーを参照してみましょう。先程の3行に続けて、Console に以下の1行を指定してください(青字が実行コマンド、黒字が実行結果です):
> summary(mydata)
ID CPUTEMP CPULOAD
Length:189 Min. :46.54 Min. :0.0400
Class :character 1st Qu.:47.62 1st Qu.:0.1700
Mode :character Median :47.62   Median :0.3400
Mean :48.14 Mean :0.3784 
3rd Qu.:48.69 3rd Qu.:0.5800
Max. :50.84 Max. :0.8800
SINE
Min. :-1.000000
1st Qu.:-0.720000
Median : 0.010000
Mean : 0.005608
3rd Qu.: 0.720000
Max. : 1.000000 
2015121510


CPULOAD, CPUTEMP, SINE の実行結果として Min., 1st Qu., Median, Mean, 3rd Qu., Max. という結果が表示されていますが、これらはそれぞれ以下の様な意味です:
表示意味
Min.最小値
1st Qu.下から4分の1のデータの値
Median中間値
Mean平均値
3rd Qu.下から4分の3(上から4分の1)のデータの値
Max.最大値


例えば CPUTEMP(CPU温度)であれば、測定期間中の最小は 46.54℃、最大は 50.84℃で、平均値は 48.14℃。一方、中間値(全データをソートした時の中間にあるデータの値)は 47.62℃なので全体的に平均よりも上に分布しているデータであることがわかります。

では CPUTEMP(CPU温度), CPULOAD(CPU負荷), SINE(サインカーブ)の3つのデータについて相関関係を調べてみます。実際に調べる前の時点で CPU 温度と CPU 負荷には何らかの相関関係があるような気がしますよね。一方これらと(決まった変化をとり続ける)サインカーブ値には何の関係もないような気がします。ただ実際にそのようなデータになっているかどうかを客観的に調べるのが相関係数です。相関係数は -1 から 1 までの間を取る値で、1に近いほど順の相関関係がある(一方が増えると、もう一方も増える関係にある)、-1 に近いほど逆の相関関係がある(一方が増えると、もう一方は減る関係にある)、0に近いほど相関関係がない(独立して変化する)、という関係を示す指数です。 R 言語では cor 関数を使って複数の相関関係を一発で調べることができます。パラメータには相関関係を調べたい変数をまとめて指定できます。今回はこの3つの値の相関関係を調べます。mydata 変数内ではこれらの値は2番目から4番目(1番目はID)なので、以下のように指定して実行します:
> cor(mydata[2:4])
CPUTMEP CPULOAD SINE
CPUTEMP 1.00000000 0.6329742 0.03631856
CPULOAD 0.63297415  1.0000000 -0.02040800
SINE 0.03631856 -0.02040800 1.00000000 
2015121511


結果は表の形で出力されます。CPUTEMP, CPULOAD, SINE それぞれの相関係数が2つの交点として出力されています。例えば CPUTEMP と CPULOAD の相関係数は 0.6329742 です。これはまあ比較的1に近い数字と考えられるので、相関関係があると言えそうです。一方、CPUTEMP と SINE の相関係数は 0.03631856 で 0 に近いので相関関係はなさそうです(CPULOAD と SINE も相関係数 -0.02040800 なので相関関係はなさそうです)。 このような結果から最初に推測した相関関係はデータでもある程度実証された、と言えそうです。


と、まあこんな感じです。dashDB というリレーショナルデータベースの DBaaS に格納されたデータを R Studio で読み込んで R 言語で統計処理を行う、ということができちゃうわけです。そしてこの dashDB 自体も実体としては IBM DB2 なので、JDBC などで普通にアクセスすることができます。クラウドのデータベースもアナリティクス機能を普通に搭載する時代になってきたんですねー。


このページのトップヘ