Workout Wednesday 2022 Week 36のお題でMarimekko Chartが取り上げられました。
Google検索をすると多くの作り方の記事はいくつか出てきます。
検索順位を見るに、Tableau公式Blogの記事がよく読まれているのでしょうか。2016年と中々の古典ですね。
基本はBar Chartで作成するのですが、いくつか見て頂くと分かるように、若干トリッキーな方法で作成します。
しかし現在ではPolygonで色々と作る方法も確立されていますので
Bar ChartではなくPolygonでMarimekkoを作成する
計算式をStep-by-stepかつ直感的にする
ことを目的に記事を書いてみます。
基本は以下の記事と同様のアプローチです。
今回使用したWorkbookは以下から参照できます。
また使用データはSample Super Storeです。
Marimekko Chart自体については、以下の記事がの利用例と恩恵をうまく解説されていましたので、こちらを参照ください。
Marimekko Chartを作成する
まず始めにPolygon作成用のダミーデータを用意し、以下のようにRelationを組みます。Relationのキーは計算フィールド作成 → 1を打ち込んでください。要はCROSS JOINです。
今回は各RegionにおけるCategoryごとの売上構成比、および各Regionの売上ボリュームを可視化することを目的とします。
実際に完成したものが以下です。構成比とボリュームがわかりやすいですね。
(Superstoreだと大体3等分になってしまうので少し面白みがないですが)
まずは下準備として、以下の計算式を作成します。
Marimekkoに使用するフィールドを格納するための計算フィールドですね。
Dim 1 (Color)
[Category]
Dim 2 (Axis)
[Region]
Measure (for Y Axis)
SUM([Sales])
Measure (for X Axis)
// 本質的には別の指標でも良いですが
// 今回は売上構成比と売上ボリューム感の可視化をテーマとします
SUM([Sales])
さてPolygonを使用するわけですが、今回はPathを使って以下のようなPolygonを作成します。
四角形を描画するわけですが、Pathの値に従って(X,Y)の値が変わります。
X軸方向について、例えばCentralを見ると
Path = 1,2: West+Eastの売上累計
Path = 3,4: West+East+Centralの売上累計
Y軸方向について、例えばWest RegionのTechnologyは
Path = 1,4: 同RegionのTechnology以外の構成比累計
Path = 2,3: 同Regionの全構成比累計 (つまり100%)
となっています。
まずは、それぞれの売上または構成比を計算しましょう。
表計算でも同様のことは可能ですが、今回はLOD計算を使います。
Measure % (for Y Axis)
// 各Dim2における、Dimごとの売上構成比
[Measure (for Y Axis)]
/MIN({ EXCLUDE [Dim 1 (Color)]: [Measure (for Y Axis)]})
Measure* (for X Axis)
// 全体Measureにおける、Dim2ごとの売上
// こちらも構成比にして[0,1]スケールにするかはお好みで
MIN({ EXCLUDE [Dim 1 (Color)]: [Measure (for X Axis)]})
そして上記の累計を計算します。
上述のように、累計範囲はPathの値に合わせて変更します。
Y Axis
// Dim1に沿って計算
IF MIN([Path]) IN (1,4) THEN
ZN(WINDOW_SUM([Measure % (for Y Axis)], FIRST(), -1))
ELSE
RUNNING_SUM([Measure % (for Y Axis)])
END
X Axis
// Dim2に沿って計算
IF MIN([Path]) IN (1,2) THEN
ZN(WINDOW_SUM([Measure* (for X Axis)],FIRST(), -1))
ELSE
RUNNING_SUM([Measure* (for X Axis)])
END
計算式が揃ったので、下図のようにそれぞれ配置します。
表計算の設定は、上記のコメント部分を参照ください。
ということで、Marimekko Chartを作成することができました。
ただしPolygonマークの欠点として、ラベルが置けません。
この点を解決するための手段として、以下のラベル用計算式を使用します。
Dim 2 Label
// Dim1に沿って計算
IF FIRST() = 0 AND MIN([Path]) = 1 THEN MIN([Dim 2 (Axis)]) END
Y Axisを二重軸 → 円マーク等に変更 → ラベルの計算式をLabelに入れ、書式と配置を整えれば完成です。
もちろん他の方法でラベルを配置することも可能ですので、ここでは方法の一つをご紹介ということで。
最後に
今回はData DensificationアプローチでMarimekko Chartを作る方法について解説しました。
Data Densificationの欠点としてCROSS JOINのため一旦データを4倍にしてから計算することになり、その点では元々のBar Chartアプローチの方がパフォーマンス上有利かもしれません。
一方でPathで明示的にデータ点を作成し、Pathの値に合わせて値を付与していくアプローチのため、ロジックの可読性は高くなると思います。
どちらを利用するかは好みと状況によると思いますが、Polygonを利用する可視化手法は多く、また根底は似通っていることを考えると、個人的にはData Densificationのアプローチを採用するように思います。
ちなみに副産物としてData Densificationしない方の作り方もアップしました。
計算式を簡略化しています。ダミーデータをデータソースに追加できない場合にどうぞ。
質問などありましたらTwitterかLinkedinでお願いします。それでは。