LoginSignup
6
6

More than 5 years have passed since last update.

Qlik SenseでR/Shinyを使う(実験段階)

Last updated at Posted at 2015-12-14

English version(with google translate) is here

はじめに

この記事では、Qlik SenseとShiny(R)を組み合わせて使う具体的な実装を提案します。どちらも無料のツールです。
qsload20.png

これによって、Qlik Senseでは、Rの持つ強力なパッケージ群の利用が容易になります。例えば機械学習、クラスタリング、統計処理、等が容易に行えるようになります。

逆にR(Shiny)の視点から見ると、Shinyの洗練されたUIに対して、さらにデータの抽出・加工の機能に特化したインターフェイスを付け加えることができます。例えば、あなたがお客様の購買動向に関する分析を行っているデータサイエンティストであったとすると、分析対象の顧客や、購買した物品に関する抽出の条件を「きわめてリズミカルに」変更して分析をすることが可能になります。
Shinyは非常に優れたインターフェイスを提供しますが、一般的なユーザに開放して、データの抽出観点を柔軟に変更させるためには、相当な作りこみが必要になります。また、ある程度のバリエーションを機械的に実行したり、逆に深い考察をしながら逐次対話的な分析はできますが、例えばテレビのチャンネルを切り替えるような感覚でデータの切り口を変更するには難があります。
一方のQlik Senseは、データの抽出観点を柔軟に変更するという点において非常に強力な一方で、単独では機械学習等の高度な操作を行うモジュール類を持ち合わせていません。
これらのツールの良いところを組み合わせてしまおう、というのが着想です。

現状、まだまだ粗削りな状態ではありますが、「こうやって組み合わせることができる」という方向性みたいなものを示すことができれば、と思っています。
今回のサンプルでは、Qlik Senseを用いて、
・有名な"Iris"のデータでクラスタリングをしてみます。
・Qlik Senseに標準で付属しているqvfを改造してアソシエーション・ルールを使って分析してみます。
スナップショットをいくつかつけているので、参考にしてください。なお、この例はほんの限られたものに過ぎず、ここで紹介しているQlik SenseのExtension、HelloShinyを使うことで、事実上任意のRコードが実行できるようになる、ということに注意してください。

環境構築

以下、Qlik SenseとShiny(R/RStudio含む)をインストールして、環境を構築します。
【重要】
・Qlik Sense Desktopを既にインストールしている場合は、エクステンションの配置のみ行ってください。
・Shinyを既にインストールしている場合は、ui.R/server.Rの配置のみ行ってください。また、Rが入っている場合、RStudioが入っている場合、等は、適宜その工程を省略します。

Qlik Sense Desktopのセットアップ

Qlik Sense Desktopは無料でインストールすることができます。

ダウンロード

http://global.qlik.com/jp/explore/products/sense/desktop
に必要な情報を入力し、ダウンロードします。64bitのWindows環境で動作します。

インストール

ダウンロードしたプログラムを実行し、指示に従ってインストールします。

エクステンションとqvfの配置★インストール済の場合も必須

以下のリンク先のRawをクリックすると、zipをダウンロードできるので、解凍します。
https://github.com/sasanquaneuf/HelloShiny/blob/master/Distribution/HelloShiny0.11_alpha.zip.zip
解凍すると、中にあるQlikSense\Extensionsフォルダの中身を、
C:\Users\<ユーザ名>\Documents\Qlik\Sense\Extensions
にコピーします。このエクステンションは、Qlik Senseの機能を拡張するようなJavaScriptのプログラムセットです。Shinyとの通信ができるように、独自の実装をしています。
また、同様にQlikSense\irisフォルダのiris.qvfとQlikSense\aruleフォルダのConsumer_Sales_Sample.qvfを
C:\Users\<ユーザ名>\Documents\Qlik\Sense\Apps
の中にコピーします。これはサンプルアプリです。irisはk-meansに、Consumer_Sales_Sampleはアソシエーション・ルールに、それぞれ使用します。

Shinyのセットアップ

Shiny、および実行のために必要なR(および簡単に実行できるようにするためのRStudio)は無料でセットアップすることができます。

Rのダウンロード・インストール

https://cran.ism.ac.jp/
の、Download R for Windows等のリンクをたどり、ファイルをダウンロードしてインストールします。

RStudioのダウンロード・インストール

https://www.rstudio.com/products/rstudio/download/
の、RStudio 0.99.489 - Windows Vista/7/8/10等のリンクからファイルをダウンロードしてインストールします。

Shinyのインストール(+必要なパッケージのインストール)

RStudioを立ち上げ、次のコマンドを入力します。

> install.packages("shiny")
> install.packages("stats")
> install.packages("stringr")
> install.packages("arules")

下の3つはshinyと直接関係ないですが、今回はk-meansによるクラスタリングのテストを簡単に試せるように、stats/stringrというパッケージもインストールします。また、アソシエーション・ルールを試せるように、arulesというパッケージもインストールします。

ui.R/server.Rの配置

任意のフォルダを作り、先ほど解凍したファイルの中のShiny\kmeans_sample、Shiny\skelton_sample、Shiny\arule_sampleを適当な場所に配置します。これらのファイルは、Qlik Senseからのアクセスを受け付けるサーバプロセスの元になります。

Shinyサーバプロセスの起動

Rstudioで、次のコマンドを実行します。

> library(shiny)
> runApp(appDir="【kmeans_sampleを配置したパス(\は/に置換)/kmeans_sample】",port=7458,host="127.0.0.1")

例えば、runApp(appDir="c:/test/kmeans_sample",port=7458,host="127.0.0.1")というような具合です。

実行すると、RStudioのアイコンのブラウザが立ち上がり、ウィンドウが開きます。
このウィンドウは大切なウィンドウなので、大切に立ち上げたままの状態にしておきます(要するに閉じない。最小化OK。)。
qsload14.png

Irisにチャレンジ(k-means)

有名なIrisのデータで試してみます。
Qlik Senseを開くと、様々なアプリが表示されますが、先ほどのiris.qvfを開きます。

すると、右側にテキストボックスがあるので、Shinyを起動する際に出てきたウィンドウのURLをコピペして、startをクリックします。
qsload16.png
※若干見た目が違っている可能性がありますが、Hello,Shinyの右のボックスに、Shinyで表示されたURLをコピペします。

雰囲気…
qsload17.png
qsload18.png

仕組みの解説のための骨格標本

今回の仕組みに合わせて、Shiny側のプログラムを最低限の実装にしたスケルトンを用意しています。
このスケルトンも、上述の通りに適当なところに配置してshinyを起動します。

> library(shiny)
> runApp(appDir="【skelton_sampleを配置したパス(\は/に置換)/skelton_sample】",port=7458,host="127.0.0.1")

このアプリにQlik Senseからアクセスすると、テーブルが表示されます。
qsload19.png

アソシエーション・ルール

今度は、Qlik Senseのサンプルとして付属しているqvfファイルを用いて、アソシエーション・ルールによるバスケット分析を試してみます。
RStudioのSTOPボタンを押すか、ブラウザの右上の×ボタンを押してkmeans用のプロセスを終了した後、上の場合と同様に、Rstudioで次のコマンドを実行します。

> library(shiny)
> runApp(appDir="【arule_sampleを配置したパス(\は/に置換)/arule_sample】",port=7458,host="127.0.0.1")

qss3.png
Qlik Senseを開き、Consumer Goods Sales -add Shiny Sample -アプリを選択します。
qss4.png
後は、画像の通りに操作します。
qss5.png
qss6.png
qss7.png
いわゆるバスケット分析です。この例では、一つの伝票に同時に含まれる商品の名前が分析の対象になっており、LHSの商品、例えばCRT-10670を含む場合、かなり高い確率でCR-10504も含まれることが分かります。
このようにして、実は意外な商品がセットで購入されている場合が発見されるかもしれません。
この分析の例として、しばしば目にするものに、ビールとおむつをセットで購入する客が一定数いる、という話があります。

同等のオブジェクトをQlik Sense上で作成する手順

ファイルを作って、データをロードし、オブジェクトを作る一連の手順をダイジェストでお送りします。Qlik Senseの操作に関しては、適宜マニュアルやQlikのコミュニティサイト等を参照してください。
qsload1.png
qsload3.png
qsload4.png
qsload5.png
qsload6.png
★ここでRowNo() as RowNum, というスクリプトを追加しておきます。
Qlik Senseの仕組み上、このRowNumが無いとデータがおかしくなる場合があります。
qsload7.png
qsload8.png
qsload9.png
qsload10.png
★Hello Shinyをドラッグして、右側に適当にドロップします。
qsload11.png
★「軸」を追加していきます。
qsload12.png
qsload13.png
★Speciesはメジャーにしておきます。
qsload14.png
qsload16.png
これで、冒頭のサンプルと同様の画面が得られます。
qsload17.png

実際の可能性とか

とりあえずk-meansでやっていますが、実際、Rでできることはほぼすべて、なんでもできるはずです。Rで色々とデータの抽出条件を変えたりして検証したい仮説を、よりリズミカルに検証する環境づくり、という感じでとらえています。
簡単に試した限りですが、集計後データ件数4万件ぐらいだと、上記のスケルトンプログラムで普通にQlik Sense<->Shinyやり取りができました。(明細は13万件程度)
明細が数百万、数千万の単位になったとき、きちんと動くかどうか、という部分は試していません。
データの規模がそれぐらい大きくなることを考慮すると、おそらく今のインターフェイス(Qlik Senseのデータを一括で渡す)よりは、ループ等によって分割しながらデータを登録して、最後のデータが登録された時点でShiny側で処理する、みたいな形にした方がよいかもしれません。
また、コピーペーストとはいえ、キーを入力しないといけない部分もちょっと遺憾なので、このあたりが改善すると非常に良いと思っています。
その他、結構適当な作り方なので、データには「,」が含まれてはいけないとか、色々微妙な制約はありますが、そうした課題を解決したソリューションが出てくると嬉しいなあ…と思っています。
その他の技術的な実装方法(リダイレクトして云々とか)については、ShinyにQlik Senseからデータを渡す(プロトタイプ)を参照してください。
全てのソースはhttps://github.com/sasanquaneuf/HelloShiny にあります。

余談

https://www.rstudio.com/faq-items/use-shiny-instead-tableau-spotfire-qlikview-similar-bi-tools/
http://www.piraeusconsulting.com/business-intelligence/r-and-shiny-the-cheat-sheet/

無料でここまでの環境を準備できるというのは、本当にいい時代になったものですね。
英語の翻訳ができたら、Qlik Communityにも投稿するかもしれません。

6
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6