Qlik Senseで分析を行う際、前年同月のデータを使って比較をしたいと思ったことはありませんか?前年同月のデータを取得することで、過去と現在の比較ができるようになり、ビジネスの意思決定や傾向の把握に役立てることができます。しかし、Qlik Senseで前年同月のデータを求めるには、少しコツが必要です。本日は、その方法について紹介します。
目次
※本記事は「2025年01月時点のSaaS」で作成しています。
はじめに
前年同月のデータを求める方法は、一つではありません。
例えば、「年月」項目が軸のチャートでは、数式内でAbove関数を使い、12行上(12か月前)のデータを参照することで、前年同月のデータが参照できる場合があります。
また、ロード スクリプトで「前年売上」として新たな項目を作成する方法も考えられます。
しかし、前述の方法を実装するには、既存のデータやチャートの状態を考慮した開発が必要になるため、開発者に高いスキルが求められる可能性があります。
今回紹介する方法は、比較的、既存のデータやチャートの状態に左右されにくい方法なので、Qlik Senseで前年のデータを求める際の入門編として、トライしてみてください!
サンプルデータの紹介
最初に、今回使用するサンプルデータを紹介します。
以下のような売上データを使用し、「年月」と「商品名」ごとの前年同月のデータ(売上)を求めます。
本ブログ内では、2024年を今年、2023年を前年と想定します。
例えば、今年である5行目の2024年1月の商品Aの場合、前年同月のデータである『1000』を求めることが目標です。
ステップ1:データのロード
まず、通常のアプリと同様に、元となるデータをロードします。
次にResident句を使用し、先ほどロードしたテーブルから「年月」の項目のみをロードします。
この時、項目名を他のテーブルで使われていない項目名に変更し、他の項目と関連付かない仮の項目としてロードします。
以下のロード スクリプトでは、項目名を「仮年月」に変更しています。
ロード スクリプトの記述例
売上テーブル:
LOAD
年月,
商品名,
売上
FROM [lib://DataFiles/QlikTraining_Sales.xlsx]
(ooxml, embedded labels, table is Sheet1);
仮テーブル:
LOAD
Distinct
年月 as 仮年月
Resident 売上テーブル;
※Distinct…データの重複を削除します。今回のサンプルデータでは、商品名ごとに同じ値の年月があるので、その重複を削除しています。
※Resident…これより前のステップでロードしたテーブルからデータをロードします。
データをロードしたら[データ モデル ビューア]を開き、仮テーブルが他のテーブルと関連付いていない(テーブル同士が線で繋がっていない)ことを確認してください。
なお、サンプルデータの「年月」は数値型となっています。データのロード時は気にする必要はありませんが、「年月」項目が日付型や文字列型の場合は、後述の『数式の補足』部分を確認ください!
仮テーブルが作成できたら、チャートの作成に移ります。
ステップ2:チャートの作成
次に、チャートを作成します。今回は、テーブルのチャートに計算結果を表示してみます。
テーブルに、以下のような軸とメジャーを設定します。
[メジャー]:前年の売上
Sum(If(仮年月 - 100 = 年月 , 売上))
※上記の数式中の『-100』は、2024を2023にするために使用します。
「年月」項目が数値型の場合は『202401 - 100 = 202301』のような計算になり、前年同月の値を求めることができます。
上記の軸とメジャーを設定すると、以下のようなテーブルが作成されます。
2024年1月の商品Aの行を見てみると、前年同月である2023年1月の『1000』という売上が取得できています!
前年同月のデータを取得できることが確認できたら、『当月の売上 ÷ 前年の売上』という数式で、前年同月比を求めます。
[メジャー]:前年同月比
Sum(If(仮年月 = 年月, 売上)) / Sum(If(仮年月 - 100 = 年月 , 売上))
※パーセント表示にするには、メジャーのプロパティから[数値書式]を「数値」にし、「12%」等を選択します。
※『仮年月 - 100』は、前年同月の値(202301など)を求めています。
軸とメジャーの設定が完了したら、基本的な設定は完了です。後は、あなたの好きなようにレイアウトを調整してみてください!
例えば、「仮年月」のラベルを「年月」にしたり、数式のラベルを変更することで、アプリを閲覧するユーザーから分かりやすい表示名にすることができます。
他にも、前年同月比に増加と減少を示すインジケーターを設定してあげると、視覚的にアクセントのあるテーブルになりますね。
インジケーターは、メジャーのプロパティから[表記]を「インジケーター」にすることで設定できます。
もし、「年月」項目を絞り込むためのフィルター パネルを追加したい場合は、フィルター パネルに設定する項目は「仮年月」にしてください。
タイトルは、テーブルの表記に揃えて「年月」等にするのが良いと思います。
前年同月のデータを求めるための作業ステップは、以上です!
上記の設定を行った場合、完成形のテーブルのチャートは以下のようになります。
数式の補足
上記の手順で紹介した数式は、「年月」項目が数値型の場合の数式です。
「年月」項目が日付型や文字列型の場合は、以下の例を参考に、前年の売上の数式を作成してみてください!
例:日付型…2024/1、文字列型…2024年01月、など。
[メジャー]:前年の売上
Sum(If(AddYears(仮年月,-1)= 年月 , 売上))
※「年月」項目が日付型の場合。
※AddYears関数を使用して、前年同月の値を求めます。
[メジャー]:前年の売上
Sum(If(AddYears(Date#(仮年月,'YYYY年MM月'),-1)= Date#(年月,'YYYY年MM月') , 売上))
※「年月」項目が文字列型の場合。
※Date#関数で「年月」項目を日付型の値として認識させてから、AddYears関数を使用して前年同月の値を求めます。
参考:なぜ仮の項目が必要なのか
以下は、少しQlikに慣れている人向けの説明になります。
前述の数式を見て、なぜ仮項目が必要なんだろう、と疑問に思われた方もいると思います。
筆者の心情としては、仮項目を使用せずに『Sum(If(年月=年月-100,売上))』のような数式で前年同月のデータが求まって欲しいところですが、実際には前年同月のデータは求まりません。
なぜなら、Qlik Senseでは、If関数の条件判定時に、同じ行の中で比較を行うためです。
例えばIf関数の条件を前述のように『年月=年月-100』としてしまうと、軸の「年月」の値が202401の場合は『202401=202301』という矛盾した条件になってしまい、成立しません。
そこで、仮項目の登場です。
仮項目は「年月」と関連付いていないため、仮項目と年月テーブルの値を集計に使用すると、以下のテーブルのように仮項目の値ごとに全ての値の組み合わせで集計を行います。
そのため、同じ行の中で値を比較した時に、If関数の条件である『仮年月 - 100 = 年月』が成立する行が存在する状態になり、前年同月の売上を取得できます。
実際にIf関数を設定してみると、画像のような状態になります。
その後、Sum関数で集計を行うことで、ステップ2で作成したテーブルのチャートのように、前年同月のデータを求めることができます。
上記のように、年月を示す項目が一つだと実現できない、『軸の値が202401の時に、同じ行の年月の値が202301になる』という条件を成立させるために、仮項目を使用しました。
さいごに
いかがでしょうか。
前年同月のデータを求めるには、仮項目の作成など、少しコツが必要です。
本ブログの方法が参考になり、皆さまのアプリでも前年同月のデータが求められることを祈っております。
是非、より深いデータ分析に役立ててみてください!
執筆者情報:
株式会社アシスト北海道 テクニカルサポート部
2022年に中途入社し、Qlik製品のサポートを担当しています。
日々進化するQlikの情報をキャッチアップし、お客様のご期待に
応えたいと思っています。
北の国から、寒さに負けず精進中です。