06.1.4
サンキーダイアグラム
plotly.graph_objects.Sankey に、箱(ノード)の名前と色を node、箱同士をつなぐ帯を link の source・target・value の 3 つの同じ長さのリストで渡すと、帯の太さが value に比例して描かれます。損益計算書やユーザーの画面遷移のように、合計が段階的に配分されていくデータに向き、ノードやリンクが 20 を超えると帯が交差して追えなくなります。直感 #
損益計算書を読むと、売上 121,008 から営業費用 84,759 を引いて純利益 36,249 が残り、営業費用の中身は航海費 36,702、船舶運航費 18,789、傭船料 8,325、一般管理費 5,854、減価償却 13,769 だと分かります。表では 8 つの数字ですが、サンキーダイアグラムはこれを「左の箱から右の箱へ流れる帯」として描き、帯の太さを金額に比例させます。売上の帯が 2 本に分かれ、費用の帯がさらに 5 本に枝分かれする形を見れば、「売上の 7 割が費用に消え、費用の 4 割強が航海費」という配分が数字を読まずに伝わります。
以下は『Genco Shipping & Trading Limited』のある期の損益を可視化したもので、最新のデータではないので注意してください。
Python で描く #
次のコードは 9 個のノードと 8 本のリンクを定義し、売上から費用と純利益への流れを plotly で描きます。
| |

実行結果の読み方 #
左端の売上 121,008 の帯が中央で 2 本に分かれ、太い赤の帯(費用 84,759)と細い緑の帯(純利益 36,249)になります。帯の太さの比がそのまま 7 : 3 なので、「売上の約 3 割が利益」と目で読めます。右端では費用が 5 本に枝分かれし、最も太い航海費 36,702 が費用の 4 割強、最も細い一般管理費 5,854 が 7% 弱だと、帯の太さの比較から分かります。
使いどころと落とし穴 #
損益計算書のような資金の配分、ユーザーがトップページから購入完了までたどる画面遷移、エネルギーの供給源から用途への流れなど、「合計が段階的に分配される」データが典型的な用途です。帯の太さで量を、箱の並びで段階を表せるので、積み上げ棒グラフでは見えない「どの経路を通ったか」が読めます。トップページ → 商品一覧 → 購入のように段階ごとの離脱率だけを見たいなら、帯を 1 本にまとめた ファネルチャート のほうが簡潔です。
失敗しやすいのはノードとリンクの数です。箱が 20、帯が 30 を超えると帯が交差して追跡できなくなるので、主要な経路に絞り、細い帯は「その他」にまとめます。色の使い方も要注意で、9 個の箱と 8 本の帯の色を場当たり的に決めると流れの意味が追えません。この例のように「赤 = 費用、緑 = 利益」という対応を箱と帯の両方で一貫させてください。source と target の番号を 1 つ間違えると帯が別の箱につながるので、描いた後は各箱の入る量と出る量(84,759 + 36,249 = 121,008)が一致しているかを確認します。