QlikView Training http://qlikview-training.ashisuto.co.jp 無料で使えるBIツール「QlikView」と「Qlik Sense」の使い方を、初心者の方にも分かりやすく解説していきます。 Thu, 28 Feb 2019 04:09:12 +0000 ja hourly 1 Qlik Senseのマップに顧客データを表示する http://qlikview-training.ashisuto.co.jp/customer-data-on-map/ Tue, 20 Nov 2018 01:00:20 +0000 http://qlikview-training.ashisuto.co.jp/?p=9737 (続きを読む…)]]> 今回はQlik Senseのマップについてご紹介します。
Qlik Senseのマップを使用する事で、お持ちの顧客データをマップに表示させ、BIツールならではの集計、分析ができるようになります。

ただし、マップは地理情報を扱うため、他のチャートとは違うマップ特有の注意事項があります。
たとえば、自社の拠点をマップに表示したい場合、事前に拠点の緯度経度を調べておく必要があります。
今回はそんなマップの基本から、マップ特有の注意事項と解決方法をご紹介します。

顧客の分布等、マップでしかできない分析にご興味のある方は是非ご覧ください。


マップの基本


まず、Qlik Senseでは以下の5種類の方法でマップ上にデータを描画できます。

・ポイントレイヤー
・エリアレイヤー
・ラインレイヤー
・密度レイヤー
・背景レイヤー

ここで言う各レイヤーは、マップに重ねて描画でき、例えばエリアレイヤーの上にポイントレイヤーを重ねて描画することが可能です。

各レイヤーはQlik Senseのヘルプから画面キャプチャで確認できます。
まだ一度もマップを使った事が無い方、マップを使った分析をしたことがない方は是非一度ご覧ください。

※この記事の内容はQlik Sense September 2018の情報です。
Qlik Senseでは最近、バージョンアップごとにマップ機能が強化され、その度に新しいレイヤーが追加されています。
今後も新しい種類のレイヤーが増えると予想されますので、最新の情報を知りたい方はQlik Senseのヘルプもあわせてご確認ください。
ヘルプ画面の左側にバージョンを選択できるドロップダウンメニューがあります。

マップ作成


まずQlik Senseでマップを作成する際、以下の2通りの方法があります。

・地理名称を使ってマップを作成する
・緯度経度のデータを使ってマップを作成する

今回は地理名称である、日本語の都道府県名と市区町村名を使って、Qlik Senseで自動的に地理情報を取得してマップを作る方法から見ていきます。

まずは、日本語の都道府県名と市区町村名をQlik Senseに取り込みます。

都道府県名と市区町村名のデータを格納したcsvファイルを用意しました。
csvファイルは以下からダウンロードしてください。
district.csv

※上記のファイルは、以下のページで公開されているデータを一部加工して利用しています。
「都道府県コード及び市区町村コード」(総務省)を加工して作成

ダウンロードが完了したら、Qlik Senseで新しいアプリを作ってドラッグ&ドロップの操作でデータを取り込みましょう。

アプリの一覧画面から[アプリの新規作成]をクリックし、さきほどダウンロードしたcsvファイルをQlik Sense上にドラッグ&ドロップしてください。



右下の[データの追加]をクリックします。


データが取り込めました。
[閉じる]ボタンで閉じましょう。


さっそく取り込んだデータをマップに描画させてみましょう。
洞察画面を消して編集画面に移ります。




編集画面から[チャート]をクリックし、[マップ]チャートを画面に配置します。


[項目]をクリックし「都道府県名」項目をマップの上にくるようにドラッグ&ドロップします。


[新しいレイヤーとして追加]をクリックします。


今回は[エリアレイヤー]を選択します。


しばらくすると日本地図が表示されました。


例えば「北海道」をクリックすることで、北海道に絞り込まれます。


このように日本語の都道府県名であれば緯度経度のデータがなくても、簡単にマップを使う事ができます。

では続いて日本語の「市区町村名」を使ってポイントが表示されるか見てみましょう。
「市区町村名」をさきほどのマップにドラッグ&ドロップします。


[新しいレイヤーとして追加]をクリックします。


今回は[ポイントレイヤーとして追加]をクリックしましょう。


しばらく待つと画面が以下のように切り替わります。

ポイントも表示されるようになりましたが、日本以外の国の結果が表示されています。

これは、例えば中国(吉林省)の「白山市」と日本(石川県)の「白山市」という同じ名前の地理名称が複数あるような場合に、どの国の「白山市」なのかをQlik Senseが判断できていないためです。


今回は日本の市区町村のデータなので、日本の「白山市」が表示できるように設定を少し加えましょう。

[編集]ボタンをクリックし、マップをクリックします。
右側の[場所]タブをクリックします。


[場所の範囲]を「自動」から「カスタム」に変更します。


[国]の入力欄に「’JP’」と入力します。


場所の範囲を日本に限定したことで、日本の市区町村のみ表示できました。


「白山市」も日本の石川県にある「白山市」として表示されています。


以上が地理名称を使ってマップ作成する方法です。

なお、今回ご紹介した地理名称を使ってマップを作成する方法ですが、日本語の地理名称が使えるのは「国名」「都道府県名」「市区町村」の3つです。

市区町村未満、つまり「〇丁目〇番〇号」といった”番地”のデータを使ってマップを作成するには、冒頭でご紹介した2つ目の方法、緯度経度のデータを使う必要があります。

緯度経度のデータを持っているという方はほとんど居ない思いますので、ここからはデータを用意する方法からご紹介していきます。

緯度経度データの用意


まず前提として、緯度経度のデータを用意する際、「ジオコーディング」という言葉を覚えておく事をおすすめします。

この言葉の意味を覚える必要はありませんが、大まかに言えば「地理的な名称等から緯度経度の情報を取得する」という意味を持ちますので、ご自身で調べる際に便利だと思います。

ジオコーディングをする事で、例えば以下のような住所から緯度経度を求める事ができます。

<住所>                             <緯度>   <経度>
東京都千代田区九段北4-2-1     ⇒     35.692241  139.738824

では、本題の緯度経度のデータを取得する方法をみていきましょう。

ここからは緯度経度のデータを取得する方法と、Qlik Senseで緯度経度のデータを使ったマップの作成方法をご紹介していきます。

Qlik製品自体にもジオコーティングできる有償のオプションがありますが、今回は無料でかつ、筆者が使いやすいと感じた「jSTAT MAP」を使って顧客データ(住所)をジオコーディングしていきます。

「jSTAT MAP」は総務省統計局が公開している、誰でも使える地理情報システムです。
詳しくはjSTAT MAP ヘルプをご覧ください。

こちらのページ上段にある「地図で見る統計(jSTAT MAP)」をクリックしてください。
※ジオコーディングを利用するには、アカウントを作成する必要があります。
[アカウントを作成する]ボタン等から画面の指示に従いアカウントを作成してください。

jSTAT MAPにログインすると、地図が表示されます。


左上の[統計地図作成]をクリックし、[プロット作成]をクリックしてください。




真ん中の[ジオコーディング]をクリックします。


住所データが格納されたcsvファイルをアップロードします。
※住所の列は必ず2列目にしてください。


今回は弊社の各拠点の住所を格納したcsvファイルを使います。
弊社の拠点情報しかありませんが、ご利用になりたい方は以下からダウンロードしてご利用ください。
branch-office.csv

[参照]ボタンをクリックして、アップロードするファイルを選択します。
[アップロードをクリックする]ボタンをクリックします。






[結果ファイルのダウンロード]をクリックします。




ダウンロードしたファイルを早速Qlik Senseに取り込みましょう。

データを取り込みます。




新しいシートを作成します。


シート上にマップを配置し、「名称」をドラッグ&ドロップします。


[新しいレイヤーとして追加]-[ポイントレイヤーとして]追加の順にクリックします。




今回のデータだと「本社」という名前から、自動的にある地点が表示されます。
これは、最初にご紹介したQlik Senseが名称から地理情報を自動的に取得する機能によるものです。

なぜこの場所が「本社」として表示されているかは分かりませんが、意図した場所ではありませんので、追加の設定をして緯度経度で拠点の場所を表示できるようにしましょう。

右側のプロパティパネルから[場所]をクリックします。


[[緯度]項目と[経度]項目]にチェックをいれます。


[緯度]と[経度]にそれぞれ緯度経度の情報が格納されている項目を指定します。
先ほどジオコーティングして作られた「マッチング緯度」項目と「マッチング経度」項目を指定します。




[完了]ボタンをクリックして結果を見ると、ポイントが表示されました。


※右上の家の形をしたボタンをクリックしないと拡大されたままで結果が確認できない事があります。


弊社の本社がある市ヶ谷の場所も正確に表示されています。


緯度経度のデータを取得する方法と緯度経度を使ったマップの作成方法は以上です。

あとはお持ちの売上データ等と組み合わせて、バルブサイズの設定や色の設定をすることで以下のような分析画面が作成できます。


振り返り

今回はマップの基本的な作り方と緯度経度のデータを取得する方法についてご覧いただきました。
以下に今回ご紹介した重要なポイントをまとめます。

  • マップの作成方法は2種類
    ・地理名称を使ってマップに描画する。
    ・緯度経度のデータを用意してマップに描画する。
  • 緯度経度データの用意
    ・ジオコーティングで住所から緯度経度が取得可能。
    ・「jSTAT MAP」で顧客データ(番地)からジオコーテイングができる。

最後に

今回はジオコーティングできるサービスとして、無償で利用でき、使いやすいという理由から「jSTAT MAP」を使いましたが、WEBで検索すると有償・無償問わず様々なサービスがあります。
サービスによっては郵便番号から緯度経度を求めたり、「スカイツリー」等観光名所の名前から緯度経度を取得できるサービスもあるようです。
ジオコーティングにご興味のある方は、是非お時間のある際に調べてみてください。

また、今回は紹介しきれませんでしたが、「jSTAT MAP」を使ってエリアデータを作成することも可能です。
エリアデータを使用すれば、面で塗りつぶした描画ができるので、関東等の地域を確認できます。

エリアデータについても、後日別の記事として作成したいと思います。

次回の記事にもご期待ください。

お疲れ様でした。

]]>
Aggr関数の構造化パラメータとは?Aggr関数の知られざる機能のご紹介 http://qlikview-training.ashisuto.co.jp/aggr-function-structured-parameter/ Wed, 10 Oct 2018 00:00:49 +0000 http://qlikview-training.ashisuto.co.jp/?p=9469 (続きを読む…)]]> 以前、『Aggr関数再入門』という記事でAggr関数の使い方について解説いたしましたが、今回はさらにもう一歩踏み込んだAggr関数の応用的な使い方について解説いたします。
Aggr関数について詳しく知りたい方、ヘルプに掲載されている構造化パラメータ(Structured Parameter)について知りたい方、Aggr関数で意図した結果が得られないという方は、ぜひご一読ください。

Aggr関数の構文

QlikViewを古くからお使いの方は、ヘルプでAggrと検索したことが一度はあるかと思います。
実は最近のバージョンでAggr関数の構文が拡張されたことはご存知でしょうか。

QlikView 11のヘルプでは、Aggr関数の構文は以下のように書かれています。
以下はQlikViewリファレンスマニュアルからの引用です。

aggr ( [ distinct | nodistinct ][{set_expression}]expression {, dimension} )

最近のバージョンであるQlikView 12やQlik Senseのヘルプでは、Aggr関数の構文は以下のように書かれています。
以下はQlikViewヘルプからの引用です。
※最近のバージョンではオンラインヘルプになりました。

Aggr({SetExpression}[DISTINCT] [NODISTINCT ] expr, StructuredParameter{, StructuredParameter})

新旧のバージョンで構文を比べてみてください。
最後の部分がバージョン11では「dimension」、バージョン12では「StructuredParameter」となっています。
“Dimension”というのは軸項目のことです。これに対して”Structured Parameter”は構造化パラメータと呼ばれる指定です。

では、軸項目と構造化パラメータで何が違うかというと、一番の違いは構造化パラメータでは単純な項目の指定に加えて、”値の並び順を制御できる”という点です。
つまり、バージョン11以前は単純な軸項目の指定のみが可能でしたが、バージョン12以降では単純な軸項目の指定に加えて、値の並び順を制御できるようになったということです。


ここまでの内容をまとめておきましょう。
Aggr関数は指定した軸項目ごとに値を集計する関数ですが、QlikView 11以前と12以降で以下の違いがあります。
QlikView 11以前:単純な軸項目ごとに値を集計する。軸項目(Dimension)の指定
QlikView 12以降:単純な軸項目ごとに値を集計するのに加えて、値の並び順を制御できる。構造化パラメータ(Structured Parameter)の指定


Aggr関数での値の並び順とは

構造化パラメータで値の並び順を制御できることがわかったところで、Aggr関数において値の並び順がどんな意味を持つのか順を追って説明していきます。
まず、Aggr関数再入門の記事で説明したように、Aggr関数を使用すると内部的に仮想のテーブルが作成されます。
たとえば、以下のような指定があったとします。
Aggr(Sum(実績), 年)
このとき内部的に、以下のような仮想テーブルが作成されています。
実績
2017200
2016100
2018150
この仮想テーブルが作成される際、値の並び順はデータが取り込まれた順になります。
つまり上の仮想テーブルであれば、データが取り込まれた順がたまたま2017→2016→2018の順であったということになります。
だからなにが困るのかという点は追々説明してまいりますので、まずはこのような動作であるという点を押さえておいてください。

では、QlikViewの画面上で動作を確かめてみましょう。実際に試したい方は以下の手順にそって操作してみてください。
まず以下のような簡単なサンプルデータを作成します。
年月のデータですがあえて1ヶ所、月の順序を逆にしています。2015年3月と2月を3月→2月の順にしています。
LOAD * INLINE [
    年, 月, 実績
    2015, 1, 2
    2015, 3, 5
    2015, 2, 4
    2015, 4, 5
    2015, 5, 5
    2015, 6, 5
    2015, 7, 3
    2015, 8, 2
    2015, 9, 6
    2015, 10, 6
    2015, 11, 3
    2015, 12, 5
    2016, 1, 3
    2016, 2, 4
    2016, 3, 1
    2016, 4, 4
    2016, 5, 6
    2016, 6, 8
    2016, 7, 4
    2016, 8, 7
    2016, 9, 8
    2016, 10, 5
    2016, 11, 7
    2016, 12, 5
    2017, 1, 4
    2017, 2, 3
    2017, 3, 6
    2017, 4, 4
    2017, 5, 2
    2017, 6, 5
    2017, 7, 4
    2017, 8, 6
    2017, 9, 8
    2017, 10, 5
    2017, 11, 6
    2017, 12, 6
];
リロードを実行したら、シートに月のリストボックスを追加してください。
リストボックスでは月が1月から順番に表示されます。これはリストボックス側で並べ替えがおこなわれているためです。
設定を見てみましょう。リストボックスのプロパティで[ソート]タブを開きます。
[数値]にチェックが入っています。これにより、リストボックスでは1月から順に表示されます。

設定を変更してみましょう。
[数値]のチェックを外して[ロード順]にチェックを入れ、[OK]ボタンをクリックしてください。
月の並び順が3月→2月の順になりました。これはデータを取り込んだ順です。

動作が確認できたら、設定を元に戻しておいてください。
リストボックスのプロパティで[ソート]タブを開き、[ロード順]のチェックを外して[数値]にチェックを入れます。

それでは、今後はストレートテーブルを追加してAggr関数の動作を確認してみましょう。

軸と数式を以下のように設定します。ここではRowNo関数を使用して年月ごとに行番号を表示してみます。
軸:年と月
数式:RowNo()

年月ごとに行番号を表示できました。

このストレートテーブルに以下の数式を追加して、Aggr関数の動作を確認してみてください。
Aggr(RowNo(), 年, 月)
※この数式はAggr関数の動作を確認するためのものです。実用性はありません。

年月ごとに行番号を表示するという数式ですので、前の数式とおなじ結果になりそうな気がします。
[OK]ボタンをクリックして表示を確認してみてください。
「RowNo()」と「Aggr(RowNo(), 年, 月)」で値の並び順が違っています。Aggr関数の方はデータを取り込んだ順に表示されていますね。

では、ここまでの内容をまとめておきましょう。
Aggr関数以外の関数(例ではRowNo関数)は、チャート側で指定されたソート順に処理をおこなう。
Aggr関数は、チャート側で指定されたソート順に関係なくデータを取り込んだ順に処理をおこなう。


構造化パラメータの指定方法

それでは構造化パラメータを使用して、Aggr関数の値の並び順を変更してみましょう。
あらためて構造化パラメータの指定方法を確認しておきます。構造化パラメータはAggr関数の軸項目の部分に、以下の形で指定します。
(軸項目名, (ソートタイプ, 昇順降順))
ソートタイプは並べ替えの基準が文字なのか数値なのか、並べ替えの種類を設定するものです。先ほどリストボックスのプロパティの[ソート]タブで設定した内容に相当します。
昇順降順については、昇順の場合は「ASCENDING」を降順の場合は「DESCENDING」を指定します。
ソートタイプソートタイプの意味昇順の指定降順の指定
NUMERIC数値ASCENDINGDESCENDING、REVERSE
TEXT文字ASCENDING、A2ZDESCENDING、REVERSE、Z2A
FREQUENCYレコード数ASCENDINGDESCENDING、REVERSE
LOAD_ORDERロード順ASCENDING、ORIGINALDESCENDING、REVERSE
「REVERSE」「A2Z」「Z2A」などは、どれも「ASCENDING」「DESCENDING」の別名に当たるもので、いずれも昇順か降順かをあらわします。

それでは、構造化パラメータを指定してみましょう。
今回は月を数値の昇順で並べ替えたいため、構造化パラメータの指定は以下のようになります。
※昇順降順の指定を省略したときの動作はヘルプには書かれていませんが、こちらで確認したところ昇順になりました。
(月, NUMERIC)
Aggr関数の全文は以下のようになります。
Aggr(RowNo(), 年, (月, NUMERIC))

値の並び順が月の昇順になりました。

降順の指定も試してみましょう。昇順降順を指定する場合、構造化パラメータをさらに括弧で囲んで以下のように指定します。
(月, (NUMERIC, DESCENDING)))
Aggr関数の全文は以下のようになります。
Aggr(RowNo(), 年, (月, (NUMERIC, DESCENDING)))

値の並び順が月の降順になりました。


ここまでで構造化パラメータの指定方法をご覧いただきましたが、お分かりいただけましたでしょうか。
括弧の指定が重なるため、はじめのうちは記述ミスをしてしまうかもしれませんが、構造化パラメータで値の並び順を制御できるということはお分かりいただけたと思います。


実践的な例

ここまでで、構造化パラメータの概要と指定方法を説明いたしました。
しかし、実際どのようなときに役に立つのかは、なかなか想像がつかないと思います。
実際、構造化パラメータが必須となる機会はそれほど多くないのですが、いくつか実践的な例をご紹介します。

前述のとおり、構造化パラメータは値の並び順を制御するものです。つまり、値の並び順によって結果が変わるような場合に必要になってきます。
値の並び順によって結果が変わる演算とは、たとえば累計や移動平均などのことです。関連する関数で言えばRangeSum関数、RangeAvg関数、Above関数などが挙げられます。


累計値の例

ここでは以下のチャートについて考えてみます。このチャートではRangeSum関数とAbove関数を使用して累計値を表示しています。

累計値は以下の数式でもとめています。
RangeSum(Above(Sum(実績), 0, 12))
Above関数はチャートの並び順に従って、上の行にある値を取得する関数です。RangeSum関数と組み合わせることで累計値を計算できます。

しかし、Above関数はチャートの並び順に従って、上の行にある値を取得する関数ですから、並び順が変わると結果が変わってきます。
たとえば、月を降順で表示すると12月から1月に向かって値が累計されていきます。

では、チャートの並び順を変えても常に1月から12月に向かって値を累計するにはどうしたらいいでしょうか。
このような場合に、Aggr関数と構造化パラメータが使用できます。
Aggr(RangeSum(Above(Sum(実績), 0, 12)), 年, (月, NUMERIC))

構造化パラメータにより、月は昇順に並べ替えることが定義されますので、チャートの並び順に関わらず常に1月から12月に向かって値が累計されていきます。

構造化パラメータを使わずに、Aggr関数のみ指定した場合の画面も掲載しておきます。
Aggr関数で集計基準は指定できるのですが、繰り返しお伝えしているとおり並び順がデータを取り込んだ順になるため、累計の順序もデータを取り込んだ順になります。



折れ線グラフの例

最後に折れ線グラフの例をご紹介します。
この折れ線グラフではRangeAvg関数を使用して3ヶ月移動平均を表示しています。
この場合も、Aggr関数と構造化パラメータの指定が必要になります。
なぜならば、折れ線グラフでは、1つ目の軸項目がX軸となり2つ目の軸項目ごとに折れ線が描画されるからです。
つまり、上図のように年ごとの比較をしたい場合、月を第1軸に年を第2軸に指定する必要があります。

そのため、もし単純にRangeAvg関数を使うと月ごと年ごとの値が計算されます。この例で言えば1月の中で2015年、2016年、2017年の3年間分の平均値が表示されます。
軸項目は月、年の順に設定し、集計は年、月の順におこなう必要があるためAggr関数の指定が必要になる訳です。


以前のバージョンでは、構造化パラメータが使用できなかったため、上のような表やグラフを作成したかった場合、ロードスクリプト側で事前にデータを並べ替えておく必要がありました。
構造化パラメータを使用することで、チャート側の指定だけでやりたいことが実現できるようになりました。


最後に…

今回はAggr関数と構造化パラメータについてご覧いただきましたが、いかがだったでしょうか。
構造化パラメータは、もともと目に見えない部分を制御する機能ですのでなかなか難しかったと思います。
Aggr関数の結果が思いどおりにいかないときや、累計や移動平均がうまく計算できないときは、引数に指定した軸項目のソート順を確認してみてください。構造化パラメータで解決できるかもしれません。

お疲れ様でした。

]]>
Qlik Sense Desktopのインストール http://qlikview-training.ashisuto.co.jp/qlik-sense-desktop-install/ Thu, 27 Sep 2018 04:00:55 +0000 http://qlikview-training.ashisuto.co.jp/?p=9495 (続きを読む…)]]> Qlik Sense Desktopをインストールしてみましょう。
Qlik Sense Desktopをダウンロードしていない方は、以下のページを参考にダウンロードしてください。
Qlik Sense Desktopのダウンロード

インストール
Qlik Sense Desktopの起動
サンプルアプリケーションの確認

インストール

Qlik Sense Desktopのインストールは非常に簡単です。
ダウンロードした「Qlik_Sense_Desktop_setup.exe」を実行して、あとはインストーラーの指示にしたがっていけば、インストールが完了します。
以下に画面キャプチャを掲載しますので、参考にしてください。(クリックすると拡大します。)

インストーラーを実行します。


Qlik Sense DesktopをインストールするPCの.NET Frameworkのバージョンが古い場合、.NET Frameworkのセットアップ画面が表示されます。
以下の画面が表示された場合には、[同意してインストール]をクリックします。



画面中央の[Install]をクリックします。
※[Custom Installation]をクリックすることで、任意の場所にインストールできます。



使用許諾が表示されます。



使用許諾を確認し、[I accept the lisence agreement]にチェックを入れて、[Next]をクリックします。



[Install]をクリックします。



インストールが始まります。



インストール終了後、[Finish]をクリックして画面を閉じます。


以上で、Qlik Sense Desktopのインストールは完了です。

Qlik Sense Desktopの起動

Qlik Sense Desktopがインストールできたら、さっそく起動してみましょう。
Windowsのスタートボタン→[Qlik Sense]→[Qlik Sense Desktop]を選択します。



Qlik Sense Desktopを使用するには、QlikTech社で登録したQlikアカウントか、有償版のQlik Sense Enterpriseのアカウントが必要です。
そのため、Qlik Sense Desktopを起動すると、以下のログイン方法を選択する画面が表示されます。

今回は[Qlik アカウントを使ったログイン]をクリックしてください。
※Qlik Sense Enterpriseをご利用中の方は [認証リンクの追加]をクリックしてください。






ユーザー名とパスワードを入力する画面が表示されます。
Qlik Sense Desktopのダウンロード時に、QlikTech社で登録したQlikアカウントを指定してください。
入力後[ログイン]をクリックします。
※この画面はQlik Sense Desktopの起動時に毎回表示されます。
ログイン情報を保持したい場合、右上の[パスワードを保持]をクリックする事で、次回ログイン時にログイン情報の入力を省略できます。



Qlik Senseが起動して、「Qlik Sense Desktopへようこそ」の画面が表示されました。


サンプルアプリケーションの確認

「Qlik Sense Desktopへようこそ」の画面で、[アプリの新規作成]をクリックすれば、独自のアプリケーションをあたらしく作成できます。
今回は、ようこそ画面を閉じて、あらかじめ用意されているサンプルアプリケーションを確認してみましょう。
「Qlik Sense Desktopへようこそ」画面を右上の[×]ボタンで閉じます。



以下の画面が「ハブ」と呼ばれる画面で、アプリケーションの一覧が表示されます。
サンプルアプリケーションがあらかじめ、四つ用意されていますね。
ここでは一番右側の「Sales Discovery」をクリックして開いてみましょう。



アプリケーションを開くと、「アプリ概要」と呼ばれる画面が開きます。
画面下部の「シート」という箇所に、「Performance Dashboard」や「Top Customers」など、計八つの枠が表示されています。
これら一つ一つが「シート」と呼ばれるもので、一つのシートが一つの分析画面にあたります。
ここでは「Perfomance Dashboard」をクリックして開いてみましょう。



「Perfomance Dashboard」のシートが開きました。棒グラフなどが表示されていますね。



試しに画面左側で、適当な値をクリックしてみてください。



値をクリックすると、その値でデータが絞り込まれます。
グラフの表示も変化したかと思います。



以上で、Qlik Sense Dektopのインストールと稼働確認は終了です。
次回は、基本的なアプリケーションをあたらしく作成してみたいと思います。

Qlik Sense Desktopをまだお持ちでない方は、ぜひ以下からダウンロードして使ってみてください。
Qlik Sense Desktopのダウンロード

お疲れ様でした。

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

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社の記事です。非常に分かりやすくまとめられています。(英語)

]]>
学習アプリ「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ファイル)も同梱しています。
振替休日や国民の休日にも対応した完全版ですので、ぜひダウンロードして使ってみてください。

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

]]>