QlikView Training http://qlikview-training.ashisuto.co.jp 無料で使えるBIツール「QlikView」と「Qlik Sense」の使い方を、初心者の方にも分かりやすく解説していきます。 Wed, 11 Jul 2018 01:10:39 +0000 ja hourly 1 Qlik Senseでの基本的なアプリケーション作成 http://qlikview-training.ashisuto.co.jp/qlik-sense-first-application/ Wed, 24 Jan 2018 08:00:34 +0000 http://qlikview-training.ashisuto.co.jp/?p=9327 (続きを読む…)]]> Qlik Senseで基本的なアプリケーションを作成してみましょう。
ここでは、はじめてQlik Senseを使う方を対象に、ExcelのデータをQlik Senseに取り込んで簡単なチャートを作成する手順について説明いたします。
これからはじめてQlik Senseを使う方は、ぜひご覧ください。

改訂 2018年1月24日
新バージョンに対応しました。
2018年1月現在の最新バージョンである「Qlik Sense November 2017」にあわせて、内容を改訂しました。
改訂前の記事はこちらからご覧いただけます。(旧版)Qlik Senseでの基本的なアプリケーション作成



Excelファイルのダウンロード

ここでは以下のファイルを使用しますので、ダウンロードしてください。
uriage-jisseki-excel.zip
Zip形式ですので、ダウンロード後解凍してデスクトップに置いてください。
このファイルには、以下のような売上実績のデータが格納されています。
三つのシートにそれぞれ、売上、都道府県、地区のデータが格納されています。




アプリケーションの作成

それでは、Qlik Senseを起動して、あたらしくアプリケーションを作成してみましょう。
Qlik Senseを起動するには、デスクトップ上のショートカットアイコンをダブルクリックするか、
または、Windowsのスタートメニュー→[Qlik Sense]→[Qlik Sense Desktop]を選択してください。
もし、Windowsファイアウォールに関する警告が表示されたら、アクセスを許可してください。
そうすると、ログイン方法の選択画面が表示されます。
今回は「Qlikアカウントを使ったログイン」を選択します。
※「認証リンクの追加」は、有償版のQlik Senseで使用します。
ログイン画面が表示されます。
ユーザー名とパスワードを入力してログインします。
ここで入力するユーザー名とパスワードは、Qlik Sense Desktopダウンロード時にQlik社のサイトに登録したものです。
Qlik Senseが起動したら、あたらしくアプリケーションを作成します。
「Qlik Sense Desktopへようこそ」の画面で、[アプリの新規作成]をクリックします。
アプリケーションの名前を指定します。
「売上実績」と入力して[作成]ボタンをクリックします。
[アプリを開く]ボタンをクリックします。
アプリケーションが作成され、以下のような画面が表示されます。



データの取り込み

アプリケーションを作成したら、まずはじめに必要なデータをアプリケーションに取り込みます。
データを取り込む方法には、「ファイルおよびその他のデータソースからデータを追加」と「スクリプトエディター」の二つの方法があります。
「ファイルおよびその他のデータソースからデータを追加」は、ウィザード形式で簡単にデータを取り込む機能です。
「スクリプトエディター」は、より高度な機能です。専用のエディタを使用して、関数などを指定することも可能です。

[ファイルおよびその他のデータソースからデータを追加]をクリックしてみましょう。
データソースの選択画面が開きます。ここから任意のデータソースを指定してデータを取り込めます。
下図を参考に、ExcelファイルをQlik Sense Desktopの画面にドラッグ&ドロップしてください。
データソースの選択画面からExcelファイルを選択しても結果はおなじですが、このようにドラッグ&ドロップでもデータを取り込めます。

データを取り込むためのウィザードがはじまります。
この画面で取り込むデータの確認などができます。
初期設定では、一つ目のシート(ここでは売上シート)のみが、対象となっています。
今回は都道府県と地区のデータも取り込みたいため、「都道府県」と「地区」にもチェックを入れます。
以上で設定は完了です。
画面右下の[データの追加]ボタンをクリックします。
データの追加中です。
ここでデータの関連付けを行う画面が表示されます。
画面右上の[データのロード]ボタンをクリックします。
データの取り込みが完了しました。

データの取り込みが完了したら、こんどは分析画面となる「シート」を作成していきます。
[シートを編集する]ボタンをクリックしてください。
空のシートが表示されました。
以上でデータの取り込みは完了です。

Qlik Senseでは、あたらしくアプリケーションを作成したら、まず使用するデータを取り込みます。
データの取り込みが完了したら、分析画面となるシートを作成していきます。
もちろん、データをあとから追加したり、変更したりすることも可能ですが、大まかな流れとしては”データの取り込み”→”シートの作成”という手順になりますので、覚えておきましょう。


シートの作成

それでは、シートを作成していきましょう。
まず、この画面の見方を簡単に説明しておきます。

画面左側の領域のことを「アセットパネル」と呼びます。
「アセットパネル」の中には、さらに四つのパネル(タブ)があり、それぞれ「チャート」「カスタムオブジェクト」「マスターアイテム」「項目」となっています。
「チャート」のタブには、棒チャート、折れ線チャートなど、シートに配置するオブジェクトが表示されます。
「カスタムオブジェクト」のタブは今回は使用しませんが、エクステンションが表示されます。
標準では提供されていないビジュアライゼーションを利用したい場合に使用します。
「マスターアイテム」のタブは今回は使用しませんが、チャートや項目のテンプレートが表示されます。
頻繁に使用するチャートや項目を登録しておいて、再利用したいときに使用します。
「項目」のタブには、データとして取り込んだ項目が表示されます。
画面左下には、アプリにデータを追加するボタンが表示されます。
画面右下に目を移すと、こちらにもボタンがあります。
このボタンは、画面右に表示される「プロパティパネル」の開閉ボタンです。
「プロパティパネル」は、シートに配置したオブジェクトの詳細設定をするパネルです。



項目の追加

では、シートを作成していきましょう。
「アセットパネル」から「項目」を選択します。
「年」の項目をシート上にドラッグ&ドロップで追加してください。
「年」の項目が追加されました。

下図を参考に、「年」のサイズを調節してください。
オレンジ色の枠線をドラッグ&ドロップすることで、サイズを調節できます。
このように、Qlik Senseではグリッドデザインが採用されており、横24マス x 縦12マスのグリッドに沿ってレイアウトを調節していきます。ピクセル単位の細かい調節ができない代わりに、より簡単に統一感のあるレイアウトを作成できます。

同様にしてこんどは「月」の項目を追加してください。



チャートの追加(KPIオブジェクトの作成)

それではここからは、チャートを作成してきましょう。
「アセットパネル」から「チャート」を選択します。
「KPI」をドラッグ&ドロップでシートに追加します。
KPIオブジェクトは集計値を一つ(最大二つまで)表示するオブジェクトです。たとえば売上金額、達成率、前年比など、主要な数値を画面上に大きく表示したい場合に使用します。
KPIオブジェクトで[メジャーを追加]をクリックします。
ここでいう”メジャー”とは数値データのことです。
項目の一覧が表示されるので、「売上金額」を選択します。
集計方法を選択します。
ここでは、売上金額の合計値を表示したいため、Sum([売上金額])を選択します。
KPIオブジェクトが作成できました。
下図を参考にサイズを調節してください。
表示が見にくいので詳細設定をしていきましょう。
オブジェクトの詳細設定は、画面右側の「プロパティパネル」でおこないます。
「プロパティパネル」が開いていない方は、右下のボタンで開閉できることを思い出してください。
[ラベル]に「売上金額」と入力します。
[数値書式]を選択して[通貨]を選択します。
表示が綺麗に整いました。


棒チャートの作成

それでは、こんどは棒チャートを作成してみましょう。
「アセットパネル」の「チャート」から「棒チャート」を追加します。
KPIオブジェクトはメジャーだけでしたが、棒チャートには軸(X軸)が必要です。
[軸を追加]をクリックして、「商品名」を選択します。
[メジャーを追加]をクリックして、「売上金額」を選択します。
集計方法からSum([売上金額])を選択します。
棒チャートができました。

それでは、詳細設定をしていきましょう。
画面右側の「プロパティパネル」で[スタイル]を選択します。
さらに[プレゼンテーション]を選択し、[水平]を選択してください。
棒チャートを横棒チャートに変更できました。
以上でアプリケーションは完成ですが、最終的な見た目を確認しておきましょう。
画面右下のボタンで「プロパティパネル」を閉じます。
Qlik Senseではグリッドデザインに加え、レスポンシブデザインが採用されており、表示するデバイス(の画面解像度)にあわせて、レイアウトが自動で調節されます。
たとえば、PCで見たときと、タブレットを縦持ちで見たとき、横持ちで見たとき、それぞれ見やすいレイアウトに自動で調節してくれるということです。
そのため、アプリケーションを作成したら、さいごに全画面表示にして最終的な見た目を確認するといいでしょう。

さいごに保存して編集を完了します。
画面左上の[保存]ボタンをクリックします。
画面右上の[完了]ボタンをクリックします。



データの分析

以上でアプリケーションは完成ですが、すこしだけデータの分析の操作も確認してみましょう。
値をクリックすると、その値で絞り込むことができます。
年から「2012」を選択します。
選択と同時に、グラフの表示が変化するのが分かると思います。
選択を確定するには、右上の[選択の確認]をクリックします。
複数の値をドラッグして選択することも可能です。

また、これは項目の値だけでなく、チャート内の棒やラベルについても同様です。
棒チャートのX軸(ここでは商品名)をドラッグして、売上金額の上位五位までの商品を選択しています。

選択した値は、画面上部で確認できます。一度選択した値を変更することもできます。
選択をクリアするには、項目名の右側にある×ボタン、[選択をクリア]ボタンをクリックします。
画面左側の×ボタン、[選択をすべてクリアする]ボタンはすべての項目の選択をクリアします。

分析を終了して、はじめの画面に戻るには画面左上の[ナビゲーション]ボタンをクリックして、[アプリ概要]をクリックします。
「アプリ概要」画面に戻ってきました。
アプリケーションを閉じるには、単純にこのアプリケーションのタブを閉じてください。
また、Qlik Sense Desktopを終了するには、単純に画面を閉じてください。


さいごに…

今回ははじめてQlik Senseを使う方を対象に、基本的なアプリケーションの作成についてご覧いただきました。
細かい機能の説明などは省きましたが、大まかな開発の流れは掴んでいただけたのではないでしょうか。

今回はごく基本的な機能のみを紹介しましたが、Qlik Senseにはほかにも便利な機能が沢山あります。
たとえば、チャートに関して言えば、折れ線チャートや円チャートはもちろん、コンボチャートや散布図、ツリーマップ、マップ(地図)などが作成できます。
チャートのサンプル(散布図、コンボチャート、ツリーマップ、マップ)
qlik-sense-first-application-312
ほかにも、データを横断的に検索できる検索ツールや、Microsoft PowerPointのようなプレゼンテーション用のスライドを作成するストーリーテリング機能、高い拡張性を活かしたプラグイン(チャートエクステンション)など、非常に多くの便利な機能があります。
これらの機能についても、機会があればこのブログ上で紹介したいと思います。

さらにQlik Sense Desktopでは、QlikView Personal Editionにあった、ほかの方が(ほかのPCで)作成したファイルを開けないという制限もなく、ファイルの共有も自由にできます。
例として、今回作成したアプリケーションをアップしておきましたので、ご自由にご利用ください。
qlik-sense-first-application.zip

「売上実績.qvf」が今回作成したアプリケーションの完成版、「売上実績2.qvf」が上に掲載したチャートのサンプルです。
Qlik Sense Desktopにドラッグ&ドロップして直接開くか、または以下のディレクトリに配置すると、ハブ(Qlik Sense Desktopの初期画面)に表示されます。
C:\Users\<ユーザー名>\Documents\Qlik\Sense\Apps

お疲れ様でした。

]]>
QlikView、Qlik SenseとR、Pythonとの連携 http://qlikview-training.ashisuto.co.jp/qlik-and-r-python-integration/ Tue, 09 Jan 2018 00:00:59 +0000 http://qlikview-training.ashisuto.co.jp/?p=9204 (続きを読む…)]]> 以前、『ただの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社の記事です。非常に分かりやすくまとめられています。(英語)

]]>
学習アプリ「Quizlet」にQlikViewとQlik Senseの関数を学習できるコンテンツを公開しました http://qlikview-training.ashisuto.co.jp/qlikview-qliksense-functions-quiz-on-quizlet/ Wed, 31 May 2017 00:00:21 +0000 http://qlikview-training.ashisuto.co.jp/?p=8975 (続きを読む…)]]> これまでQlikViewとQlik Senseの学習コンテンツを公開していた「zuknow」のサービス終了に伴い、学習アプリ「Quizlet」に学習コンテンツを公開しました!

「Quizlet」は、問題と解答が書かれたカードを使用した学習アプリです。カードの問題と解答を交互に見たり、神経衰弱のようにカードの問題と解答のペアを選択したりして学習できます。
スマートフォンを使って手軽にQlikViewとQlik Senseの関数を学習できますので、是非ご活用ください!

「Quizlet」には以下のコンテンツを公開しています。
・QlikView、Qlik Senseの関数(基礎編)
・QlikView、Qlik Senseの関数(基本集計関数編)
・QlikView、Qlik Senseの関数(条件付き関数編)
学習コンテンツは随時追加予定ですので、ご期待ください。


Quizletには「単語カード」、「学習」、「音声チャレンジ」、「テスト」、「マッチ」の機能があります。
※「音声チャレンジ」は音声で読み上げられた単語を聞き取り、文字で入力して解答する機能です。語学の学習以外ではあまり意味をなさないため、説明は割愛いたします。

Quizletの機能

単語カード

「単語カード」では、カードの問題が表示され、カードを返すと解答が表示されます。英単語のカードをめくるような感覚で学習できます。


学習

「学習」では、学習進度に応じて、「単語カード」、「○か×かの質問」、「選択問題」、「入力式の出題」の4種類の問題が出題されます。複数の出題形式を使って、問題集を解くように学習できます。


※入力式の出題を使って学習する場合、「日本語で答を入力してください」の設定をオフにしてください。


「日本語で答を入力してください」の設定がオンの場合、関数名(英語)の方を問題に、関数の説明文(日本語)の方を解答にした問題が出題されます。
例えば、問題に「Sum」と出題された場合、解答に「合計値をもとめます」と一字一句間違えずに入力しないと正解になりません。
これではあまり意味がないため、上記のとおり設定を変更します。

テスト

「テスト」では、「文字入力」、「選択問題」、「○か×か」の3種類の問題が出題されます。テストの正答率が表示され、学習後の力試しができます。

マッチ

「マッチ」では、カードの問題と解答のペアを見つける神経衰弱のような問題が出題されます。全てのペアを見つけるまでの時間が計測され、ゲーム感覚で学習できます。


このようにiPhoneやAndroidを使用して、QlikViewとQlik Senseの関数を非常に手軽に勉強できますので、ぜひ一度利用してみてください!

はじめ方

Quizletはアプリ版もしくはブラウザ版でご利用いただけます。また、ご利用にあたってユーザー登録が必要です。

アプリをインストールして使用する

iOS版、またはAndroid版のアプリをインストールしてください。
App Store(iOS版)、Google Play(Android版)で検索していただくか、または「Quizlet」からダウンロードできます。

ブラウザ上で使用する

スマートフォンで、Quizletのサイトを開いてください。
学習ツールと単語カードを無料で | Quizlet

Quizlet上で学習セットを検索する

Quizletでは、カードの問題と解答をまとめたものを「学習セット」と呼んでいます。例えば、「QlikView、Qlik Senseの関数(基礎編)」という学習セットには22個の関数のカードがあります。Quizletで学習する際は、まずこの学習セットを検索します。

QlikView、Qlik Sense関数の学習セットは、「kkaeducation」をキーワードに検索するとすぐに見つかります。※「kkaeducation」は、当ブログ担当者のユーザー名です。


学習ツールと単語カードを無料で | Quizlet
https://quizlet.com/

]]>
ドリルダウンとは?QlikViewやQlik Senseでの実現方法は? http://qlikview-training.ashisuto.co.jp/drilldown/ Thu, 20 Apr 2017 01:00:32 +0000 http://qlikview-training.ashisuto.co.jp/?p=8822 (続きを読む…)]]> ここ数回上級者向けの記事がつづきましたので、今回ははじめての方でも簡単に使える「ドリルダウン」という便利な機能をご紹介します。
ドリルダウンはQlikViewやQlik Senseだけでなく、ほかのBIツールなどにもある機能です。使い方も簡単ですのでぜひ使ってみてください。

ドリルダウンとは

ドリルダウンには、もともと”掘り下げる”という意味があります。つまりデータ分析で言うところのドリルダウンとは、概要から詳細へデータを掘り下げて分析していく手法のことを指します。

“概要から詳細へ”ということですので、日付(年→月→日)や地理(国→都道府県→市区町村)など、親子関係を持つデータを分析する場合にとくに有用です。
親子関係を持つというのは、階層を持つと言い換えられると思いますが、事実QlikViewのヘルプでは、ドリルダウン機能は階層グループという名前で紹介されています。
階層グループ (ドリルダウン) ‒ QlikView

親子関係を持つデータには、たとえば以下のようなものが考えられます。
日付:年→月→日
地理:国→都道府県→市区町村
組織:事業部→部→課
商品など:大分類→中分類→小分類
このような項目は業種、業態を問わずよく使われる項目で、かつ親子関係が誰の目にも明らかですので、親(概要)から子(詳細)へ簡単に視点を切り替えて分析できると、使い勝手がよいということです。

ドリルダウンは”データを掘り下げて分析していく”ことですので、専門的なツールがなくても、たとえばExcelなどでも使える手法です。
そもそもドリルダウンという名前を知らない方も、ドリルダウンにあたる操作を日常的におこなっていると思います。

Excelでのドリルダウン

たとえば、Excelではピボットテーブルを使って以下のようにドリルダウンを使用できます。
以下はExcelのピボットテーブルの例です。ここでは行ラベルに「地区名」と「都道府県名」を、値に「売上金額」の合計値を表示しています。

「関東」の左側にある「+」ボタンをクリックすると、関東地区の中にある7都県が表示されます。

また、Excelではあらかじめ設定してなかった軸(行ラベル)を、ダブルクリックで追加できます。
たとえば、「茨城県」の値をダブルクリックして、表示された項目の一覧から「年」を選択します。

茨城県の年ごとの集計が表示されました。

非常に単純なことですが、これもドリルダウンです。
“データを掘り下げて分析する”というのが、なにを指しているのかお分かりいただけたかと思います。

繰り返しになりますが、ドリルダウンは地区→都道府県のように親子関係を持つデータを分析する際に便利な機能です。
しかし、親子関係を持つというのは必須の条件ではなく、上で試した都道府県→年のように、親子関係を持たないデータでドリルダウンを使用することもあります。

可視化の観点から見たドリルダウンの利点

ドリルダウンの利点をご理解いただくには、もっと単純に見た目の話をした方が分かりやすいかもしれません。

たとえば、以下のような地区別の棒グラフがあったとします。
ここで地区を1つ選択してみます。

当然、棒を1本表示するだけのあまり意味のないグラフになってしまいます。右側にぽっかり空いたスペースが無駄ですよね。

かと言って、都道府県をすべて並べてしまうと、サイズが大きすぎて見にくくなってしまいます。

理想的な動作は、以下のようなものではないでしょうか。

地区を1つ選択すると…

自動的に都道府県別のグラフに切り替わります。当然、関東を選択すれば関東地区の中にある7都県のみが表示されます。

これがQlikViewやQlik Senseにおけるドリルダウンの動作です。
QlikViewやQlik Senseにおけるドリルダウンとは、値の選択に応じてグラフの軸項目を自動的に切り替えてくれる機能というです。


Qlik Senseのドリルダウン

それではここからは、QlikViewやQlik Senseのドリルダウンについて見ていきましょう。
QlikViewやQlik Senseでドリルダウンを使うには、チャートを作成する前にドリルダウンのための簡単な設定が必要です。具体的には、親子関係を持つ項目をグループ化する設定をおこないます。

まずはQlik Senseです。
サンプルのデータを用意しましたので、ぜひおなじように操作してみてください。
以下のExcelファイルをダウンロードしてください。
uriage-jisseki.xlsx

Qlik Senseで新規にアプリを作成します。

アプリの名前はここでは、「ドリルダウン」としておきます。

Excelファイルからデータを取り込んでください。
ExcelファイルをQlik Senseの画面にドラッグ&ドロップするか、「データの追加」をクリックしてExcelファイルを選択してください。

データは1シート目の「売上」のデータを、そのまま取り込むだけで構いません。


それでは、ドリルダウンの設定をしていきましょう。
Qlik Senseでドリルダウンを使用するには、マスターアイテムにドリルダウン用の軸を追加します。
※マスターアイテムとは、よく使用するチャートや数式をあらかじめ登録しておく機能です。マスターアイテムに登録したチャートや数式は、アプリの中で簡単に再利用できます。Qlik Senseでドリルダウンを使用するには、ドリルダウン用の軸をマスターアイテムとして登録します。

画面左側の「アセット」パネルから「マスターアイテム」を選択します。
「軸」を選択して「新規作成」をクリックします。

「軸の新規作成」画面でドリルダウン用の軸を作成します。
ここでは、「地区名」と「都道府県名」から地区のグループを作成します。

まず画面上部で「ドリルダウン」を選択します。
項目の一覧から「地区名」と「都道府県名」を選択します。
選択した項目が画面右上の「項目」に追加されていきます。
このとき項目の並び順に注意してください。項目の並び順がドリルダウンの親子関係になりますので、もし順番が違う場合はドラッグ&ドロップで順番を入れ替えてください。

「名前」にこのグループの名前を指定します。ここでは「地区グループ」と指定しておきます。
名前を指定したら「軸を追加」ボタンをクリックし、最後に「完了」ボタンをクリックしてください。
「軸を追加」ボタンをクリックせずに「完了」ボタンをクリックすると、グループが作成されないまま、前の画面に戻ってしまうので注意しましょう。(事前に警告が出ます。)

地区グループが作成できました。あとはこの軸を使って、普段どおりチャートを作成するだけです。

画面左側の「アセット」パネルから「チャート」を選択し、「棒チャート」をドラッグ&ドロップで追加します。

「軸を追加」をクリックして、先ほど作成した「地区グループ」を選択してください。

「メジャーを追加」をクリックして、「売上金額」を選択し「Sum([売上金額])」を選択します。

最後にグラフのサイズを調節して完成です。

画面上部の「完了」ボタンをクリックして、動作確認してみましょう。
棒グラフから「関東」を選択してみてください。

軸が都道府県に切り替わります。X軸のタイトルにも「都道府県名」と追加されました。

軸をもとに戻すには、単純に絞り込みを解除するか、グラフのX軸にある「地区名」をクリックします。
この操作を、ドリルダウンに対してドリルアップと呼びます。


以上ここまでで、ドリルダウンの動作が確認できました。
このように、ドリルダウンでは値を選択するとグラフの軸が自動的に切り替わります。より正確に言うと、以下のようになります。
軸の切り替えは、親の項目の値が1つに絞り込まれたときに発生します。

ではそのことを確認してみましょう。
画面上部の「編集」ボタンをクリックして、アプリの編集画面に戻ります。
画面左側の「アセット」パネルから「項目」を選択し、「地区名」をドラッグ&ドロップで追加します。

画面上部の「完了」ボタンをクリックして、動作確認してみましょう。
「地区名」のフィルターパネルで、値を選択してみてください。
値を1つ選択すると、ドリルダウンが発生し軸が「都道府県名」に切り替わります。

しかし、値を2つ選択するとドリルダウンは発生せず、軸は「地区名」のままです。


このように値が1つに絞り込まれたかどうかが、ドリルダウンの発生条件となります。
ドリルダウンを設定したグラフが直接操作されたかどうかは関係ありません。ここでご覧いただいたように、フィルターパネルで値が絞り込まれた場合も、またはほかのグラフで値が絞り込まれた場合も、親の項目の値が1つに絞り込まれたら、軸の切り替えが発生します。


QlikViewのドリルダウン

それでは、こんどはQlikViewのドリルダウンについて見ていきましょう。
考え方はQlik Senseとおなじですので、簡単に説明をしていきます。

ドキュメントを新規に作成し、「ロードスクリプトの編集」画面を開きます。

カーソルをスクリプトの最下部にあわせて、「テーブルファイル」ボタンをクリックし、データを取り込みます。

リロードを実行してデータを取り込んでください。
ドキュメントは任意の名前で保存していただいて構いません。ここでは「ドリルダウン」という名前にしています。

それでは、ここからはQlikViewのドリルダウンについて説明していきます。
Qlik Senseの軸に相当するものは、QlikViewでは「ドキュメントプロパティ」の「グループ」に当たります。

「ドキュメントプロパティ」画面で「グループ」タブを開き、「新規作成」ボタンをクリックします。

「グループの設定」画面で、「ドリルダウングループ」を選択します。もう一つのサイクリックグループについては後述いたします。
グループ名を入力して、項目一覧から「地区名」と「都道府県名」を選択し、最後に「OK」ボタンをクリックします。

ドリルダウングループが作成できました。
「ドキュメントプロパティ」画面は「OK」ボタンで閉じてください。

あとは、普段どおりグラフを作成するだけです。

軸の選択画面で、先ほど作成した「地区グループ」を選択します。

数式を設定して完成です。

地区からなにか値を1つ選択すると、都道府県の表示に切り替わります。

もとに戻す操作(ドリルアップ)も、Qlik Senseとほぼ同様です。
「クリア」ボタンなどから選択を解除するか、グラフの右下にある上矢印ボタンをクリックしてください。



サイクリックグループ(QlikView)と代替軸(Qlik Sense)

先ほどQlikViewでドリルダウンを設定する際、「ドリルダウングループ」の隣に「サイクリックグループ」という選択肢がありました。
サイクリックグループもドリルダウングループとおなじように、複数の項目をグループ化する機能なのですが、ドリルダウングループと違い、親子関係のない項目をグループ化するために使用されます。

たとえば、下図では「地区名」「大分類名」「年」の3つの項目をサイクリックグループとして登録しています。

下図のようにグラフ右下のアイコンから、自由に軸を変更できます。

このように、サイクリックグループは単純に軸を手動で変更する機能です。
ドリルダウングループと違い、値の絞り込みとは連動せず、手動で軸を切り替える機能になります。

Qlik Senseにはサイクリックグループの機能はありませんが、チャートの設定にある「代替軸」を使えばおなじことができます。

下図では軸に「地区名」を設定し、代替軸に「大分類名」と「年」を設定しています。

下図のように軸を変更できます。
編集画面に移動せずに軸を切り替えられますので、サイクリックグループとおなじように利用できます。
サーバー版であるQlik Sense Enterpriseについて言えば、編集権限のないユーザーの方でも軸を切り替えられるということになります。当然、ユーザーが軸を変更してもそのユーザーの画面上の表示が変わるだけで、アプリ(qvfファイル)自体に変更は加えられません。


ユーザーインターフェース側の機能

ここまででドリルダウンについてご覧いただきましたが、当初の目的に立ち返り”データを掘り下げて分析する”ということで言えば、ドリルダウンの機能は使わずにグラフの見せ方を工夫するという考え方もあるはずです。
ここでは、いくつか例をご紹介します。

ピボットテーブルの折り畳み

Excelのピボットテーブルとおなじように、QlikViewやQlik Senseのピボットテーブルでもデータの折り畳みができます。
なお、Qlik Senseではデータの折り畳みは初期設定では無効になっています。
有効にするには、画面右側の「プロパティ」パネルで「プレゼンテーション」→「完全に展開」をオフにしてください。

Qlik Senseのピボットテーブル(完全に展開をオフ)

Qlik Senseのピボットテーブル(完全に展開をオン)

QlikViewのピボットテーブル


ツリーマップ(Qlik Sense)とブロックチャート(QlikView)

Qlik Senseのツリーマップと、QlikViewのブロックチャートは、名前は違いますが機能的にはおなじものです。
どちらも値の大小を四角形の大きさであらわすグラフで、複数の軸を入れ子にできるのが特長です。

Qlik Senseのツリーマップ

QlikViewのブロックチャート


タイムアウェアチャート(Qlik Senseのみ)

タイムアウェアチャートは、Qlik Senseの折れ線グラフ特有の機能です。この機能は日付の項目を軸に設定すると、自動的にドリルダウンを設定したかのようにラベルを表示してくれます。

下図はタイムアウェアチャートの例です。
軸には日付(年月日)の項目を設定しただけですが、X軸の表示は年レベルの表示になっています。
2012年を選択すると…

月レベルの表示に切り替わります。1月を選択すると…

日レベルの表示に切り替わります。

無効にしたい場合は、画面右側の「プロパティ」パネルで「スタイル」→「X軸」→「連続」をオフにしてください。

もし、今回のデータを使ってタイムアウェアチャートを試してみたい方は、一度データマネージャーを開いてデータを取り込み直してください。
※データを取り込みなおす理由は、この記事の最後にまとめました。

日付項目の左側に、カレンダーのアイコンが表示されていれば問題ありません。



ドリルダウンの落とし穴

うまいこと言いたかった訳ではなく、ドリルダウンも万能ではないというお話です。
QlikViewやQlik Senseでドリルダウンを使う上で、ぜひ気にかけていただきたい内容です。

当たり前のことではあるのですが、ドリルダウンでは親の異なる子同士を比較することはできません。
今回の例で言うと、関東の詳細を見ながら、近畿の詳細を見るといったことはできません。

たとえば、以下の2つのグラフを見て、東京の値と京都の値、どちらが大きいかすぐに分かるでしょうか。
この例は、目盛をよく見れば東京の値の方が大きいことが分かるのですが、画像を並べて見ても分かりにくいので、実際に値を選択しながら見比べるのはさらに難しくなります。

これに対して、単純に都道府県をランキング形式で表示した以下の棒グラフはどうでしょうか。
東京の方が京都より値が大きいこと、しかしながら差は僅差であること、また兵庫ともほぼおなじ値であること、新潟とは若干の開きがあることなどが分かります。
今回の例で言えば、このグラフの方がより多くの情報を得られると言えるでしょう。

以下はQlikViewヘルプ「項目グループ」のページからの引用です。
項目グループ ‒ QlikView

QlikView と OLAP ツールなどのその他の多くのデータベース ビューアーの主な違いとして、QlikView では入力データの階層を事前定義する必要がありません。QlikView 固有の内部ロジックでは、完全な軸として任意の項目に任意の順序で自由にアクセスできます。ほとんどの目的において、この自由度はきわめて強力です。

ただし、事前定義された階層は、より効率よくデータを表示するために役立つ場合があります。このため、QlikView には、項目のグループを定義する機能が用意されています。グループは、階層 (ドリルダウン) または非階層 (サイクリック) で作成できます。

以下はわたしなりの解釈です。
QlikViewやQlik Senseの連想技術は、ある値に紐づく値を高速に取り出す技術です。そのため、ドリルダウンのように項目の親子関係を事前に定義しなくても、ユーザーが自由に明細レベルのデータにアクセスできます。ヘルプでは、この自由度の高さは非常に強力であると言っています。


最後に…

今回はドリルダウンについてご覧いただきましたが、いかがだったでしょうか。
最後にお話ししたとおりドリルダウンも万能ではありませんが、便利な機能であることに変わりはありません。
QlikViewやQlik Senseの良さである”分析における自由度の高さ”を活かしつつ、ドリルダウンも使いこなしていただけたら幸いです。


タイムアウェアチャートを使用する前に、データを取り込みなおした理由

Qlik Senseのデータ取り込み機能であるデータマネージャーでは、日付項目を認識して年、月、日などの項目を自動で追加してくれます。
タイムアウェアチャートはこの機能と連動して、年、月、日などの表示をおこなっています。
そのため、もしデータの取り込みをおこなう際に、データマネージャーを一度も開かずにデータを取り込んでいた場合、年、月、日などの項目が追加されていないため、タイムアウェアチャートの表示が上の例と違ったものになります。
たとえば、月の項目がないため、月の代わりに月の初日が表示されます。たとえば2017年1月は2017/01/01と表示されます。

以下の画面で「データの準備」をクリックせずに「データをロードして終了」ボタンをクリックした場合、データマネージャーを一度も開いていないため、年、月、日などの項目は追加されません。

すこし分かりにくい動作ですが、手元の環境でためしたところ、このような動作となりましたので注意してください。
なお今回使用したのは、Qlik Sense Desktop 3.2 SR2です。バージョンによって動作に違いがありましたらご了承ください。

]]>
AutoNumber関数周辺についての本当に詳しい解説2(ハッシュ編) http://qlikview-training.ashisuto.co.jp/deep-dive-into-qlik-autonumber-function2/ Thu, 16 Mar 2017 00:00:32 +0000 http://qlikview-training.ashisuto.co.jp/?p=8626 (続きを読む…)]]> 前回の記事につづき、QlikViewやQlik Senseの関数である「AutoNumber関数」について、深く掘り下げて見ていきましょう。
前回の「カウンタ編」では、RowNo関数、RecNo関数、AutoNumber関数についてご覧いただきました。
今回の「ハッシュ編」では、Hash128関数、Hash160関数、Hash256関数、AutoNumberHash128関数、AutoNumberHash256関数についてご覧いただきます。

これらの関数は、関数名が「Hash」ではじまるもの(Hash128関数、Hash160関数、Hash256関数)と、関数名が「AutoNumberHash」ではじまるもの(AutoNumberHash128関数、AutoNumberHash256関数)の、2つに大別できます。
それではまず、Hash関数の方から見ていきましょう。

Hash128関数、Hash160関数、Hash256関数


ハッシュとはなにか?

QlikViewやQlik SenseのHash関数について説明する前に、まずハッシュとは何なのか簡単に説明します。
ハッシュ自体は、QlikViewやQlik Sense特有のものではなく、他のツールやプログラミング言語などにもあるものです。

ハッシュ(ハッシュ関数)とは、かなり簡単にまとめると、ある文字列を規則性のない別の文字列に置き換える仕組みのことです。
元の文字列がすこしでも違えば、結果の文字列はまったく別のものになります。また、結果の文字列から元の文字列を推測することはできません。

一般的に使用されているハッシュ関数(MD5、SHA-1、SHA-2など)でも、QlikViewやQlik SenseのHash関数でも、結果の文字列は固定長です。固定長とは常に文字列の桁数がおなじという意味です。

ご注意
この部分は正確な説明をかなり省略しています。たとえば、”規則性のない”というのは元の文字列を推測できないという意味で、実際はある規則にもとづいて計算されています。実行するたびに結果が変わる乱数ではありません。
また、元の文字列を推測できないというのは、推測が難しいという意味であって、絶対に推測できないという意味ではありません。
ハッシュについて正確に理解するには、コンピュータ科学の専門的な知識が必要です。上の説明をはじめ、この記事の中にはコンピュータ科学の観点で言えば、正確でない記述が含まれていることをあらかじめご了承ください。


ハッシュについては、オンラインで試せるツールがありますので、早速使ってみましょう。
Hash function – tools.timodenk.com
テキストボックスになにか文字列を入力し、「Hash」ボタンをクリックすると、すぐ下に結果が表示されます。
中央のドロップダウンでは、ハッシュのアルゴリズム(ハッシュ関数の種類)を選択できます。ここでは「MD5」と呼ばれるものを選択しています。

「a」と入力すると、「0cc…」という長い文字列(正確には32桁の文字列)が表示されます。これがハッシュ関数によって生成された結果の文字列です。この文字列のことを「ハッシュ値」と呼びます。

以下が実行結果の例です。
元の文字列結果の文字列(MD5のとき)説明
a0cc175b9c0f1b6a831c399e269772661 
sample5e8ff9bf55ba3508199d22e984129be6元の文字列が一文字でも変われば、まったく違う結果を返します。
simple8dbdda48fb8748d6746f1965824e966a
Samplec5dd1b2697720fe692c529688d3f4f8d大文字小文字が変わっただけでも、まったく違う結果を返します。
Qlik Sense DesktopやQlikView Personal Editionは、無料で使えるBIツールです。c18446197055a9a62691e2faf0cf2ea4どんなに長い文字列でも結果の文字数は変わりません。
8c0c3027e3cfc3d644caab3847a505b0日本語や数字でもおなじです。
1c4ca4238a0b923820dcc509a6f75849b
(空文字)d41d8cd98f00b204e9800998ecf8427e空文字、半角ブランク、全角ブランクもすべて違う結果を返します。
 (半角ブランク)7215ee9c7d9dc229d2921a40e899ec5f
 (全角ブランク)1920baf9665480a79df488e00e69530a

オンラインで使えるツールには、他にも以下のようなものがあります。
hashr – the hash maker
MD5 create hash online – Hash & Encryption
「ハッシュ オンライン」などのキーワードで、Web上を検索すれば他にも見つかると思います。

以上、ここまでがハッシュの概要です。
ハッシュのアルゴリズムなどの話は非常に難しいのですが、ハッシュというのが大体どのようなものかはお分かりいただけたかと思います。

それでは、QlikViewやQlik Senseのハッシュについて見ていきましょう。

QlikViewやQlik SenseのHash関数

QlikViewやQlik Senseには、Hash128関数、Hash160関数、Hash256関数の3つのHash関数があります。
末尾の「128」「160」「256」は、ハッシュの計算で使用される値の桁数(ビット数)をあらわしています。たとえばHash128関数は内部的に128ビットの値を使用しているということになります。

“ハッシュのビット数”というのは内部的な処理の話ですので、ここでは単純に、結果の文字列の長さが違うと認識しておけば問題ありません。
逆に言うと、これら3つの関数の違いは結果の文字列の長さのみで、指定方法や用途に違いはありません。
関数名結果の文字列の長さ
Hash128関数22桁
Hash160関数27桁
Hash256関数43桁

実行結果の例
Hash128('a') IFU@3:'%))D]/FM==R=2_%
Hash160('a') IFU@3:'%))D]/FM==R=2_1IK4Y-
Hash256('a') IFU@3:'%))D]/FM==R=2_1IK4Y-D_!=PWV?U]-RN(II

使用される文字の種類は以下のとおりです。
英大文字26種類: ABCDEFGHIJKLMNOPQRSTUVWXYZ
数字10種類: 0123456789
記号28種類: ‘-!”#$%&()*,./:;?@[]^_`\+<=>
ご注意
使用される文字の一覧はヘルプに記載されていなかったため、独自に検証して確認しました。
検証に使用したロードスクリプトは、この記事の最後に掲載しています。


Hash関数の動作確認

それでは、QlikViewやQlik SenseでHash関数の動作を確認してみましょう。
今回は簡単なロードスクリプトのサンプルを用意してあります。インラインロードを使用して、データ値をスクリプト中に埋め込んでいるため、ロードスクリプトの編集画面にそのまま貼り付けてご利用いただけます。

Qlik Senseのデータロードエディタ(QlikViewのロードスクリプトの編集画面)に、以下のロードスクリプトを貼り付けて実行してください。
LOAD RowNo() as RowNo,
     元の文字列,
     説明,
     Hash128(元の文字列) as Hash128,
     Hash160(元の文字列) as Hash160,
     Hash256(元の文字列) as Hash256;
LOAD * INLINE [
    元の文字列, 説明
    a, 
    sample, 
    simple, 
    Sample, 
    Qlik Sense DesktopやQlikView Personal Editionは、無料で使えるBIツールです。, 
    あ, 
    1, 
    '', 空文字
    ' ', 半角ブランク
    ' ', 全角ブランク
];
Qlik Senseのテーブル(QlikViewのテーブルボックス)で、結果を確認します。
先ほどのオンラインツールと結果の文字列は異なりますが、ハッシュの原理(規則性のない文字列を返す、固定長の文字列を返すなど)は変わりません。


複数の文字列からハッシュ値を生成する

QlikViewやQlik SenseのHash関数では、以下のように複数の文字列を指定できます。
Hash128(<文字列1>, <文字列2>, ..., <文字列n>)
このように指定することで、複数の文字列からハッシュ値を生成します。言い換えると、複数の値の組み合わせが、一部でも違うと異なる結果を返すということです。
これは、つぎに説明するAutoNumberHash関数においても重要なポイントですので、覚えておいてください。

では、先ほどとおなじようにサンプルのロードスクリプトで動作を確認してみましょう。
LOAD RowNo() as RowNo,
     F1,
     F2,
     Hash128(F1, F2) as Hash128,
     Hash160(F1, F2) as Hash160,
     Hash256(F1, F2) as Hash256;
LOAD * INLINE [
    F1, F2
    001, 01
    001, 02
    002, 01
    002, 01
    002, 02
];
この例では、項目F1と項目F2の組み合わせからハッシュ値が生成されます。
Hash128(F1, F2)
上図で3行目と4行目はF1とF2の値が一致していますので、ハッシュ値もおなじになります。
それ以外はハッシュ値はすべて異なります。F1だけがおなじ場合やF2だけがおなじ場合は、生成されるハッシュ値は異なるということです。

以上、ここまでがHash関数の基礎についてです。
ハッシュの原理や、Hash関数の指定方法についてご理解いただけたと思います。
ここからは、規則性のない文字列を生成することになんの意味があるのか、具体的な使用例を2つ紹介いたします。


Hash関数の使用例1(値のマスキング)

まず、規則性のない文字列を生成するといってすぐに思いつくのは、値のマスキングです。たとえば、氏名や住所などの個人情報を非公開にしたい場合などが考えられます。
値を非公開にしたい場合に、単純に値を削除したり、または固定の文字列(****といった伏字など)に置き換えたりすると、値の区別がつかなくなってしまいます。

値の区別はしたいが、元の値は判別できなくしたいという場合は、Hash関数で文字列をマスキングするとよいでしょう。
“値は区別したい”の意図は、たとえばキーとして使用したい場合や、一意の件数を数えたい(Count Distinctしたい)場合が挙げられます。

指定例は以下のとおりです。
LET Salt = Rand(); //Rand関数で乱数を生成しています。
LOAD Hash256($(Salt), 顧客名),
:
FROM Table1;
LOAD Hash256($(Salt), 顧客名),
:
FROM Table2;
顧客名はHash関数により隠蔽されますが、おなじ顧客名はおなじハッシュ値になるため、キーとして使用したり、一意の件数を数えたりできます。
また、ここではRand関数を組み合わせることで、ロードスクリプトを実行するたびにハッシュ値が変わるようにしています。


Hash関数の利用例2(恒久的なキーの作成)

前回の記事で、AutoNumber関数でキーを作成する際の注意事項について説明しました。
注意事項2 おなじロードスクリプトから実行した場合のみ、キーとして使用できる
AutoNumber関数はデータを読み込んだ順に連番を振っていくため、別のロードスクリプトで作成されたキーでは関連付けができないという問題です。

あらためてヘルプの注意事項を確認してみると、Hash関数について言及されています。
autonumber – スクリプト関数 ‒ Qlik Sense
「!」の注意事項を再確認してください。以下はヘルプからの引用です。

autonumberキーは、テーブルが読み込まれた順番で生成されるため、おなじデータ ロードで生成された場合のみ結合できます。ソース データのソート処理から独立してデータ ロード間で恒久的に維持されるキーを使用する必要がある場合は、hash128関数、hash160 関数、hash256 関数を使用する必要があります。

「恒久的に維持されるキーを作成したい場合は、Hash関数を使用する」とのことです。
ここで言う、”恒久的に維持されるキー”というのは、実行するたびに1から連番を振る仕組みなどではなく、常におなじ値になるものという意味です。
テーブルや項目、アプリが違っても、おなじ値にはおなじ結果を返すという意味です。まさにHash関数の動作ですね。

ただし、Hash関数は単純にAutoNumber関数に置き換わるものではありません。
AutoNumber関数でキーを作成する利点として、データのサイズを小さくできるという点があります。長い文字列のキーを単純な連番に置き換えることで、データのサイズを小さくできます。
Hash関数は最小のHash128関数でも22桁の文字列ですので、AutoNumber関数で作成されたキーと比べるとデータのサイズは大きくなります。

まとめると、以下のような場合は、AutoNumber関数ではなくHash関数でキーを作成することを検討してください。
・ロードスクリプトが複数に分かれているため、AutoNumber関数ではキーを作成できない。
・元の文字列の桁数が長い(22桁を超える)ため、Hash関数でデータのサイズを節約したい。
・そのデータ自体は不要(またはマスキングしたい)場合。
たとえば、複数のシステムにまたがって使用されているお客様のメールアドレスなどは、この条件に合致することがあると思います。

以上でHash関数の説明は終了です。
指定方法や用途などをご理解いただけましたでしょうか。

つづいては、AutoNumberHash関数について見ていきましょう。

AutoNumberHash128関数、AutoNumberHash256関数

AutoNumberHash関数には、AutoNumberHash128関数とAutoNumberHash256関数の2種類があります。
末尾の「128」「256」はHash関数とおなじように、ハッシュの計算で使用される値の桁数(ビット数)をあらわしています。

Hash関数は「128」「160」「256」の3種類あるのに対し、AutoNumberHash関数は「128」と「256」の2種類のみです。
なぜ、Hash関数にだけ「160」があるのか疑問に思われるかもしれませんが、そういうものだと覚えてください。

AutoNumberHash128関数とAutoNumberHash256関数は、前回ご覧いただいたAutoNumber関数とおなじように、ある値から連番の項目を作成します。
AutoNumber関数との違いは、内部的にハッシュを使用していることです。


AutoNumber関数とAutoNumberHash関数の違い

内部的にハッシュを使用することでなにが違うかというと、AutoNumberHash関数はHash関数とおなじように複数の値を指定できます。
AutoNumberHash128(<項目1>, <項目2>, ..., <項目n>)
これにより、複数の項目の組み合わせが一意になるように連番が作成されます。
そのため、複合キー(複数の項目がキー項目になっている)を、単一のキーに置き換える場合に使用できます。

AutoNumber関数でも区切り文字を連結するなどして、複合キーを単一のキーに置き換えることはできます。
AutoNumber(項目1 & '-' & 項目2)

しかし、AutoNumberHash関数であれば、そもそも区切り文字などを意識する必要がありません。
AutoNumberHash128(項目1, 項目2)

もう一点、AutoNumber関数とAutoNumberHash関数では、Null値の扱いが異なる点にも注意してください。
Hash関数はNull値にも文字列を割り当てます。これに対して、AutoNumber関数はNull値にはNull値を返します。

実行結果の例
Hash128(Null()) NI<!H%G$DCY?<.=_`KMG).
AutoNumber(Null()) Null値
AutoNumberHash128(Null()) 1などの連番
これは、AutoNumberHash関数で関連付けのキーを作成している場合に注意が必要です。
もとの値がNull値のもの同士で、関連付けがおこなわれるためです。

これを回避するには、以下のような数式でNull値のチェックをしてください。
If(IsNull(項目1) or IsNull(項目2), Null(), AutoNumberHash128(項目1, 項目2)) as キー;


AutoNumberHash128関数とAutoNumberHash256関数の違い

前述のとおり、Hash関数はハッシュのビット数で結果の文字列の長さが変わります。たとえば、Hash128関数は22桁、Hash256関数は44桁の文字列を返します。
これに対して、AutoNumberHash128関数とAutoNumberHash256関数は、数値の連番を返しますので結果に違いはありません。
つまり、これら2つの関数で違うのは内部的な処理のみということになります。

では内部的な処理によってなにが変わるかと言うと、内部的に128ビットのハッシュを使うか、256ビットのハッシュを使うかによって、”生成できる値の数”が変わります。
しかし、QlikViewやQlik Senseにおいては”生成できる値の数”が違うというよりも、”値の衝突が発生する確率”が違うと捉えた方がいいでしょう。

この点について説明していきます。

・生成できる値の数は十分大きいため制約とならない
128ビットのハッシュと256ビットのハッシュでは、値の桁数(ビット数)が違うため生成できる値の数が異なります。
しかし、128ビットのハッシュでもQlikViewやQlik Senseで使用するのに十分な数の値が生成できます。

具体的に書きます。
128ビットのハッシュで生成できる値の数は、2の128乗です。計算すると約3.4 x 1038(10の38乗)種類の値が生成できることになります。
日本語の単位で言うと、”京”を2回掛け合わせたよりも大きな数です。

これに対して、QlikViewやQlik Senseには、一意の値の件数は約21億個までという制限があります。
これは、QlikViewやQlik Senseが内部的に32ビットのインデックスを使用しているためです。
ロードするデータ量の制限 ‒ QlikView
※21億というのは、あくまで一意の値の件数です。1項目につき21億”種類の”値が持てるということです。データの件数は21億件以上保持できます。

つまり、128ビットのハッシュでもQlikViewやQlik Senseで使用するのに、十分な数の値が生成できるということになります。

・値の衝突が発生する確率について
繰り返しになりますが、元の値が異なれば結果の値も異なるというのが、ハッシュ関数の特性です。

しかしこの特性も完璧ではありません。
ある文字列を別の文字列に置き換える以上、衝突が発生する可能性があります。
衝突というのは、元の値が異なるのに、結果の値がおなじになってしまうということです。
※ハッシュ関数で非常に多くの値を生成できるといっても、その数は有限です。それに対して元の値のパターンは無限に考えられますので、衝突をゼロにはできません。


しかしながら、衝突の可能性がわずかであるというのが、ハッシュ関数の特性です。
これ以上は、コンピュータ科学や数学の話になるため非常に難しいのですが、簡単に概要を理解するにはWikipediaの以下のページが参考になります。
誕生日攻撃 – Wikipedia
途中の説明や数式は、正直わたしもまったく分かりませんが、一番下の表と説明が参考になります。

以下はWikipediaからの引用です。

128ビットのMD5を文書のチェックサムとして使用する場合、8200億個の文書までならハードディスクでの誤り発生確率の範囲内に収まると言える

誕生日攻撃」『フリー百科事典 ウィキペディア日本語版』(http://ja.wikipedia.org/)。2017年3月15日16時(日本時間)現在での最新版を取得。

“8200億個の文書”とありますが、この部分は”8200億件のデータ”に置き換えてもおなじはずです。
また、”ハードディスクでの誤り発生確率”というのは、上の表によると10−15(10のマイナス15乗)のようです。

このことから以下のことが言えます。
128ビットのハッシュを使用する場合、データの件数が8200億件までであれば、衝突の確率は10−15(10のマイナス15乗)以内に抑えられる。

256ビットのハッシュを使用する場合、データの件数が1.5 × 1031(10の31乗)件までであれば、衝突の確率は10−15(10のマイナス15乗)以内に抑えられる。

値が大きすぎて、これがどの程度の確率なのか実感が湧きませんが、もはや狙って制御できるレベルの話でないことはわたしにも理解できます。

このことから、128ビットのハッシュでも十分なので、AutoNumberHash128関数を使うという考え方もあるでしょうし、念のためAutoNumberHash256関数を使うという考え方もあると思います。
いずれにしても、用途に応じて使い分けるようなものではないということは、お分かりいただけたかと思います。

以上でAutoNumberHash関数については終了です。
お疲れ様でした。


最後に…

2回に渡って、AutoNumber関数とそれにまつわる関数の詳細についてご覧いただきました。
前回の記事の冒頭に書いたとおり、”みなさまが普段何となく気になっているであろう疑問に、できるかぎり詳しくお答えする”ということを目標に、できる限り詳しく書いてみましたが、いかがだったでしょうか。

途中ハッシュ関数などについても言及しましたので、かなりマニアックな内容になっていたかと思います。
最後までお読みいただいた方は、本当にありがとうございました。



ロードするデータ量の制限 ‒ QlikView
http://help.qlik.com/ja-JP/qlikview/12.1/Content/limitations.htm
QlikViewのヘルプです。
一意の件数の制限が、約21億であることが書かれています。

誕生日攻撃 – Wikipedia
https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E6%94%BB%E6%92%83

Memory sizes for data types | Qlikview Cookbook
http://qlikviewcookbook.com/2008/05/memory-sizes-for-data-types/
QlikViewで使用されるデータ型ごとの、データサイズがまとめられています。
最後の「Sequential Integer Optimization」に、AutoNumber関数を使用してデータ容量がゼロになることの詳細がまとめられています。(英語)

QlikView hash functions and collisions – The Qlik Fix! The Qlik Fix!
http://www.qlikfix.com/2014/03/11/hash-functions-collisions/
QlikViewのHash関数について、非常に詳しくまとめられています。(英語)


検証用のロードスクリプトを以下にまとめます。

検証用ロードスクリプト


Hash関数で使用される文字の検証用スクリプト

Hash関数で使用される文字にどのようなものがあるのか、確認するためのスクリプトです。
Rand関数で乱数を生成し、そこからハッシュ値を生成しています。
LOAD RowNo() as RowNo,
    Mid(Hash128(Rand()), Ceil(Rand() * 22), 1) as Hash128Chr,
    Mid(Hash160(Rand()), Ceil(Rand() * 27), 1) as Hash160Chr,
    Mid(Hash256(Rand()), Ceil(Rand() * 43), 1) as Hash256Chr
AutoGenerate 100000;
本編で説明したとおり、Hash関数で使用される文字の一覧はヘルプに記載されていないため、独自に検証しています。
しかし、使用される文字種の数とハッシュ値の桁数から、生成できるハッシュ値の数を考えると、本編に掲載の文字種で間違いなさそうです。
英大文字A-Z 26種類、数字0-9 10種類、記号28種類の計64種類。

たとえばHash128関数は22桁の結果を返すため、生成できるハッシュ値の数は、64種類の文字が22桁あることから、64の22乗 = 2の132乗となり、128ビットのハッシュで生成できるハッシュ値の数である2の128乗をちょうど超えます。

Hash128関数(22桁) 64 ^ 22 = 2 ^ 132 > 2 ^ 128
Hash160関数(27桁) 64 ^ 27 = 2 ^ 162 > 2 ^ 160
Hash256関数(44桁) 64 ^ 44 = 2 ^ 264 > 2 ^ 258
※^を累乗の記号として記述しています。

]]>
AutoNumber関数周辺についての本当に詳しい解説1(カウンタ編) http://qlikview-training.ashisuto.co.jp/deep-dive-into-qlik-autonumber-function/ Wed, 15 Feb 2017 23:00:32 +0000 http://qlikview-training.ashisuto.co.jp/?p=8558 (続きを読む…)]]> QlikViewやQlik Senseの関数である「AutoNumber関数」について、深く掘り下げてまとめました。
実用的なテクニックなども一部載せていますが、それよりも技術的な理解を深め、いままで何となく分かった気になっていたものを、本当の意味で理解することに主眼を置いています。
QlikViewやQlik Senseの上級者の方に、ぜひご一読いただきたい内容です。

QlikViewやQlik Senseには、連番やキーを作成するために、AutoNumber関数をはじめさまざまな関数が用意されています。
具体的には以下の関数です。
RowNo関数、RecNo関数、AutoNumber関数、AutoNumberHash128関数、AutoNumberHash256関数、Hash128関数、Hash160関数、Hash256関数

これらの関数は結果が分かりやすいため、裏側の動作を知らなくとも使い方に困ることはあまりありません。
しかし、たとえばRowNo関数とRecNo関数の違いは何なのか、AutoNumber関数はどんな基準で連番を振っているのかなど、疑問を持ちながら使っている方も多いのではないでしょうか。
この記事では、みなさまが普段何となく気になっているであろう疑問に、できるかぎり詳しくお答えします。

なお、記事が長くなってしまったため、この記事は「カウンタ編」としてRowNo関数、RecNo関数、AutoNumber関数の3つの関数についてまとめます。
残りの関数については、「ハッシュ編」として次の記事にまとめますので、ご期待ください。

この記事は、AutoNumber関数の概要や、データの関連付け、またQVDファイルについて理解されている方を対象に書かれています。
もし基礎から学習したい方は、先に以下の記事をご覧いただくことをおすすめいたします。
データの関連付け
大量データを超高速に読み込むQVDファイルの使い方
QlikViewの高速性を支えるアーキテクチャ(シンボルテーブルとビットスタッフド・ポインター)

ではまず、RowNo関数とRecNo関数について見ていきましょう。

RowNo関数、RecNo関数

RowNo関数とRecNo関数はどちらも連番を作成する関数ですが、RowNo関数が結果のテーブルの行数であるのに対し、RecNo関数は読み込みもとのテーブルの行数という違いがあります。
言い換えると、RowNo関数は出力時の行数、RecNo関数は入力時の行数ということです。
実際に結果に違いが出るのは、Where句で条件を掛けている場合や、複数のテーブルを縦に連結(Concatenate)している場合です。

RowNo関数RecNo関数
結果のテーブルの行数読み込みもとのテーブルの行数
Where句によってデータが絞り込まれた後の行数Where句によってデータが絞り込まれる前の行数
複数のテーブルを連結した後の行数複数のテーブルを連結する前の行数
Where句によるデータの除外

複数のテーブルの連結

以上でRowNo関数、RecNo関数の説明は終了です。単純に行数を出すものですが、出力時と入力時どちらの行数なのかに注意しましょう。

RowNo関数とRecNo関数は、それほど難しくなかったと思います。
では、AutoNumber関数について深く掘り下げていきましょう。

AutoNumber関数とはなにか?

AutoNumber関数は、ある値をもとに一意の連番を作成する関数です。
RowNo関数とRecNo関数が単純にテーブルの行数をもとめるのに対し、AutoNumber関数はある項目の値をもとに一意の連番を作成します。
一意の連番ですので、複数のテーブルを関連付けるキーとして使用できます。
項目の値が「A」の場合は常に「1」が、「B」の場合は常に「2」が振られていますね。
このように、おなじ値にはおなじ番号が振られていきます。

実際の用途としては、桁数の多いコードや複合キー(複数の項目がキーになっている)を、単純なキーに置き換えてデータのサイズを小さくするというのが、代表的な使用例です。
※実際は複合キーの処理には、AutoNumberHash128(256)関数を使うことも多いのですが、AutoNumberHash128(256)関数については別の記事にまとめます。

さらに、AutoNumber関数で作成された連番はサイズが小さくなるだけでなく、サイズがゼロになるという特長があります。
この点に関しては、以下の記事にまとめていますのでぜひ見てみてください。
QlikViewの高速性を支えるアーキテクチャ(シンボルテーブルとビットスタッフド・ポインター)

以上がAutoNumbre関数の概要です。ではここからは、AutoNumber関数を使用する際の注意事項やTipsについて見ていきましょう。


注意事項1 複数同時に使用するときは識別子を追加する

では、AutoNumber関数がどのような基準で連番を振っているのか確認してみましょう。
まずはヘルプで、AutoNumber関数のページを確認してみてください。
autonumber – スクリプト関数 ‒ Qlik Sense
「!」で書かれている注意事項に、以下のようにあります。
以下はヘルプからの引用です。

autonumberキーは、テーブルが読み込まれた順番で生成されるため

AutoNumber関数は単純にデータを読み込んだ順に、連番を振っているということです。

ここで注意しなければならないのは、AutoNumber関数を複数同時に使用している場合です。
例を見てみましょう。

LOAD 項目1,
     項目2,
     AutoNumber(項目1) as AutoNumber1,
     AutoNumber(項目2) as AutoNumber2
:
結果は下図のようになります。
項目1と項目2、交互に連番が振られていますね。
このように、AutoNumber関数は単純にデータを読み込んだ順に連番を振っていきます。

もちろん、一意の連番となるように、すでに読み込み済みの値にはおなじ番号が振られます。
上図の例で、たとえば項目2の4行目の値が「D」だった場合(項目1とおなじ値だった場合)、結果は下図のようになります。

キーとして使いたいだけであれば、このままでも問題ないのかもしれませんが、それぞれの項目で連番になっていた方が分かりやすいでしょう。
複数のキーをそれぞれ連番にしたい場合は、AutoNumber関数に追加の指定が必要です。

では、あらためて上記のヘルプで、AutoNumber関数の構文を確認してみてください。
autonumber(expression[ , AutoID])
数式(expression)のうしろに「AutoID」とあります。
※カギ括弧([ ])の表記は、「AutoID」の指定が省略可能であることをあらわしています。

このAutoIDが、AutoNumber関数を複数使用する場合に、それぞれを区別する識別子になります。
先ほどの例で、2つのキーをそれぞれ連番にしたい場合は、以下のようにAutoIDを追加します。
LOAD 項目1,
     項目2,
     AutoNumber(項目1, 1) as AutoNumber1,
     AutoNumber(項目2, 2) as AutoNumber2
:
AutoIDには文字列も指定できるので、もとの項目名などを指定して、識別子を分かりやすくしておいた方がいいでしょう。
LOAD 項目1,
     項目2,
     AutoNumber(項目1, '項目1') as AutoNumber1,
     AutoNumber(項目2, '項目2') as AutoNumber2
:
2つのキーがそれぞれ連番になりました。
このように、AutoNumber関数を1つのロードスクリプト中で複数使用するときは、識別子(AutoID)を追加してください。

ここまでで確認したAutoNumber関数の動作を、図にあらわすと下図のようになります。
識別子(AutoID)ごとに、カウンタを管理する領域をもうけ(ヘルプではこれをカウンタインスタンスと呼んでいます)、値を読み込んだ順に追加していきます。このとき値が無ければ追加し、すでに値があれば新たに追加せずにカウンタを取得します。
厳密にこういった仕様であるとは言い切れませんが、動作のイメージとしては間違っていないでしょう。


キーの作成以外での利用用途

このようにAutoIDは、連番を区別するための識別子として使用します。
これは言い換えると、連番にする範囲を指定できるということです。または、連番をリセットするタイミングを制御できるとも言えます。
これを利用することで、RowNo関数やRecNo関数では難しい、項目の値ごとに連番を振る処理ができます。

たとえば、売上明細のテーブルがあったとします。顧客ごと日付ごとに並べ替えた上で、顧客ごとに連番を振っていくことで累積の購入回数(リピート回数)がもとめられます。
LOAD 顧客番号,
     日付,
     売上金額,
     AutoNumber(RowNo(), 顧客番号) as リピート回数; //顧客番号ごとに連番を作成する
SQL SELECT *
FROM `売上明細`
Order By 顧客番号, 日付; //Order By句で、顧客番号ごと日付ごとに並べ替える


以上でAutoIDの説明は終了です。

前述のとおり、AutoNumber関数はデータを読み込んだ順に連番を振っていきます。
これは、もう一つ重要な注意事項があることを示唆しています。それではもう一つの注意事項を見ていきましょう。


注意事項2 おなじロードスクリプトから実行した場合のみ、キーとして使用できる

先ほど確認したヘルプの注意事項を、もう一度確認してみましょう。
autonumber – スクリプト関数 ‒ Qlik Sense
「!」の注意事項を再確認してください。以下はヘルプからの引用です。

autonumberキーは、テーブルが読み込まれた順番で生成されるため、同じデータ ロードで生成された場合のみ結合できます。ソース データのソート処理から独立してデータ ロード間で恒久的に維持されるキーを使用する必要がある場合は、hash128関数、hash160 関数、hash256 関数を使用する必要があります。


しつこいようですが、AutoNumber関数はデータを読み込んだ順に連番を振っていきます。
そのため、別のロードスクリプトで作成されたキーでは関連付けができません。
これは言い換えると、別のアプリ(QlikViewのqvw、Qlik Senseのqvf)で作成したキーでは、関連付けできないということです。

実際にどんなときに起こり得るかと言うと、QVDファイルを使用して差分更新をする場合が代表例として挙げられます。
下図をご覧ください。
この例では、変更のないデータをQVDファイルにあらかじめ出力しておくことで、差分更新を効率的におこなおうとしています。
このとき、QVDファイル出力時にAutoNumber関数でキーを作成すると、あとから作成したキーと整合性が取れなくなってしまいます。

そのため、AutoNumber関数によるキーの作成は、テーブルの結合が必要になったときに一括で(おなじロードスクリプト内で)おこなうようにしてください。

悪い例と良い例、それぞれロードスクリプトの例を掲載しておきます。
以下は悪い例です。

//QVD出力用ロードスクリプト

売上明細:
LOAD 販売月,
     商品名,
     販売金額,
     AutoNumber(商品名) as 商品キー //キーを作成する ×
SQL SELECT ...
;

商品マスター:
LOAD 商品名,
     AutoNumber(商品名) as 商品キー //キーを作成する ×
SQL SELECT ...
;

//QVDファイルに出力する
STORE 売上明細 into 売上明細.qvd;
STORE 商品マスター into 商品マスター.qvd;
//QVD読み込み用ロードスクリプト

//QVDファイルからデータを取り込む
売上明細:
LOAD *
FROM 売上明細.qvd;

//最新のデータをデータベースから取り込む
LOAD 販売月,
     商品名,
     販売金額,
     AutoNumber(商品名) as 商品キー //キーを作成する
SQL SELECT ...
;

//QVDファイルからデータを取り込む
商品マスター:
LOAD *
FROM 商品マスター.qvd;
以下は良い例です。
//QVD出力用ロードスクリプト

//QVDファイル作成前には、キーを作成しない
売上明細:
LOAD 販売月,
     商品名,
     販売金額
SQL SELECT ...
;

商品マスター:
LOAD 商品名
SQL SELECT ...
;

//QVDファイルに出力する
STORE 売上明細 into 売上明細.qvd;
STORE 商品マスター into 商品マスター.qvd;
//QVD読み込み用ロードスクリプト

//QVDファイルからデータを取り込む
売上明細:
LOAD *,
     AutoNumber(商品名) as 商品キー //キーを作成する ○
FROM 売上明細.qvd;

//最新のデータをデータベースから取り込む
LOAD 販売月,
     商品名,
     販売金額,
     AutoNumber(商品名) as 商品キー //キーを作成する
SQL SELECT ...
;

//QVDファイルからデータを取り込む
商品マスター:
LOAD *,
     AutoNumber(商品名) as 商品キー //キーを作成する ○
FROM 商品マスター.qvd;
このようにキーの作成は、一つのロードスクリプト中でおこなう必要があります。


AutoNumber関数とQVDファイルの超高速モードの併用

ここからは、さらに上級者向けの内容です。
このまでの説明を読んで、QVDファイルの超高速モード(QVD Optimizedモード)はどうなるのかと思った方は、非常に鋭いご指摘です。
QVDファイルからもっとも高速にデータを取り込むには、項目の追加などはせずに、もとの構造のままデータを取り込む必要があります。(これを超高速モードと呼びます。)

キーの作成をQVDファイル読み込み時におこなえば、当然超高速モードは無効になります。
これに対する万能な解決策は、わたしの知る限りありません。
ですが、一つの方法としてQVDファイルを超高速モードで読み込んだあと、キーの作成のみをあとからおこなう方法が考えられます。
//QVD出力用ロードスクリプト

売上明細:
LOAD 販売月,
     商品名,
     販売金額
SQL SELECT ...
;

商品マスター:
LOAD 商品名
SQL SELECT ...
;

//QVDファイルに出力する
STORE 売上明細 into 売上明細.qvd;
STORE 商品マスター into 商品マスター.qvd;
//QVD読み込み用ロードスクリプト

//キーは作成せずに、QVDファイルからデータを取り込む
売上明細:
LOAD *
FROM 売上明細.qvd;

//最新のデータをデータベースから取り込む。ここでもキーは作成しない
LOAD 販売月,
     商品名,
     販売金額
SQL SELECT ...
;

//商品マスターなど、マスターのデータはデータ量が少なければ、超高速モードは妥協する
//データ量が多ければ、売上明細とおなじようにキーはあとから作成する
商品マスター:
LOAD *,
     AutoNumber(商品名) as 商品キー
FROM 商品マスター.qvd;

//売上明細を再読み込みしてキーを作成し、もとの売上明細にJOINする
JOIN (売上明細)
LOAD Distinct //Distinctで一意の値を読み込む
     商品名,
     AutoNumber(商品名) as 商品キー //キーを作成する
Resident 売上明細; //Residentで売上明細を再読み込みする

以上で解説は終了です。お疲れ様でした。


最後に…

今回の記事では、AutoNumber関数について詳しく説明いたしましたが、いかがだったでしょうか。
AutoNumber関数がどのように連番を振っているか、キーを作成するときの注意事項についてご理解いただけましたでしょうか。

後半部分はとくに難解だったと思います。最後までお読みいただいた方、ありがとうございました。
実際ここまで深く理解しておく必要はないのかもしれませんが、裏側の動作を理解することでモヤモヤを解消し、ストレスなく開発をしていただけたらと思います。

よく理解できなかったという方も、いつか必要になったときに今回の記事を見直していただければ幸いです。


データの関連付け
http://qlikview-training.ashisuto.co.jp/associate-data/

大量データを超高速に読み込むQVDファイルの使い方
http://qlikview-training.ashisuto.co.jp/what-is-qvd-file/

QlikViewの高速性を支えるアーキテクチャ(シンボルテーブルとビットスタッフド・ポインター)
http://qlikview-training.ashisuto.co.jp/qlikview-architecture-symbol-tables-and-bit-stuffed-pointers/

Autonumber in qvd | Qlik Community
https://community.qlik.com/thread/171322
「AutoNumber関数とQVDファイルの超高速モードの併用」について書く際、参考にした記事です。(英語)


検証用のロードスクリプトを以下にまとめます。
インラインロードを使用して、データ値をスクリプト中に埋め込んでいるため、ロードスクリプトの編集画面にそのまま貼り付けてご利用いただけます。

検証用ロードスクリプト


RowNo関数、RecNo関数の検証用ロードスクリプト

RowNo関数とRecNo関数の違いについて、確認するためのロードスクリプトです。
/Where句によるデータの除外
WhereSource:
LOAD * INLINE [
    項目1
    A
    B
    C
    D
    E
];

WhereResult:
LOAD 項目1,
     RowNo() as RowNo_Where,
     RecNo() as RecNo_Where
Resident WhereSource
Where 項目1 <> 'C';

DROP Table WhereSource;

//テーブルを縦に連結
ConcatenateSource1:
LOAD * INLINE [
    項目2
    A
    B
    C
];

NoConcatenate

ConcatenateSource2:
LOAD * INLINE [
    項目2
    D
    E
];

ConcatenateResult:
LOAD 項目2,
     RowNo() as RowNo_Concatenate,
     RecNo() as RecNo_Concatenate
Resident ConcatenateSource1;

LOAD 項目2,
     RowNo() as RowNo_Concatenate,
     RecNo() as RecNo_Concatenate
Resident ConcatenateSource2;

DROP Tables ConcatenateSource1, ConcatenateSource2;

AutoNumber関数の識別子(AutoID)検証用ロードスクリプト

AutoNumber関数の識別子(AutoID)の動作を、確認するためのロードスクリプトです。
識別子(AutoID)の指定なし
Table1:
LOAD *,
    AutoNumber(項目1) as AutoNumber1,
    AutoNumber(項目2) as AutoNumber2;
LOAD * INLINE [
    項目1, 項目2
    A, AA
    B, BB
    C, CC
    D, D
    E, EE
];
識別子(AutoID)の指定あり
Table1:
LOAD *,
    AutoNumber(項目1) as AutoNumber1,
    AutoNumber(項目2) as AutoNumber2;
LOAD * INLINE [
    項目1, 項目2
    A, AA
    B, BB
    C, CC
    D, D
    E, EE
];

AutoNumber関数の検証用ロードスクリプト

AutoNumber関数によるキーの不整合を、確認するためのロードスクリプトです。

1つ目のアプリ(QlikViewのqvw、Qlik Senseのqvf)で以下を実行し、QVDファイルを作成する。
Table1:
LOAD *,
    AutoNumber(項目1) as AutoNumber1;
LOAD * INLINE [
    項目1
    A
    B
    C
    D
    E
];

STORE Table1 into Table1.qvd;

DROP Table Table1;

2つ目のアプリ(QlikViewのqvw、Qlik Senseのqvf)で以下を実行する。
Table1のAutoNnumber1と、Table2のAutoNumber2は、おなじ項目1から連番を作成しているにもかかわらず、おなじ値に異なる番号が振られる。
Table1とTable2でデータの並び順が異なる(Table2の項目1はCから始まっている)ため、このようなことがおこる。
LOAD 項目1, 
     AutoNumber1
FROM
Table1.qvd
(qvd);

Table2:
LOAD *,
    AutoNumber(項目1) as AutoNumber2;
LOAD * INLINE [
    項目1, 項目2
    C, 300
    B, 200
    A, 100
    B, 180
    A, 90
    E, 500
    C, 290
    A, 100
];

]]>
QlikViewやQlik Senseで使えるマスターカレンダー(日本の祝日対応版)を公開しました http://qlikview-training.ashisuto.co.jp/master-calendar/ Thu, 15 Dec 2016 00:00:51 +0000 http://qlikview-training.ashisuto.co.jp/?p=8456 (続きを読む…)]]> QlikViewやQlik Senseで使えるマスターカレンダーをご用意しましたので、ぜひご利用ください。

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

ダウンロード

ファイルはこちらです。ダウンロードしてご自由にお使いください。
master-calendar.zip
上記の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の各ページを参考にいたしました。
国民の祝日春分秋分振替休日国民の休日

自動取得項目 ‒ 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/blogs/qlikviewdesignblog/2014/02/17/canonical-date

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

]]>
Aggr関数再入門(Aggr関数の詳細と使用例) http://qlikview-training.ashisuto.co.jp/aggr-function/ Mon, 14 Nov 2016 05:00:36 +0000 http://qlikview-training.ashisuto.co.jp/?p=8187 (続きを読む…)]]> 以前、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

]]>
データの可視化 Data-ink Ratioとは?簡潔で分かりやすいグラフを描くためのコツ http://qlikview-training.ashisuto.co.jp/data-ink-ratio/ Wed, 19 Oct 2016 07:00:59 +0000 http://qlikview-training.ashisuto.co.jp/?p=8073 (続きを読む…)]]> グラフを分かりやすくするための大原則としてよく、”余分な要素をできるだけ排除して、シンプルにせよ”といったことが言われます。
しかし、”頭では分かっているが、具体的にどうすればよいか分からない”という方や、”普段なんとなくシンプルになるようにしている”という方も多いのではないでしょうか。

そんな方のために、以下の記事をご紹介します。
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の説明をまとめる上で参考にしたページの中から、おもなものを掲載します。

]]>
SET分析再入門2(SET分析の詳細と指定例) http://qlikview-training.ashisuto.co.jp/set-analisys-advanced/ Thu, 18 Aug 2016 01:00:14 +0000 http://qlikview-training.ashisuto.co.jp/?p=7940 (続きを読む…)]]> 今回も前回にひきつづき、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

]]>