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

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

Pocket

今回も前回にひきつづき、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