見出し画像

Tableauのお勉強【集計・非集計】 

今回のテーマは分かったつもりでも分からないことだらけで奥が深い、【集計・非集計】について取り上げていきたいと思います。
よろしくお願いします!


どっちの式が正しいの?①

突然ですが「サンプルスーパーストアで地域別の利益率を出したい」
こう言われたとき、どういう計算式を作成するべきでしょうか。試しに2つの式を書いてみました。

① [利益]/[売上]

② SUM([利益])/SUM([売上])

この2つの式の違いは SUM関数を使っているかどうかですが、①の式だととんでもねえ数字が出てきます。

これは誰しもが通る道だと思っていますが、①の式だと1行レコード単位の利益率を計算してから地域別で各利益率を合計しているため、おかしな数値になってしまいます。正しい結果を得たい場合は②の式のように地域別の売上・利益をまとめて集計してから最後に割ってあげる必要があります。
①のような式を非集計計算・②のような式を集計計算といいます。

集計・非集計

★1行のレコード単位の計算=非集計 
 →行単位なので値は複数存在する
★複数のレコードをまとめた計算=集計
 →まとめる際にはSUMやAVGなどの集計関数を使用
 →フィールド別にまとめているので集計値は必ず1つになる

どっちの式が正しいの?②

次に「各地域の売上平均を出したいが、'関西地方'のみ0で表示したい」
こう言われた時どういう式を書くべきか、式を2つ書いてみました。

①  ZN ( IF [地域]<>'関西地方' THEN AVG([売上])  END )

②  ZN( AVG ( IF [地域]<>'関西地方' THEN [売上] END))

違いは集計関数のAVGの位置ですが、
果たして①と②どちらが正しい結果を得られるでしょうか。
結論からいうと②の式が正しくて①の式だとエラーが表示されます。

親の顔より見た赤字のエラー

エラーの原因は、IF文の中に集計と非集計が混在しているためです。

条件式/結果式を切り分けて見てみる

本当に混在しているのか、①の式を切り分けて考えていきます。

まず、[地域]<>'関西地方'→条件式となるこの部分は非集計になります。
この式のみを記載した計算フィールドを入れてみます。

真・偽で返される条件式をブール式といいます

各レコードに真か偽が入っています。これは、各行が[地域]を参照して条件式の結果を返しています。したがって、1行単位で計算した結果をそれぞれ返していることから非集計といえます。

次に、AVG([売上]) →結果式となるこの部分は集計関数を使っているので集計になります。

上記から①の文にはIF文に集計と非集計が混在していることが分かります。
ではなぜ集計・非集計が混在しているとエラーが出てしまうのか。
それは、比較するデータのレベルが異なるからです。
うーん。いまいち。。わからない。。。

例えば…

英・国・数・理・社の5教科のテストがあり、40点未満は赤点だとします。A君はそれぞれ70点・30点・70点・30点・70点を取りました。
するとA君は「合計270点で40点超えたから赤点免れた!( ^ω^)」と大喜びしました。
→そんな都合のいい話あっていいはずがないです。
比較するデータのレベルが異なるとこのように意味が大きく変わります。
赤点の40点(定数なので非集計)の比較対象は、各教科の点数(非集計)です。40点(非集計)を合計得点(集計)と比較するわけにはいきません。

例えが果たして適切かはさておいて、つまるところ比較で集計と非集計を混在させる不具合がおきてしまい、エラーが生じてしまいます。

条件式が集計なら、結果式も同じ集計式にする必要があります。
同様に条件式が非集計なら結果式も同じ非集計式にする必要があります。

②の式は大丈夫なの?

①の式は適切ではない事が分かりました。それでは②の式は適切なのか念のため見てみます。

②  ZN( AVG (IF [地域]<>'関西地方' THEN [売上] END))

条件式: [地域]<>'関西地方'(非集計
結果式: [売上](非集計
条件式と結果式はともに非集計なのでOKです。
比較した結果を全体でAVG関数で集計しているのでここもOKです。
→比較をしているわけではないので混在ではありません。

こちらは正しい結果が得られました。

混在のエラーはよくありがち

IF文を作る時はこの集計非集計の混在でエラーが出てくることがよくあることだと思います。(特に式が長かったり複雑だったりすると)
エラーが出た時は落ち着いて、どちらか片方のレベルに合わせるということを頭に入れて、実践を繰り返していけば理解が深まると思います。

ATTR関数

実は、ATTR関数というものを使えば非集計値を集計値に変換することができます。これは「属性」と表現することができます。属性と聞くと、
Tableauをやっていたら見覚えある人も多いと思います。

ATTR関数(属性)とは?

すべての行に単一の値がある場合に式の値を返す。それ以外の場合は*を返す。

上記がATTR関数の説明になりますが、なかなかイメージがつきづらかったので、私は「フィールドに与えられた情報で属性の値を特定できればその値が返され、特定できなければ*が返される。」という解釈で理解しています。

単独か複数か

[地域]を属性に変換して、[市区町村]のフィールドを入れてみます。すると、地域名が返ってきている行もあれば*と返されている行があります。

上記の現象のからくりは、市区町村名という情報でどの地域か特定していれば地域名が返され、特定できなければ*が返されます。
「伊勢」は関西地方以外に存在しないので'関西地方'と値が返されています。反対に「芦屋」はそれだけの情報ではどの地域か特定できないので*が返されます。

関西地方と九州に「芦屋」が存在しているのが分かります。

このことから、*は複数の情報を持っているということを示し、
値を返される行は単独の情報だということが分かります。
→その行が単独のレコードなのか複数のレコードを含むのか確かめたいときに使えます。

非集計を集計に

ATTR関数は、視覚化のレベルでデータを集約している(返される値は単独の情報でデータに一貫性がある)ので他の集計関数と同様に扱うことができます。試しに、先ほどエラーが起きていた①の式にATTR関数をいれてみます。

①  ZN (IF ATTR([地域])<>'関西地方' THEN AVG([売上])  END )

すると、計算式は有効になり、正しい結果が返されてきました。

②の式と同様の結果が返される

今までにも非集計のものを集計値として扱いたいという、もどかしい思いをしてきたので非常に有用な関数だと思います。使いこなせるようしっかりと復習していきたいです。

まとめ

・計算式を書くときは集計・非集計を意識する。
・条件式が集計なら結果式も集計と合わせる必要がある。
・非集計値を集計値に変換したい場合はATTR関数を使うのがおすすめ。

おわりに

今回、集計・非集計の基本的なところをざっくりまとめてみましたが、「LOD計算で算出した数値は集計なのか非集計なのか?」など、この分野はまだまだ奥が深く、未知数です。理解するのが難しくややこしいですが、まずは基本をしっかりと理解して、スムーズに解を出せるよう復習していきたいと思います。

いいなと思ったら応援しよう!