顧客がチャネルを経由して別のアクションへ流れる状況は、サンキーダイアグラムで枝分かれを示すと分かりやすくなります。インタラクティブに探索したい場合は Plotly の go.Sankey が便利です。ホバーでフロー量を確認でき、HTML としてそのまま共有できます。
import plotly.graph_objects as go
labels = [
"流入",
"無料登録",
"カート離脱",
"FAQ閲覧",
"直帰",
"有料化",
"再来訪",
"離脱",
]
sources = [0, 0, 0, 0, 1, 1, 1]
targets = [1, 2, 3, 4, 5, 6, 7]
values = [420, 280, 200, 100, 260, 100, 60]
fig = go.Figure(
data=[
go.Sankey(
arrangement="snap",
node=dict(
pad=18,
thickness=18,
line=dict(color="rgba(0,0,0,0.2)", width=1),
label=labels,
color=[
"#4C78A8",
"#F58518",
"#E45756",
"#72B7B2",
"#54A24B",
"#EECA3B",
"#B279A2",
"#FF9DA6",
],
),
link=dict(
source=sources,
target=targets,
value=values,
color=[
"rgba(76,120,168,0.45)",
"rgba(229,87,86,0.45)",
"rgba(114,183,178,0.45)",
"rgba(84,162,75,0.45)",
"rgba(245,133,24,0.45)",
"rgba(238,202,59,0.45)",
"rgba(178,121,162,0.45)",
],
),
)
]
)
fig.update_layout(
title=dict(text="来訪後の顧客フロー(Plotly Sankey)", x=0.5, font=dict(size=18)),
font=dict(size=12, color="#222"),
margin=dict(l=10, r=10, t=40, b=10),
)
# ブラウザで共有できるインタラクティブ HTML
fig.write_html("static/images/visualize/advanced/sankey-diagram.html", include_plotlyjs="cdn")
# ドキュメント用の静的画像 (kaleido のインストールが必要: pip install kaleido)
fig.write_image("static/images/visualize/advanced/sankey-diagram.png", scale=2)
plt.show()

読み方のポイント #
- 幹の太さがフロー量を表すので、どの分岐で大きく減っているかが直感的に把握できます。
- 連結している枝をたどることで、特定の出口(例: 有料化)までのボトルネックを追跡できます。
- 分岐が多すぎる場合は、主要経路に絞って描くと読みやすさが保てます。