Rで作成したモデルをPMMLに出力してYellowfinで利用するざっくりした手順


先日リリースされたYellowfin 7.4は統計やデータマイニング、機械学習等の各種ツールとの連携が強化されています。どんなことができるのか簡単に試してみましょう。

# 今回やること

やることはタイトルそのままなのですが、あえて図にすると以下のようになります。

![image-01.png](https://qiita-image-store.s3.amazonaws.com/0/116818/7722fea2-276d-0518-2235-33ce847013c0.png "image-01.png")

PMML（Predictive Model Markup Language）とは、XMLベースの統計やデータマイニングモデルの記述言語です。この技術を用いることにより、異なる環境や製品間でもデータモデルを相互に共有・移植することが可能になります。

データサイエンティストやデータアナリストと呼ばれる人たちが分析モデルを作る際、通常はローカルのRやPythonでデータとごりごり格闘することが大半でしょう。で、素晴らしい精度を誇る完璧なモデルができあがったとします。ではそれを通常業務で利用している本番環境へ移植するにはどうすればいいでしょうか。本番環境でRは動かせないし、かといってモデルを再実装するのは大変すぎる……。そこで登場するのがPMMLのような標準フォーマットなわけです。

# 準備するもの

* R
* Yellowfin 7.4
* YellowfinのPMML用プラグイン

RのインストールについてはWeb上にいろいろ情報があるのでググってください。R本体だけでなく、RStudioもインストールするほうが便利だと思います。

【参考】[RとRStudioのインストール](https://qiita.com/hujuu/items/ddd66ae8e6f3f989f2c0)

Yellowfin 7.4とPMMLプラグインを国内で入手するには、現時点（2017年11月）ではYellowfin Japan社へ連絡する必要があります。

# モデルの作成

まずはRでデータモデルを作成します。ネタは以下のサイトのサンプルを参考にさせていただきました。

[エクセルで重回帰分析をやろう｜マーケティングと重回帰分析-その4](http://xica.net/magellan/marketing-idea/stats/multiple-regression-analysis/)

部屋の広さや駅からの近さ、築年数等から家賃の相場を予測するモデルを作ります。
上記サイトではサンプルデータとしてExcelファイルが用意されていますが、このままだとRで扱いづらいのでCSVに加工しました。

[room_rent_trainning.csv](https://raw.githubusercontent.com/hadatuna/r-pmml-yf/master/room_rent_training.csv)

このCSVファイルをRで読み込んで重回帰分析のモデルを作ります。
まずはCSV読み込み。

```R:
data <- read.table('[ファイルへのパス]/room_rent_training.csv', sep=',', header=T)
```

続いてlm()を使い、重回帰分析を行います。

```R:
output <- lm(data$rent ~ data$walking_time + data$room_area + data$const_age
             + data$floor_number + data$new_const + data$upper_floor
             + data$facing_south + data$parking + data$automatic_lock
             + data$air_conditioner + data$separated_toilet
             + data$reheating_bath + data$wooden_floor + data$pets_allowed)
```

この例では、チルダ（~）以降のwalking_time（徒歩分数）やroom_area（部屋面積）等の値を元に、rent（家賃）を予測するモデルを作っています。

そして、そのモデルをPMMLのフォーマットに出力します。

```R:
library(pmml)
pmml(output)
```

ここまで実行すると、コンソールにPMMLの記述が表示されます。以下はRStudioでの画面例です。

![rstudio.png](https://qiita-image-store.s3.amazonaws.com/0/116818/254c719c-cd32-c254-71d2-0cc940a20425.png "rstudio.png")

このPMML記述をコピペして.pmmlファイルを作ればOKです。

ただ、ネタ元のサイトにも書かれているのですが、家賃への影響度は項目によって異なります。どの項目がより家賃に影響を与えているのか、それを判断する指標がt値（t value）です。その絶対値が概ね2.0を超えていれば統計的に「関係がある」と判断する目安になるのだそうです。

t値はsummary()で確認できます。

```R:
> summary(output)

Call:
lm(formula = data$rent ~ data$walking_time + data$room_area + 
    data$const_age + data$floor_number + data$new_const + data$upper_floor + 
    data$facing_south + data$parking + data$automatic_lock + 
    data$air_conditioner + data$separated_toilet + data$reheating_bath + 
    data$wooden_floor + data$pets_allowed)

Residuals:
     Min       1Q   Median       3Q      Max 
-15119.8  -4115.7   -338.8   4713.5  14931.9 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            34516.0     5492.8   6.284 1.36e-08 ***
data$walking_time      -1102.5      233.4  -4.724 9.07e-06 ***
data$room_area          2764.5      115.2  23.994  < 2e-16 ***
data$const_age          -587.0      325.8  -1.802 0.075085 .  
data$floor_number       1442.1      254.0   5.678 1.86e-07 ***
data$new_const          4627.3     3118.3   1.484 0.141531    
data$upper_floor       -1613.8     2817.6  -0.573 0.568333    
data$facing_south      -1179.9     1710.5  -0.690 0.492210    
data$parking            2446.8     2067.8   1.183 0.239999    
data$automatic_lock     9864.8     2863.3   3.445 0.000889 ***
data$air_conditioner   -1887.9     3226.6  -0.585 0.560037    
data$separated_toilet  -1100.8     2207.8  -0.499 0.619358    
data$reheating_bath      399.3     2541.5   0.157 0.875536    
data$wooden_floor      -3656.1     3365.9  -1.086 0.280462    
data$pets_allowed       3448.5     1994.0   1.729 0.087361 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7073 on 85 degrees of freedom
Multiple R-squared:  0.948,	Adjusted R-squared:  0.9394 
F-statistic: 110.6 on 14 and 85 DF,  p-value: < 2.2e-16
```

関係がありそうなのは、walking_time（徒歩）、room_area（面積）、floor_number（階数）、automatic_lock（オートロック）の4項目ということになります。
そこで、先ほどの.pmmlを編集して4項目に絞ったものが以下のファイルです。

[room_rent.pmml](https://raw.githubusercontent.com/hadatuna/r-pmml-yf/master/room_rent.pmml)

# PMMLファイルの配置

上記のroom_rent.pmmlを任意の場所に置きます。Yellowfinからアクセス可能なパスならどこでも構いません。

# Yellowfinのレポート作成

## テスト用CSVの取り込み

以下のCSVファイルを使ってレポートを作成します。先ほどのモデル作成に使用したCSVとは違って、このCSVには家賃が含まれていません。家賃はデータモデルで予測するからです。

[room_rent_test.csv](https://raw.githubusercontent.com/hadatuna/r-pmml-yf/master/room_rent_test.csv)

CSV取り込みでレポートを作成して、とりあえず全フィールドを配置してみます。

![yellowfin_1.png](https://qiita-image-store.s3.amazonaws.com/0/116818/1ca88b5a-8668-c113-e915-1437f0391421.png "yellowfin_1.png")

## ダミーのフィールド作成

予測値を反映するためのフィールドを、計算フィールドを使用して作成します。
予測値は数値が返ってくるので、ここでは適当に「0」とかを入れておきます。

![yellowfin_2.png](https://qiita-image-store.s3.amazonaws.com/0/116818/8fd7e538-1536-0f73-c5e9-141bb540dca8.png "yellowfin_2.png")

## 高度な関数の使用

作成したダミーのフィールドに高度な関数を使用します。操作は以下のGIFを見ていただければわかると思いますが。

![room.gif](https://qiita-image-store.s3.amazonaws.com/0/116818/bd688b54-268b-4550-ec43-ce4e0d9ce837.gif "room.gif")

1. ダミーのフィールドをキャンバスに置く
2. 高度な関数を選択する
3. Plugins→PMML Model(Numeric)を選択する
4. PMML Fileにフルパスを入力する
5. Loadを選択する
6. walking_time、room_area、floor_number、automatic_lockにそれぞれ対応するフィールドを選択する

以上の手順で家賃の予測値が得られます。

# まとめ

統計やデータマイニングといったデータサイエンスの領域と、実際の業務・ビジネスの領域は分断されているケースが大半でした。ですが、Yellowfin 7.4ならそれらをより簡単に繋ぐことができます。
また、中間層としてPMMLのような標準フォーマットを介することで、分析モデル構築に高い自由度をもたらすことが可能になります。