Rのプログラムを組み込んでみる #alteryx #13 | Alteryx Advent Calendar 2016

こんにちは、小澤です。

当エントリは『Alteyx Advent Calendar 2016』の13日目のエントリです。

今回はRのプログラムを直接かけるR Toolを使ってみたいと思います。

R Toolとは

スクリーンショット 2016-11-24 14.59.16

このようなアイコンのToolです。設置すると5つもの出力があり、Configurationもまっさらな自由入力のみの状態となっています。

スクリーンショット 2016-11-24 15.02.48

これはRというプログラム言語で好きな処理を実装するようになっているものです。 これを利用することでAlteryxにはない機能を実現することも可能です。
とはいえ、すでにある程度必要な機能は存在しているように見えます。 しかし、実は一部のToolではマクロ内部でRによって実装されているものがあります。このToolをうまく活用することでできることの幅が広がるでしょう。

Rとは

日本語Wikipediaから引用すると

R言語(あーるげんご)はオープンソース・フリーソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境である。

R言語はニュージーランドのオークランド大学のRoss IhakaとRobert Clifford Gentlemanにより作られた。現在ではR Development Core Team(S言語開発者であるJohn M. Chambersも参画している。)によりメンテナンスと拡張がなされている。

R言語のソースコードは主にC言語、FORTRAN、そしてRによって開発された。

なお、R言語の仕様を実装した処理系の呼称名はプロジェクトを支援するフリーソフトウェア財団によれば『GNU R』であるが、他の実装形態が存在しないために日本語での慣用的呼称に倣って、当記事では、仕様・実装を纏めて適宜にR言語や単にR等と呼ぶ。

とあります。
ここでは、統計解析や機械学習に特化した言語仕様やライブラリの充実が特徴のプログラム言語と思っていただければ差し支えありません。

なお、今回はRの書き方についての詳細には立ち入りませんのでその点はご了承ください。

使ってみる

まずは簡単な処理で動きを見てみましょう。

スクリーンショット 2016-11-24 15.50.44

入力は簡単なものを用意しました。

スクリーンショット 2016-11-24 15.51.39

これをR Toolに通します。中のコードは

library(ggplot2)
set.seed(1234)

df <- read.Alteryx("#1", mode="data.frame")
df$y <- df$x * 2 + rnorm(10)

write.Alteryx(df, 1)

AlteryxGraph(2, width=300, height=300)
qplot(data=df, x=x, y=y) + theme_bw()
invisible(dev.off())

これに対して「1」からつながるBrowseは

スクリーンショット 2016-11-24 15.56.36

「2」からつながる方は

スクリーンショット 2016-11-24 15.57.17

のように出力されています。
これを順に説明していきます。

入力

データの入力は
df <- read.Alteryx("#1", mode="data.frame")
で行っています。read.Alteryx関数がAlteryx上で接続された他のToolから入力を受け取るための関数です。 引数の「#1」は受け取るものを具体的に指定していて、今回の場合だと、Text InputとRの間の接続に書いてある「#1」を指定していることになります。 この名前はConnectionのConfigurationで変更することができますので、何を接続しているかわかりやすい名前をつけたい場合は変更してください。
このR Toolの入力は複数接続可能です。その場合はデフォルトの名前は#2, #3,... となっていき、引数のに与える値を変更することで複数の入力を使い分けられます。 入力は最大で5つまで受け付けられるようです。

スクリーンショット 2016-11-24 16.06.44

出力

出力は今回2種類行っています。
まずはテーブル形式でのデータ出力を見ていきます。これは
write.Alteryx(df, 1)
がそれを行っています。出力したいものと、出力先の番号を指定しています。これによって、R Toolのアイコンにある「1」の出力にこの内容が渡されています。
今回の例ですと、入力xを2倍して乱数を足したものをyとして追加しているのでそれが出力されています。

もう一つはグラフ出力です。こちらはAlteryxGraphとinvisibleで囲んだ範囲のグラフ描画処理内容が出力となります。 Rでは複数の処理を実行することで1つのグラフを組み立てることがあるのでこのような形式になっています。
ここでは出力先に「2」を指定しているため、Tool上の2から接続したBrowse結果としてグラフが表示されています。

Rで機能の実装をしてみる

ここでは既存にない機能のとしてXGBoostを使ってみます。 今回の目的は汎用的なマクロの作成ではなく簡易的に実行してみることにします。 そのため、Predictive Analytics系のツールのように学習した結果のレポートティングとモデルを出力するのではなく、学習データとテストデータの両方を受け取りテストデータに対する予測値のみを出力するもの作成します。

最初に
C:\Program Files\Alteryx\R-3.2.3\bin\R.exe
を起動して以下の操作を行っておきます。

install.packages(c("xgboost", "Matrix"))

これで準備が整いました。Workflowを作成してみましょう。

スクリーンショット 2016-11-25 10.35.14

入力はDecision TreeやLogistic Regressionのサンプルと同じものを使っています。 まずXGBoostでは予測ラベルを0から始まる整数値として受け取るようなので、予測対象となるDefaultを数値に変換します。 ここではYesを1、Noを0に変換しています。

スクリーンショット 2016-11-25 10.41.19 スクリーンショット 2016-11-25 10.41.36

この際、変換処理を行う前のDefaultと今回学習に使用しないSample変数はSelect Toolを使って削除しておきます。

次には学習データとテストデータに分ける処理をします。 この処理の結果の両方のデータはそれぞれ「#1」、「#2」としてR Toolに入れています。
なお、今回のデータセットでは結果が乱数のシードにかなり依存してしまうようです。図に示したRandom seedでこの先の結果は再現可能ですが、他のシードを入れるとあまりいい結果にならない場合があります。そのため、他のデータでも試していただいてもいいかもしれません。

スクリーンショット 2016-11-24 19.04.30

今回はこの2つのデータ入力として、テストデータに予測結果を付加したものを出力します。

library(xgboost)
library(Matrix)

train.df <- read.Alteryx("#1", mode="data.frame")
train.sparse <- sparse.model.matrix(default_int~., data = train.df)
train.matrix <- xgb.DMatrix(train.sparse, label=train.df$default_int)
model <- xgb.train(data = train.matrix, max.depth = 2, eta = 1, 
                   nround = 2, nthread = 2, objective = "binary:logistic")

test.df <- read.Alteryx("#2", mode="data.frame")
test.sparse <- sparse.model.matrix(default_int~., data = test.df)
result <- predict(model, test.sparse)

result.bin <- ifelse(result > 0.5, 1, 0)
result.df <- test.df["default_int"]
result.df$predict_int <- result.bin
write.Alteryx(result.df, 1)

このRの出力は0か1で表された正解ラベルと予測値の2つのカラムをもつデータになります。

スクリーンショット 2016-11-25 10.55.41

このRの出力から混同行列の作成を行います。
まず、ラベルが0か1になっているので、Formula ToolでこれをYes, Noに戻しています。

スクリーンショット 2016-11-25 11.02.27

スクリーンショット 2016-11-25 11.03.30

あとは混同行列の形に整えていくことで最終的な出力を得ます。

スクリーンショット 2016-11-24 19.11.10

R Toolを使う上での課題

Rの出力が文字化けしてしまうことがあるようです。

スクリーンショット 2016-11-24 19.14.13

通常は問題無いのですが、エラーが出ている時にエラーメッセージが読めないと非常に困ります。
これはAlteryx経由でインストールされたRにも同様の問題があり、install.packagesを行う時にもコンソールが文字化けしていた場合があるかと思います。

対応方法としては、他の処理を行う前に

Sys.setenv(LANGUAGE = "CP932")

と最初にしておくとRの出力が全て英語になりこの問題を解消できるようです。

スクリーンショット 2016-11-25 11.10.47

R Toolの使いどころ

Alteryxを利用すれば、プログラミングを行わなくても様々なデータ分析が行えるというメリットがありますし、現状でも機能面での充実はかなりものものです。
しかし、Rには統計解析用のライブラリが充実しており、新しい手法の登場などによってそれらは常に拡充されていきます。 Alteryxのようなツールで利用するには一つ一つをマクロのような形式で提供する必要があるため、それら全てを網羅することは現実的ではないと思われます。
そういった新しい手法をマクロとして提供していく側であれば、このツールが必要になるものと思われます。

終わりに

今回はAlteryxのR Toolを利用していました。
Alteryxはプログラミングを行わなくても様々なことができる便利なツールですが、このような拡張性があることも便利な点としてあげられるかと思います。

明日13日目はtruestarさんの『Alteryxで調査データをTableau用データに加工してみた-Part 1』の予定です。明日もお楽しみに!