見出し画像

Tableau数学 - 2. Projection view : 投影図

 こんにちは、おつうです。今年も参加させて頂きました、Tableau Tips * Tabjo Advent Calendar 2023では、Tableau数学の第2弾を執筆してみようと思います。
 さて今回は、先日のMoM2023W41で使った「投影図」について、オリジナルであるさかぴーさんへのリスペクトも込めて、数学の考え方から説明してみます。


はじめに

 今回の投影図を理解するにあたって、重要なキーワードはベクトル行列です。多くの大学生は線形代数として履修します。これを基礎からすべて説明するのは時間がかかるので、「Tableauの計算フィールドで何をしているのかを、なんとなく理解して使いこなす」ことをこのNoteのゴールにしたいと思います。とは言いつつも、Tableau数学では最低限の数学の知識は、しっかりと説明することをモットーにしてますので、是非お付き合いください。

ベクトルと行列

ベクトルとは、向きと大きさを持つ量

 ベクトルとは、数を一列に並べたものです。ベクトルは大きさ向きの2つの要素を持ちます。イメージしやすくするために、3次元空間を考えます。原点に始点を置いたとき、任意の点までの距離が大きさであり、矢印の方向が向きになります。このベクトルを数学では以下のように記述します。これが行列です。

横に並んだものが行、縦に並んだものが列

 行列とは、数を縦と横に並べたものです。先ほどはベクトルを行列で表したので1列しかありませんでしたが、以下のような行列も存在します。

行列の第 i 行目、j 列目の成分を特に行列の (i, j) 成分と言う

行列の演算規則と一次変換

 今回は、行列の積(掛け算)について説明します。これは、ルールとして覚えてもらうしかありません。

3行3列型と3行1列型の積

 まず、青い線を見て下さい。計算結果の1行目は、1行目と1列目を順番にかけたものを足すことで得られます。次に2行目は、赤い線で示した2行目と1列目の積の和です。具体的な数字を代入すると、イメージしやすいはずです。

順番にかけて足すと新しい3行1列の行列が得られる

 そもそも、なぜベクトルを行列で表現したのかというと、計算しやすくするためです。そして、行列の積を計算することにより、新しいベクトルが得られることが分かりました。これが、ベクトルの一次変換であり、線形代数の醍醐味でもあります。つまり、行列とは「ベクトルの別のベクトルに変換するもの」です。

一次変換では元のベクトルを新しいベクトルに変換する

 一次変換が図形的にイメージしやすくなる動画を見つけました。このように、元のベクトルを自由に変換することで、新しいベクトル、つまり今回であれば投影図を計算するわけです。

引用:https://www.headboost.jp/what-is-linear-transformation/

投影図

 さて、漸く本題です。今回は、投影図を作ります。先に述べてきたベクトルの一次変換を使うわけですが、コチラを参考にさせて頂きました。スクリーンに投影された新しい座標を、どのように計算するかが解説されています。理解したい計算式は以下です。

投影図の座標を得るための行列式

 難しいことに変わりはありませんが、これまでの説明もあって、
 1. 3行3列型の行列である
 2. ベクトルの一次変換を2回している?
ということが、なんとなくの分かるのではないでしょうか。ここからは、どのような変換をしているのか、なるべくわかりやすく解説してみます。

原点中心の球を斜め上から見た図

 スクリーンの座標は、最終的にTableauのVizを作るときに必要な、縦と横の座標情報です。元の空間座標(x, y, z)と区別するために、「h」,「v」という新たな軸で考えます。あなたは今、三次元空間にいて、少し上から球を見ています。目の前にはスクリーンがあって、上図のように球が投影されています。

z > 0 で球を切断したとき

 もう少しわかりやすくするために、球の上半分を切断しました。そして、z = 0 の高さからこの半球を見ているとします。赤矢印から見た時、x軸と球の交点にある黄色の点はどのように見えるでしょうか?「h」と「v」の原点は、もとの三次元空間の原点に重ねてあります。

半球を横からみた図

 スクリーン上ではこのように見えるはずです。目線は z = 0 ですので、黄色の点はh軸上(v = 0)にあります。この時、黄色の点がどのくらいに左に見えるか?を計算することが出来れば、投影図を描くことが出来ます。

座標軸の回転

目線をx軸上に変えてみる

 先ほどは、x軸からθ度だけ右から見ていましたが、目線をx軸上に変えてみます。すると黄色の点は、スクリーン上でどのように見えるでしょうか?

x軸上から半球をみた図

 黄色の点は、真ん中(原点上)に重なって見えます。これは、比較的イメージしやすいはずです。「水平方向(z軸周り)に目線をθだけ動かすと黄色の点は原点に戻る」ということは、「最初の目線で左に見える距離は、軸をθだけ回転させた分」と捉えることが出来ます。これが私なりの変換2の解釈です。ここで、先に説明したベクトルの一次変換が役に立ちます。

水平方向に回転させる一次変換(変換2)

 変換2の中身(3行3列の行列式)については今回は触れません。この行列式で変換すれば、水平方向にθだけベクトルを回転できるおまじないだと思ってください。

φだけ上から見た時のスクリーン上の投影図

 ここまでくると、変換3が何をしているのかは概ね予想がつくはずです。スクリーンの位置を、垂直方向にφだけ回転させています。上から見れば見るほど、スクリーン上の黄色い点はv軸のマイナス方向に動いていきます。

垂直方向に回転させる一次変換(変換3)

 ここで、下の行列式に着目します。これは変換2と変換3を先に計算しています。それぞれの行と列をかけて足すという演算規則に従って考えれば、行列の成分は理解できるはずです。実際のTableauの計算フィールドではこの行列式を使います。

原点の移動

 最後に、変換1について説明します。これは、途中で述べた「hとvの原点を、もとの三次元空間の原点に重ねる」という作業です。ex, ey, ezは自分がどこから見ているかの情報です。つまり、「ここにスクリーンを置いて、原点中心にVizを描く」と定義しています。
 では実際に、Tableau上でVizを作ってみます。データはおなじみのサンプルスーパーストアを使います。はじめに、3つのパラメーターを使って、自分がどこから見るかを決めます。

θだけ横から、φだけ上から、Rだけ離れたところから見ているとする

 目線の位置座標 (ex, ey, ez) は以下の計算式で表すことが出来ます。これは三次元極座標といいますが、言い換えるならば地球の緯度(φ)と経度(θ)の情報から三次元の座標 (x, y, z) を計算しているようなものです。

実際には3つの計算フィールドを作る

投影図の座標計算

 次に、俯瞰したい元のVizを作ります。オーダー日の月(1月~12月)を円に並べてみました。1周(360°)を12等分するので1つの要素の角度は30°です。二次元の極座標変換については過去のNoteで解説しています。xy平面に円を描きたいので、zは0としました。

二次元極座標の逆変換を用いてx,y,zの直行座標を定義する

 ここからは、本Noteの集大成といえる計算フィールドを作ります。これを理解するために、ここまで長々と説明してきました。ステップとしては2つで、原点の移動ベクトルの一次変換です。

計算フィールドで再現したい行列式

 まずは、原点の移動をしますが、これはとても簡単な計算式です。すでに作成したx, y, zから、ex, ey, ezそれぞれを引いた計算フィールドを作成してください。

1Yと1Zも同様に計算フィールドを作成する

 次に一次変換の部分です。もう一度、行列の積の演算規則をおさらいします。1行目と1列目をそれぞれかけて足したものが新たな1行目になるので、「d」の値は以下のような計算式になります。

投影図の座標を求めるためのベクトルの一次変換
実際の計算フィールド(d)

 パラメータの「Phi φ」と「Theta θ」は0~360の整数で与えているため、RADIANS関数を使って角度に変換しています。同様に、「h」と「v」も計算フィールドを作成してください。
 得られた「h」と「v」がスクリーン上の新しい座標になりますが、ここではMAKEPOINT関数を使いました。理由は、マップデータに変換してマークレイヤーの機能を使うためです。複数のマークを重ねることで、自由度の高いVizを作ることが出来ます。

要素の順番に注意。MAKEPOINT([h],[v])とすると、90°回転させたVizになる

dの意味

 「h」と「v」はスクリーン上の縦横の座標でしたが、計算結果には「d」も出てきます。この値は、もとの座標からスクリーンまでの距離に相当します。正確には、dは下図のベクトルとは向きが逆であり、基本的に負の値を取ります。距離として考えるならば、-dが正しい値です。

遠くの点ほど、-dの値が大きくなる(-d1 > -d2)

 つまり、-dの計算フィールドをサイズに使うことで、遠近感を演出することが出来ます。遠くのものほど-dの値は大きいので、サイズを反転させるか、-dの逆数(1/-d)を取ってください。ただし、今回は距離を考えるために-dで説明しましたが、実際のVizではdをそのまま使えば、サイズを反転させる必要はありません。

斜め45°から見た図。パラメータを変更すると、視点の位置が変わる。

 ここから先は、個人の表現の自由です。Viz作成にあたり、以下のポイントに注意してください。

  1. MAKEPOINTと、その粒度となるフィールド(今回はオーダー月)を詳細に入れる

  2. dをサイズで使う場合は平均値にする(合計にしない)

  3. [マップ]→[バックグラウンド レイヤー]からウォッシュアウトを100%にすることで背景色を消すことができる

zを応用した立体的なViz

 今回はx,y平面に円を描いただけなので、z = 0 に固定しましたが、何かしらのメジャーバリューを入れることで、立体的なVizを作ることが出来ます。その場合、必要な計算フィールドを複製し、新たに作成したMAKEPOINTをマークレイヤーとして追加して下さい。注意する点は、集計と非集計の混在です。メジャーバリューを非集計として扱いたい場合、私はVizLODに合わせたFIXED計算を使って先に計算しています。この時、売上の合計をそのまま使うと値が大きすぎるため、合計に対する割合に5をかけて、見た目の高さを調整しています。

月ごとの売上の割合を高さ(z軸)で表現したViz

さいごに

 今回は、ベクトルと行列についてお話させて頂きましたが、私自身もすべてを理解しているわけではありません。ただ、今回のNoteを読んで、一人でも多くの方に「投影図を作ってみようかな」と思っていただけると嬉しいです。
 最後に、今回使ったワークブックを載せておきますので、是非ダウンロードして理解を深めるための参考にして下さい。ここまでお付き合いいただき、ありがとうございました。

それでは、また。

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