Marimekko ChartをRelationで作る


Workout Wednesday 2022 Week 36のお題でMarimekko Chartが取り上げられました。

Google検索をすると多くの作り方の記事はいくつか出てきます。

検索順位を見るに、Tableau公式Blogの記事がよく読まれているのでしょうか。2016年と中々の古典ですね。


基本はBar Chartで作成するのですが、いくつか見て頂くと分かるように、若干トリッキーな方法で作成します。

しかし現在ではPolygonで色々と作る方法も確立されていますので

  • Bar ChartではなくPolygonでMarimekkoを作成する

  • 計算式をStep-by-stepかつ直感的にする

ことを目的に記事を書いてみます。


基本は以下の記事と同様のアプローチです。

Sankey DiagramをRelationで作る


今回使用したWorkbookは以下から参照できます。

また使用データはSample Super Storeです。

https://tabsoft.co/3B1S1u1


Marimekko Chart自体については、以下の記事がの利用例と恩恵をうまく解説されていましたので、こちらを参照ください。

【5分でわかる】マリメッコグラフはExcelで作れる

 
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でお願いします。それでは。