Quantcast
Channel: 中級者向け – Qlik Training
Viewing all 29 articles
Browse latest View live

大量データを超高速に読み込むQVDファイルの使い方

$
0
0

QlikViewとQlik Senseには、QVDファイルと呼ばれる独自の形式のファイルがあり、これを使用するとデータの読み込みが非常に高速になります。(リファレンスマニュアルによると、10倍から100倍高速になるとのことです。)
とくに大量データの読み込みや差分更新などで威力を発揮するのですが、読み込みが非常に高速で使い勝手がよいため、QlikViewやQlik Senseでは日常的に使用する機能になります。

この記事では、QVDファイルの概要から、QVDファイルの使い方、注意事項まで説明していきます。
QVDファイルを使用することで、開発生産性が大幅に向上しますので、ぜひご一読ください。

参照したマニュアル
この記事では正確を期すために、リファレンスマニュアルの記載を多数引用しています。参照しているリファレンスマニュアル、およびバージョンは以下のとおりです。
QlikViewリファレンスマニュアル バージョン11.20 SR12 日本語版

QVDファイルとは

QVDファイルとは何なのか理解するために、リファレンスマニュアルの記載を見てみましょう。
以下はQlikViewリファレンスマニュアル P493『28 QVDファイル』からの引用です。

QVD(QlikView Data)ファイルは、QlikViewからエクスポートされたデータのテーブルを含むファイルです。QVDは、ネイティブQlikViewファイルで、QlikViewでのみ読み書きすることができます。ファイル形式は、QlikViewスクリプトからデータを高速に読み取れるように最適化され、サイズもコンパクトです。QVDファイルからのデータの読み取りは、ほかのデータソースから読み取る場合よりも一般に10~100倍高速になります。

つまり、QVDファイルとはQlikView独自のデータファイルで、QlikView用に最適化されているため、ほかと比べてデータの読み込みが10~100倍高速になるということです。
“QlikView用に最適化される”の詳細については、以前書いたこちらの記事をご参照ください。QlikViewが内部的にどのようにデータを最適化しているかをまとめています。

補足
QVDファイルはQlik Senseでも使用できます。
上記はQlikViewリファレンスマニュアルを引用しているため、”QlikView”となっていますが、QVDファイルはQlik Senseでも使用できます。

QVDファイルの使用目的

では、どのようなときにQVDファイルを使うのでしょうか。リファレンスマニュアルでは以下の4つの用途を挙げています。
以下はQlikViewリファレンスマニュアル P493『28.1 QVD ファイルの使用目的』からの引用です。

  1. ロード速度の向上
  2. データベースサーバーの負荷の減少
  3. 複数のQlikViewアプリケーションからのデータの統合
  4. 増分/差分ロード

順番に見ていきましょう。

ロード速度の向上

これは単純な話で、QVDファイルからの読み込みは非常に高速であるため、ロードの速度が向上するということです。

データベースサーバーの負荷の減少、複数のQlikViewアプリケーションからのデータの統合

この2つは関係が深いので、一緒に解説します。
複数のアプリケーションでおなじデータを使用する場合に、毎回データベースに問い合わせに行くのは非効率です。
データベースに一度問い合わせに行ったら結果をQVDファイルに出力しておき、以降はQVDファイルからデータを読み込めば、速度の向上に加えてデータベースサーバーの負荷軽減にもつながります。

さらにこれは、複数のアプリケーションで使用するデータを一元管理できるということにもなります。
簡単に図示すると以下のようになります。
qvd-file-uses

増分/差分ロード

データ量が多くデータのロードに時間が掛かる場合、増分/差分ロードを検討します。
実際の指定方法は要件によって変わるため一概には言えないのですが、簡単に言うと過去のデータ(変更されないデータ)をQVDファイルに出力しておくことで、データのロードを効率的におこなえるということです。
たとえば日次でデータを更新する場合、前日までのデータはあらかじめ作成済みのQVDファイルから読み込み、当日のデータのみデータベースから直接読み込みます。そしてこれらを連結(Concatenate)して最新版のデータとし、さらに翌日の日次処理のためにQVDファイルにも出力しておきます。
翌日以降またおなじことを繰り返すことで、全体としてデータのロードを高速化できます。

補足

リファレンスマニュアルと重複するかもしれませんが、”開発効率の向上”という利点も追加で挙げておきたいと思います。
実際の開発では、ロードスクリプトを一回ですべて完成させることは稀で、多くの場合すこし修正してはリロードを実行するという作業を繰り返しながら、完成に向かっていきます。そのたびにデータベースから直接データを読み込もうとすると、”リロードの完了待ち”が多発して非常に非効率です。またオフラインで開発をしたい、さらにはデータ量を絞った開発用のデータが欲しいといった要望もあるかと思います。
このような場合に、開発用のデータをQVDファイルとして保持しておくと、開発が非常に進めやすくなります。


QVDファイルの作成方法

では、どのようにQVDファイルを作成するのか説明します。リファレンスマニュアルでは、QVDファイルを作成する方法は3つあるとしています。
  1. STORE文による明示的な作成
  2. Bufferプレフィックスによる自動作成
  3. シートオブジェクトの内容をエクスポートする
まず、1つ目の「STORE文による明示的な作成」が一番よく使われる方法で、”QVDファイルを作成する”と言った場合、通常STORE文による作成のことを指します。
2つ目の「Bufferプレフィックスによる自動作成」は、なかなか奥が深い機能であるため後日別の記事にまとめたいと思います。
また、3つ目の「シートオブジェクトの内容をエクスポートする」は、単純にストレートテーブルなどを右クリック→[エクスポート]のメニューからQVD形式でエクスポートできるというものです。
what-is-qvd-file-201what-is-qvd-file-202

STORE文の指定方法

それではSTORE文の指定方法を見てみましょう。STORE文は以下のように指定します。
STORE <テーブル名> into <ファイル名>(qvd | txt)
STORE文ではQVD形式だけでなく、CSV形式でもデータを出力できます。
形式を指定したい場合は、ファイル名の後ろにフォーマットを指定します。なおフォーマットの指定を省略するとQVD形式で出力されます。
以下は例文です。
STORE Table1 into file1.qvd QVD形式で出力します。(フォーマットを省略するとQVD形式で出力されます。)
STORE Table1 into file2.qvd(qvd) QVD形式で出力します。
STORE Table1 into file3.csv(txt) CSV形式で出力します。
ご注意
Qlik Senseではファイル名の指定方法が若干異なります。
詳細は後述のQlik SenseでのQVDファイルの作成方法をご覧ください。


標準(高速)モードと最適化(超高速)モード

QVDファイルからのデータのロードも、ほかのファイルとおなじように指定できます。
ただし、LOAD文の指定によって標準(高速)モードで読み込まれるか、最適化(超高速)モードで読み込まれるかが変わります。標準モードでも十分高速なのですが、最適化モードはさらに高速ですので、できるだけ最適化モードで読み込まれるようにしましょう。
最適化モードで読み込むには、QVDファイルの内容を変換なしでそのまま読み込みます。
たとえば、数式によってあたらしい項目を追加したりすると、標準モードでの読み込みとなります。項目名の変更や項目の削除(QVDファイル中の一部の項目のみを読み込む)だけであれば、最適化モードで読み込まれます。


演習

それでは、実際にQVDファイルの作成と読み込みを試してみましょう。
ここはぜひ実際に操作してみてください。

初期設定

ドキュメントを作成する前に、ユーザープロパティを1つ設定しておきます。
この演習ではリロードに掛かった時間を確認したいため、[ロードスクリプトの進捗]画面を自動で閉じないように設定しておきます。
QlikViewを起動して、[設定]メニュー→[ユーザープロパティ]を選択し、ユーザープロパティを開きます。
[基本設定]タブで、[リロード終了後、ダイアログを自動的に閉じない]にチェックを入れてください。
what-is-qvd-file-101

サンプルデータの作成

ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
what-is-qvd-file-102
QVDファイルを作成する前に、まずはもとになるサンプルデータを自動生成します。
以下のロードスクリプトを貼り付けてください。
sample:
LOAD RecNo() as RecNo,
     Ceil(Rand() * 10) as Number1,
     Ceil(Rand() * 100) as Number2,
     Ceil(Rand() * 1000) as Number3,
     Left(Hash128(Rand()), 3) as Text1,
     Left(Hash128(Rand()), 5) as Text2,
     Left(Hash128(Rand()), 10) as Text3
AutoGenerate 100;
「AutoGenerate 100」の指定により100件のデータが自動生成されます。項目はRand関数により乱数の値を自動生成しています。1桁から3桁の数値と、3文字、5文字、10文字の文字列のデータを作成しています。
what-is-qvd-file-103[OK]ボタンをクリックします。
リロードを実行します。
what-is-qvd-file-104
ファイルを保存してください。
ここでは「qvdfile」というフォルダに「create_qvd.qvw」というファイル名で保存しています。
what-is-qvd-file-104-1what-is-qvd-file-105
リロードが完了しました。
[閉じる]ボタンをクリックしてください。
what-is-qvd-file-106
どのようなデータが作成されたのか確認してみましょう。
シートの余白で右クリックし[シートオブジェクトの追加]→[テーブルボックス]を選択します。
what-is-qvd-file-107
すべての項目を選択し、[ロード順]ボタンをクリックして、データをロードした順に並べ替えます。
[OK]ボタンをクリックします。
what-is-qvd-file-108
データが確認できました。乱数の数値や文字列のデータが100件作成されています。
what-is-qvd-file-109

QVDファイルの作成

では、QVDファイルを作成してみましょう。
[ロードスクリプトの編集]画面を再度開きます。
ロードスクリプトの後半部分を以下のように編集します。
AutoGenerate 5000000;

STORE sample into sample.qvd;
STORE sample into sample.csv(txt);

DROP Table sample;
what-is-qvd-file-110ここでは、以下の3つの指定を追加、変更しています。
  • まず100件だと件数が少ないため、「AutoGenerate」の後ろを「5000000」まで増やしています。ここはお使いの環境に応じて適宜調節してください。
    こちらではメモリ4GBを割り当てた仮想マシンを使用しています。スペックに応じて100万件~1000万件程度にするといいでしょう。
  • つづいてSTORE文でQVDファイルとCSVファイルを出力しています。
  • 最後にDROP文でテーブルを削除しています。このドキュメントはQVDファイルとCSVファイルの生成のみに使うもので、このドキュメント自体はデータを持つ必要がありません。そのため、ファイルを出力したあとテーブルを削除しています。
再度リロードを実行してください。
500万件のデータが生成されました。
what-is-qvd-file-111以上で1つ目のドキュメント(QVDを作成するためのQVW)は完成です。ドキュメントを閉じてください。

QVDファイルの読み込み

それでは、いま作成したQVDファイルからデータをロードしてみましょう。
ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
ロードスクリプトの最下行にカーソルをあわせて、[テーブルファイル]ボタンをクリックします。
what-is-qvd-file-112
比較のためにまず、CSVファイルからデータをロードします。
ドキュメントとおなじディレクトリに「sample.csv」というファイルが出力されているはずですので、こちらを選択してください。
what-is-qvd-file-113
今回は単純にデータをロードするだけですので、[終了]ボタンをクリックします。
what-is-qvd-file-114
ロードスクリプトが作成されたら、ここでも最下行にDROP文を追加してください。
DROP Table sample;
500万件のデータを読み込むため、データを残しておくとファイルの保存自体に時間が掛かってしまいます。今回はデータをロードする部分のテストだけできればよいため、DROP文によりテーブルを削除します。
[OK]ボタンをクリックします。
what-is-qvd-file-115
リロードを実行します。
what-is-qvd-file-116
ファイルを保存してください。
ここでは、前回とおなじディレクトリに「load_qvd.qvw」というファイル名で保存しています。
what-is-qvd-file-117
リロードが完了しました。
CSVファイルからの読み込みは、33秒掛かっています。
what-is-qvd-file-118こんどはQVDファイルからデータをロードしてみましょう。
[ロードスクリプトの編集]画面を再度開きます。

CSVファイルのLOAD文を削除するか、下図のようにコメントアウトしてください。
DROP文の前にカーソルをあわせて[テーブルファイル]ボタンをクリックします。
what-is-qvd-file-119
「sample.qvd」を選択します。
what-is-qvd-file-120
今回もデータをそのままロードするだけですので、[終了]ボタンをクリックします。
what-is-qvd-file-121
ロードスクリプトが作成されたら[OK]ボタンをクリックします。
what-is-qvd-file-122
リロードを実行します。
what-is-qvd-file-123
リロードが完了しました。
QVDファイルからの読み込みは、13秒で終了しました。CSVファイルのときと比べてかなり速くなっています。
what-is-qvd-file-124また、「qvd optimized」の表示にも注目してください。これは最適化モードでデータがロードされたことをあらわしています。

以上で演習は終了です。
今回はローカルのCSVファイルとの比較だったため、ロード時間の差は2.5倍程度の開きでしたが、データベースからデータを読み込む場合や、データの量や内容によっては、さらに大きな差がつきます。

ここまででQVDファイルの基本的な説明は終了です。ここからはQlik Senseでの指定方法や、よくいただくご質問、その他の注意事項について見ていきましょう。


Qlik SenseでのQVDファイルの作成方法

Qlik SenseでもQlikViewとおなじようにQVDファイルを使用できますが、QlikViewとQlik Senseではファイルパスの指定方法が異なります。
ファイルを指定する際、QlikViewではファイルシステム上の絶対パスや相対パスで指定しますが、Qlik Senseでは「lib://」ではじまる独自の方式(フォルダデータ接続)で指定します。
これは、ファイルシステムの露呈を防ぐという、セキュリティ上の理由によるものです。

STORE文でQVDファイルを出力する場合、QlikViewでは任意のディレクトリにファイルを出力できるのに対して、Qlik Senseではあらかじめアクセスが許可されたディレクトリにのみ、ファイルを出力できます。
QlikView
STORE Table1 into C:\file1.qvd;
C:ドライブ直下にファイルを出力します。
ここではfile1.qvdという名前で、QVDファイルを出力しています。

Qlik Sense
STORE Table1 into lib://dir1/file1.qvd;
あらかじめアクセスが許可されたdir1というディレクトリに、ファイルを出力しています。
dir1はQlik Senseのアプリ作成時に、あらかじめ設定したディレクトリです。

下図はQlik Senseのデータロードエディタです。
what-is-qvd-file-206フォルダデータ接続を新規に作成するには、画面右上の[接続の新規作成]ボタンから[フォルダ]を選択し、アクセスを許可したいディレクトリを選択します。


FAQ

ここではQVDファイルについて、よくいただくご質問をまとめます。

Q1.複数のテーブルをまとめて、1つのQVDファイルに出力できますか。

できません。1つのQVDファイルに出力できるのは1テーブルのみです。
あらかじめJoinで1つのテーブルに結合しておけば、それを1つのQVDファイルに出力することは可能です。

Q2.QVDファイルをロードスクリプトから削除できますか。

QlikViewの機能では、QVDファイルを削除することはできません。
EXECUTE文により、OSのコマンドを実行できるため、これを使用すればQVDファイルを削除できます。
たとえば、以下のように指定します。
EXECUTE CMD.EXE /C DEL "sample.qvd";
ただし、EXECUTE文はセキュリティ上、そのまま実行できないように制限が掛かっており、リロードを実行すると以下の警告が表示されます。
[セキュリティを上書きし、このステートメントを実行する]をクリックすると、EXECUTE文が実行されます。
what-is-qvd-file-207もしくは、以下の設定によりEXECUTE文をあらかじめ許可しておくこともできます。
[ロードスクリプトの編集]画面下部の[設定]タブ→[外部プログラムを実行する]にチェックを入れます。
what-is-qvd-file-203いずれもセキュリティ上の危険性を、ご理解いただいた上でお使いください。
なお、STORE文により同名のQVDファイルが作成された場合、古いファイルは自動で上書きされます。

Q3.QlikView Personal Editionでは、ほかのPCで作成したドキュメント(QVW)は使用できないとのことですが、ほかのPCで作成したQVDファイルは使用できますか。

QVDファイルであれば使用できます。あるPCで作成したQVDファイルを、ほかのPCにあるQlikView Personal Editionで読み込んで使用することができます。

Q4.QVDファイルよりも、それを読み込んだQVWファイルの方が、ファイルサイズが小さくなることがあります。これはなぜでしょうか。

まず、QVWにはQVDに含まれるデータに加え、ユーザーインターフェースなどの情報も含まれています。そのため情報量としては基本的に、QVD < QVWとなります。
しかし、QlikView Desktop(Personal Edition含む)はQVWを保存する際、自動でファイルを圧縮するため(ここで言う圧縮はZipのようなファイル圧縮のことです。)、QVWが圧縮された状態ではファイルサイズが逆転する場合があります。
QVWの圧縮率を「なし」に設定すると、QVWとQVDのファイルサイズはほぼおなじか、またはQVD < QVWとなります。

QVWの圧縮率の設定は、[設定]メニュー→[ドキュメントプロパティ]から「ドキュメントプロパティ」を開き、[基本設定]タブ→[圧縮率]で変更できます。
また、[設定]メニュー[ユーザープロパティ]から「ユーザープロパティ」を開き、[保存]タブ→[圧縮率]から設定を変更すると、ドキュメント新規作成時の初期値(ドキュメントプロパティの初期値)を変更できます。

「ドキュメントプロパティ」[基本設定]タブ
what-is-qvd-file-204
「ユーザープロパティ」[保存]タブ
what-is-qvd-file-205

その他の注意事項


Order By句について

QVDファイルからデータを読み込む際、Order By句によるデータの並べ替えはできません。LOAD文のOrder By句はResidentでテーブルを再読み込みする場合のみ使用できます。QVDファイルやExcel、CSVなどのファイルからデータを読み込む場合は使用できません。
データの並べ替えをしたい場合は、一度データをロードしたあとResidentで再読み込みします。
TempTable:
LOAD *
FROM file.qvd(qvd);

Table1:
NoConcatenate
LOAD *
Resident TempTable
Order By Field1, Field2;

DROP Table TempTable;

その他、リファレンスマニュアルからの抜粋

以下はQlikViewリファレンスマニュアル P504からの引用です。

QVDファイルからデータをロードする場合にupper関数を使用すると、ロードスピードが遅くなります。


以下はQlikViewリファレンスマニュアル P332からの引用です。

最適化されたQVDファイルをロードする際は、sampleプレフィックスを使用できません。

Sampleプレフィックスを使用すると、サンプルデータのためにランダムでデータを間引いてロードできます。
たとえば、LOAD文の前に「Sample 0.5」と追加すると、約50%のデータがランダムで抽出されます。
QVDファイルを最適化モードで読み込む場合、Sampleプレフィックスは無効になります。

以下はQlikViewリファレンスマニュアル P323からの引用です。

最適化モードでQVDファイルをロードする際、map … usingステートメントは機能しません。

こちらはマニュアルの記載が分かりにくいのですが、Mappingプレフィックスを使用すると最適化モードが無効になることを言っているものと思われます。こちらで検証したところ、Mappingプレフィックスを使用するとQVDファイルの最適化モードは無効になり、標準モードで読み込まれました。


参考文献

この記事を書くにあたり、参考にした資料をまとめておきます。
Document Compression | Qlikview Cookbook
http://qlikviewcookbook.com/2011/03/document-compression/
QVWファイルとQVDファイルにおける圧縮(compression)と重複削除(de-duplication)について、検証結果がまとめられています。
この記事によると、QVDファイルの中身は”RAM image”とのことで、つまりメモリにそのまま展開できるデータのイメージがQVDファイルであるとのことです。

QlikView Optimised QVD Loads – Quick Intelligence
http://www.quickintelligence.co.uk/qlikview-optimised-qvd-loads/
QVDファイルからのデータのロードが、最適化モードで実行される条件についてまとめられています。
これによると、おなじ項目を二回読み込む場合なども最適化が無効になるとのことです。

一行追加するだけでデータの取り込みを高速化するBufferプレフィックス

$
0
0

今回はQlikViewやQlik Senseの隠れた良機能である、Bufferプレフィックスをご紹介します。
Bufferプレフィックスを使うと、ごく簡単な指定を追加するだけで、データの取り込みを高速化できます。
用途が限定的なためか、ほとんど使われていないように感じますが、うまく使えば開発効率が大幅に向上しますので、ぜひこの記事で使い方を学んでください。

Bufferプレフィックスは、内部的にQVDファイルという仕組みを使っています。
この記事は、QVDファイルについてご存じなくても理解できるように書いたつもりですが、先にQVDファイルについて知っておいた方がより理解が進みます。
前回の記事をご覧になっていない方は、ぜひ先に前回の記事をご覧ください。
大量データを超高速に読み込むQVDファイルの使い方


Bufferプレフィックスとは

Bufferプレフィックスとは、簡単に言うと読み込んだデータをローカルにキャッシュする機能です。
一度読み込んだデータはローカルに保存され、二度目以降はローカルのファイルからデータを読み込みます。

さらにこのときローカルに保存されるデータは、QlikViewとQlik Sense用に最適化された、QVDファイルという独自形式のファイルです。
QVDファイルからのデータの読み込みは非常に高速であるため、二度目以降のリロード処理は非常に高速におこなわれます。


Bufferプレフィックスの特徴

Bufferプレフィックスは、”プレフィックス(prefix:前につける)”の名のとおり、LOAD文やSELECT文の前に追加するコマンドです。

LOAD文の前に「Buffer」と追加すると、読み込んだデータを自動的にローカルのQVDファイルに出力し、以降はそのQVDファイルからデータを読み込みます。
さらに不要になったQVDファイルは自動的に削除されるため、管理の手間もありません。

少し乱暴ですが、簡単にまとめると以下のようになります。
Bufferプレフィックスは、QVDファイルが
・なければ作る
・あれば使う
・いらなくなれば削除する
という機能です。


STORE文との違い

前回の記事でご紹介したSTORE文は、ファイル名やパスを指定して明示的にQVDファイルを作成します。そのため本番環境で使用する永続的なQVDファイルを作成したい場合に、言い換えるとQVDファイルを手動で管理したい場合に使用します。

これに対してBufferプレフィックスは、裏で暗黙的にQVDファイルが生成され、使用され、削除されます。そのため開発環境で一時的に使用するQVDファイルを作成したい場合に使用します。

 STORE文Buffreプレフィックス
作成明示的暗黙的
管理手動自動
永続性永続的一時的
利用目的本番環境での高速リロードや差分更新開発時のリロード効率の向上


補足:その他のプレフィックス

QlikViewとQlik Senseには、Bufferプレフィックス以外にもさまざまなプレフィックスがあります。たとえば、Firstプレフィックス(先頭何行かをロードする)、Joinプレフィックス(テーブルを結合する)などです。


Bufferプレフィックスの使用

Bufferプレフィックスを使用する場合、LOAD文の前に「Buffer」と追加します。
Buffer
LOAD ...

それでは実際に試してみましょう。
ドキュメントを新規に作成し、[ロードスクリプトの編集]画面を起動します。
create-qvd-file-by-using-buffer-prefix-101
以下のロードスクリプトを貼り付けてください。
sample:
Buffer
LOAD RecNo() as RecNo,
     Ceil(Rand() * 10) as Number1,
     Ceil(Rand() * 100) as Number2,
     Ceil(Rand() * 1000) as Number3,
     Left(Hash128(Rand()), 3) as Text1,
     Left(Hash128(Rand()), 5) as Text2,
     Left(Hash128(Rand()), 10) as Text3
AutoGenerate 5000000;

DROP Table sample;
詳細は割愛しますが「AutoGenerate 5000000」の指定により5百万件のデータを自動生成しています。LOAD文の内容はとくに重要ではありません。Rand関数などを使って乱数の値を自動生成しています。
最後にDROP文で、読み込んだデータをドキュメントから削除しています。今回はBufferプレフィックスの動作が確認できればよいため、データを読み込んだ後、データをすべて削除しています。
create-qvd-file-by-using-buffer-prefix-102
リロードを実行します。
create-qvd-file-by-using-buffer-prefix-103
ファイルを保存してください。
ここでは「qvdfile」というフォルダに「buffer_test.qvw」というファイル名で保存しています。
create-qvd-file-by-using-buffer-prefix-104
リロードが完了しました。
「経過時間」を見ると、35秒掛かっていることが分かります。
create-qvd-file-by-using-buffer-prefix-105
では、そのままもう一度リロードを実行してください。
create-qvd-file-by-using-buffer-prefix-106
「buffered」の表示は、自動生成されたQVDファイルからデータが読み込まれたことをあらわしています。
「経過時間」を見ると、13秒でリロードが完了しています。先ほどよりもリロード時間が短縮されていますね。
create-qvd-file-by-using-buffer-prefix-107今回は「AutoGenerate」でデータを自動生成していますが、データベースからデータを読み込む場合や、大量データの場合はさらに顕著な差があらわれます。

Bufferプレフィックスの基本的な使い方はこれだけです。LOAD文の前に「Buffer」と追加するだけで、あとはQlikViewが必要に応じてQVDファイルを作成し、リロードを効率化してくれます。

それでは、自動生成されたQVDファイルを確認してみましょう。
まず、ファイルの保存場所はユーザープロパティから確認、変更できます。
[設定]メニュー→[ユーザープロパティ]を選択し、[パス]タブで[QVDバッファ]の値を確認します。
create-qvd-file-by-using-buffer-prefix-108
以下が保存先の初期設定です。
C:\Users\<ユーザー名>\AppData\Local\QlikTech\QlikView\Buffers
Qlik Sense Desktopの場合は以下が保存先です。
C:\Users\<ユーザー名>\Documents\Qlik\Sense\Buffers
該当のディレクトリを見てみましょう。
規則性のない長いファイル名のQVDファイルが、自動生成されていることが分かります。
create-qvd-file-by-using-buffer-prefix-109

以上でBufferプレフィックスの確認は終了です。
以降LOAD文を変更するまで、キャッシュされたQVDファイルからデータが読み込まれます。
LOAD文を変更すると、QVDファイルは削除され新しいQVDファイルが作成されます。逆に言うと、LOAD文を変更するまで(またはQVDファイルを手動で削除するまで)、データの内容は更新されませんので注意してください。


Bufferプレフィックスの内部動作

前述のとおり、BufferプレフィックスではQVDファイルの管理について意識する必要はない(と言うか自由に管理できない)のですが、Bufferプレフィックスの内部動作についてリファレンスマニュアルの記載を確認してみましょう。

参照したマニュアル
参照しているリファレンスマニュアル、およびバージョンは以下のとおりです。
QlikViewリファレンスマニュアル バージョン11.20 SR12 日本語版

QVDファイルのファイル名

QVDファイルには規則性のない長いファイル名が自動で割り当てられていましたが、これには以下のようなルールがあります。
以下はQlikViewリファレンスマニュアル P278『Buffer』からの引用です。

QVDファイルの名前は、計算で求められた名前(160ビットの16進ハッシュ。後続のloadまたはselectステートメントとその他の識別情報の全体)であり、通常ApplicationDataフォルダか、ユーザープロパティ:パス(105ページ)ページで指定された別のフォルダに保存されます。つまり、QVDバッファは、後続のloadまたはselectステートメントの変更によって無効になることを意味します。

create-qvd-file-by-using-buffer-prefix-diagram-1あの規則性のない長い名前は、LOAD文の内容からハッシュ値を計算することで求められているということです。
つまり、LOAD文の内容がまったく同じであれば、QVDファイルの名前も同じになり、キャッシュされたQVDファイルからデータが読み込まれます。
逆に、LOAD文の内容を少しでも変更した場合は、QVDファイルは削除され、別の名前のQVDファイルが新しく作成されます。

QVDファイルの削除

では、こんどはQVDファイルの削除について見てみましょう。
以下はQlikViewリファレンスマニュアル P279『Buffer』からの引用です。

通常、QVDバッファが削除されるのは、そのバッファを作成したドキュメントのスクリプト全体の実行でバッファが参照されなくなったときと、そのバッファを作成したドキュメントが存在しなくなったときです。

前述のとおり、LOAD文を変更した場合はQVDファイルは再作成されます。またドキュメント(QVWファイル)が削除された場合もQVDファイルは削除されます。
ドキュメントが削除されたことを、QlikViewがどのように検知しているかはリファレンスマニュアルからは読み取れませんが、確かに関連するドキュメントをすべて削除した上で、リロードを実行するとQVDファイルが削除されました。

「ドキュメントプロパティ」と「ユーザープロパティ」の設定を変更することで、QVDファイルの自動削除を無効にできます。しかしリファレンスマニュアルにあるとおり、QVDファイルの自動削除を無効化するのは推奨されません。
以下、同様にQlikViewリファレンスマニュアル P279『Buffer』からの引用です。

ドキュメントプロパティ:基本設定(508ページ)ページの照会先のないQVDバッファを保持するオプション(第1条件)とユーザープロパティ(85ページ)ダイアログの照会先のないQVDバッファを削除しないオプション(第2条件)をそれぞれオンにして、削除機能をオフにすることができますが、一般的には推奨しません。



ここまででBufferプレフィックスの使い方や内部動作について見てきました。
最後に、Bufferプレフィックスの2つのオプションを紹介します。

Bufferプレフィックスのオプション


Inclementalオプション

Buffer (Inclemental)
Inclementalオプションは、増分ロードをおこなう指定です。
過去のデータはQVDファイルから読み込み、新しいデータはもとのデータソースから追加で読み込みます。
一見便利な機能ですが、以下の制限があるので注意してください。
  1. テキストファイルでのみ使用できます。
  2. 単純な増分ロードでのみ使用できます。
    過去のデータが変更されたり、削除されたりしている場合は正常にデータが読み込めません。
そのため、ログファイルのような過去のデータが変更されない、テキストファイルの増分ロードには使用できますが、データベースの差分更新などには使用できません。

Stale Afterオプション

Buffer (Stale [After] <n> [hours | days])
Stale Afterオプションは、QVDファイルの有効期限を設定する指定です。

Buffer (Stale After 3 hours) 有効期限を3時間に設定します。
Buffer (Stale After 1 days) 有効期限を1日に設定します。
「After」の記述を省略し、以下のように指定することもできます。
Buffer (Stale 1 days)
有効期限を過ぎた場合、QVDファイルは再作成されます。

以下のようにカンマ区切りで、InclementalオプションとStale Afterオプションを併用することもできます。
Buffer (Inclemental, Stale After <n> [hours | days])
しかし、一定期間でファイルを削除し(Stale Afterオプション)、かつ増分ロードをする(Inclementalオプション)というのは、かなり用途が限定されると思います。


最後に…

今回はBufferプレフィックスをご紹介しました。
BufferプレフィックスはQVDファイルの管理を手動で制御できないため、本番運用で使用するというよりも、やはり開発効率を向上するために使用する機能になります。

最後になりましたが、Bufferプレフィックスの消し忘れには充分ご注意ください。
Bufferプレフィックスを残したまま、ドキュメント(QVWファイル)を本番のサーバーに展開した場合、何度リロードを実行しても最新のデータが取り込まれず、混乱のもとになります。

ただのBIツールではない、分析プラットフォームとしてのQlik Senseの潜在能力

$
0
0

メーカーの発表などを見ていると、最近Qlik Senseのことを”分析プラットフォーム”と表現することが多くなってきました。
つまり、Qlik Senseはただの”BIツール”ではなく、より広い範囲に適用できる”分析プラットフォーム”であるという訳です。
そこで今回はいつもとすこし趣向を変えて、Qlik Senseの拡張性に着目してみます。

見た目の美しさや操作性の良さに言及されることの多いQlik Senseですが、本来どこまでのポテンシャルを持っているのか、Qlik Senseの拡張性や将来性に触れてみましょう。

Qlik Senseをお使いの方はもちろん、BIツールの導入を検討中の方も、Qlik Senseというツールの本質を理解する上で有用だと思いますので、ぜひご覧ください。

Qlik Senseの製品群

まずはQlik Sense製品群をあらためて確認してみましょう。
Qlik Senseのヘルプの以下のページで、「Qlik Sense製品ファミリ」の図をご覧ください。
Qlik Sense とは?
ごく簡単に図示すると下図のようになります。
qlik-analytics-platform-introduction-101「Qlik Sense Desktop」などの各製品は「Qlik Analytics Platform」の上に成り立っています。
つまり、「Qlik Sense Desktop」などはあくまでGUIのツールであり、根幹を支えているのは「Qlik Analytics Platform」であるということになります。


Qlik分析プラットフォームの特徴

では、もう一つ別のページを見てみましょう。
以下のページは、Qlik製品の特長を簡潔に説明したQlik社のページです。
Qlik が選ばれる理由 | Qlik

このページの下部にある「自由な構築が可能なプラットフォーム」に、以下の記載があります。
以下は上記のページからの引用です。

Qlik 分析プラットフォームは、ユーザーが自由に構築できるよう設計されています。実は、Qlik Sense アプリケーションもこの方法で構築したものなのです。

  • オープンかつ標準的な API。Qlik 分析プラットフォームは、オープンかつ標準的な API を通じ、QIX エンジンに対する比類のないアクセス性を提供します。
  • マッシュアップおよび拡張。Qlik 分析プラットフォームが搭載するマッシュアップおよび拡張 API を用いることで、高度なウェブ アプリケーションおよびカスタム ビジュアライゼーションを簡単かつ迅速に構築できます。

簡単に補足しながらまとめると、Qlik SenseはHTML5などの標準的なWebの技術を採用しているため、外部のWebサイト(Webアプリ)と統合したり、もともと用意されていないチャートを独自に追加したりできるということです。
もっと言えば、「Qlik Sense Desktop」のようなツールを、自分で一から開発することも可能です。

以上で概要の説明は終了です。

やはり説明だけでは実感が沸かないと思いますので、ここからは具体的な例を見てみましょう。
できる限り実際に試せるようにまとめていきますので、みなさまもぜひご自身でも試してみてください。


Qlik Senseが採用している技術

前述のとおり、Qlik SenseはHTML5などの標準的なWebの技術を採用しています。
ではどのような技術が採用されているか、キーワードだけでも確認しておきましょう。
以下のページはQlik Senseの開発者向けヘルプです。
Qlik Sense for Developers help Technologies

開発者向けの補足:Qlik Senseのヘルプには、通常のヘルプ開発者向けのヘルプがあります。開発者向けのヘルプには、Qlik Senseで使用できるAPIの詳細などもまとめられています。

「HTML5」「WebSocket」「JSON」「REST」などの単語が並んでいますね。
聞いたことのある単語がいくつかあると思いますが、重要なのは全面的にWebの技術が採用されているという点です。
QlikViewでもJavaScriptなどを使用して拡張機能を開発できましたが、Qlik Senseではさらにこれが徹底されています。

では、本当にそうなのか実際に確認してみましょう。
Qlik Sense Desktopを起動してください。
起動したら、「Ctrl」キーと「Shift」キーを押しながら、画面上の任意の場所を右クリックしてください。
これはQlik Sense Desktopの隠しコマンドのようなもので、以下のような見慣れないメニューが出てくるかと思います。
この中から「Show DevTools」を選択してください。
qlik-analytics-platform-introduction-201
以下の画面が起動します。
これは開発者向けのデバッグツールで、Qlik Sense Desktopに表示されている画面のソースなどを見ることができます。
内容を見ると中身のソースがHTMLでできていることが分かります。
qlik-analytics-platform-introduction-202

開発者向けの補足:この画面を見てピンときた方もいるかもしれませんが、これはGoogle Chromeのデベロッパー ツール(F12キー)とおなじものです。Qlik Sense Desktopの実体はChromiumベースのアプリケーション(埋め込みブラウザ)です。
Qlik Sense for Developers help Qlik Sense Desktop architecture

これだけではなく、実はQlik Sense Desktopはブラウザから使用することもできます。
Qlik Sense Desktopを起動したまま、ブラウザを起動してください。
後ほどChrome特有の機能を使用しますので、ChromeがインストールされているのであればChromeを使用してください。
ChromeがなければInternet Explorer(10以降)、Firefoxなど他のブラウザで構いません。
ブラウザが起動したら、アドレスバーに以下のURLを入力してください。
http://localhost:4848/hub/
qlik-analytics-platform-introduction-203
ブラウザの中に、Qlik Sense Desktopとまったく同じ画面が表示されました。
qlik-analytics-platform-introduction-204
このようにQlik Sense Desktopは見た目上はWindowsのアプリケーションですが、中身はWebブラウザです。言い換えるとQlik Sense Desktopは、Qlik Sense専用のWebブラウザということです。

では一つ、おもしろい実験をしてみましょう。
Qlik Sense Desktopと、ブラウザ側のQlik Senseハブでおなじアプリを開いてください。
ここでは、デモアプリとしてあらかじめ用意されている「Customer Goods Sales」を選択します。
qlik-analytics-platform-introduction-205アプリ概要が開いたら、左から2つ目の「Sales & Margin Analysis」を開いてください。
qlik-analytics-platform-introduction-206Qlik Sense Desktopでもおなじように操作し、おなじアプリのおなじシートを開いてください。
下図のように画面を横に並べておくと分かりやすいでしょう。
qlik-analytics-platform-introduction-207ブラウザとQlik Sense Desktopのどちらでも構いませんので、なにか値を選択してください。
どちらか一方でなにか値を選択すると、もう一方の画面にも瞬時に反映されると思います。
片方を別のシートに変更して試してみてください。シートが変わっても(アプリがおなじであれば)、二つの画面は自動的に同期されます。
このように、おなじユーザーがおなじアプリを見ている限り、選択状態などはクライアントのツール間で自動的に同期されます。


QIXエンジン

それではここで、QIXエンジンについて触れておきます。
QIXエンジンというのは簡単に言うと、Qlik Senseのエンジンに当たるもので連想技術の核となる部分です。ここでは難しく考えずに裏で動いているエンジンだと思ってください。

重要なのは、Qlik Senseの動作はQIXエンジンによって一元的に管理されているということです。
先ほどクライアントのツール間で表示が自動的に同期されたのは、QIXエンジンの働きによるものです。

開発者向けの補足:リアルタイムに画面が更新される部分には、WebSocketの技術が使われています。また、このことを利用して複数画面でQlik Senseのアプリを開発できます。たとえば二つの画面でおなじアプリを開き、片方を編集モードに、もう一方を閲覧モードにすればリアルタイムに結果を確認しながらアプリを開発できます。



マッシュアップとエクステンション

ここまでで、Qlik Senseが標準的なWebの技術を採用していることを説明してきました。
では、それによってなにが嬉しいのかという話ですが、Webの技術を採用していることにより、外部のWebサイト(Webアプリ)との統合が容易になります。=マッシュアップ
また、標準的な技術を採用していることにより、先進的な外部ライブラリとの連携が容易になり、またこれによって機能を拡張できます。=エクステンション

マッシュアップ

では、マッシュアップの機能を試してみましょう。
※ここで紹介する機能は正確には”埋め込み(Embed)”と呼ばれるもので、マッシュアップとは別の機能です。ただし埋め込みもマッシュアップも、Qlik Senseのチャートを別のWebサイトに統合するという意味ではおなじものです。

まず、マッシュアップやエクステンションを開発するには、「Qlik Dev Hub」という開発者用の画面にブラウザからアクセスします。
ブラウザを起動してアドレスバーに以下のURLを指定してください。
http://localhost:4848/dev-hub/
qlik-analytics-platform-introduction-301なお、Qlik Sense Desktopのメニューから「Qlik Dev Hub」を選択してもこの画面が表示されます。
qlik-analytics-platform-introduction-302「Qlik Dev Hub」には全部で4つの機能がありますが、今回は一番上の「Single configulator」を使用します。この機能は単一のチャートを呼び出すためのURLを生成するものです。
「Qlik Sense Cloud」にある「Qlik Sense Charts」と同等のものです。

では、画面左側から「Single configulator」を選択してください。
qlik-analytics-platform-introduction-303さらに画面左側で、アプリとチャートを選択します。今回は先ほど使用したデモアプリのチャートを使用します。
qlik-analytics-platform-introduction-304
2つほど設定を加えます。まず値の選択などを有効にするために「Disable interaction」のチェックを外します。
qlik-analytics-platform-introduction-305つづいてチャートの上部に、いつもの選択バーを表示するために「Show selections bar」にチェックを入れます。
qlik-analytics-platform-introduction-306以上で完成です。
「View」をクリックして結果を確認してみましょう。
qlik-analytics-platform-introduction-307単一のチャートが画面いっぱいに表示されました。
qlik-analytics-platform-introduction-308ブラウザのアドレスバーに表示されたURLを使用することで、このチャートをQlik Senseの外から参照できます。たとえば社内のイントラにチャートを埋め込むことができます。

また、この場合もQIXエンジンによる一元管理が働いています。
qlik-analytics-platform-introduction-309つまり、一つのページに複数のチャートを埋め込んだ場合も、複数のチャートが自動で連動するということです。

なお、今回は「Single configulator」をご覧いただきましたが、「Mashup」を使用することで複数のチャートを組み合わせた独自のWebページを作成することも可能です。以下はMashupの作成イメージです。
qlik-analytics-platform-introduction-310


エクステンション

最後にエクステンションについて見ていきましょう。
ここでは「Qlik Sense 2 Dimensional Heatmap」というチャートを追加するエクステンションと、「SenseIt」というChromeの拡張機能を紹介します。
なお、Qlik Senseで単純に”エクステンション”と言った場合、”ビジュアライゼーション エクステンション”つまりチャート関連の拡張機能を指します。そういった意味では「SenseIt」の方は”エクステンション”ではないのですが、機能を拡張するという意味ではおなじですので、あわせて紹介いたします。

ビジュアライゼーション エクステンション

それではまず「Qlik Sense 2 Dimensional Heatmap」を使用してみましょう。
エクステンションは、先ほどのDev Hubで一から開発することもできるのですが、はじめからエクステンションを開発するのは敷居が高いため、まずは無償で公開されているエクステンションを利用するところから、はじめてみてください。

無償のエクステンションは「Qlik Branch」というサイトに、大量に公開されています。
では早速、Qlik Branchを見てみましょう。
Qlik Branch
http://branch.qlik.com/
GitHubのかわいらしいマスコットキャラがトップに表示されましたね。
qlik-analytics-platform-introduction-401画面上部の「Projects」メニューから、エクステンションを検索することなどもできますが、今回は以下のURLをクリックして「Qlik Sense 2 Dimensional Heatmap」のページに直接移動してください。
Qlik Branch Qlik Sense 2 Dimensional Heatmap
「Download project」ボタンをクリックして、エクステンションをダウンロードしてください。
qlik-analytics-platform-introduction-402エクステンションはZip形式で圧縮されていますので、解凍してください。
qlik-analytics-platform-introduction-403解凍したフォルダを、Qlik SenseのExtensionsフォルダにコピーしてください。
Extensionsフォルダは以下にあります。
C:\Users\<ユーザー名>\Documents\Qlik\Sense\Extensions
qlik-analytics-platform-introduction-404※Zipを解凍したときにフォルダを自動生成した場合は注意してください。このフォルダ「ralfbecher-xxxx」の直下にREADMEなどが置かれている状態にしてください。
これだけでエクステンションが使えるようになります。
qlik-analytics-platform-introduction-405シートの編集画面を開くと、チャートに「2 Dimensional Heatmap」が追加されていることが分かります。もし追加されていない場合は「F5」キーで画面を更新するか、Qlik Sense Desktopを再起動してください。
このエクステンションはこのあと使用します。


SenseIt

それではつづいて「SenseIt」を使用してみましょう。
SenseItはWebページ上のテーブルを、Qlik Senseに簡単に取り込むChromeの拡張機能です。
Chromeを起動して、以下のページにアクセスしてください。
※SenseItはChrome版しかないためChromeを使用してください。
SenseIt – Chrome ウェブストア
以下の画面を参考にSenseItをインストールしてください。
qlik-analytics-platform-introduction-501qlik-analytics-platform-introduction-502
SenseItがインストールされました。
qlik-analytics-platform-introduction-503
前述のとおり、SenseItはWebページ上のテーブルをQlik Senseに取り込む機能です。
ここでは題材として、以前このブログで取り上げた以下の記事からデータを取り込んでみましょう。
データの可視化 日本人の誕生日ランキングをあらわす一枚の画像
このページの下部に日本人の誕生日ランキングの表があります。アドレスバーの右にある「SenseIt」ボタンをクリックしてください。
qlik-analytics-platform-introduction-504
SenseItはWebページ上のテーブルを自動で認識して、テーブルに黄色の枠線を着けます。誕生日ランキングの表をSenseItのウィンドウにドラッグ&ドロップします。
qlik-analytics-platform-introduction-505画面下部の「Create App」ボタンをクリックすると、この表がQlik Senseにデータとして取り込まれ、さらにアプリも自動生成されます。
qlik-analytics-platform-introduction-506ボタンの表示が「Open App」に変わったら完成です。「Open App」ボタンをクリックしてください。
qlik-analytics-platform-introduction-507Qlik Senseの画面が開くので、シートを作成して編集を開始してください。
qlik-analytics-platform-introduction-508qlik-analytics-platform-introduction-509
先ほど追加したエクステンションを使用してみましょう。「チャート」から「2 Dimensional Heatmap」をドラッグ&ドロップでシートに追加します。
qlik-analytics-platform-introduction-510
軸とメジャーを設定します。
ここでは下図のように、1つ目の軸に「月」、2つ目の軸に「日」を設定します。さらにメジャーで「合計出生数」を選択し「Sum([合計出生数])」を設定してください。
qlik-analytics-platform-introduction-511
これだけでヒートマップが作成されます。ヒートマップは値の大小を色の変化で表現するチャートです。
qlik-analytics-platform-introduction-512
画面右の「スタイル」では、このエクステンション特有の設定も可能です。
「Color And Legend」で配色を変更できます。ここでは「Qlik Sense Diverging(Reverse)」を選択してみましょう。
qlik-analytics-platform-introduction-513
ヒートマップが完成しました。この配色では値の少ないものを赤、多いものを青であらわします。
たとえば、2月29日に生まれた方は非常に少なく(四年に一回しかないので当然ですね)、逆に9月下旬や12月下旬に生まれた方が多いということが視覚的に分かります。
qlik-analytics-platform-introduction-514
以上でエクステンションの説明は終了です。
あらかじめ用意されていないチャートを追加したり、外部のソフトウェアと連携したりできることがお分かりいただけたかと思います。


最後に…

今回はQlik Senseの拡張性というテーマで、Qlik Senseにできることをいろいろと紹介してきましたが、個人的には拡張性が高い一方で、QIXエンジンによる一元管理が徹底されている点が印象的でした。

つまり、データ値そのものやユーザーが選択した値など、データが直接関わる部分は常に一つで、それはQIXエンジンが一元管理しています。
その一方で、デバイスやクライアントは複数同時に利用できるようになっており、またチャートなど見た目に関する部分は自由に拡張できるようになっています。

採用している技術の観点から言えば、核となるQIXエンジンは独自の特許技術で保護しつつ、APIやクライアント製品には標準のWeb技術や、先端的なライブラリを採用しています。

最後にここまでの内容を、表にまとめておわります。
これはわたしの独自解釈ですが、今回見てきた内容を総合すると下表のようにあらわせると思います。
フロントエンドバックエンド
豊富なAPIによる柔軟な拡張QIXエンジンによる一元管理
標準的なWebの技術(オープンな技術)独自の特許技術(クローズドな技術)
表現(デバイス、ブラウザ、チャート)には多様性を事実(データ)には一貫性を

Qlik Sense for Developers help 窶鈀 Qlik Sense
https://help.qlik.com/en-US/sense-developer/
Qlik Senseの開発者向けヘルプです。Qlik SenseのAPIの詳細などがまとめられています。(英語)

Qlik Branch
http://branch.qlik.com/
Qlik Branchです。エクステンションを探したいときは、まずここを見るといいでしょう。(英語)

QlikSpace | Qlik Sense + QlikViewの技術情報サイト
http://www.qlikspace.net
QlikViewとQlik Senseの技術情報を発信しているブログです。Qlik社の方が運営しているため、APIや拡張機能に関する記事も非常に充実しています。

Qlik Sense Platform APIs Ignite New Open Source Community | Qlik
http://www.qlik.com/us/company/press-room/press-releases/0126-qlik-sense-platform-apis-ignite-new-open-source-community
Qlik Branchを発表した際のQlik社のリリースです。(英語)
Qlik社が今後、開発者の支援やオープンソースコミュニティへの取り組みを強化していくといったことが書かれています。

SET分析再入門(SET分析の概要から、簡単な数式の作成まで)

$
0
0

今回はQlikViewやQlik Senseの機能の中でも、難しいと言われることの多い「SET分析」について説明いたします。
SET分析を使うには、関数の中にさらにSET分析特有の式を書く必要があるため、慣れないうちは難しく感じます。
しかし、複雑な式も分解してみれば、基本的な式の組み合わせです。

この記事ではSET分析とは何なのか、SET分析の概要と基本的な使い方について解説いたします。
SET分析を使ったことのない方はもちろん、使ったことはあるがよく意味が分からずに使っているという方にもお勧めです。

なお、SET分析は指定方法が多岐に渡り、一つの記事ではまとめきれないため、何回かに分けて解説する予定です。今後の記事にもご期待ください。

SET分析とは

SET分析とは何なのか理解するために、まずはマニュアルを見てみましょう。
以下は、QlikViewヘルプの該当箇所からの引用です。
なお、SET分析はQlikViewでもQlik Senseでもおなじように使用できます。以下はQlikViewヘルプからの引用ですが、Qlik Senseヘルプにもおなじことが書かれています。
set 分析および set 数式 窶鈀 QlikView
set 分析および set 数式 窶鈀 Qlik Sense

set 分析を使用すると、現在の選択で定義された通常のセットとは異なるデータ値のセット (またはグループ) を定義できます。

QlikViewやQlik Senseでは、なにか値を選択するとその値に絞り込まれます。しかしSET分析を使用すると、いま選択されている値とは別の条件で値を絞り込めます。
下図をご覧ください。
introduction-to-set-analysis-101このアプリでは、データが2009年に絞り込まれています。
しかし、画面中央のテーブルを見るとすべての年が表示されています。(2009年の絞り込みが無視されています。)
さらに、画面右のテーブルを見ると2008年の値が表示されています。

このように、SET分析を使用すると現在の選択状態と関係ない条件で値を絞り込めます。
そのため、たとえば選択された値に関わらず、常に総合計を表示したい場合や、常に今年の値を表示したいといった場合に使用できます。
またこれは、異なる条件で絞り込んだ値を並行して使えるということですので、たとえば今年の値と昨年の値を比較する(前年比をもとめるなど)といった場合にも使用できます。

指定する際は、値の選択状態を数式として記述することになりますので、条件が複雑であればその分数式も複雑になります。
たとえば、”年が2009年または2010年で、商品がAで、顧客の年齢が30歳未満で…”といった条件を数式として記述することを考えると、とても長い数式になりそうだということが想像できるかと思います。

SET分析の難しさの一因はこの部分にあります。事実、マニュアルでも条件の記述方法の説明に大半が割かれています。


SET分析の前提

上記マニュアルのページに、SET分析を使用するための前提として、重要なことが2点書かれています。
以下はQlikViewヘルプの該当箇所からの引用です。

set 数式は、集計関数で使用される必要があります。この例では、集計関数は sum(Sales) です。
Set 数式は、チャートの数式にのみ使用可能で、スクリプト式には使用できません。

  • SET分析は、集計関数の中で使用します。
    SET分析は任意の条件を指定して値を集計するものです。
    そのため、Sum関数、Avg関数などの集計関数でのみ使用でき、Date関数など、その他の関数では使用できません。
  • SET分析は、ロードスクリプトでは使用できません。チャートの数式でのみ使用できます。
    SET分析は選択状態を制御する機能です。値を選択するのはユーザーインターフェース側の話ですので、ロードスクリプトでは使用できません。

Qlik Senseアプリのダウンロード

今回はベースとなるQlik Senseのアプリ(qvf形式)をあらかじめ用意してあります。以下からダウンロードしてください。
Zip形式で圧縮してあり、解凍するとqvfファイルが出てきます。
set-analysis.zip

QlikViewをお使いの方は、Zipファイルの中にExcelファイルを同梱してありますので、こちらからデータを取り込んでください。
「売上」のシートからデータを取り込んでください。
introduction-to-set-analysis-102introduction-to-set-analysis-103
Qlik Senseをお使いの方も、もし一からアプリを作成したい場合はExcelファイルからデータを取り込んでください。
introduction-to-set-analysis-104
それでは、アプリを開いてみましょう。
qvfファイルを、Qlik Sense Desktopにドラッグ&ドロップして開いたり、アプリ用のフォルダにコピーして開いてください。
アプリ用のフォルダのパスは以下のとおりです。
C:\Users\<ユーザー名>\Documents\Qlik\Sense\Apps
シートが1つありますので、このシートを開いてみてください。
introduction-to-set-analysis-105
「年」と「分類名1」のフィルタ、そして「売上金額」の集計を表示するテーブルがあります。
introduction-to-set-analysis-106
現時点ではSET分析を使用していない、いわゆる普通のアプリです。
値を選択すれば、その値で絞り込まれます。
introduction-to-set-analysis-107


SET分析の使用

それでは、SET分析を使用してみましょう。
まず、なにか値を選択している方は一旦すべて選択を解除して、「編集」ボタンをクリックしてください。
introduction-to-set-analysis-201
SET分析用に、テーブルにメジャーを追加します。
画面左側の「項目」パネルから「売上金額」を、テーブルの上にドラッグ&ドロップしてください。
introduction-to-set-analysis-202
「メジャーとして追加」→「Sum([売上金額])」を選択します。
introduction-to-set-analysis-203
画面右側の「プロパティ」パネルで、いま追加したメジャーのプロパティを開きます。
「数式」にそのまま数式を記述することもできますが、入力欄が小さいと入力しにくいため「数式エディタ」を使用しましょう。
「数式エディタを開く」をクリックします。
introduction-to-set-analysis-204
まずはもっとも簡単なSET分析の式を指定してみましょう。
数式に「{1}」と追加します。
Sum({1} [売上金額])
introduction-to-set-analysis-205設定後、画面右下の「適用」ボタンをクリックしてください。

動作を確認してみましょう。「完了」ボタンをクリックします。
introduction-to-set-analysis-206
画面右側の数式に注目してください。
「{1}」の指定は、そのとき選択された値をすべて無視する(常に総合計を表示する)という指定です。
フィルタで値を絞り込んでも、集計値はまったく変化せず、常に総合計が表示されていることが分かります。
introduction-to-set-analysis-207この指定はKPIチャートに、常に総合計を表示したいときに便利な機能です。

このように、SET分析の式はかならず波括弧{}で囲んで指定します。言い換えると、いま指定した「1」の部分を書き換えることで、さまざまな条件を指定できるということです。
波括弧{}で囲むというのは、SET分析共通のルールですので覚えておきましょう。

では、別の指定も試してみましょう。選択をすべて解除し、「編集」ボタンをクリックします。
introduction-to-set-analysis-208introduction-to-set-analysis-209
先ほど作成したSET分析の式を変更します。
数式エディタを開いて、波括弧{}の中を以下のように変更してください。
Sum({<年={2008}>} [売上金額])
introduction-to-set-analysis-210設定後、画面右下の「適用」ボタンをクリックしてください。

動作を確認してみましょう。「完了」ボタンをクリックします。
introduction-to-set-analysis-211
今回の指定は、常に2008年の値を表示するという指定です。
フィルタで年の値を変更しても、常に2008年の値が表示されることが分かります。
introduction-to-set-analysis-212introduction-to-set-analysis-213
この指定が、SET分析の一番基本となる型ですので覚えておきましょう。
この指定により、任意の条件を指定できます。波括弧{}の中だけ抜き出して書くと以下のようになります。
<項目名={条件値}>
括弧が2種類あって混乱しますが、これが基本の型ですのでこの形を忘れないようにしてください。

では、ほかの指定も試してみましょう。基本の型さえ覚えてしまえばあとはこれの応用です。
下図を参考に、さまざまな指定を試してみてください。
値を複数指定したいときは、,(カンマ)で区切って指定します。
Sum({<年={2008, 2009}>} [売上金額])
introduction-to-set-analysis-214この指定は、2008年と2009年に絞り込む指定です。
introduction-to-set-analysis-215
では、複数の項目にまたがった条件は、どのように指定したらいいでしょうか。
その場合は、以下のように条件式全体を,(カンマ)で区切って指定します。
Sum({<年={2008, 2009}, 分類名1={AV機器}>} [売上金額])
※分類名1の「1」は全角数値ですので注意してください。
introduction-to-set-analysis-216この指定は、2008年と2009年のAV機器に絞り込む指定です。
introduction-to-set-analysis-217

ここまで覚えてしまえば、SET分析の基礎は理解できたと言えるでしょう。
以下の基本の型を覚えていただき、あとは条件値や条件式全体を,(カンマ)で区切って複数指定していくだけです。
<項目名={条件値}>
SET分析はほかにもさまざまな指定ができるのですが、ここから先はまた別の記事にまとめようと思っています。


SET分析の括弧について

では、さいごにSET分析の括弧について触れておきます。

ここまで見てきて、SET分析の指定は括弧が多すぎると感じた方も、多いのではないでしょうか。
波括弧{}と山括弧<>を重ねて書くのはなぜなのか、条件値の指定のために、さらに波括弧{}で囲むのは冗長ではないかと。
これは構文の問題なので、慣れていただくしかないと言えばそれまでなのですが、SET分析の詳細を理解していくと、括弧も無駄についている訳ではなく、それぞれの括弧に意味があることが分かってきます。

条件値を囲む波括弧{}

まず、条件値を囲む波括弧{}についてです。
<項目名={条件値}>
実は条件値を囲む波括弧{}には、以下の意味があります。

波括弧{}なしの場合、項目名をあらわす
波括弧{}がない場合、項目名とみなされます。波括弧をつけずに指定することで項目同士の比較ができます。
<項目名1=項目名2>

波括弧{}ありの場合、波括弧{}内には、単純な値だけでなく検索式を指定できる
QlikViewやQlik Senseの検索機能(フィルタの虫眼鏡アイコンなど)では、大なり小なり(<>)やワイルドカード(*)が指定できます。SET分析の条件値もおなじように指定できます。
たとえば、以下のように指定すると年の値が「2010」未満という条件が指定できます。
<年={"<2010"}>
※大なり小なり(<>)やワイルドカード(*)を指定する場合、”(ダブルクォーテーション)で囲む必要があります。
introduction-to-set-analysis-218introduction-to-set-analysis-219
複数組み合わせて指定することもでき、たとえば2009以上、2011年以下という場合は以下のようになります。
<年={"<=2009>=2011"}>
ワイルドカード(*)を使用して、以下のように書くこともできます。
<年={"20*"}>


条件式を囲む山括弧<>

つづいて、条件式全体を囲む山括弧<>についてです。
{<年={2008}>}
この山括弧<>にも、きちんと意味があります。
今回は使用しませんでしたが、山括弧<>で囲んだ条件式を複数指定できます。
この指定は、OR条件を指定したい場合に有効です。
※AND条件は,(カンマ)区切りでよいため。

たとえば、以下のように指定すると2008年か、またはAV機器の値という意味になります。
{<年={2008}> + <分類名1={AV機器}>}


最後に…

最後に、今回学んだSET分析の基本をまとめておきます。
SET分析には、ほかにもさまざまな指定方法があり、さらに実践的な使い方もできます。
次回また紹介したいと思いますので、ぜひご期待ください。
お疲れ様でした。

  • SET分析は、集計関数の中で使用する。
  • SET分析は、ロードスクリプトでは使用できない。チャートの数式でのみ使用できる。
  • SET分析は、波括弧{}で囲んで指定する。
  • SET分析で条件式を指定する際の基本の型
    <項目名={条件値}>
  • 複数の条件値や、複数の条件式を,(カンマ)区切りで指定できる。
    <年={2008, 2009}>
    <年={2008, 2009}, 分類名1={AV機器}>
  • 条件値には、単純な値だけでなく大なり小なり(<>)やワイルドカード(*)を指定できる。
    <年={"<2010"}>
    <年={"20*"}>
  • 複数の条件式を指定し、OR条件を指定できる。
    <年={2008}> + <分類名1={AV機器}> 2008年またはAV機器


set 分析および set 数式 窶鈀 QlikView
https://help.qlik.com/ja-JP/qlikview/12.0/Subsystems/Client/Content/ChartFunctions/SetAnalysis/set-analysis-expressions.htm

set 分析および set 数式 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/2.2/Subsystems/Hub/Content/ChartFunctions/SetAnalysis/set-analysis-expressions.htm

SET分析再入門2(SET分析の詳細と指定例)

$
0
0

今回も前回にひきつづき、SET分析について解説していきます。
前回の記事ではSET分析の基本的な使い方について解説しましたので、今回の記事ではSET分析の詳細と指定例について解説していきます。
内容自体はヘルプを読めばすべて書いてあることですが、なるべく分かりやすく、かつ例文を多く盛り込みながらまとめたつもりですので、SET分析に苦手意識のある方はぜひご一読ください。

今回の記事で使用した例文をまとめたQlik Senseのアプリを用意しましたので、ぜひダウンロードして動作を確認してみてください。
set-analysis-2.zip

前回の振り返り

まずは前回の内容を振り返ってみましょう。
SET分析を使用する際は、以下の点を押さえてください。
  • SET分析は、集計関数の中で使用する。
  • SET分析は、ロードスクリプトでは使用できない。チャートの数式でのみ使用できる。
  • SET分析は、波括弧{}で囲んで指定する。
  • SET分析で条件式を指定する際の基本の型
    <項目名={条件値}>
ここに書いた内容に不安のある方は、先に前回の記事をお読みください。

この記事の内容

この記事では、大まかには以下の2つの内容を取り扱います。
  • SET分析の構文の詳細
    まず、SET分析の構文について詳しく説明します。具体的には、SET修飾子、SET識別子、SET演算子という3つの用語についてです。
  • SET分析で使える便利な機能
    そのあと、SET分析の中で使える便利な機能について説明します。具体的には、ドル記号展開と黙示的項目値定義(P関数、E関数)という2つの機能についてです。

SET分析の構文の詳細

ここでは、SET修飾子、SET識別子、SET演算子という3つの用語について説明します。
これらはSET分析の構文を分解して、各パーツに呼び名を着けたものです。つまり、これらはただの呼び名であって特別な機能ではありません。
実は前回の記事ですでにご紹介しています。

前回の記事で以下のような式が出てきたかと思います。この式は、2008年かまたはAV機器の値という意味です。
「+」の記号が、または(OR条件)をあらわしています。
<年={2008}> + <分類名1={AV機器}>
この式の<>で囲まれた条件式の部分をSET修飾子、条件式の間にある「+」をSET演算子と呼びます。
<年={2008}>     +     <分類名1={AV機器}>
    ↑          ↑          ↑
SET修飾子   SET演算子   SET修飾子
このように、SET修飾子、SET識別子、SET演算子は、いずれもSET分析の構文の中で、各パーツをあらわす呼び名です。
では、それぞれ詳細を説明していきますが、ここでは説明が簡単な順に、SET修飾子、SET識別子、SET演算子の順で説明していきます。

SET修飾子

SET修飾子とは、SET分析で指定する条件式のことです。
言い換えると、SET分析の指定の中で山括弧<>で囲まれた部分のことです。
<年={2008}>
SET修飾子は前回の記事にも出てきましたので、とくに難しいところはないと思います。
ただ、前回の記事にも書きましたが、「単純な値だけでなく検索式を指定できる」という点には注意してください。
波括弧{}の中に指定する条件値には、単純な値だけでなく、*などのワイルドカードも使えますし、等号不等号を使用した範囲指定なども可能です。

ここで指定できるものは、基本的にはQlik SenseやQlikViewの”検索”機能で使用できるものとおなじです。
フィルターパネル(Qlik Sense)やリストボックス(QlikView)などで使える検索機能です。

そのため、どのような指定ができるのかについては、ヘルプで”検索”の箇所を確認してください。
検索 窶鈀 QlikView
リスト検索 窶鈀 Qlik Sense
また、検索式をテストしたい場合は、フィルターパネル(Qlik Sense)やリストボックス(QlikView)の検索機能で、実際に試してみるのがおすすめです。
set-analisys-advanced-101
指定例
指定 意味
Sum({<年={2008}>} 売上金額) 2008年のもの。
Sum({<年={“200*”}>} 売上金額) 「200」ではじまるもの(前方一致)。
検索式を使用したい場合は、”(ダブルクォーテーション)で囲みます。
Sum({<年={“*11”}>} 売上金額) 「11」でおわるもの(後方一致)。
Sum({<年={“*1*”}>} 売上金額) 「1」を含むもの(前後方一致)。
Sum({<年={‘2011’}>} 売上金額) 「2011」のもの(完全一致)。
‘(シングルクォーテーション)で囲むと完全一致での検索となります。
Sum({<年={“<2010”}>} 売上金額) 年が2010年未満のもの。
Sum({<年={“>=2009<=2011”}>} 売上金額) 年が2009年以上、2011年以下のもの。
Sum({<年={“*”}>} 売上金額) すべての年。
Sum({<年=>} 売上金額) すべての年。上とおなじです。=(イコール)のうしろになにも指定しなかった場合、すべての値(言い換えると、値の絞り込みを何もしない)という意味になります。
Sum({<項目名1=項目名2>} 売上金額) 2つの項目の値がおなじもの。項目名を指定するときは{}波括弧なしで指定します。

SET識別子

SET識別子とは、簡単に言うとそのとき選択されている値を引き継ぐのか、無視するのかの指定です。
※正確に言うとそれだけではないのですが、まずは上記のように理解してください。

前回の記事で、「{1}」という指定をご覧いただきましたが、この「1」はSET識別子の一種です。
「1」を追加すると、そのとき選択されている値を無視します。
Sum({1} 売上金額)
そのとき選択されている値をすべて無視して、常に売上金額の総合計を表示します。

また、「1」のかわりに「$」を指定すると、そのとき選択されている値をそのまま使用します。つまり、なにも指定しなかったときとおなじです。
以下の2つの数式はおなじ結果となります。
Sum({$} 売上金額)
Sum(売上金額)
そのため、「$」を単体で指定する意味はないのですが、つぎに説明するSET演算子と組み合わせて、「1-$」と指定できます。
これは、”そのとき選択されていないもの”という意味になります。
SET識別子には「1」と「$」以外の指定もあるのですが、まずはこの2つだけ覚えておけば問題ないでしょう。
指定例
指定 説明
Sum({1} 売上金額) そのとき選択されている値を無視して、常に売上金額の総合計を表示する。
Sum({$} 売上金額) 売上金額を集計する。Sum(売上金額)とおなじ。
Sum({1-$} 売上金額) そのとき選択されている値以外の売上金額を集計する。
Sum({<年={2008}>} 売上金額) そのとき選択されている値に加えて、年を2008年に絞り込む。
Sum({1<年={2008}>} 売上金額) そのとき選択されている値を無視して、年を2008年に絞り込む。

SET演算子

SET演算子とは、複数の条件式を指定した際に、それをどう組み合わせるのか(AND、ORなど)を指定するものです。
代表的な使用例は、前回もご覧いただいたOR条件を指定するというものです。
これは、単純に複数の条件式をカンマ区切りで指定するとAND条件になるためです。
<年={2008}>, <分類名1={AV機器}> 2008年かつAV機器
<年={2008}> + <分類名1={AV機器}> 2008年またはAV機器
SET演算子には、以下の4種類があります。
SET演算子 意味
* 論理積(AND)
両方に含まれる値を検索する。
+ 論理和(OR)
どちらかに含まれる値を検索する。
除外
A-Bで、AにあってBにない値を検索する。
/ 排他的論理和(XOR)
どちらか一方にしかない値を検索する。
暗黙的SET代入演算子
SET演算子を指定する際、「+=」「-=」「*=」「/=」のように、うしろに「=」を付けた指定ができます。これにより式を簡略化できます。
たとえば、”そのとき選択されている年から、2008年を除外する”という指定をしたい場合、以下のように指定します。
<年 = 年 - {2008}>
これは、以下のように簡略化できます。
<年 -= {2008}>
指定例
指定 説明
Sum({1-$} 売上金額) そのとき選択されている値以外の売上金額を集計する。
Sum({<年={2008}, 分類名1={AV機器}>} 売上金額) 2008年かつAV機器。
Sum({<年={2008}> * <分類名1={AV機器}>} 売上金額) 2008年かつAV機器。
Sum({<年={2008}> + <分類名1={AV機器}>} 売上金額) 2008年またはAV機器。
Sum({<年=> – <年={2008}>} 売上金額) すべての年から、2008年を除外する。SET演算子には否定(NOT)はありませんが、-(除外)で代用できます。
Sum({<年={“*”}> – <年={2008}>} 売上金額) すべての年から、2008年を除外する。上とおなじです。
Sum({<年=年-{2008}>} 売上金額) そのとき選択されている年から、2008年を除外する。
Sum({<年-={2008}>} 売上金額) そのとき選択されている年から、2008年を除外する。上とおなじです。
ここまでで、SET分析の構文の詳細な説明をしてきました。
SET修飾子、SET識別子、SET演算子という3つの用語について説明してきましたが、ご理解いただけましたでしょうか。
  • SET修飾子
    SET分析の条件式。山括弧<>で囲まれた部分。条件値には検索式を指定できる。
  • SET識別子
    そのとき選択されている値を引き継ぐのか、無視するのかの指定。まずは「1」と「1-$」の指定を理解するとよい。
    • 「1」 そのとき選択されている値を無視する。
    • 「1-$」 そのとき選択されていない値を取得する。
  • SET演算子
    複数の条件式を指定したときの関係を指定する。
    *(論理積 AND)、+(論理和 OR)、-(除外)、/(排他的論理和 XOR)

SET分析で使える便利な機能

それではつづいて、SET分析の中で使える便利な機能について説明します。
具体的には、ドル記号展開と黙示的項目値定義(P関数、E関数)という2つの機能についてです。

これらは、SET分析の中で数式を指定したり、項目を指定したり、またはSET分析の中でさらにSET分析を指定したりするためのものです。
言ってみれば「<年={2008}>」という指定があったときに、「2008」という固定値の部分を、数式の指定にしたり、項目の指定にしたりする機能です。

ドル記号展開

いままで「<年={2008}>」のような指定を見てきましたが、この「2008」の部分に変数や数式を指定したい場合は、ドル記号展開を使用します。
以下のように、変数は「$()」で、数式は「$(=)」で囲んで指定します。
<項目名={$(変数名)}>
<項目名={$(=数式)}>
なお、以下の指定は前年比をもとめる際に、よく使用する式ですので覚えておくとよいでしょう。
Sum({<年={$(=Max(年)-1)}>} 売上金額)
この指定により、そのとき選択されている年から「-1」した年が選択されるため、前年の値をもとめられます。
Max関数を指定しているのは、年がなにも選択されていない場合や複数選択されている場合に、どの年を取得するのか指定するためです。(ここでは最大値を取得する)
年を一つ取得できればよいため、Min関数などに置き換えることもできます。

黙示的項目値定義

いままで「<年={2008}>」のような指定を見てきましたが、この「2008」の部分で項目を指定したい場合や、SET分析の中でさらにSET分析を指定したい場合は、黙示的項目値定義を使用します。
黙示的項目値定義には、P関数とE関数という2つの関数があります。これらの関数はSET分析専用の関数で、SET分析の中でのみ使用できます。

P関数はそのとき有効な値を取得するもので、E関数はそのとき無効な(除外された)値を取得するものです。
たとえば、以下のように指定すると、そのとき選択されていない年の売上を集計できます。
Sum({<年=E(年)>} 売上金額)
このようにE関数は使い方が明確なのですが、P関数の方はすこし説明が必要だと思います。
P関数はそのとき有効な値を取得するものですので、単体で指定しても意味がありません。
たとえば、以下の指定はなにも指定しなかったのとおなじ結果となります。
Sum({<年=P(年)>} 売上金額)
年をそのとき選択されている年に絞り込むという意味になり、これはSET分析をなにも指定しない、以下の指定とおなじ結果となります。
Sum(売上金額)
では、P関数はなにに使うかと言うと、特定の項目の条件だけを有効にしたい場合や、SET分析の中でさらにSET分析を指定したい場合など、式が複雑になるときに使用します。
指定例
指定 説明
Sum({<年=E(年)>} 売上金額) そのとき選択されていない年。
Sum({<年=P(年)>} 売上金額) そのとき選択されている年。SET分析をなにも指定しない、以下の指定とおなじ結果となります。
Sum(売上金額)
Sum({1<年=P(年)>} 売上金額) ほかの項目に対する条件は無効にして、年の絞り込みのみ有効にする。「1」の指定によりそのときに選択されている値を一旦すべて無効にした上で、年の条件のみ指定しています。
Sum({<年=P(前年)>} 売上金額) 前年の売上金額を集計する。下記(注)参照。
Sum({<得意先名=P({1<分類名1={‘AV機器’}>} 得意先名)>} 売上金額) AV機器を購入したことのある顧客(得意先)。
(注)
この式を使用するには、データロード時に以下のような計算で、前年の項目を作成しておく必要があります。
LOAD 年,
     年 - 1 as 前年
:
「Sum({<年=前年>} 売上金額)」という指定では、年が前年とおなじデータという意味になるため、結果は空(NULL値)になります。
「Sum({<年=P(前年)>} 売上金額)」と指定することで、そのとき有効な前年の値という意味になるため、たとえば年で2009年が選択されていれば2008年の値を、年で2010年が選択されていれば2009年の値を集計できます。

ここまでで、SET分析で使える便利な機能について説明をしてきました。
ドル記号展開と黙示的項目値定義(P関数、E関数)という2つの機能について説明してきましたが、ご理解いただけましたでしょうか。
  • ドル記号展開
    条件値の部分に変数や数式を指定する機能。
    • 変数 「$()」で囲んで指定する。
      <項目名={$(変数名)}>
    • 数式 「$(=)」で囲んで指定する。
      <項目名={$(=数式)}>
    • 前年比をもとめる際によく使用する式
      Sum({<年={$(=Max(年)-1)}>} 売上金額)
  • 黙示的項目値定義
    条件値の部分に項目を指定したり、SET分析の中でさらにSET分析を指定したりする機能。
    • P関数
      そのとき有効な値を取得する。
      特定の項目の条件だけを有効にしたい場合や、SET分析の中でさらにSET分析を指定したい場合などに使用する。
      Sum({1<年=P(年)>} 売上金額) 年の絞り込みのみ有効にする。
      Sum({<年=P(前年)>} 売上金額) 前年の売上金額を集計する。
      Sum({<得意先名=P({1<分類名1={'AV機器'}>} 得意先名)>} 売上金額) AV機器を購入したことのある顧客(得意先)。
    • E関数
      そのとき無効な(除外された)値を取得する。
      Sum({<年=E(年)>} 売上金額)

最後に…

今回と前回、2回にわたってSET分析について説明してきましたが、いかがだったでしょうか。
SET分析は式が複雑なため、苦手意識のある方も多いと思います。

SET分析についてよく分からなくなってしまった場合は、基本に立ち返り、そもそもSET分析とはどういう機能だったのか思い出してみてください。
以下は、ヘルプからの引用です。

set 分析を使用すると、現在の選択で定義された通常のセットとは異なるデータ値のセット (またはグループ) を定義できます。

QlikViewやQlik Senseでは、なにか値を選択するとその値に絞り込まれます。しかしSET分析を使用すると、いま選択されている値とは別の条件で値を絞り込めます。

そのため、SET分析は前年比をもとめる(選択された年ではなく、その一年前の値を集計する)場合や、選択された値を無視して常に総合計を表示する(SET演算子の{1}の指定)場合に使われます。

冒頭でも紹介いたしましたが、今回の記事で使用した例文をまとめたQlik Senseのアプリを用意しましたので、ぜひダウンロードして動作を確認してみてください。
set-analysis-2.zip

お疲れ様でした。

set 分析および set 数式 窶鈀 QlikView
https://help.qlik.com/ja-JP/qlikview/12.0/Subsystems/Client/Content/ChartFunctions/SetAnalysis/set-analysis-expressions.htm

set 分析および set 数式 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/2.2/Subsystems/Hub/Content/ChartFunctions/SetAnalysis/set-analysis-expressions.htm

検索 窶鈀 QlikView
https://help.qlik.com/ja-JP/qlikview/12.0/Subsystems/Client/Content/Text_search_and_numeric_search.htm

リスト検索 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/3.0/Subsystems/Hub/Content/Search/data-search.htm

データの可視化 Data-ink Ratioとは?簡潔で分かりやすいグラフを描くためのコツ

$
0
0

グラフを分かりやすくするための大原則としてよく、”余分な要素をできるだけ排除して、シンプルにせよ”といったことが言われます。
しかし、”頭では分かっているが、具体的にどうすればよいか分からない”という方や、”普段なんとなくシンプルになるようにしている”という方も多いのではないでしょうか。

そんな方のために、以下の記事をご紹介します。
Data looks better naked
http://www.darkhorseanalytics.com/blog/data-looks-better-naked
見難いグラフを改善していく過程が、GIFアニメ(スライド版もあり)にまとめられているため、数十秒でポイントを押さえられます。
説明文を飛ばして、アニメーションのところだけご覧いただいても十分理解できますので、英語が苦手な方もぜひ見てみてください。


いかがでしたか。
ページの下部には、Speaker Deckのスライドも埋め込まれています。スライドの中央より右側をクリックするとページをめくれます。

棒グラフ編の他にテーブル編円グラフ編地図編がありますが、いずれも非常に分かりやすい内容でオススメです。

では、ここからはこのページの内容を、わたしなりに解説していきます。
まず、ページ上部の英語の解説を見てみると、”Edward Tufte”、”Data-ink”といった単語が出てきます。
まずは、これらの単語の意味から説明していきます。

Data-ink Ratioとは

Data-ink Ratio(データインク レシオ=データインク比)は、可視化の権威と言われるEdward Tufte(エドワード・タフテ)氏が提唱した用語で、その意図は”よいグラフを描くには、余分なものをすべて削除すべき”という点にあります。

“比”とあるように、ある値とある値の割り算でもとめられる比率なのですが、具体的な計算式は以下のようになります。
データそのものをあらわすために使われたインクの量 / グラフ全体で使われたインクの量

この比率が高いほどよいグラフということになります。つまり、絶対に削除できないデータそのものを残して、あとはできるだけ削除した方がよいということになります。
たとえば、棒グラフの棒自体はデータインク、影の効果などはノン・データインクであり、ノン・データインクは少なければ少ないほどよいということです。

まとめてしまうと簡単なのですが、あえて”インクの量”という言葉を選んだところに着目してみると、たとえば以下のようなことが言えます。
・背景は白にする。(背景を塗りつぶすようなことはしない。)
・目立たなくてよい罫線は、細い線や薄い色にするか、または削除する。
・文字も同様で、ラベルやタイトルなどのデータと直接関係ないものは、なるべく薄い色にするか削除する。

Data-ink Ratioの説明は以上です。
それでは、ここからはあらためて棒グラフ編、テーブル編、円グラフ編、地図編について解説していきます。
基本的な考え方は共通しているため、棒グラフ編を重点的に解説していきます。


棒グラフ編

Data looks better naked
http://www.darkhorseanalytics.com/blog/data-looks-better-naked

Qlik Sense版の良い例、悪い例を作成してみましたので、見てみてください。
data-ink-ratio-101
Qlik Senseでは、背景画像や影の効果などの装飾はもとから設定できないため、悪い例の方も見やすい方ではありますが、それでも良い例の方が簡潔だと思います。

Qlik Senseのアプリ(qvfファイル)も公開いたしますので、ぜひQlik Senseで開いて見てみてください。
data-ink-ratio.zip
Zip形式ですので、ダウンロード後解凍してください。

棒グラフ編の内容を、チェックリスト形式でまとめると以下のようになります。
  1. 背景は削除する。(Remove backgrounds)
    背景色や背景画像などは削除し、背景は白にする。
  2. 余分なラベルは削除する。(Remove redundant labels)
    グラフタイトル、X軸とY軸のタイトル、凡例などの中で余分なものは削除する。また、長いタイトルはなるべく短くする。
  3. 枠線(グラフを囲む線)は削除する。(Remove borders)
  4. 使用する色の数を減らす。(Reduce colors)
    棒グラフでは棒の色分けはしない。ただし最大値を赤色にするなどのハイライト表示はOK。
  5. 影や3Dなどの特殊効果は削除する。(Remove special effects)
  6. 文字の太字は使わない。(Remove bolding)
  7. ラベルは薄い色にする。(Lighten labels)
    たとえばX軸のラベルは普通の文字、それ以外のラベルは薄い色(灰色など)にする。
  8. 罫線は薄い色(灰色など)にするか、または削除する。(Lighten lines Or Remove lines)
  9. グラフ上に直接値を表示する。(Direct label)
    Y軸の数値は削除して、棒グラフ上に直接値を表示する。
このうち「2.余分なラベルは削除する」と「4.使用する色の数を減らす」については、すこし説明を追加させてください。

2.余分なラベルは削除する。
先ほどの悪い例に、コメントを入れてみましたのでご覧ください。
data-ink-ratio-102
X軸タイトルに地区名とありますが、「関東」や「近畿」が地区だということは明らかです。このように何の値か明らかな場合は、タイトルは削除できます。
逆に何の値か分かりにくい場合は、タイトルを残した方がいいでしょう。たとえば、散布図ではX軸、Y軸タイトルを付けた方がいいでしょうし、棒グラフでも度数分布などの場合はX軸タイトルを付けた方がいいでしょう。

Qlik Sense特有の注意事項
Qlik Senseのスマートサーチ機能では、グラフタイトルも検索対象となります。
そのため、説明的なグラフタイトルが必ずしも無駄になる訳ではありません。
data-ink-ratio-103
4.使用する色の数を減らす。
棒グラフの意味のない色分けはなくし、一色にします。

Qlik SenseとQlikView特有の注意事項
Qlik SenseやQlikViewでは、あえて棒グラフを色分けする場合があります。
固定色の機能を使用すると、複数のグラフでおなじ値にはおなじ色を割り当てられます。
たとえば、下図のように棒グラフと折れ線グラフで、地区の色を揃えたい場合にあえて、棒グラフの方も色分けする場合があります。
data-ink-ratio-104
この例では、数値の大きい順に並べ替え、グラフタイトルも統合することで、さらに簡潔にできます。
色を揃えることで、折れ線グラフの凡例も削除できるため(棒グラフが凡例の役割を果たしています)、非常にすっきりします。
data-ink-ratio-105

固定色は、以下の場所から設定できます。
Qlik Sense
画面右側のプロパティパネル[スタイル]→[色と凡例]→[固定色]
data-ink-ratio-106
QlikView
チャートプロパティウィンドウ[色]タブ→[固定色]
data-ink-ratio-107

棒グラフ編の説明は以上です。
ちなみに、棒グラフ編のページ最後で紹介されているのは、サン・テグジュペリ氏の名言です。可視化のことを語る際に、よく引き合いに出される言葉ですね。


テーブル編

Clear Off The Table
http://www.darkhorseanalytics.com/blog/clear-off-the-table

棒グラフ編と重複する部分も多いため、テーブル編特有の内容のみまとめます。
  1. 左揃え右揃えを設定する。(Left Align Text、Right Align Numbers、Align Titles with Data)
    文字は左揃え、数値や日付は右揃えにする。タイトルもデータとおなじように整列する。
  2. 数値の桁をあわせる。(Use Consistent Precision)
    たとえば、1.2、10、1.23といった表記が一つの列で混在しないように、小数の桁を揃えます。
  3. 数値の桁数を減らす。(Round the Numbers、Round the Numbers More)
    Moreとあるように、数値の桁数はなるべく少なくすることを推奨しているようです。
    この例では数値を千単位で表示して、整数部分が3桁以内におさまるようにしています。
  4. 行間を空け、値の重複を省く(Put Whitespace to Work、Remove Repetition)
    罫線ではなく、行間と値の重複を省くことでグループをあらわしています。
途中で出てくる「No More Calibri」のCalibriはWindowsに同梱されるフォントのことです。作者の方はこのフォントがあまり好きでないようです。

Qlik Senseと、QlikViewのサンプルを作成しましたので見てみてください。
Qlik SenseやQlikViewのテーブルは、初期設定でもおおむね上記の注意事項に沿ったものになります。

Qlik Senseのテーブル
data-ink-ratio-108
QlikViewのストレートテーブル
data-ink-ratio-109

最後の「値の重複を省く」について補足いたします。
テーブル編では、Qlik Senseで言う軸項目について、おなじ値がつづく場合は重複を省いて最初の一件のみ表示しています。
たしかに、報告書などで使う静的なテーブルでは、値の重複を省いた方が見やすいと思います。

しかし、Qlik SenseやQlikViewなどのBIツールでは、テーブルはただ見るだけでなく、Excel形式で出力したり、値をクリックしてその値に絞り込んだりします。
そのため、あえて重複を省かずにそのまま表示することが多いように思います。
※そもそもQlik SenseやQlikViewには、値の重複を省く機能はありません。

特にExcel形式で出力して二次加工するような使い方を想定している場合は、値の重複は省かずにそのままの明細表を、利用者に提供した方がよいでしょう。


円グラフ編

Salvaging the Pie
http://www.darkhorseanalytics.com/blog/salvaging-the-pie
個人的には一番のオススメです。
また、これが気に入った方は、当ブログ内のこちらの記事も気に入ると思いますのでぜひご覧ください。


地図編

Data Looks Better Naked: Maps Edition
http://www.darkhorseanalytics.com/blog/data-looks-better-naked-maps-edition
地図編です。考え方は棒グラフ編やテーブル編とほぼおなじです。
地図特有のものとしては、グラデーションをうまく使うという点と、グラデーションを使う際は無段階のグラデーションではなく、数段階のグラデーションにする(この例では6段階)という点が挙げられます。


最後に…

いかがだったでしょうか。
今回の記事では、Data-ink Ratioの考え方と実践的なサンプルをご覧いただきました。
データの可視化は、頭では分かっていても実践しにくいものですので、こういった分かりやすいサンプルを目で見て学べるのは非常に助かります。
またなにかよい記事を見つけましたら、このブログで紹介したいと思います。

お疲れ様でした。


作者の方の、Speaker Deckのページです。上記4つのスライドをまとめて見たいときはこちらが便利です。
Presentations by Joey Cherdarchuk // Speaker Deck
https://speakerdeck.com/cherdarchuk

Data-ink Ratioの説明をまとめる上で参考にしたページの中から、おもなものを掲載します。

Aggr関数再入門(Aggr関数の詳細と使用例)

$
0
0

以前、SET分析について解説しましたが、今回はSET分析と並んで難しいと言われることが多い、Aggr関数について解説いたします。

Aggr関数は、QlikViewやQlik Senseの関数の一種なのですが、Sum関数やAvg関数などの集計関数とはすこし毛色の違う関数です。
そのため、使い慣れるまではイメージがわきにくく、SET分析とおなじように難しい機能の一つとして捉えられているようです。

この記事では、Aggr関数について裏側の動作から詳しく解説していきますので、いままでAggr関数を使ったことがないという方や、苦手意識を持っていた方は、ぜひご覧ください。SET分析ほど難しくありませんのでご安心ください。

Aggr関数とは

Aggr関数の語源は、Aggregate(アグリゲート)からきています。
Aggregateは集計する、集約するといった意味ですが、これはどういうことなのでしょうか。まずはマニュアルを見てみましょう。
以下は、Qlik Senseヘルプの該当箇所からの引用です。
なお、Aggr関数はQlikViewでもQlik Senseでもおなじように使用できます。以下はQlik Senseヘルプからの引用ですが、QlikViewヘルプにもおなじことが書かれています。
Aggr – チャート関数 窶鈀 Qlik Sense
Aggr 窶鈀 QlikView

Aggr() は、指定された軸上で計算された数式の値の配列を返します。

重要なポイントが2点書かれています。
・Aggr関数は指定した軸項目ごとに値を集計します。
・Aggr関数は結果として複数の値を返します。(配列とあるのは、複数の値という意味です。)
Aggr関数は指定した軸項目ごとに値を集計し、その結果を複数(軸項目の値の数だけ)返すということですね。

どういうことか簡単な例を使って説明します。
まず、Aggr関数の基本的な構文は以下のようになります。
Aggr関数は”指定した軸項目ごとに値を集計”しますので、軸項目の名前と値を集計するための数式を指定します。

Aggr(数式, 軸項目名)

たとえば以下のように指定すると、地区名ごとに売上金額を集計し、その結果(の配列)を返します。
Aggr(Sum(売上金額), 地区名)

これは言ってみれば、下図のようなチャートを作成して値を集計しているのとおなじことです。
aggr-function-101
事実、Aggr関数を使用すると内部的に仮想のテーブルが作成されています。
以下はヘルプからの引用です。

Sum、Min、Avgなどの基本的な集計関数では数値が1つ返されるのに対し、Aggr()関数は、一時的な段階の結果セット(仮想テーブル)を作成することと比較することができ


Aggr関数はこのように、普段チャートに軸とメジャーを指定してやっていることを、一つの関数の中でおこないます。
aggr-function-102
では、なぜチャートでできることを関数でおこなう必要があるかというと、こちらもヘルプからの引用ですが以下をご覧ください。

高度な集計では、Aggr 関数の結果の配列をネストされる集計への入力として使用し、別の集計関数で Aggr 関数を囲みます。

Aggr関数を使用することで、集計関数をネスト(入れ子に)できるということです。
たとえば、集計(Sum)したものの最大値(Max)をもとめることができます。具体的には地区ごとに売上金額を集計して、その中から最大のものをもとめるといったことです。

Aggr(Sum(売上金額), 地区名)) → 1337, 1413, 334, 413, 631, 1824, 901, 1086
Max(Aggr(Sum(売上金額), 地区名)) → 1824


動作の確認

では簡単なサンプルデータを使って、Aggr関数の動作を検証してみましょう。
完成版のアプリも公開しておきますが、実際に操作した方が理解が深まると思いますので、ぜひ実際に操作してみてください。
aggr-function.zip

新しくアプリを作成します。
アプリの名前はここでは「aggr-function-1」としておきます。
aggr-function-201
aggr-function-202
aggr-function-203
今回は簡単なサンプルデータをロードスクリプトで作成するため、右側の「データロードエディタ」を選択してください。
aggr-function-204
以下のロードスクリプトを貼り付けてください。
Load RowNo() as 連番,
     Mod(RowNo(), 3) as 軸,
     Floor(Rand() * 100) as 数値,
     1 as 定数
AutoGenerate 10;
aggr-function-205このロードスクリプトでは、「AutoGenerate」を使用して10件のデータを作成しています。
RowNo関数やRand関数を使用して、連番の項目やランダムな値を作成しています。

ロードスクリプトを貼り付けたら、「データのロード」を実行してください。
aggr-function-206
aggr-function-207
データのロードが完了したら、アプリ概要を開いてシートを作成します。
aggr-function-208
aggr-function-209
シートの名前は任意で構いませんので、「新しいシート」のままEnterキーを押してください。
aggr-function-210
まず、作成したサンプルデータを確認してみましょう。
画面左側の「チャート」パネルから「テーブル」を、ドラッグ&ドロップしてください。
aggr-function-211
「項目」パネルから「連番」を、テーブルの上にドラッグ&ドロップしてください。
aggr-function-212
「連番」は軸として追加するため、「”連番を追加”」を選択します。
aggr-function-213「連番」が追加できたら、おなじようにして「軸」と「定数」の項目もテーブルに追加してください。

「項目」パネルから「数値」を、テーブルの上にドラッグ&ドロップしてください。
aggr-function-214
「数値」はメジャーとして追加するため、「メジャーとして追加」から「Sum([数値])」を選択してください。
aggr-function-215
テーブルが作成できました。
aggr-function-216作成したサンプルデータが、どのような値を持つか確認しておいてください。
連番:1から10までの連番の項目です。
軸:1、2、0、1、2、0…という繰り返しの値を持つ項目です。Mod関数で剰余(割り算の余り)をもとめると、こういった繰り返しの値が作れます。
定数:常に1という値を持つ項目です。
数値:ランダムな数値です。Rand関数を使用してランダムな値を生成しているため、毎回結果は異なります。上の画面キャプチャと結果が違っていても気にしないでください。

値の確認用にもう一つテーブルを追加します。
いま作成したテーブルをコピーして、貼り付けてください。
aggr-function-217aggr-function-218
テーブルを貼り付けたら、「連番」と「定数」の項目を削除します。
aggr-function-219aggr-function-220
「軸」ごとの集計値を確認しておいてください。
aggr-function-221「軸」は0、1、2の3つの値があり、「Sum([数値])」の値はそれぞれ236、166、243です。(この値は人によって異なります。)

以上で事前準備は完了です。

では、Aggr関数の動作を確認していきます。
「チャート」パネルから「テキストと画像」を追加してください。
aggr-function-222
画面右側の「プロパティ」パネルで「メジャーを追加」を選択します。
aggr-function-223
以下の数式を指定してください。
Aggr(Sum(数値), 軸)
aggr-function-224この例では「軸」ごとに「数値」が集計されるため、236、166、243という3つの値が返されるはずです。
しかし、そのままでは結果はなにも表示されません。
aggr-function-225これがなぜかと言うと、Qlik SenseやQlikViewでは、一つの値しか受け取れないところ(今回のテキストと画像など)に、複数の値を渡すと結果はなにも表示されないためです。

もう少し厳密に言うと、一つの値しか受け取れないところでは自動的にOnly関数が適用されます。
今回の指定は、以下の指定とおなじ意味になります。
Only(Aggr(Sum(数値), 軸))
Only関数では値が複数ある場合、結果は空(Null値)になりますので、今回のように結果はなにも表示されません。

では逆に、結果が一つであれば表示されることを確認してみます。
今回のサンプルデータには「定数」という、常に値が「1」である項目を用意してあります。
Aggr関数の軸項目を「定数」の項目に書き換えてください。
Aggr(Sum(数値), 定数)
aggr-function-226「定数」の値は常に「1」であるため、結果として総合計である「645」が表示されます。
総合計を表示するのであれば、単純に「Sum(数値)」と指定すればいいため、この指定に実用性はありません。
しかし、値が一つであれば表示されるということは、ご理解いただけたかと思います。

結果を確認したら、軸項目を「軸」の項目に戻しておいてください。

それでは、他の指定も試してみましょう。
Aggr関数の結果を確認したい場合、Concat関数が便利です。
Aggr関数の外側に、以下のようにConcat関数の指定を加えてください。
Concat(Aggr(Sum(数値), 軸), ', ')
aggr-function-227Concat関数は複数の値を連結するものです。今回は3つの値を,(カンマ)で区切って表示できました。
このようにConcat関数を使用すると、Aggr関数の動作がよく分かります。

では、Concat関数の指定をSumやAvgなどの一般的な集計関数に置き換えてみましょう。
まず実用性はまったくありませんが、Sum関数を指定してみてください。
Sum(Aggr(Sum(数値), 軸))
aggr-function-228これは合計したものをさらに合計しますので、総合計がもとめられます。「Sum(数値)」と指定するのとおなじですので、前述のとおり実用性はありません。

では、Avg関数、Min関数、Max関数なども試してみてください。
Avg(Aggr(Sum(数値), 軸))
aggr-function-229
Min(Aggr(Sum(数値), 軸))
aggr-function-230
Max(Aggr(Sum(数値), 軸))
aggr-function-231
ここまでで、Aggr関数の動作について詳しく見てきましたが、いかがだったでしょうか。
途中でご覧いただいたように、つまずいたときはConcat関数で値を確認してみるのがお勧めです。
Concat(Aggr関数, 区切り文字)
区切り文字は,(カンマ)などが分かりやすいと思いますが、Chr(13)で改行コードを指定するのもいいでしょう。
Concat(Aggr関数, ', ') カンマ
Concat(Aggr関数, Chr(13)) 改行コード


使用例

ここからは、より実践的な使用例について見ていきましょう。
使用例については、開発元が作成したテクニカルブリーフが参考になります。(英語)
QlikView Technical Brief – AGGR.docx | Qlik Community

こちらは完成版のアプリでご確認ください。
以下のZipファイルをダウンロードしてください。
Zipファイルを解凍し、「aggr-function-2.qvf」をQlik Senseで開いてください。
aggr-function.zip

使用例1 集計関数のネスト

1つ目のシートでは、右側のテーブルで4つAggr関数を使用しています。
aggr-function-301
それでは、各Aggr関数の指定について簡単に解説していきます。
Max(Aggr(Count([売上金額]), 分類名1, 分類名2))
先ほどもでてきたMax関数の例です。商品の分類ごとに最大値をもとめています。たとえば「AV機器」の中では「オーディオ」の「2328」が最大値、「キッチン家電」の中では「コーヒーメーカー」の「1847」が最大値です。

Sum(If((Aggr(Count([売上金額]), 分類名1, 分類名2)) >= 1000, 1, 0))
Sum関数とIf関数を組み合わせて、値が1000以上のものの件数を表示しています。たとえば「AV機器」の中では、値が1000以上のものは3つあります。(HDD・DVDレコーダー、オーディオ、テレビの3つ)

指定が長くて分かりにくい場合は、Aggr関数の部分を省略した以下の形で考えてみてください。
Sum(If(Aggr関数) >= 1000, 1, 0))
If関数により、Aggr関数の結果が1000以上だったら「1」、そうでなければ「0」を設定し、Sum関数で集計しています。
このように、ある条件を満たすものの件数を数えたいとき、0と1をセットしてSum関数で集計するというのは、よく使用する小技ですので覚えておくとよいでしょう。

FirstSortedValue(分類名2, -Aggr(Count([売上金額]), 分類名1, 分類名2))
FirstSortedValue関数は、任意の基準で並べ替えたときの最初の値を返します。
さきほどのMax関数の例では最大値そのものを表示していましたが、最大値をもつ商品を表示したい場合に使用します。
たとえば「AV機器」の中では「オーディオ」の「2328」が最大値、「キッチン家電」の中では「コーヒーメーカー」の「1847」が最大値ですが、最大値そのもの(2328などの数値)ではなく、「オーディオ」「コーヒーメーカー」などの商品名の方を表示します。

こちらも、Aggr関数の部分を省略した以下の形で考えてみましょう。
FirstSortedValue(分類名2, -Aggr関数)
Aggr関数の前に-(マイナス)を着けて順位を逆転させています。LastSortedValueといった関数はないため、最大値を基準にしたい場合は-(マイナス)を着けて順位を逆転させます。
これにより、Aggr関数の結果が最大のときの「分類名2」の値をもとめています。

Concat(If(Aggr(Rank(Count([売上金額])), 分類名1, 分類名2) <= 3, 分類名2), ', ')
Concat関数やRank関数を組み合わせることで、順位が3位以内(上位3位)の商品のリストを作っています。

まず、Aggr関数の中の指定を見てみましょう。
Aggr(Rank(Count([売上金額])), 分類名1, 分類名2)
Rank関数により順位を作成しています。

Aggr関数の部分を省略すると、以下のようになります。
Concat(If(Aggr関数 <= 3, 分類名2), ', ')
Aggr関数の結果(順位)が3以下だったら、「分類名2」を返します。
されにこれをConcat関数で連結することで、3位以内のもののリストを作成しています。

ほかにもいくつか使用例を入れてありますので、2つ目以降のシートも見てみてください。

使用例2 集計関数のネスト(KPI編)

2つ目のシートでは、集計関数のネストを「KPI」や「テキストと画像」で使用しています。
aggr-function-302Aggr関数の中身自体は1つ目のシートとほぼ同様ですが、KPIのようにデータ全体から1つの値を計算したい場合、Aggr関数を使う機会が多くなります。
1つの数式の中で計算を完結する必要があるため、必然的にAggr関数を使う機会も多くなるということですね。

使用例3 計算軸の作成

3つ目のシートでは、度数分布を作成しています。
aggr-function-303このように、チャートの軸(X軸)を計算によって作成するというのも、Aggr関数の代表的な使用例です。
4つ目のシートは、度数分布でX軸を5単位にクラス分けした例です。
aggr-function-304

使用例4 プロパティの設定

5つ目のシートでは、基準線の計算にAggr関数を使用しています。
aggr-function-305単純にAvg関数で平均値をもとめると、明細の平均値となるため基準線としては使えません。ここでは地区ごとに集計したものの平均値をもとめるために、Aggr関数を使用しています。
考え方としてはKPIのときとおなじです。1つの数式の中で計算を完結するためにAggr関数を使用しています。

なお、基準線は「拡張機能」→「基準線」→「基準線を追加」から設定できます。
aggr-function-306


注意事項

それでは、最後に注意事項をまとめて終わりにしたいと思います。

軸項目に数式は指定できない

Aggr関数の軸項目名には単純な項目名を指定する必要があります。数式は指定できません。
Aggr(数式, 軸項目名) ○
Aggr(数式, 軸を作成するための数式) ×
以下はヘルプからの引用です。

制限事項:
Aggr()関数の各軸は、単一の項目でなければならず、数式(計算軸)にすることはできません。

軸項目を複数指定することは可能です。
たとえば、以下のように指定すると、地区名ごと、都道府県名ごとに売上金額を集計します。

Aggr(Sum(売上金額), 地区名, 都道府県名)

パフォーマンスに注意する

前述のとおり、Aggr関数を使用すると内部的に仮想のテーブルが作成されるため、データ量が多い場合などはパフォーマンスが低下する可能性があります。
データ量が多い場合などは、以下のことを検討してください。

単純な計算に置き換えられないか検討する

たとえば、平均値は集計値を件数で割ればもとめられる場合があります。以下の3つの数式はすべておなじ結果になる可能性があります。
Avg(Aggr(Sum(売上金額), 都道府県名))
Sum(売上金額) / Count(DISTINCT 都道府県名)
Sum(売上金額) / 47
必ずしもおなじ結果になる訳ではないという点に注意してください。この例では売上を1件も上げていない都道府県があった場合、結果が違ってくる可能性があります。

ロードスクリプトで、あらかじめ計算しておくことを検討する

パフォーマンスの低下が著しいようであれば、ロードスクリプト側であらかじめ事前集計しておくことも検討してください。
その際は、Residentによるテーブルの再読み込みや、Group Byによるグループ化をうまく使ってください。
売上:
Load 商品名,
     得意先番号,
     得意先名,
     売上金額,
        :
From ...;

得意先別売上集計:
Load Sum(売上金額) as 得意先別売上集計,  //Sum関数による集計
     得意先番号
Resident 売上  //Residentによるテーブルの再読み込み
Group By 得意先番号;  //Group Byによるグループ化

新バージョンでは構文が拡張されている

Qlik Sense 2.2、QlikView 12から構文が拡張され、Aggr関数の結果の並び順を制御できるようになりました。
わたしは、まだ新しい構文を使う必要性に迫られたことがないため、利点を実感できていないのですが、構文が拡張されたことは認識しておくとよいでしょう。
なお、QlikViewの方は、まだヘルプに反映されていないので注意してください。
詳細は、コミュニティの以下のブログ記事が参考になります。(英語)
Qlik Design Blog : The sortable Aggr function i... | Qlik Community


最後に...

今回はAggr関数についてご覧いただきましたが、いかがだったでしょうか。
慣れるまでは難しいかもしれませんが、Aggr関数の動作はお分かりいただけたかと思います。
そこから先は、ヘルプなどから例文を探してきてアレンジする作業になりますので、記事の中で複雑な数式も出てきたと思いますが、必要以上に難しく考えることなく、まずはコピペで活用するところからはじめてみてください。

式が複雑になる場合は、一旦式を分解してConcat関数で動作を確認しながら進めていけばいい訳ですし、また、式があまりにも複雑でメンテナンス性が著しく低下するような場合は、ロードスクリプト側で事前集計しておくという方法もあります。
ぜひ難しくとらえずに、便利な機能の一つとして活用してみてください。

お疲れ様でした。


Aggr - チャート関数 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/ChartFunctions/aggr.htm
Qlik Senseのヘルプです。

Aggr 窶鈀 QlikView
https://help.qlik.com/ja-JP/qlikview/12.0/Subsystems/Client/Content/ChartFunctions/aggr.htm
QlikViewのヘルプです。Qlik Sense 2.2で追加された拡張構文はQlikView 12でも使用できますが、ヘルプにはまだ反映されていないようです。

QlikView Technical Brief - AGGR.docx | Qlik Community
https://community.qlik.com/docs/DOC-3857
テクニカルブリーフです。

Qlik Design Blog : AGGR... | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2013/03/07/aggr
上記のテクニカルブリーフに関連するブログ記事です。

QlikView App: Aggr() | Qlik Community
https://community.qlik.com/docs/DOC-4279
上記のテクニカルブリーフに関連するドキュメント(QVWファイル)です。

Qlik Design Blog : A Historical Odyssey: QlikVi... | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2013/05/06/a-historical-odyssey-qlikview-7
QlikViewバージョン7の回顧録です。Aggr関数はQlikView 7で追加された新機能だったようですね。

Qlik Design Blog : The sortable Aggr function i... | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2016/02/26/the-sortable-aggr-is-finally-here
Qlik Sense 2.2、QlikView 12でAggr関数の構文が拡張されたことに関する、ブログ記事です。

以下、この記事を書く上で参考にしたページをまとめておきます。
Qlik Design Blog : When should the Aggr() funct... | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2013/03/11/when-should-the-aggr-function-not-be-used

Qlik Design Blog : Pitfalls of the Aggr function | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2015/10/05/pitfalls-of-the-aggr-function

計算軸 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/Dimensions/calculated-dimensions.htm

ネストされた集計関数 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/ChartFunctions/NestedAggregations/nested-aggregations.htm

QlikViewやQlik Senseで使えるマスターカレンダー(日本の祝日対応版)を公開しました

$
0
0

QlikViewやQlik Senseで使えるマスターカレンダーをご用意しましたので、ぜひご利用ください。

QlikViewやQlik Senseでカレンダーを自動生成するサンプルスクリプトはよく見かけますが、日本の祝日に対応したものがなかったため作成してみました。
カレンダーを自動生成するスクリプトに加え、「国民の祝日に関する法律」が制定された1948年から、2099年までの作成済みデータ(CSVファイル)も同梱しています。
振替休日や国民の休日にも対応した完全版ですので、ぜひダウンロードして使ってみてください。

2019年2月12日更新
祝日法の改正に対応しました。
天皇の即位の日の追加、天皇誕生日の変更、東京オリンピックなどのための特別措置といった、最新の祝日法に対応しています。
祝日法の改正については以下のページで確認しています。
国民の祝日について – 内閣府祝日法の改正

ダウンロード

ファイルはこちらです。ダウンロードしてご自由にお使いください。
master-calendar.zip 最新版(2019年2月12日作成)
master-calendar-20161215 旧版(2016年12月15日作成)

上記のZipファイルには以下の3種類、計6個のファイルが含まれています。
「holidays」ではじまるファイルは祝日のみのデータ、「calendar」ではじまるファイルは平日を含むカレンダーのデータです。
  • csv
    CSVファイルです。「国民の祝日に関する法律」が制定された1948年から2099年までのデータが含まれています。
    ファイル: holidays.csv(祝日のみ)、calendar.csv(平日を含むカレンダー)
  • qvs
    QlikViewやQlik Senseで使える自動生成用のスクリプトです。拡張子がqvsとなっていますが中身はテキストファイルです。
    ファイル: holidays.qvs(祝日のみ)、calendar.qvs(平日を含むカレンダー)
  • qvw_qvf
    QlikViewのドキュメント、およびQlik Senseのアプリです。祝日のデータと、平日を含むカレンダーのデータを両方取り込んであり、結果の確認用にごく簡単なテーブルなどを配置してあります。
    ファイル:calendar.qvw(QlikViewのドキュメント)、calendar.qvf(Qlik Senseのアプリ)

祝日の計算について

祝日の計算については、以下のJavaScriptのライブラリを参考にさせていただきました。
GitHub – osamutake/japanese-holidays-js: Provides utilities to manipulate japanese holidays.
https://github.com/osamutake/japanese-holidays-js

また、祝日の定義や結果の確認には、Wikipediaの各ページを参考にいたしました。
国民の祝日春分秋分振替休日国民の休日

スクリプトの使い方

スクリプトを使用するには、qvsファイルの内容をロードスクリプトに貼り付けて使用するか、またはInclude文によりqvsファイルを読み込んでください。

日付の指定方法

holidays.qvsとcalendar.qvsは、いずれも作成する日付の範囲を指定できます。
  • holidays.qvs
    スクリプトよりも前に以下のように指定すると、作成する日付の範囲を指定できます。
    SET StartYear = 1948;
    SET EndYear = 2099;
    
    なにも指定しなかった場合は、今年(実行したときの日付)一年分のデータを作成します。
  • calendar.qvs
    スクリプトよりも前に以下のように指定すると、作成する日付の範囲を指定できます。
    SET StartDate = '1948/07/20';
    SET EndYear = '2099/12/31';
    
    なにも指定しなかった場合は、今月(実行したときの日付)一ヶ月分のデータを作成します。

使用例

//祝日生成スクリプトの読み込み
SET StartYear = 1948;
SET EndYear = 2099;

$(Include=C:\Users\qlik\Desktop\holidays.qvs); //注1
RENAME Field HolidayDate to Date; //注2

//カレンダー生成スクリプトの読み込み
SET StartDate =  '1948/07/20';
SET EndDate = '2099/12/31';

$(Include=C:\Users\qlik\Desktop\calendar.qvs); //注1
注1:qvsファイルのディレクトリは適宜変更してください。Qlik Senseをお使いの方は、さらに下の「Qlik SenseでのInclude文」もご確認ください。
注2:祝日テーブルでは日付の項目名を「HolidayDate」に、カレンダーテーブルでは日付の項目名を「Date」という名前にしています。
これらを関連付けたい場合は、RENAME文などで項目名を変更し、おなじ名前にしてください。

Qlik SenseでのInclude文

Qlik Senseではセキュリティの都合により、あらかじめ指定したディレクトリにあるファイルしか読み込めないようになっています。
Include文を使用するには、ファイルの置き場所をあらかじめデータ接続として定義しておく必要があります。
[接続の新規作成]→[フォルダ]を選択します。
master-calendar-101
パスと使用する名前を指定します。ここではパスに「.」を指定してカレントディレクトリ(qvfファイルとおなじディレクトリ、既定ではC:\Users\<ユーザー名>\Documents\Qlik\Sense\Apps)を指定しています。
master-calendar-102
定義した名前を使用して、Include文を指定します。
$(Include=lib://CurrentDir/holidays.qvs);
master-calendar-103

マスターカレンダーとは?なぜカレンダーのデータが必要なのか?

今回カレンダーのデータを公開しましたが、そもそもなぜカレンダーのデータが必要なのかというと、おもに以下の2つの理由が挙げられます。
  • 必要な日付データをすべて用意しておくため
  • 企業独自のルールや、日本独自の祝日の計算を簡単におこなうため
これらは、QlikViewやQlik Senseに限らず、ほかのソフトウェアにもある課題かと思いますが、QlikViewやQlik SenseはインメモリBIツールということもあり、複雑な日付演算を都度おこなうよりも、汎用的なカレンダーを作成してメモリに取り込んでおくという手法をよく採用します。
この汎用的なカレンダーのことを”マスターカレンダー”と呼びます。

マスターカレンダーという名前は正式な機能名などではないのですが、開発元のコミュニティサイトなどにも出てきますし、QlikViewやQlik Senseの技術者の間では普通に通じる単語です。
言ってみれば、マスターカレンダーは開発のベストプラクティス、またはデザインパターンといった位置付けのものです。

明細データから日付の範囲を自動取得する方法

カレンダーの開始日、終了日を固定で指定するのではなく、明細のデータにあわせて自動取得したい場合があります。
たとえば、データベースに売上明細のテーブルがあったときに、これに含まれる日付の範囲でカレンダーを自動生成するということです。
その場合は以下のサンプルを参考にしてください。
売上明細:
LOAD ...
FROM ...;

//Residentにより売上明細を再読み込みし、日付の最小値と最大値を取得します。
StartEndDate:
LOAD Min(日付) AS StartDate,
     Max(日付) AS EndDate
Resident 売上明細;

//Peek関数を使用して、最小値と最大値を変数に格納します。
LET StartDate =Peek('StartDate');
LET EndDate =Peek('EndDate');
LET Days = EndDate - StartDate + 1;

DROP Table StartEndDate;

Calendar:
LOAD Date('$(StartDate)' + RecNo() - 1, 'YYYY/MM/DD') as 日付
:
AutoGenerate Days;

その他の関連機能

マスターカレンダーの話からは逸れますが、Qlik Senseにはカレンダーに関する機能がいくつかありますので、ご紹介いたします。

自動取得項目(Declare文、Derive文)

Qlik Senseでは、日付の項目を取り込むと自動的に年、月、日などの項目が作成されます。
詳細はヘルプの以下のページをご参照ください。
自動取得項目 窶鈀 Qlik Sense

自動的にDeclare文とDerive文が定義されています。これにより、1つの日付から年、月、日などの項目が自動生成されます。
Declare文を編集することで、自動生成される項目名を変更したり、独自の項目を追加したりできます。
master-calendar-201
Year、Monthなどの項目が自動生成されています。
master-calendar-202

タイムアウェアチャート(連続スケール)

Qlik Sense 3.0の新機能にタイムアウェアチャートというものがあります。
これは、折れ線グラフなどでX軸を日付の項目にすると、自動的に見やすく表示してくれる機能です。
詳細はヘルプの以下のページをご参照ください。
タイムアウェア チャート 窶鈀 Qlik Sense
ヘルプには折れ線グラフのみに対応していると書かれていますが、新バージョンで機能が拡張され、折れ線グラフに加えて棒グラフとコンボチャートにも対応しています

タイムアウェアチャートは、[プロパティ]パネル→[X軸:<項目名>]→[連続]→[連続スケールの使用]から設定できます。
初期設定で有効になっているため、無効にしたい場合以外は、この設定を操作する必要はありません。
master-calendar-203
タイムアウェアチャートを無効にしたい場合は、[連続スケールを使用]をオフにしてください。
タイムアウェアチャートが無効な場合、データとして存在する日付のみが表示されます。たとえば、下図では2008年1月4日や1月6日の値がありませんが、これはデータ中に存在しないためです。
master-calendar-204
タイムアウェアチャートが有効な場合、データに応じて自動的に年、月、日の表示が切り替わります。
下図は年の表示です。2008年に絞り込むと
master-calendar-205
月の表示にドリルダウンします。さらに1月に絞り込むと
master-calendar-206
日の表示にドリルダウンします。タイムアウェアチャートが無効な場合に表示されていなかった、1月4日や1月6日の値も表示されています。
master-calendar-207

最後に…

今回はマスターカレンダーのサンプルをご紹介しましたが、いかがだったでしょうか。
冒頭に書いたとおり、マスターカレンダーのサンプルスクリプトはよく見かけるのですが、日本の祝日に対応したものが無かったため、いつか作りたいと思っていました。
今回作成したものがお役に立てば幸いです。
GitHub – osamutake/japanese-holidays-js: Provides utilities to manipulate japanese holidays.
https://github.com/osamutake/japanese-holidays-js
祝日の計算を定義する際に、参考にさせていただいたJavaScriptのライブラリです。
また、祝日の定義や結果の確認には、Wikipediaの各ページを参考にいたしました。
国民の祝日春分秋分振替休日国民の休日

2019年から2020年にかけての祝日法改正については、以下のページを参考にいたしました。
国民の祝日について – 内閣府
https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
祝日法の改正
http://nomenclator.la.coocan.jp/ip/holiday/rev/syuku.htm

自動取得項目 窶鈀 Qlik Sense
http://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/Scripting/derived-fields.htm

タイムアウェア チャート 窶鈀 Qlik Sense
https://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/Visualizations/time-aware-charts.htm

Qlik Design Blog : What’s new in Qlik Sense 3.0… | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2016/07/15/what-s-new-in-qlik-sense-30-time-aware-charts
タイムアウェアチャートについて、アニメーション付きで紹介しているページです。

Qlik Design Blog : Time-Aware feature has made … | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2016/12/06/time-aware-feature-has-made-it-to-the-bar-and-the-combo-charts
タイムアウェアチャートが、棒グラフとコンボチャートにも対応したことを解説しているページです。おなじくアニメーション付きです。

How to use – Master-Calendar and Date-Values | Qlik Community
https://community.qlik.com/docs/DOC-8843
日付とカレンダーについての情報をまとめたリンク集です。

以下の4つはマスターカレンダーの詳細について書かれたページです。
マスターカレンダーは”マスター”と言っても、一回しか読み込まれない訳ではありません。たとえば、注文月が9月のときに、請求月は10月の場合があります。
このような場合、1つのドキュメント中で複数回マスターカレンダーを読み込むのですが、その点の詳細について解説されています。
Qlik Design Blog : The Master Calendar | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2012/10/16/the-master-calendar

Qlik Design Blog : Why You sometimes should Loa… | Qlik Community
https://community.qlik.com/blogs/qlikviewdesignblog/2012/08/30/master-table-with-multiple-roles

Qlik Design Blog : Canonical Date | Qlik Community
https://community.qlik.com/t5/Qlik-Design-Blog/Canonical-Date/ba-p/1463578

Linking to two or more dates | Qlik Community
https://community.qlik.com/docs/DOC-5834

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

$
0
0

以前、『ただの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」、日本語であれば「分析接続」と調べてみてください。

2018年9月25日更新URLが変更になっていたため、リンク先を変更しました。
Space: Advanced Analytics Integration | Qlik Community
https://community.qlik.com/community/advanced-analytics-integration

Space: Server Side Extensions (SSE) | Qlik Community
https://community.qlik.com/community/value-added-products/server-side-extensions-sse
「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社の記事です。非常に分かりやすくまとめられています。(英語)
Viewing all 29 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>