ストリームグラフで構成比のうねりを見る

中級

6.7.10

ストリームグラフで構成比のうねりを見る

最終更新 2020-06-03 読了時間 1 分
まとめ
  • ストリームグラフでカテゴリ構成比の時間推移を上下対称の波で表現する。
  • ax.stackplotbaseline="wiggle"で柔らかな積層曲線を描画。
  • チャネル別流入やジャンル別売上の構成変化を直感的に伝えたいときに使う。

カテゴリ構成が時間とともにどのようにシフトしているかを強調したい場合は、ストリームグラフが便利です。上下対称の波で割合の変化が視覚的になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 24)
rng = np.random.default_rng(24)
segments = []
for phase in range(4):
    trend = 12 + 6 * np.sin(2 * np.pi * (x + phase * 3) / 12)
    noise = rng.normal(0, 1.2, size=x.size)
    segments.append(np.clip(trend + noise, 0, None))
stacked = np.vstack(segments)

fig, ax = plt.subplots(figsize=(6.4, 4))
colors = ["#0ea5e9", "#22d3ee", "#818cf8", "#f472b6"]
ax.stackplot(x, stacked, baseline="wiggle", colors=colors, alpha=0.9)
ax.set_xticks(range(0, 24, 3), labels=[f"{h}時" for h in range(0, 24, 3)])
ax.set_title("チャネル別流入構成のストリームグラフ")
ax.set_ylabel("セッション数")
ax.set_xlabel("時間帯")
ax.spines[["right", "top"]].set_visible(False)
ax.grid(axis="x", alpha=0.15)

legend_labels = ["自然検索", "広告", "SNS", "紹介"]
ax.legend(legend_labels, loc="upper left", frameon=False)

fig.tight_layout()

plt.show()

上下対称の波で割合の変化が視覚的になりますの図

読み方のポイント #

  • 波の厚みで構成比の増減が分かります。昼帯でSNSが厚くなっていれば拡散タイミングの示唆になります。
  • 中央線が水平なら全体規模は安定、上下に大きく振れていれば総量が変動しているサインです。
  • 連続データが少ないと波がガタつくので、平滑化した系列を使うと読みやすくなります。

いつ使うか #

  • 適している場面: カテゴリ構成比の時間推移を有機的な流れとして視覚的に表現したいとき。
  • 不向きな場面: 個別カテゴリの正確な値を読み取るのが難しく、ベースラインが揃わないため定量比較には不向きです。
  • 代替手段: 正確な値の比較が必要なら積み上げエリアチャートの方がベースラインが揃って読みやすいです。

よくある失敗パターン #

  • 個別系列の値の読み取り困難: ベースラインが波打つため個別カテゴリの正確な値を読み取れません。ホバーツールチップか別の補足図で値を提示してください。
  • カテゴリの並び順: 変動の大きいカテゴリを中央に配置すると全体が大きく揺れて見えます。安定したカテゴリを中央に置くとグラフが落ち着きます。