K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

バンプチャートで順位推移を可視化

中級

06.7.3

バンプチャートで順位推移を可視化

最終更新 2020-02-26 読了時間 2 分
まとめ
バンプチャートは、時点ごとの「順位」だけを折れ線でつないで、誰が誰を追い抜いたかを線の交差で見せる図です。売上額そのものではなく 1 位・2 位という離散的な順位を Y 軸に取るため、値の大小に関係なく入れ替わりが等間隔で表示されます。matplotlib では系列ごとに ax.plot を呼び、set_ylim(5.5, 0.5) のように上限と下限を逆に渡して軸を反転させるのが唯一のコツです。読み終えると、Q1 で 3 位だった Bravo が Q2 で 1 位に上がった動きを線の交差として読み取り、ブランドやチームのランキング推移を同じ手順で描けるようになります。
動画で見る:pythonでランキングの時間変化のアニメーションを作る方法(K_DM チャンネル)

直感 #

5 つのブランドの四半期売上ランキングを表にすると、Q1 から Q4 まで 4 列の数字が並び、「Charlie はいつ 1 位になったか」を目で追うのに時間がかかります。バンプチャートは各ブランドの順位を点にして四半期をまたいで線でつなぐので、線が上に向かえば順位上昇、下に向かえば下降、2 本の線が交差した場所が追い抜きの瞬間だと読めます。順位は 1 が最上位なので、普通に描くと 1 位が図の一番下に来てしまいます。そこで Y 軸を上下反転させ、1 位を上に置くのがこの図の約束事です。

Python で描く #

次のコードは 5 ブランド × 4 四半期の順位行列 ranks を用意し、ブランドごとに ax.plot でマーカー付きの折れ線を描きます。描いたあとに set_ylim(5.5, 0.5) で Y 軸を反転させると、1 位が上、5 位が下の図になります。

 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
29
import numpy as np
import matplotlib.pyplot as plt

quarters = ["Q1", "Q2", "Q3", "Q4"]
brands = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"]
ranks = np.array(
    [
        [1, 2, 3, 3],
        [3, 1, 1, 2],
        [2, 3, 2, 1],
        [4, 4, 5, 4],
        [5, 5, 4, 5],
    ]
)

fig, ax = plt.subplots(figsize=(7, 4))

for brand, rank in zip(brands, ranks):
    ax.plot(quarters, rank, marker="o", linewidth=2, label=brand)

ax.set_ylim(5.5, 0.5)
ax.set_ylabel("順位")
ax.set_title("ブランド別 売上順位の推移")
ax.grid(axis="y", alpha=0.2)
ax.legend(loc="upper right", bbox_to_anchor=(1.15, 1))

fig.tight_layout()

plt.show()

順位を上下反転して描くのがポイントですの図

実行結果の読み方 #

図の一番上が 1 位です。Alpha は Q1 に 1 位でしたが Q2 で Bravo に抜かれ、Q3 で Charlie にも抜かれて 3 位まで下がったことが、線が右下へ向かう形と 2 回の交差から読めます。Delta と Echo は 4 位と 5 位を Q3 で入れ替えるだけで、上位 3 ブランドの争いとは別のグループになっています。特定のブランドを強調したいときは、そのブランドだけ linewidth=4 にして他をグレーにすると、線の交差を追いやすくなります。

使いどころと落とし穴 #

バンプチャートは、競合ブランドや製品カテゴリの順位変動を 4〜12 時点で追うときに向いています。同率順位が多いデータでは線が完全に重なって見えなくなるので、rank(method="first") で同率を崩すか、Y 座標に小さな jitter を加えてずらします。順位の背後にある売上額の差が重要なら、値そのものを ax.plot する通常の折れ線グラフの方が定量的な比較ができます。線の端にラベルがないと凡例との照合に手間がかかるため、系列が 6 本を超えるなら Q4 側の点の横に ax.text でブランド名を直接書く方法に切り替えてください。