dashDB & Rを使ったデータ分析 in-database Analytics アソシエーション分析 基礎編

###**dashDB & Rを使ったデータ分析をはじめてみる 基礎編（アソシエーション分析）**
***
今回からクライアント環境に導入したR Studioを使用してdashDB In-database Analytics 関数を使用したデータ分析を進めてみたいと思います。基礎編ということで、dashDB R ライブラリのインストールから、どのようにRプログラムを記載するのか？というレベルから記載していきます。

また今回はサンプルシナリオとして、架空のアウトドア会社の売上明細表と製品マスタ表を元に、販売製品の併売傾向を分析するケース(アソシエーション分析)を例にして、dashDB In-database Analytics関数がどのように使えるか紹介していきます。

####**①.dashDB & Rを使用したデータ分析のために必要なライブラリ**#####
dashDBのin-database Analytics関数を使用するためには**「ibmdbR」**というパッケージのダウンロードをCRANから実施する必要があります。R Studionのパッケージインストールからこちらは可能です。他のRパッケージとの依存関係は下記の通りです。

```lang:
 install.packages("ibmdbR") 
```
![R_8.png](https://qiita-image-store.s3.amazonaws.com/0/94920/520a28cc-bb36-e6fa-1773-e014d0f05868.png)

####**②.RODBCを使用したdashDB接続設定を行う。**####
ODBCドライバ名やデータベース名等の情報については、dashDBにログインして、『Connect』タブの『Connect Information』をクリックするとdashDB ODBC接続情報、OS別ドライバのダウンロード先へのリンクの参照できるようになっています。ユーザー名とパスワードはdashDBへの接続するユーザーのIDとパスワードになります。

```lang:
library(ibmdbR) 
　driver.name <- “{ODBCドライバ名}"     #IBM DB2 ODBC DRIVER
  db.name <- “データベース名" 
  host.name <- “ホスト名" 
  port <-“ポート番号" 
  user.name <-“ユーザー名” 
  pwd <- “パスワード" 
  con.text <- paste("DRIVER=",driver.name, ";Database=",db.name, ";Hostname=",host.name, ";Port=",port, ";PROTOCOL=TCPIP", ";UID=", user.name, ";PWD=",pwd,sep="")  
 con <- odbcDriverConnect(con.text) 
```
参考: dashDB Web Consoleログイン ⇒ Connect ⇒ Connect Information
![R9.png](https://qiita-image-store.s3.amazonaws.com/0/94920/05fbb1cb-4e14-2437-f75b-cd32a31a56dc.png)

**もしくはODBCデータソースとして事前に接続定義を作成している場合**は下記構文から接続可能です。

```lang:
con <- idaConnect(“dashDB”, “”, “”)　　　　　　　　　　
```
※『dashDB』はODBCシステムリソース名。接続定義は事前に記載必要です。ODBC設定はWindows7であればコントロールパネル⇒管理ツール⇒データソース(ODBC)で設定できます。


####**③.dashDBへのODBC接続定義を初期化します。**####

```lang:
idaInit(con)　　　　　　　
```
####**④.IDAデータフレームの作成**####
例として、dashDB上のORDER_DETAILS表を使用したIn-DBデータフレーム(IDAデータフレーム)オブジェクトを作成してみます。今回はORDER_DETAILS_40M表の2列とproduct表の2列を参照するIDAデータフレームオブジェクトを作成しています。これらのオブジェクトはDBの中で処理されます。ORDER_DETAILS_40M表は架空のアウトドア製品会社の4000万件の売上明細データとproduct表はアウトドア関連の製品マスタを指しています。

```lang:
orderDetails <-ida.data.frame(‘ORDER_DETAILS_40M’),c('PRODUCT_NUMBER','ORDER_NUMBER')]
product <- ida.data.frame('PRODUCT'),c('PRODUCT_NUMBER','PRODUCT_TYPE_CODE')]
```

####**⑤.IDAデータフレームオブジェクトをマージする**####
次にorderdetailsとproducts IDAデータフレームをproduct_number列の値で結合させてみます。記述方法としては下記の通り、通常のRのmergeと記述の仕方はほぼ同じですが、データはDBの中で全て処理されています。

```lang:
orderDetails2 <- idaMerge(orderDetails,product,'PRODUCT_NUMBER')
head(orderDetails)  
 PRODUCT_NUMBER ORDER_NUMBER PRODUCT_TYPE_CODE
1          68110       700193               961
2          70240       700193               961
3          71110       700193               961
・・・
```

####**⑥.アソシエーション分析モデルの作成**####
下記は⑤で作成したorderDetails2 IDAデータフレームを使用した相関ルールモデルの作成処理です。トランザクションIDにORDER_NUMBER, アイテムにPRODUCT_TYPE_CODEを指定、表記をわかりやすくするため、nametable,namecolとの紐付けを実施しています。inspect(モデル名)で確認するとどの製品が同時に購買されているのか傾向を示す値(support, confidence,lift)を確認することができます。

```lang:
r <- idaArule(orderDetails2,tid="ORDER_NUMBER",item="PRODUCT_TYPE_CODE",minsupport=0.05,maxlen=2,nametable = "PRODUCT_TYPE",namecol = "PRODUCT_TYPE_EN")
inspect(r)
   lhs                rhs             support    confidence lift    
1  {Cooking Gear}  => {Tents}         0.06406790 0.5154857  5.194457
2  {Tents}         => {Cooking Gear}  0.06406790 0.6456008  5.194457
3  {Cooking Gear}  => {Sleeping Bags} 0.06495043 0.5225865  5.241218
・・・
```
ちなみにsupport, confidence, liftについて1行目の結果で説明すると製品「Cooking Gear」を買ったお客様が製品「Tents」を買った全体の割合は6.4%となります。またCooking Gearを購入された顧客がTentsを購入した顧客の発生割合が51%という結果になっています。相関ルールは、support、confidence、Liftの値を元に各製品が合わせて購入される傾向を見るものですが、単純に各指標の値だけ見て判断できない側面もあるため、実際に有効なデータであるかの判断はビジネス現場での判断も重要になります。

相関ルール自体の説明については、[こちら](http://bdm.change-jp.com/?p=1341)のサイトの説明が非常にわかりやすいです。


####**⑦.アソシエーション分析モデルの適用**####
次に⑥で作成した分析モデルの適用を行い結果をheadを使用して参照してみます。モデル適用にはidaApplyRule関数を使用することが可能です。IDAデータフレームを使用した処理となるため、こちらもDB内で処理が可能です。

```lang:
q <- idaApplyRules(idaGetModelname(r),orderDetails2,"ORDER_NUMBER","PRODUCT_TYPE_CODE")
head(q)
  ORDER_NUMBER RANK RULEID                        PRINT LENGTH    SUPPORT     LIFT CONFIDENCE
1       100001    1     16       (Eyewear) => (Watches)      2 0.61940439 1.225006  0.8340371
2       100002    1     15       (Watches) => (Eyewear)      2 0.61940439 1.225006  0.9097603
3       100003    1     16       (Eyewear) => (Watches)      2 0.61940439 1.225006  0.8340371
・・・
```
上記分析結果から今回使用したサンプルデータからは、EyewearとWatchesの相関関係の強さがわかりますね。supportの値が約61%、confidenceの値が90％という結果になっていることから、１つ分析結果として解釈することができます。

####**⑧.作成したオブジェクトの削除、接続クローズ**####
最後に作成した表、モデルといったオブジェクトをDBから削除して接続をクローズさせたいと思います。それぞれ下記のような形でRプログラムで実装することが可能です。

```lang:
idaDeleteTable(orderDetails2)
idaDropModel(idaGetModelname(r))
idaClose(con)
```

このようにRプログラムと同じような文法構造でありながら、処理自体はDBの中で行わせることができる点がdashDB In-database Analyticsのメリットにもなります。Rになじみのある記載方式なので使用にあたりそこまでハードルは高くないと思います。もちろんdashDB側のテクノロジーについてある程度把握しておくと、どのような処理をDBサーバー側でやらすと効果的か予測がしやすくなるので、知っておくことに越したことはありません。

以上、今回は終了です。次はK-meansやベイズといった分析基礎編、dashDB MPPによる大量データ分析処理の実施例をアップしていきたいと思います。

####**⑨.参考:サンプルRスクリプト**####
***
最後に今回のdashDB & R アソシエーション分析で使用したRスクリプトを参考までにのせておきます。こちらはdashDBのサンプルとして記載がありますので、全体を記載すると下記となります。

```lang:Rスクリプト例
library(arulesViz)
library(ibmdbR)

con <- idaConnect('dashDB','','')
idaInit(con)

orderDetails <- ida.data.frame('XXXXX.ORDER_DETAILS_40M')[,c('PRODUCT_NUMBER','ORDER_NUMBER')]

products <- ida.data.frame('XXXXX.PRODUCT')[,c('PRODUCT_NUMBER','PRODUCT_TYPE_CODE')]
orderDetails2 <- idaMerge(orderDetails,products,'PRODUCT_NUMBER')
head(orderDetails2)

r <- idaArule(orderDetails2,tid="ORDER_NUMBER",item="PRODUCT_TYPE_CODE",minsupport=0.05,maxlen=2,nametable = "XXXXX.PRODUCT_TYPE",namecol = "PRODUCT_TYPE_EN")
inspect(r)

jpeg('graph.jpeg')
plot(r,"graph")
dev.off()

jpeg('grouped.jpeg')
plot(r,"grouped")
dev.off()

q <- idaApplyRules(idaGetModelname(r),orderDetails2,"ORDER_NUMBER","PRODUCT_TYPE_CODE")
head(q) 

idaDeleteTable(orderDetails2)
idaDropModel(idaGetModelname(r))

idaClose(con)
```