毎週執筆することに一切コミットしませんが、Workout Wednesdayに関するブログを書き始めます。
目的はWorkout Wednesdayで紹介されているTableauテクニックの勉強です。
Workout Wednesdayは完全再現を目的としていますが、僕はそこまでやりません。
書式設定やツールチップは適当です。テクニックの勉強が目的なので。
このブログに使用されたTableauワークブックは以下からダウンロードできます。
Workout Wednesdayについて:http://www.workout-wednesday.com/
Week 46のページ:http://www.workout-wednesday.com/2018-week-46/
【今回のお題】
元々はAndyのMakeover Monday W45の作品です。
学んだこと:
・表計算、特にLOOKUP()の復習。
・Line Chartの始点と終点にドットを置く方法。
・Reference Lineを使って、軸の範囲を「自動」にしながら、軸範囲にゆとりをもたせられる。
以下、順に作り方を解説していきます。
データセットはこちらからダウンロードできます。
【データの整形と基本Viz作成】
整形というほど大袈裟ではないですが、元データは横に長すぎるデータでした。
少々使いにくいので、まずはピボットします。Age 0からAge100まで選択します。
ピボットのフィールド名を「Age Label」、ピボットのメジャー名を「Population」とでもしておきます。
次に、元のVizに沿って「Older Adults」と「Children」が欲しいので、先ほどの「Age Label」から作成します。
Children/OlderAdults
IF INT(SPLIT([Age Label]," ",-1)) <= 17 THEN "Children" ELSEIF INT(SPLIT([Age Label]," ",-1)) >= 65 THEN "Older Adults" END
そして以下のように配置します。Children/OlderAdultsのNULLは非表示にしてあります。
(非表示のやり方は、凡例のNULLを右クリック→非表示です)
次に、2つのLine Chartが交わるYEARを求めるために、いくつかの作業をします。
(今回のWorkout WednesdayではLOD計算を使わない、という縛りでした。これが地味に辛く…)
「2つの直線が交わる」と聞いて、最初にイメージするのは連立方程式のような「2つの直線の、y軸の値が等しいx軸の値を求めれば良い」というようなことでしょうか。
しかし、今回の場はYEARは不連続な整数なので、上のロジックは通用しません(求めるYEARが小数になりえるので)。
あるいは「ChildrenのPopulationが、Older AdultsのPopulationを超えたYEAR」という解釈でも、今回の場合は意味が通ります。
僕の場合は「ある時点のYEARでのPopulationの大小関係と、その1年前での大小関係が逆転したYEAR」というように定義しました。
問題は、僕の定義の場合、たとえば「どのようにして、"Children"の"1年前のPopulation"を、”Older Adults”の”今年のPopulation”に与えてやるか」ということが問題となります。
どういうことかというと、基礎とした上のVizでは、各データ点は「Children/OlderAdult」と「YEAR」で区切られています。この状況で、あるデータ点に、区切りをまたいだデータの情報を与えてやらないといけない、ということです。
【Table Calcを使い倒す】
こういう場合にLODで頑張れなくもないですが、今回はTable Calcの練習です。
まず最初に「Older Adultsのデータ点にChildrenのデータを渡す方法」について解説します。
結論としては、LOOKUP()を使います。
Children Population %
LOOKUP( IF ATTR([Children/OlderAdults]) = "Children" THEN SUM([Population]) / TOTAL(SUM([Population])) END )
Older Adults Population %
LOOKUP( IF ATTR([Children/OlderAdults]) = "Older Adults" THEN SUM([Population]) / TOTAL(SUM([Population])) END )
LOOKUP()がそもそも何かについては、Googleで調べたところリファレンスがたくさんある様子なので、そちらにお任せします。
要は、Children/OlderAdultsにそれぞれ対応した基準を設けてあげたのちに(ChildrenもしくはOlder Adultsを参照するように設定してあげたのちに)、IF文回してあげて、それを表計算でデータの区切りをまたげるようにしてあげよう、という感じです(きっと、多分)。
ここまで結果を見てみると、以下のようになります。簡単のためにOriginはTotal、SexはBothのパネルのみを抜き出しています。
ディメンションでChildren/OlderAdultsを分けている一方で、それぞれが異なるブロックにも対応する数字が入っていることがわかります。
では、1年前の値を持ってくる、ということはどうやればいいでしょうか。
考え方としては「Children/OlderAdultsを使用して。LOOKUP()で求めた値を、さらに”YEARを使用したLOOKUP()"を使用」します。計算式を見て頂いた方が早いです。
Children Population % -1 YEAR
LOOKUP([Children Population %],-1)
Older Adults Population % -1 YEAR
LOOKUP([Older Adults Population %],-1)
2016年はYEARの開始なので、Previousの値がありません。
それ以外では、例えば2017年では、2016年の値を参照しています。
このように、LOOKUP()を使い倒すことにより「どのようにして、"Children"の"1年前のPopulation"を、”Older Adults”の”今年のPopulation”に与えてやるか」問題が解決しました。
ということで、下記の式によって世代間人口の逆転が起きた年を求められます。
(先ほどのPreviousは使っていませんが、本質的には同じ式です。)
(余談ですが、形を合わせたかったのでLOOKUP(,0)使ってますが、これいらない気がします
Crossing Year
IF LOOKUP([Children Population %]-[Older Adults Population %],-1) * ([Children Population %]-[Older Adults Population %]) <= 0 THEN MIN([Year]) END
正しく表計算の編集をしてあれば、このCrossing YearをReference Lineに用いることで、下記のVizまで作成できているはずです。
【Line Chartの始点、交点、終点にドットをつける】
次に、ドットをつける作業をします。
Line Chart始点と終点だけに関して言えば、以下が一番早いです。
この方法のデメリットを挙げるとしたら、ドットだけのサイズ変更ができない(はずですが、知らないだけかもしれません)ことです。
ということで、どうせ交点にドット置くなら、始点と終点も同じ方法で置いてあげようと思います。
以下の計算式を用意します。
Year Label
CASE MIN([Year]) WHEN WINDOW_MIN(MIN([Year])) THEN "MIN" WHEN WINDOW_MAX(MIN([Year])) THEN "MAX" WHEN [Crossing Year] THEN "CROSS" END
このYear Label用いて、下図のようにセッティングします。
Populationの合計に対する割合をコピーし、2重軸&軸の同期をします。2つ目のPopulationは円にします。
【Reference Lineを使って軸範囲にゆとりを】
最後に、ちょっとラベルが窮屈なので、軸範囲を広めにします。
ここで軸の編集→軸範囲の固定、はしません。Reference Lineを使います。
そのために以下の計算式を用意します。 ここで[OFFSET]はパラメータです。
MAX Year Offset
WINDOW_MAX(MIN([Year])) + [OFFSET]
MIN Year Offset
WINDOW_MIN(MIN([Year])) - [OFFSET]
それぞれをReference Lineに入れてやり、パラメータで好きな余白を与えてください。
残り、ちょっとだけフォーマットを触れば、以下のような形になります。
いつもながら省略した個所もあるので、分からない点などあればお気軽にご連絡ください。