QlikView、Qlik SenseとR、Pythonとの連携

QlikView、Qlik SenseとR、Pythonとの連携

Pocket

以前、『ただのBIツールではない、分析プラットフォームとしてのQlik Senseの潜在能力』という記事で、Qlik Senseの拡張性や将来性について触れました。
今回は、Qlik製品の拡張性や将来性に着目するテーマとして、「Advanced Analytics」との統合についてご紹介します。

Advanced Analyticsとは?

みなさま、「Advanced Analytics」という言葉を聞いたことありますか?
直訳すると「高度な分析」となります。

以下は、ガートナー社が「Advanced Analytics」について説明しているページです。
Advanced Analytics – Big Data Analytics Defined by Gartner
https://www.gartner.com/it-glossary/advanced-analytics/

上記のページからの引用です。(英語)

Advanced Analytics is the autonomous or semi-autonomous examination
of data or content using sophisticated techniques and tools,
typically beyond those of traditional business intelligence (BI),
to discover deeper insights, make predictions, or generate recommendations.


日本語訳をしながらまとめると、「Advanced Analytics」とは今までのBIより、洗練されたテクニックやツールを使用し、より深い気づきを得たり、予測を行ったり、レコメンドなどを行うことを言います。
具体的な手法としては「Advanced Analytics」のテクニックにはデータ/テキストマイニングや機械学習、パターンマッチング、予測、シミュレーションなどがあります。

実際「Advanced Analytics/アドバンスト・アナリティクス」という言葉を調べてみると、関連するページが多く表示され、注目度が高いことが想像できます。
「Advanced Analytics」とは今までのBIより洗練されたテクニックやツールを使用した分析のことですが、QlikなどのBI製品は「Advanced Analytics」に完全に置き換わっていくのでしょうか。
…いえ、そんなことはありません!むしろお互いを補完し合って更に価値のある「分析プラットフォーム」を提供できると私は考えています。

QlikとAdvanced Analyticsの統合

ここからはQlikと「Advanced Analytics」の統合について見ていきます。
QlikView、Qlik Senseでは統計で使用される「Python」や「R」、その他プログラミング言語と連携できます。
それぞれ以下のバージョンから提供されています。
・QlikView:November 2017以降
・Qlik Sense:June 2017以降

※補足
・外部プログラムとの接続のことを「Analytic connections」と呼び、外部プログラムのことを「Server Side Extension(SSE)プラグイン」と呼びます。
・SSEプラグインの詳細やサンプルは以下のページにまとまっています。(英語)
GitHub – qlik-oss/server-side-extension
https://github.com/qlik-oss/server-side-extension

例えばPythonのプログラムと連携すると、どのような動きになるのかは下図をご覧ください。

QlikView、Qlik SenseからPythonのプログラムの関数を呼び出します。すると、外部プログラムが計算をおこない、結果をQlikView、Qlik Senseに返します。


連携してみよう

それではここから実際に外部プログラムとの連携方法をご紹介します。
今回は、統計や機械学習で使用されるPythonとQlik Senseを連携させてみます。
「GitHub」に公開されているPythonのサンプルプログラム「Hello World」を使用して、Qlik Senseで指定した値(Hello World1、Hello World2)を表示します。
※使用するサンプルプログラムは以下のページで公開されています。
https://github.com/qlik-oss/server-side-extension/blob/master/examples/python/helloworld/README.md

Qlik Sense Desktop

まずはQlik Sense Desktopとの連携です。
以下2つがインストール済みです。
‐Qlik Sense Desktop(June 2017以降)
‐Python(3.4以降)と必要なパッケージ(今回のサンプルではgrpcioを使用)
また、GitHubからPythonのサンプルプログラムやQVFをダウンロード済みです。

続いて、Pythonのサンプルプログラムに接続するために、
C:\Users\[user]\Documents\Qlik\SenseにあるSetting.iniファイルに以下を追記します。
SSEPlugin=EngineName,host:port

EngineName:外部プログラムの名前を任意に設定します。
host:同じ環境にある場合は「localhost」と指定します。
port:外部プログラムに指定したポートを入力します。
※ポートは以下のようにPythonのプログラムの中で指定しています。

Pythonのプログラムを実行します。

アプリを確認してみましょう。
Pythonのプログラムで指定している関数を呼び出す時には、EngineName.関数名と指定します。
きちんと値が返ってきていますね。

ちなみに、きちんと連携できていない場合は、文字が表示されません。

同様に、QlikViewでもQlikViewのSetting.iniを編集すると連携が可能です。


Qlik Sense Enterprise

続いてはQlik Sense Enterpriseの設定方法です。
以下2つがインストール済みです。
‐Qlik Sense Enterprise(June 2017以降)
‐Python(3.4以降)と必要なパッケージ(今回のサンプルではgrpcioを使用)
また、GitHubからPythonのサンプルプログラムやQVFをダウンロード済みです。

続いてQlik Management Consoleを開き[Analytic connections]をクリックします。
ここで、接続の設定を行います。

以下を入力欄に指定します。
Name:EngineNameと同じです。外部プログラムの名前を任意に設定します。
Host:同じ環境にある場合は「localhost」と指定します。
Port:外部プログラムに指定したポートを入力します。
※Certificate file pathには証明書のファイルパスを任意で入力できます。今回は証明書を使用しない方法で連携をおこないます。

Pythonのプログラムを実行します。
そして、Qlik Sense Engine Serviceを再起動します。Pythonのプログラムを実行した後は、必ず再起動してください。

アプリを確認してみましょう。

以上が外部プログラムと連携する際の設定手順になります。どの製品においても、EngineName、host、portの3つを指定することで連携できるということですね。


使用例~お客様の満足度を最大に。~

それでは、実際にPythonで作成した外部プログラムと連携する具体例を見ていきましょう。今回はQlik Sense Enterpriseの画面でご覧いただきます。

例えば、こんなことがあったとしましょう。
ある地域に新しく映画館がオープンすることになりました。そこで、映画館のオーナーは地元の方を無料で招待することにしました。
対象の映画はA, B, Cの3つです。申し込みをしてもらった人には、A, B, Cどの映画が見たいか、好みを「1-10」の数値で表してもらいました。
お客様の好みを踏まえて誰をどの映画に招待するか決めます。
ただし、招待する人数は各映画2名ずつとし制約事項として観られる映画は1人1つまでとします。

このような問題を「線形計画問題」と言い、「Advanced Analytics」でいうシミュレーションに当たります。
※線形計画問題とは…
目的の関数に対して制約条件をかけながら最大値、最小値を算出し、最適な計画を求める問題のこと。

さて、こんな複雑な問題があった時、Qlikの関数だけでやるにはどうすれば良いのでしょうか?
Qlikでもすべてのパターンを一つずつ計算すれば出すことはできるかもしれませんが、組み合わせが多くある場合、現実的ではありません。
ここで、Pythonの出番です!

Pythonにはシミュレーションをおこなうパッケージが複数あります。
その中でもPythonには線形計画問題を解く「PuLP」というパッケージがあります。
このパッケージを使うことで、線形計画問題を比較的簡単に解くことができます。

では見てみましょう。

まずは、Qlik Management Consoleで外部プログラムとの接続設定をおこないます。

適用したら、続いてPythonのプログラムを実行します。
Qlik Sense Engine Serviceを再起動し、Qlik Sense Hubを開きます。

では、事前に作成しておいたアプリを確認してみましょう。
左上には「地域」「お客様ID」のフィルターパネル、右下には元データ(アンケート結果)
のテーブルを配置しています。
その他、以下のオブジェクトが配置されています。
(1) 計算結果を返すテーブル(固定)
(2-A) 引数に値を指定する入力ボックス
(2-B) 2-Aにいれた数値を基に計算結果を返すテーブル(可変)

まず、(1)を見てみましょう。外部プログラムに設定している関数を呼び出しています。
EngineNameは、Qlik Management Consoleで「Movie」と指定しました。

また、事前に引数に値を指定しています。ここでいう引数は、招待できる人数です。
今回の例では、全ての映画に2人ずつ招待しようと、3つの引数に2を指定しました。
すると、Pythonのプログラム側で線形計画問題を解き、どの映画に誰を招待するか結果を返します。
(1)の結果を見てみると映画A、B、Cが2行ずつあります。例えば、お客様ID「33、107」の方は「A」という映画に招待することが最適という結果が返ってきています。

続いて(2-A)、(2-B)です。(2-B)は(1)と同じようなテーブルですが、引数を固定ではなく可変にできるよう変数を使っています。この変数には、(2-A)の入力ボックスを使用して値を渡します。
先ほどは各映画に2名ずつ招待しようと考えていましたが、席に余裕ができたため違う数値を入れてシミュレーションしたいと思います。
ちなみに(2-A)は「Sense Input Variable」というエクステンションを使用しています。
GitHub – LorisLombardo87/sense-input-variable: Sense Input Varible
https://github.com/LorisLombardo87/sense-input-variable
さて、例えばMovie A:5、Movie B:3、Movie C:6と入力すると

結果が表示されました!

また、「地域」のフィルターで「East」を選択すると

Python側でコードを書かなくても、簡単に地域を絞り込むことができます。

このように外部プログラムと連携することにより、Qlik側としては利用できる数式が大きく拡張されるというメリットがあります。
また、Python側としても、Qlikのインタラクティブな操作による柔軟な分析ができるというメリットがあります。


最後に…

今回はQlik製品の拡張性ということで「Advanced Analytics」との統合についてご覧いただきましたが、いかがだったでしょうか。

私個人としても最近お客様から「Qlikで機械学習とかレコメンドさせるとかできないの?」というお声をいただくことが多くなり、高度な分析(Advanced Analytics)のニーズが高まっていることを実感しています。

プログラミングにあまり馴染みが無い方には少し難しいかもしれません。しかし、Qlikと外部プログラムの連携により、Qlik標準の機能に収まらず、予測やシミュレーションなどを行い、より広く深い気づきを得られるということを、少しでも感じていただければ幸いです。
GitHubなどにサンプルがいくつか公開されているので、ぜひまずはサンプルを動かすところからはじめてみてください。

お疲れ様でした。


最後にこの記事を書く際に参考にしたページを載せておきます。

Qlik | Help
https://help.qlik.com/ja-JP/
QlikView、Qlik Senseのメーカー公式ヘルプサイトです。バージョンによっては英語のみの提供になっています。英語であれば「Analytic connections」、日本語であれば「分析接続」と調べてみてください。

Space: Advanced Analytics Integration | Qlik Community
https://community.qlik.com/community/advanced-analytics-integration
「Advanced Analytics」との統合に関する情報がまとまっているコミュニティです。
日々更新されているので、ぜひここで最新情報をキャッチしてください。

Qlik Sense Server Side Extensions Part 1/3: Architecture and Environment – Axis Group
http://www.axisgroup.com/qlik-sense-server-side-extensions-part-13-architecture-environment/
弊社と同じくQlik社のパートナーであるAxis Group社の記事です。非常に分かりやすくまとめられています。(英語)