履歴データによって変化する分析(スナップショット機能)
GoodData は、最新データと変更点を簡単に分析できます。 このセクションでは販売のシナリオを使用しますが、ヘルプデスク、品質管理、データエンジニアリングやデータ開発の分析にも応用できます。
このセクションでは、スナップショットという分析手法を紹介します。 以下のシナリオでは、商談、セールスステージ、変化のコンセプトを使用します。
売上分析
売上分析は、営業活動により創出された販売の商談に関する分析です。 商談はそれぞれ、Open (進行中) (パイプライン)、Won (成約) (収益)、または Lost (不正約) (収益損失) のいずれかのステータスになっています。
販売では次のような質問がよくあります。このセクションでは、この質問に答えることを目的として説明を進めます。 「今四半期のパイプラインの売上高は当初いくらだったか? それ以降はどのように伸びたか?」
スナップショットの基本
この質問に答えるためには、スナップショットという手法を利用します。 基本として、毎週 (要件によっては毎日または毎月) CRM から GoodData に全商談を継続的に転送します。 週ごとの商談グループをスナップショットと呼びます。 各スナップショットには、日付と固有 ID があります。
たとえば、118 週分のスナップショットを蓄積するプロジェクトでは、プロジェクト内の大半の商談が 118 回複製されることになります。 スナップショットの開始後に作成された商談の中で、118 個よりも少ないバージョンを持つものはほとんどありません。 各バージョンは、スナップショット日 (たとえば毎週月曜日) とスナップショット ID に関連付けられます。 スナップショットが連続している場合には、スナップショット ID を使用すると大変便利です。 現在の ID から1を引く/加えることで、前/次のスナップショットを簡単に特定できます。
ここからが最初のつかみです。 簡単な SELECT SUM(Amount) WHERE Status = Open
メトリックはパイプラインを測定し、予想よりも約 118 倍大きな数値を返します。 これは、各商談の全バージョンを合計しているからです。 この代わりとして、個別のスナップショットのみについて合計額を示すメトリックを定義できます。
Pipeline [118 weeks ago]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = 1
Pipeline [Now]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = 118
しかし、この方法では、次の週の新しいメトリック、次の次の週の新しいメトリックが必要になります。 最後のスナップショットの合計額を返すメトリックがあれば、便利です。 そうしたメトリックを作成するために、最後のスナップショットを特定するところから始めましょう。
Snapshot [Most Recent]:
SELECT MAX(SnapshotId)
この定義は簡単ですが、問題があります。 たとえば、スナップショット 25 の間に、販売担当者 John が解雇されたとします。 John が終了した全商談を John に関連付けた状態を維持し、進行中の商談を他の販売担当者に再割り当てしました。
さて、Snapshot [Most Recent] メトリックを販売担当者別に内訳すると、このメトリックは John については Snapshot [Most Recent] = 25 を返し、彼以外のすべての販売担当者については 118 を返します。 つまり、John についてはスナップショット 25 の合計額が計算され、その他の全販売担当者についてはスナップショット 118 の合計額が計算されるので、問題があります。 Snapshot [Most Recent] メトリックの定義を改善しなければなりません。
Snapshot [Most Recent]:
SELECT MAX(SnapshotId) BY ALL IN ALL OTHER DIMENSIONS WITHOUT PARENT FILTER`
このメトリックは、ディメンションにかかわらず、MAX のスナップショットを返します。 全地域、全製品等において、販売担当者すべての最新スナップショット(= 118)に John が含まれます。 BY ALL IN ALL OTHER DIMENSIONS ステートメントをメトリックへ追加すると、全期間ならびに全ディメンションの総計(最大値)が返されます。 このメトリックから返されるのは定数になります。
WITHOUT PARENT FILTER 句にはどのような目的があるのでしょうか? SalesRep (販売担当者) = John のフィルターを含むレポートにこのメトリックを配置した場合を考えます。 このフィルターを適用すると、BY ALL IN ALL OTHER DIMENSIONS を使って除外したはずの問題がまた発生することになります。 そこで、WITHOUT PARENT FILTER 句を使用して、上位レベルのフィルターを無視します。
その他の例や集約の概念については、「MAQL - 分析用クエリ言語」を参照してください。
次に、パイプラインメトリック内で Snapshot [Most Recent] メトリックを使用し、次の方法で最新の金額を取得します。
Pipeline [Now]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = Snapshot [Most Recent]
最初のスナップショット (最も古いもの) についても同様に計算できます。 このメトリックは次のようになります。
Snapshot [Oldest]:
SELECT MIN(SnapshotId) BY ALL IN ALL OTHER DIMENSIONS
これを次のパイプラインメトリック内で使用します。
Pipeline [Oldest]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = Snapshot [Oldest]
1四半期のパイプラインの変化を測定する
最古のスナップショットと最新のスナップショットは有用ですが、私たちが求めているものとは少し違います。 私たちは1四半期の最初と最後のスナップショットについてパイプラインを計算したいと考えています。 これは、次のメトリック定義により取得できます。
Snapshot [First in Period]:
SELECT MIN(SnapshotId) BY ALL IN ALL OTHER DIMENSIONS EXCEPT SnapshotDate WITHOUT PARENT FILTER
Snapshot [Last in Period]:
SELECT MAX(SnapshotId) BY ALL IN ALL OTHER DIMENSIONS EXCEPT SnapshotDate WITHOUT PARENT FILTER
ここでは、BY ALL IN ALL OTHER DIMENSIONS EXCEPT
にフォーカスしましょう。 このコンセプトを使えば、特定の属性を除外しながら、ディメンションに関係なく、SnapshotId の MIN/MAX の合計を計算できます。 除外する属性は、EXCEPT
式の後に続く属性です。 したがって、結果の数値は常に定数にはならず、 SnapshotDate の値によって変わってきます。 言い換えれば、このメトリックは、SnapshotDate (スナップショット日) の期間について最大の SnapshotId を返します。
Snapshot Quarter (スナップショットの四半期) を持つレポートに上記のメトリックを配置すると、各四半期の最初と最後のスナップショット ID が表示されます。 次のレポートを参照してください。
したがって、期間の当初におけるパイプラインは次のようになります。
Pipeline [First in Period]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = Snapshot [First in Period]
最後かつ最大のパイプラインの数値は次のようになります。
Pipeline [Last in Period]:
SELECT SUM(Amount) WHERE Status = Open AND SnapshotId = Snapshot [Last in Period]
Snapshot Quarter を持つレポートにこれら2つのメトリックを配置したので、各四半期の当初のパイプラインと各四半期の既知の最後のパイプラインを取得できます。
ニーズに応じてこれらの数値を除算または減算すれば、絶対的/相対的な成長率を取得できます。