1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2024

Day 6

【Domo】はじめてのBeast mode①

Last updated at Posted at 2024-12-16

Domo(ドーモ)は、データの接続や可視化も特別な知識がなく、直感的に操作ができるツールです。
可視化の下準備:データ整形にあたるETL処理もSQLの知識がなくても行うことができます。

Domoを学び始めて、既存のデータセットからの可視化までDomoで一通りできるようになった頃、こんな場面にあったことはないでしょうか?

・今あるデータセットの列(カラム)同士を計算させたい
・この列(カラム)さえがあれば、もっと見やすいカードが作れるのに…
・Excelだったら自分でも簡単に計算できるのに!

企業の運用によっては、可視化は許可されているがデータ作成はNG、とされているところもあるかと思います。ユーザーサイドではこんな場面もあるのではないでしょうか。

・列の追加申請が大変。。
・データセットへの列追加の対応まで時間がかかる
・カード作成の場面で必要としているので、今すぐほしい!

こういった場面でユーザーが簡単に新たな列(カラム)を作成できるDomoの機能が、Beast modeです。

Beast modeはSQLの記述で様々なことができる機能ですが、SQLがわからなくても、これをコピー&ペーストすればすぐ使える!という記述をいくつかご紹介します。
※私はSQLを知らぬまま、Beast modeに触れ学んでいきました:door:

既存のデータセットに対して、異なるデータの列追加は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
①日別・商品別の集計
Beast modeの記述
`売上` / `前年売上`

A÷BA/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でいう集計行を列で集計してしまった結果と同じで、①で作成した前年比を合算している状態です。

こちらを改善するために記述を、売上を集計した後に除算となるように修正する必要があります。

Beast modeの記述(修正後)
SUM(`売上`) / SUM(`前年売上`)

image.png

結果はこのようになります。

日付 売上 前年売上 前年比
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で解決することもできます。
ここでは検証のため、新たに前年差(売上-前年売上)を作成します。

前年差 Best 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単体での記述だと、以下のような結果になります。

Best modeの記述
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

これを一つの記述にまとめると以下のようになります。

前年差(修正後)Best modeの記述
SUM(IFNULL(`売上`,0) - SUM(IFNULL(`前年売上`,0))

0を含む列でのBeast mode

今回の結果はNullでしたが、一般的にSQLでは除算時の分母が0の場合にエラーとなります。
エラーを回避するため、0をNullに置き換えするため、NULLIFを使用します。
NULLIF単体での記述は以下になります。

Best modeの記述
NULLIF(`前年売上`,0)

このまま使用すると、Nullを含む集計になってしまうため以下のようにします。

前年比(修正後)Best modeの記述
SUM(`売上`,0) / NULLIF(SUM(`前年売上`),0)

これで前年売上の集計結果が0の場合、Nullに置き換えてから除算してエラーを回避できます。

まとめ

・予期せぬエラーを未然に回避するため、四則演算の際はIFNULLNULLIFを用途に合わせて使い分けましょう。
・データセット作成時のETL処理でNullや0を適切な値にすると、カード作成時のBeast modeの記述の負担が減ります。できるだけETLでの処理を心がけましょう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?