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

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

言語 JA

ダンベルチャートでビフォー・アフター比較

中級

06.7.4

ダンベルチャートでビフォー・アフター比較

最終更新 2020-03-11 読了時間 2 分
まとめ
ダンベルチャートは、項目ごとに「前」と「後」の 2 つの値を点で置き、その間を 1 本の線でつないで変化量を線の長さとして見せる図です。2 本の棒を並べるグループ化棒グラフより、差そのものが線の長さとして直接読めるので、施策の効果や AB テストの前後比較に向いています。matplotlib では ax.hlines(departments, before, after) で線を、ax.scatter を 2 回呼んで前(赤)と後(緑)の点を描くだけです。読み終えると、5 部門の中で線が最も長い開発部門(72 → 80)が最大の改善だと読み取り、自分の前後比較データを同じ 3 行で描けるようになります。

直感 #

社内の 5 部門で研修を実施し、前後にエンゲージメントスコアを測ったとします。「営業 68 → 78、開発 72 → 80……」と表にすると、どの部門が最も伸びたかは引き算をしないと分かりません。ダンベルチャートは各部門を 1 行にして、施策前の値に赤い点、施策後の値に緑の点を置き、2 点を灰色の線でつなぎます。線が長い部門ほど変化が大きく、緑の after が右にあれば改善、左にあれば悪化です。棒グラフで 2 本の棒を並べる方法と違って、棒の根元(0)からの長さではなく「2 点の距離」だけが目に入るので、差の比較に集中できます。

Python で描く #

次のコードは 5 部門の before と after を用意し、ax.hlines で 2 点を結ぶ線、ax.scatter で前後の点を重ねて描きます。X 軸がスコア、Y 軸が部門名のカテゴリ軸になります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import matplotlib.pyplot as plt

departments = ["営業", "開発", "サポート", "マーケ", "人事"]
before = np.array([68, 72, 65, 70, 60])
after = np.array([78, 80, 72, 74, 68])

fig, ax = plt.subplots(figsize=(6, 4))
ax.hlines(departments, before, after, color="#94a3b8", linewidth=3)
ax.scatter(before, departments, color="#ef4444", s=80, label="施策前")
ax.scatter(after, departments, color="#22c55e", s=80, label="施策後")

ax.set_xlabel("エンゲージメントスコア")
ax.set_title("施策前後のエンゲージメント比較(ダンベルチャート)")
ax.legend(loc="lower right")
ax.grid(axis="x", alpha=0.2)

fig.tight_layout()

plt.show()

ダンベルチャートは開始値と終了値を 1 本の線で結び、差分を視覚的に示しますの図

実行結果の読み方 #

各行の赤い点が施策前 before、緑の点が施策後 after で、緑が右にあれば改善です。この例では 5 部門すべてで緑が右にあり、線が最も長い営業(68 → 78、+10)と開発(72 → 80、+8)の改善幅が大きく、マーケ(70 → 74、+4)が最も小さいと読めます。差を数値でも示したいときは、緑の点の右に ax.text(after[i] + 0.5, i, f"+{after[i] - before[i]}") のように変化量を添えると、線の長さを目で測らずに済みます。

使いどころと落とし穴 #

ダンベルチャートは、施策前後や前年比のように「ちょうど 2 時点」の差を 5〜15 項目で比較するときに最も効きます。3 時点以上になると 1 行に点が 3 つ並んで線の意味が曖昧になるので、その場合はスロープグラフやバンプチャートで推移として描きます。2 つの点を同じ色・同じ大きさにすると前後が区別できなくなるため、この例のように色を変えて凡例を付けるか、矢印付きの線で向きを示してください。項目を入力順のまま並べると変化の大きさが見えにくいので、np.argsort(after - before) で差の順に並べ替えると、最も伸びた項目と伸びなかった項目が両端に集まって読みやすくなります。