Tableau計算1 論理関数

先日Data Saber BootCampの活動の中でOrd.5について、議論を行いました。Ord.5は計算フィールドやパラメータなど、多種の機能を使って説き進めていくものになります。
その中で使用した論理関数について、改めていろんな書き方があると気づいたのでこちらのほうで気づきの共有をしたいと思います。

論理関数とは簡単にいうと「ある特定の条件がTrue(真)なのかFalse(偽)なのか判定を行う」関数です。
IFやIIF、CASEがこれにあたります。さらには複数条件を設定するためのANDやORなども論理関数にふくまれます。
いろんな書き方があるというのは、同じ判定をしようとしたときに、IF、IIF、CASEのいずれを使っても同様のことができるという意味です。
実際に見てましょう。

魚種別釣果

上のVizは魚種別に過去どれだけ釣れたかを表したものです。
こちらの魚種の中には海の魚もいれば、川の魚もいます。
このVizに川の魚、海の魚というディメンションを論理関数で追加してみます。

① IF文の場合

IF文自体はExcel関数にもあるのでそれなりに馴染みのある方も多いかと思います。
Tableauでの書き方は
 IF   条件式① THEN 結果①
 ELSEIF 条件式② THEN 結果②
 ELSE   それ以外の場合の結果
 END
となります。
この条件式の中にANDやORを入れてやることで、複数条件の場合の結果も出力できます。

IF文を用いた判定

上記の式を書きました。文字列型の判定なのでアポストロフィ('')で囲むのを忘れないようにしましょう。 
これでディメンションに海の魚と川の魚を追加できました。

判定結果

NULLがでてきました。
アジとアユの判定しか書いてないので当然ですよね。
ではそれぞれの魚種についてELSEIF。。。。と追加していくのも面倒ですよね。
ELSEやANDも使ってみます。

ORやELSEを使った条件式

上記の場合はアユまたはアマゴなら川の魚、それ以外は海の魚という書き方をしています。

判定結果2

思った通りの結果になっているのではないでしょうか?

このようにIF文を使用した場合、ELSEIFを使って条件式自体を追加したり、ORやANDなどで複数条件を追加したり、ELSEで条件式に書いていないものをまとめたりして使います。
同様のことをIIF文でやってみます。

② IIF文の場合

IIF文はExcel関数にはないので、あまりなじみはないかと思います。VBA関数のほうにはあるので、マクロを自分で書いたことがある人はもしかしたら使ったことがあるかも?程度です。
自分はIIF関数はマクロでも使ったことがありませんでした。
Tableauでの書き方は
 IIF (条件式①, Trueの場合の結果, Falseの場合の結果)
となります。
先ほどIF文で書いたことと同じことが、IIF文でもできることがわかりますか?
実際に書いてみます。

IIF文を用いた魚の判定

この式の中では条件式①の中で「魚種がアユまたはアマゴなら」、Trueの場合の結果に「川の魚」、Falseの場合の結果に「海の魚」という書き方をしています。

IIF文を用いた魚の判定結果

IF文で書いた結果と全く同じ結果になっています。
今回の場合は判定結果が海の魚か川の魚かの2通りだったからできましたが、IIFを用いた場合、Trueの時の結果、Falseの時の結果の二通りしか出力できないように見えませんか?
例えばここに「川から海へ」という第三の結果を入れたい場合はどうでしょうか?
IF文の場合はELSEIFを用いて条件式を書いてやれば「川から海へ」という結果も出力できるのですが。。。

その場合は入れ子にしてしまいましょう。

上の文章ではFALSEの場合の結果という部分に「海の魚」という判定結果を入れましたが、ここにさらにIIF関数を組み込んでやれば解決します。

IIF文入れ子

上記の式では条件式①で、まず魚種がアマゴかどうか判定をしています。Trueの場合は「川の魚」です。
Falseの場合はという部分にさらにIIF関数を追加して二つ目の条件式を書いています。二つ目の条件式で魚種がアユの場合は「川から海に降ります」、さらにFalseの場合は「海の魚」です。
という書き方をしています。

IIFを用いた入れ子の結果

ちなみに全くの余談ですが、アマゴも海に降ります。一生を川で生活する陸封型のものをアマゴと呼び、海に降り、海から帰ってくるものをサツキマスとよびます。
本当に全く関係ない話でした。

以上でIF文で書いた結果をIIF文で書くこともできました。
それでは最後にCASE文についてみていきたいとおもいます。

③ CASE文の場合

CASE文もExcel関数にはないですがVBA関数にはあります。VBA関数と書き方が違うので、最初は少しどうだったっけ?となる論理関数でした。
CASE文の書き方
 CASE 判定したい対象 
 WHEN 場合分け① THEN ①の結果
 WHEN 場合分け② THEN ②の結果
 END
IF文、IIF文とは毛色が少しことなります。
条件式を書くことをしません。
まず判定したい対象があって、その対象が①の場合、①の結果、②の場合、②の結果、という書き方をしていきます。
具体的に見ていきましょう。

CASEを使った魚の判定

上記の式ですが、今回判定したい対象は[魚種]というディメンションになります。
それが、アユだった時、川の魚、アマゴだった時、川の魚、それ以外は海の魚という書き方をしています。

CASE文を使った魚の判定結果

思ったように分かれています。
ただ、アユもアマゴも同じ出力結果なのにいちいちWHEN~THEN~と書くのは面倒じゃないですか?
そんな時はIN関数を使いましょう。

IN関数の使用

出力結果が同じ場合は場合分けの中をINでくくりましょう。
結果については同じものができあがります。

④ IF、IIF、CASEの使い分けについて

ここまでで、同じ結果を三つの論理関数で判定してきましたが、じゃあどれを使えばいいの?という話になります。
結果が同じなら正直どれを使ってもよいかと思いますが、なるべくすっきりと誰がみてもわかるように書きたいですよね。
私の中でのIF文とCASE文の使い分けにはなるのですが、1つの条件式の中で複数条件を組み込みたい場合はCASEでは無理なのでIF文を、使います。ただ条件が多くなればなるほど横に広がって見にくくなります。
判定したい対象が一つの場合はCASE文を使ったほうがすっきりします。
ただ場合分けが多くなればなるほど縦に広がっていきます。
条件が複雑で、さらにその条件の中でも場合分けをしなければいけない場合はIFとCASEを組み合わせても良いです。
IIFは条件式について、明確にTrueの場合、Falseの場合でやりたいことがはっきりしていれば一番きれいに書けると思いますが、入れ子にしてしまうと最終的に閉じかっこがひどいことになります。ex. )))))))
色々と試行錯誤してみてください。
皆さんの使い分けについても教えていただければ新たな発見があるのではないかとおもっています。

以上 論理関数についてでした

この記事が気に入ったらサポートをしてみませんか?