Domo(ドーモ)は、データの接続や可視化も特別な知識がなく、直感的に操作ができるツールです。
可視化の下準備:データ整形にあたるETL処理もSQLの知識がなくても行うことができます。
Domoを学び始めて、既存のデータセットからの可視化までDomoで一通りできるようになった頃、こんな場面にあったことはないでしょうか?
・今あるデータセットの列(カラム)同士を計算させたい
・この列(カラム)さえがあれば、もっと見やすいカードが作れるのに…
・Excelだったら自分でも簡単に計算できるのに!
企業の運用によっては、可視化は許可されているがデータ作成はNG、とされているところもあるかと思います。ユーザーサイドではこんな場面もあるのではないでしょうか。
・列の追加申請が大変。。
・データセットへの列追加の対応まで時間がかかる
・カード作成の場面で必要としているので、今すぐほしい!
こういった場面でユーザーが簡単に新たな列(カラム)を作成できるDomoの機能が、Beast mode
です。
Beast mode
はSQLの記述で様々なことができる機能ですが、SQLがわからなくても、これをコピー&ペーストすればすぐ使える!という記述をいくつかご紹介します。
※私はSQLを知らぬまま、Beast mode
に触れ学んでいきました
既存のデータセットに対して、異なるデータの列追加はBeast mode
では解決できず、データセット作成(ETL
処理など)からの対応となる可能性が高いです。
Beast mode(ビーストモード)とは
Beast Mode機能は、計算フィールドを追加してチャートの列を変換するのに使用できます。
引用元:Domo Central | Beast mode計算を作成する
計算して列を変換(=追加)できる機能です。
追加された列は、カード単体でのみ使用することも、同じデータセットの他カードで使用することもできます。
使用の範囲は作成時に選択可能です(後から変更も可)
この計算を行う場所へは2つのアプローチがあります。
1.Analyzer画面(カード作成時)
カード編集(Analyzer)画面の左下にある「計算フィールドを作成」で作成できます。
※データセットにない列を必要とする場面はカード作成時の場合が多く、私は主にこのアプローチで作成してます。
こちらが計算フィールドです。
作成時に、現在のカード単体で使用するか、このデータセットで共通の列として使用するか選択します。(デフォルトはカード単体)
2.Beast modeマネージャー
データセットに対して列を作成します。
そのため、初めからデータセットで共通で使用する列としての作成になります。
ヘッダーの「データ」タブを選択して、左サイドのタブに”強面のおじさん"のアイコンを選びます。
※タブ→タブなので、ちょっと見つけにくいかも。。
選択すると”強面のおじさん”再登場!
…彼がビースト!?※アメコミの「HELLBOY」では!?という噂も。。。
右上の「計算フィールドを作成」よりデータセットを選択したら、記述する計算フィールドが開きます。
カード作成時との違いは、列の作成を”カード単体”or”データセットで共有”の選択ができず、データセットで共有となります。(”計算をDatasetに保存”のチェックボックスが非活性)
_
Beast mode
が広く使われるようになると、1つのデータセットに対して似たような計算や列名だけが異なるようなBeast mode
が作成されたりもします。
そんな場面ではBeast modeマネージャーでデータセット毎やBeast mode
に特化した管理ができます。
まずはは 1.Analyzer画面(カード作成時)の方法で始めてみるのがオススメです。
それでは本題のBeast modeを実際に書いてみましょう!
四則演算
計算って聞くと私は四則演算がまず思いつきます。Excelでも四則演算は日常的に使っている方が多いと思います。
足し算、引き算、掛け算、割り算…などの計算については、Beast mode
での記述はExcelとほぼ同じです。
ここでは、実用場面が多い除算についてフォーカスしてみます。
除算(割り算)
ここでは前年比
(売上÷前年売上)を計算したいと思います。
使用するデータはこちらです。(本文中のデータは全てサンプルデータです)
日付 | 商品 | 売上 | 前年売上 |
---|---|---|---|
2024/04/01 | A | 12,000 | 8,000 |
2024/04/01 | B | 8,000 | 16,000 |
2024/04/01 | C | 12,000 | 16,000 |
2024/04/02 | A | 12,000 | 12,000 |
2024/04/02 | C | 16,000 | 8,000 |
2024/04/03 | C | 12,000 | 8,000 |
①日別・商品別の集計
`売上` / `前年売上`
A÷B
はA/B
となり、Excelとほとんど同じですね。
結果はこのようになります。
日付 | 商品 | 売上 | 前年売上 | 前年比 |
---|---|---|---|---|
2024/04/01 | A | 12,000 | 8,000 | 1.50 |
2024/04/01 | B | 8,000 | 16,000 | 0.50 |
2024/04/01 | C | 12,000 | 16,000 | 0.75 |
2024/04/02 | A | 12,000 | 12,000 | 1.00 |
2024/04/02 | C | 16,000 | 8,000 | 2.00 |
2024/04/03 | C | 12,000 | 8,000 | 1.50 |
新たに作成された前年比
の列に、売上÷前年比の結果の値がありますね。
Excelで計算列を作っている感覚とほぼ同じかなと思います。
②日別の集計
ただ、この記述だと行単位(今回のデータだと日別・商品別売上)で計算されているため、可視化の際の小計、合計で期待している値と異なってしまう場合があります。
日単位で集計した時の結果はこちらです。
日付 | 売上 | 前年売上 | 前年比 |
---|---|---|---|
2024/04/01 | 32,000 | 40,000 | 2.75 |
2024/04/02 | 28,000 | 20,000 | 3.00 |
2024/04/03 | 12,000 | 8,000 | 1.50 |
行単位で計算した値を合計しているため、4/1と4/2の前年比がおかしな数値になってますね。
<正しい値>
2024/04/01 32,000÷40,000=0.8
2024/04/02 28,000÷20,000=1.4
Excelでいう集計行を列で集計してしまった結果と同じで、①で作成した前年比を合算している状態です。
こちらを改善するために記述を、売上を集計した後に除算となるように修正する必要があります。
SUM(`売上`) / SUM(`前年売上`)
結果はこのようになります。
日付 | 売上 | 前年売上 | 前年比 |
---|---|---|---|
2024/04/01 | 32,000 | 40,000 | 0.80 |
2024/04/02 | 28,000 | 20,000 | 1.40 |
2024/04/03 | 12,000 | 8,000 | 1.50 |
今度は期待している値になってますね!
修正後の記述でも、①日別・商品別での結果は先ほどと同じになります。
③商品別の集計
さらに、作成した前年比
を使用して商品別で集計した場合の結果はこちらです。
商品 | 売上 | 前年売上 | 前年比 |
---|---|---|---|
A | 24,000 | 20,000 | 1.20 |
B | 8,000 | 16,000 | 0.50 |
C | 40,000 | 32,000 | 1.25 |
集計が日付から商品に変わっても正しい値になっていますね。
まとめ
・Beast mode
は、SQLの知識がなくても使い始めることができる機能です。まずは四則計算から慣れてみましょう。
・粒度が異なる集計でも柔軟に利用できるBeast mode
を心がけましょう。
おまけ:Nullや0を含むデータの計算
Nullや0を含むデータの計算
Beast modeで除算をした際にエラーとなってしまう場合、要因の一つに集計したい列でデータの欠損の可能性が挙げられます。
データセット作成時のETL処理での解決が望ましいですが、Beast mode
で解決することもできます。
ここでは検証のため、新たに前年差
(売上-前年売上)を作成します。
SUM(`売上`) - SUM(`前年売上`)
Nullを含めた計算
4/3の前年売上をNullとします。
Nullを含む減算
日付 | 商品 | 売上 | 前年売上 | 前年比 | 前年差 |
---|---|---|---|---|---|
2024/04/01 | A | 12,000 | 8,000 | 1.50 | 4,000 |
2024/04/01 | B | 8,000 | 16,000 | 0.50 | -8,000 |
2024/04/01 | C | 12,000 | 16,000 | 0.75 | -4,000 |
2024/04/02 | A | 12,000 | 12,000 | 1.00 | 0 |
2024/04/02 | C | 16,000 | 8,000 | 2.00 | 8,000 |
2024/04/03 | C | 12,000 | Null | Null | Null |
前年比:12,000 / Null = Null
前年差:12,000 - Null = Null
前年比
(除算)、前年差
(減算)ともに、結果はNullになります。
0を含めた計算
4/3の前年売上=0とします。
分母が0の除算
日付 | 商品 | 売上 | 前年売上 | 前年比 | 前年差 |
---|---|---|---|---|---|
2024/04/01 | A | 12,000 | 8,000 | 1.50 | 4,000 |
2024/04/01 | B | 8,000 | 16,000 | 0.50 | -8,000 |
2024/04/01 | C | 12,000 | 16,000 | 0.75 | -4,000 |
2024/04/02 | A | 12,000 | 12,000 | 1.00 | 0 |
2024/04/02 | C | 16,000 | 8,000 | 2.00 | 8,000 |
2024/04/03 | C | 12,000 | 0 | Null | 12,000 |
前年比:12,000 / 0 = Null
前年差:12,000 - 0 = 12,000
今回、Beast modeの除算では分母=0の場合にNullとなりましたが、エラーとなる可能性が高い計算です。
Nullを含む列でのBeast mode
値がNullの場合、減算で正しく計算されるように、Nullを0に置き換えます。
置き換えにはIFNULL
を使用します。
IFNULL
単体での記述だと、以下のような結果になります。
IFNULL(`前年売上`,0)
日付 | 商品 | 売上 | 前年売上 |
---|---|---|---|
2024/04/01 | A | 12,000 | 8,000 |
2024/04/01 | B | 8,000 | 16,000 |
2024/04/01 | C | 12,000 | 16,000 |
2024/04/02 | A | 12,000 | 12,000 |
2024/04/02 | C | 16,000 | 8,000 |
2024/04/03 | C | 12,000 | 0 |
これを一つの記述にまとめると以下のようになります。
SUM(IFNULL(`売上`,0) - SUM(IFNULL(`前年売上`,0))
0を含む列でのBeast mode
今回の結果はNullでしたが、一般的にSQLでは除算時の分母が0の場合にエラーとなります。
エラーを回避するため、0をNullに置き換えするため、NULLIF
を使用します。
NULLIF
単体での記述は以下になります。
NULLIF(`前年売上`,0)
このまま使用すると、Nullを含む集計になってしまうため以下のようにします。
SUM(`売上`,0) / NULLIF(SUM(`前年売上`),0)
これで前年売上
の集計結果が0の場合、Nullに置き換えてから除算してエラーを回避できます。
まとめ
・予期せぬエラーを未然に回避するため、四則演算の際はIFNULL
、NULLIF
を用途に合わせて使い分けましょう。
・データセット作成時のETL処理でNullや0を適切な値にすると、カード作成時のBeast mode
の記述の負担が減ります。できるだけETLでの処理を心がけましょう。