見出し画像

【Tableau】るくおれのLOOKUPtips ③LOOKUPに魅せられた男が行きついた先とは(Viz解説)

どうも、すっぱいガム愛好家るくおれことLOOKUP([俺],-1)です。
今回はTableauの表計算関数「LOOKUP」を用いて作成したvizをもとに、この関数の特徴や使い方を紹介します。みなさんのお役に立てましたら幸いです。

また、こちらはLOOKUP特集連載の第3回目となりますので、ぜひ過去の記事もご一読いただければと思います。


こんなVizを作りました

マインスイーパーをTableauで再現

さて、LOOKUP特集もついに3回目ということで、今回は私が実際に作成したVizを解説しつつ、LOOKUPのテクニックをご紹介したいと思います。

まずは以下のPublicをご覧ください。
マインスイーパーというゲームをVizで再現してみたものです。

るくおれ作 今日のマインスイーパー

知らない方は少ないかと思いますが、一応ルールを簡単に説明します。

①盤面にはクリックすると開かれるマスがある
②マスを開くと、爆弾が設置されているor数字が書かれている
③爆弾のマスを開くと即座に負けとなる
④数字のマスの周囲8マスには、その数字と同じだけの爆弾がある
このルールにのっとり、爆弾以外のマスをすべて開けたらプレイヤーの勝利となります。
つまりはマスの数字をたよりに爆弾を避け続けるパズルゲームです。

※Vizでつくるにあたり、完全に機能を再現できているとは言えません…
例えば「爆弾だと思うマスにフラグを立てる機能」が実装できていません。この辺りはうまい表現方法があればぜひご教示いただきたいです…!

どこにLOOKUPを使っているのか?

ここでルールを見直してみると、表計算っぽいところ、お気づきになりませんでしょうか?

④数字のマスの周囲8マスには、その数字と同じだけの爆弾がある

出典:【Tableau】るくおれのLOOKUPtips③(循環参照)

周囲8マス…これは表計算のにおいがプンプンしますねぇ!?
ということで、「周囲のマスに爆弾が何個あるか?」というロジックを実装しました。

じゃあ、作ってみますか

前提として、元データは以下のようなシンプルなものを利用しています。

9×9マスにしたいので、
X=1,Y=1~X=9,Y=9までの計81行
それ以外の列は元データにはありません

[地雷の場所]は選択した難易度とTODAY関数によりランダムに生成しており、地雷の場所になったセルには1を、それ以外にはnullを返すように設定してあります。
ここに関してはややこしいのであえて計算式は省きますが、なんか色々掛け算したりしてランダムっぽくしてるって感じ捉えていただければOKです。詳しくは「線形合同法」と調べていただければと思います。(ぶっちゃけ私もよくわかってないです)

そして、本題に入ります。
周囲の8つのセルで1があるものを足し合わせていくと地雷の数は求まるので、まずは上下1マスと左右1マスの判定を行いました。

[上下]
ZN(LOOKUP(ZN([地雷の場所]),-1))
+ZN(LOOKUP(ZN([地雷の場所]),1))

[左右]
ZN(LOOKUP(ZN([地雷の場所]),-1))
+ZN(LOOKUP(ZN([地雷の場所]),1))

なにかがおかしい、誤植か?と気づいたあなたは偉い。
そう、何を隠そうこの2つは全く同じ計算式となっています。

LOOKUP関数は表計算の向きがとても重要です。
この子たちにはそれぞれ「君の向きは表(下)だよ」「君の向きは表(横)だよ」と教え込んであげるために、2種類必要ということです。
同じ運命をもつ2人は、私の指嗾により永遠にすれ違うのです。

そして、最終的な値となる[周囲]の計算フィールドが以下です。

[周囲]
IF [地雷の場所]=1 THEN NULL
ELSE ([上下]+[左右]+ZN(LOOKUP([左右],-1))+ZN(LOOKUP([左右],1)))
END

まず自身が地雷である場合には数値は表示の必要が無いため条件分岐をしています。
地雷でない場合、先の[上下][左右]の値に加え、さらにひとつ前とひとつ先の[左右]を足しこんでいます。
これは「上の左右」はつまり「右上・左上」にあたり、「下の左右」は「右下・左下」にあたることを利用しています。わざわざ[斜め]なんて作らなくてもよいのです。

さて、それではついにシートに表示してみます。
列:[X]
行:[Y]
マーク:円
色:[地雷の場所](1の場合赤、nullは灰色)
テキスト:[周囲]
としました。

おや、数が合わない…?

このままだと地雷の数と数字がちぐはぐですね。
ここで表計算の超重要事項を思い出しましょう。
そうです。表計算の編集ですね。

テキストに入れた[周囲]の表計算の編集を開きます。
すると「ネストされた計算」という選択肢が現れます。
これは計算式の中に複数の表計算が含まれる場合に、それぞれに対し別の計算方法を設定することができる機能です。

[周囲]自身を含め4つの選択肢

今回はこちらを
[周囲]:表(下) (斜めの計算は[周囲]の計算式内のため)
[地雷の場所]:表(横から下へ) (色に入れている[地雷の場所]も同様)
[上下]:表(下)
[左右]:表(横)
と設定します。

正しく周囲の地雷の数をカウントできています!

というわけで、今回もLOOKUP様のおかげで一件落着、というお話でした。

表計算って便利~!

おわりに

3回にあたりLOOKUPという最高の関数について語らせていただきましたが、いかがでしたでしょうか。
少しでもその魅力に気付いていただけたならLOOKUP教信者としては嬉しい限りです。
今回はマインスイーパーというパズルをもとにその素晴らしさを布教しましたが、Tableauを学ぶ上では皮肉にも表計算そのものがある意味地雷なのかもしれません。
ですが、地雷原を突っ走る勇気も時には必要です。
そのときは私も手を繋いで一緒に走らせてくださいね。
芸術のみならず、学術は爆発だ。

以上、るくおれでした。


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