Tableauで行や列を自動的に非表示にする方法
概要
例えばここに2023年1月~2024年12月までの24カ月分のデータがあったとする。
年月,実績
2023/1/1,117
2023/2/1,87
2023/3/1,102
2023/4/1,130
2023/5/1,65
2023/6/1,132
2023/7/1,135
2023/8/1,65
2023/9/1,108
2023/10/1,149
2023/11/1,132
2023/12/1,102
2024/1/1,145
2024/2/1,79
2024/3/1,148
2024/4/1,84
2024/5/1,127
2024/6/1,117
2024/7/1,131
2024/8/1,145
2024/9/1,104
2024/10/1,52
2024/11/1,82
2024/12/1,130
これをTableauで表示するとこうだが、
例えば直近1年分しか表示させたくないとしたらどうするだろう。
つまり24年1月~現在まで表示させたいという場合だが、
一番簡単なのは相対日付でフィルターする事だ。
過去1年間あるいは今年でフィルターをすれば2024年分だけで絞る事ができる。
他にもディメンションフィルターで絞る手もある。
しかしそれらのように通常のフィルターを使ってデータを”除外”した場合、やりたい事によっては不都合が起きる場合がある。代表的なのは前年比の算出だろう。
前年比(前年同月比)は当年÷前年で出す事が出来るので、一番簡単なのは前もってデータで前年実績を持たせておく事である。つまりは下記のような感じだ。
色を塗った部分は全く同じ数値という事になる。
こうして同じ行に揃えておけば、ただ計算フィールドで[実績] / [前年実績]と書けばいい事になる。しかし実務ではそうもいかないケースも多いのではないかと思う。そう簡単に元データソースをいじれない場合であったり、あるいはリソース節約の観点から全く同じ数値をごっそりもってくるような列を新設する事が許されない場合もあるかもしれない。
そういった場合に使えるのが表計算関数だ。わざわざデータソースで前年実績を前もって同じ行に用意せずとも、Tableauの機能でそれと同じことを実現する訳だ。
表計算関数のLOOKUPを使って次のように書く事で前年実績を用意できる。
これをメジャーバリューに配置して、表 (下)で計算されている事を確認する。
つまり単純な話だが、表計算関数をつかって12行前の実績を取ってきているという事である。
それでシートを見てみると、
あれ?前年実績が表示されてないじゃないか!となる。
※その解説をする前にヘッダー名が分かりづらいのでここで別名「前年実績」を付与しておく。
さて、前年実績が表示されなかった理由だが、
それはフィルターで12行前が”除外”されていたからである。
なので「年月」フィルターを外してあげると・・・
きちんと前年実績が表示された。
先程見せたExcelのような構成が計算フィールドを使うだけで実現できた事になる。
ここまでくれば前年比も簡単に定義できる。
しかし・・・わざわざ画面に表示させたくもない前年行を残したままというのは全くイケてない。ダッシュボードシートでは空白などのオブジェクトで無理やり隠すか?画面外に表示させて隠すか?などの力業を考える方もいるかもしれない。
こういう時に便利なのが、Tableauの標準機能である「非表示」だ。
画面で2023/1/1~2023/12/1までを範囲選択して年月列で右クリックで「非表示」を押してみよう。
そうすると、綺麗に表計算の機能は維持しつつ不要な行を非表示にする事ができた。
これにて一件落着!解散!
・・・としたい所だが、残念ながら普通はそうはならない。
この非表示機能というのは完全に手動操作限定であり、計算フィールドなどで制御できないのである。つまり、定型レポートのようなダッシュボードで自動的にデータが入れ替わるような場合、常に最新分だけを”除外”せず”非表示”にする!という望みを叶える事はできないのだ。
ではどうするか?
実はいい方法が一つだけあるので、それを皆さんに紹介しようと思う。
「除外」せず「非表示」を自動的に実現する
まずは一回非表示を元に戻す。
そして計算フィールド「当年以外非表示」を定義する。
それを「連続」に変換する。
それをフィルターに入れて、今年で絞る。
そうすると、きちんと前年比が計算されつつ非表示にする事ができた!
年月を右クリックすると分かるが、「非表示」は出ているが「非表示のデータを表示」は出ていない。つまりTableau標準機能としての「非表示」は使ってないのだ。使ってないが、それとほぼ同等の機能が実現できた事になる。
何故こういう事ができるのか?それはフィルターの順序に答えがある。
この図を見ると分かるが、最初に前年比算出が失敗したフィルターはこの図でいう「Measure Filters」に該当する。無論それより上の「Dimension Filters」以降でも全て失敗する(正確には「表計算関数(LOOKUP等)を使って前年比等を正しく算出する事ができないケースがある」という意味だが)。
それで一番最後に使ったのは表計算関数を使ったフィルターなので、一番下の「Tableau Calc Filters」に当たる。注目ポイントはこの赤丸で囲った「table calcs」だ。
これは何かというと、ビュー上で表計算が行われている部分である。
つまり画面更新の順序として、表計算が行われてから表計算フィルター(Tableau Calc Filters)が走るようにすれば「非表示」のような機能が実現でき、前年比が正しく算出されるという事である。
失敗した時は先にフィルターされてしまってから表計算が走った為、前年比が出せずに真っ白になったという訳だ。
何時何時(いつなんどき)でも絶対不変のフィルターを構築する
基本的な事は実装できたので、ここからは応用編になる。
まず、ここまでの段階で実装した内容に致命的な傷がある事に気付いただろうか。
Tableauの相対日付のフィルターというのはデータ自体の年月に関係なく、常に「現在」を基準にフィルターされている。
※正確には基準アンカーという所をいじれば今日以外の基準にも設定できるが、これは手動で違う日付を直接指定できるだけで計算式などは使えず自動化には不向きなので実用性は無い。
従って、データの更新日程と現在という時に乖離がある場合、タイミングによっては真っ白で何も表示されなくなる事があるという事だ。例えば今のままの設定でデータ自体が更新されず年を越した場合、ここまで見てきたビューは「当年以外非表示」のフィルターによって画面が真っ白にされてしまうという事になる。
そもそもの話、ダッシュボードや要件によってはもう定期更新は打ち切りで古いデータのまま残してるものだってあるかもしれないし、常に更新している場合であっても年を越した瞬間にキッカリデータを更新するというのも難しい場合もあるだろう。かといってそういう「穴」があるタイミングの時だけ手動でダッシュボードでフィルター設定をいじるなんてやりだしたら自動更新とは言えなくなるし、手動作業は増える、ミスも増えるでいい事ないだろう。
理想は現在という時に全く左右されずデータの日付だけを見て、その最新分だけを常に表示するようなダッシュボードなはずである。人の手による手動管理が全くいらないで済ませるのが一番いい。
そんな事できる訳なくないか?と思うかもしれないが、実は割と簡単に実装できる。
実装は簡単だが、まずはその理想形の仕組みをきちんと理解する事が必要だ。
その理解をする為に、今(執筆時は2024年5月23日)が2024年ではなく2025年だとした場合をシミュレーションしてみよう。
つまり、フィルターの編集画面で今年を選んでいる時に出ている日付が2025/1/1~2025/12/31になっている状態をイメージするという事だ。
一体どうすればシミュレーションできるか、それにはとりあえず、ここで「今年」ではなく「翌年」を選んでみればよい。
実際の運用では「翌年」を選ぶ事はない訳だが、あくまでシミュレーションである。
そしてビューはどうなるか。真っ白である。
つまりこのままデータを更新せず放置した場合、翌年にはこの状態になるという事である。裏を返せばその翌年の状態であっても最新分がきちんと表示できるようにできれば目標達成という事になる。
この課題をクリアするには頭を柔らかくしなければならない。
自力で解きたい方はここで一旦閲覧を中断して自身で考えてあれこれ試してみるのもいいだろう。
では、先へ進む用意ができている方に向けて解説を始める。
まず、計算フィールド「当年以外非表示」を表示してみる。
この「年月」をどうにかすればいけるんじゃないか?という事を考えてみよう。
つまり、今がどんな日付であったとしても、この年月が常に理想の年月であってくれたらいい訳だ。
どういうことだ?と思うかもしれないが、では式を次のように変えてみたらどうか。
これで確定をすると・・・
データがきちんと表示された!
これはつまり、データの日付に無理やり1年足した日付に対してフィルターをしているという事である。なので2025年のフィルター設定と合致したのでデータが表示されたという事だ。
しかしこの1は再来年になれば2になってる必要があるし、3年後であれば3・・・と変えていかなければならない。なのでその部分だけ計算で求めればいいだけである。
答えはこうなる。
これで今の設定であれば翌年にしてしまっているのでビューは真っ白になるが、答えさえ出てしまえばもうシミュレーションは不要なので設定は今年に戻しておこう。
これで確定するとまたデータが綺麗に表示された状態になるが、大事なのは、
この計算式を設定した状態であれば、ここから先来年になろうと再来年になろうと、5年後であろうといつになろうともこのビューが保たれるという事だ。
正解の式をもう一度見てみよう。
LOOKUP(DATEADD('year',YEAR(TODAY()) - YEAR(MIN({MAX([年月])})),MIN([年月])),0)
これは何をしているか?DATEADDの第二引数で、
現在の年「YEAR(TODAY()) ⇒ 2024」から、
データの最新年月「YEAR(MIN({ MAX([年月]) })) ⇒ 2024」を引いているだけである。
つまりこの現在の例では2024 - 2024 = 0だが、
これが来年になると2025 - 2024 = 1になるし、
再来年になれば2026 - 2024 = 2,
5年後であれば2029 - 2024 = 5といった感じで勝手になってくれる。
{MAX([年月])}
↑これはFIXED構文である。FIXEDキーワードを省略しているが、つまりは
{FIXED : MAX([年月])}
このように書いてあっても同じ意味である。
FIXEDの意味をここで詳細に解説するのは趣旨から外れるのでやめておくが、ごく簡単に言えば今回の例では「データのすべての行を対象にMAX関数を適用している」処理になる。
つまりはデータの中で一番新しい日付を取得しているという事だ。
なので今がいつであろうと関係なくなるのと同時に、最新データがいつ新たに追加されようが自動的にその中で最新1年分のデータを表示できるようになっているという事になる。
最新年度のみ表示せよ
更なる応用編である。
ここまで見てきた例では1月~12月までの最新1年間を表示する話だったが、そうではなく会計年度が4月だとした場合、4月~翌年3月までの最新年度のみを表示したい場合はどうするか考えてみよう。
まずは「当年以外非表示」の計算式を次のように変えてみる。
'year'ではなく'month'に変え、-3している。
これで確定すると、
確かに4月~3月まで表示された。
※今は最新日付が2024/12/1までしか入っていないので2024年分までしか出てないが、仮に2025/1~2025/3のデータがあれば2025/3まで表示されていた。
これを踏まえた上で、この -3 の調整部分は次のように求めればよい。
(現在日付の最新年度 - データ内の最新年度) * 12 - 3
つまり現在が24年度でデータ内の最新年度も24年度だとした場合、
(2024 - 2024 = 0) * 12 - 3 = -3
という事になるし、データはそのままで日付だけ25年度に入った場合は、
(2025 - 2024 = 1) * 12 - 3 = 9
という事になる。
この設定ができれば常に最新1年度分のデータが表示できるようになる。
つまり具体的な計算式としてはこうなる。
(YEAR(DATEADD('month', -3, TODAY())) - [最新年度]) * 12 - 3
長くなるので「データ内の最新年度」は [最新年度] と表しているが、これも中身はFIXEDを使って求めればよい。余裕がある方はこの [最新年度] の部分の計算式を考えてみるのもよいだろう。
終わりに
どうだっただろうか。最後は少し難しかったかもしれないが、自身で色々試してみると理解が進みやすくなる。使い所は多いテクニックだと思うので確実に押さえておきたい所だ。
Discussion