インターバルドットプロットで推定値と不確実性を管理

中級

6.7.21

インターバルドットプロットで推定値と不確実性を管理

最終更新 2020-01-21 読了時間 1 分
まとめ
  • インターバルドットプロットで推定値と信頼区間を水平線と点でコンパクトに表示する。
  • ax.hlines で信頼区間を描き、ax.scatter で点推定値をプロットする。
  • ABテストの効果検証や回帰係数の不確実性を可視化したいときに使う。

ABテストや回帰分析の推定結果は、点推定だけでなく信頼区間も合わせて示すと説得力が増します。水平線と点で構成するインターバルドットプロットは読みやすいフォーマットです。

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

segments = ["無料会員", "ライトプラン", "スタンダード", "プレミアム"]
effect = np.array([0.12, 0.18, 0.27, 0.35])
low = effect - np.array([0.05, 0.06, 0.07, 0.08])
high = effect + np.array([0.05, 0.06, 0.07, 0.09])

fig, ax = plt.subplots(figsize=(6.4, 3.6))
ax.hlines(range(len(segments)), low, high, color="#94a3b8", linewidth=3)
ax.scatter(effect, range(len(segments)), color="#0ea5e9", s=90, zorder=3)

ax.axvline(0, color="#475569", linestyle="--", linewidth=1)
ax.set_yticks(range(len(segments)), labels=segments)
ax.set_xlabel("改善率(対照比)")
ax.set_title("施策効果の推定値と90%信頼区間")
ax.set_xlim(-0.05, 0.45)
ax.grid(axis="x", alpha=0.2)

for idx, (eff, lo, hi) in enumerate(zip(effect, low, high)):
    ax.text(hi + 0.01, idx, f"{eff*100:.1f}% (+{(hi - eff)*100:.1f}/-{(eff - lo)*100:.1f})", va="center")

fig.tight_layout()

plt.show()

水平線と点で構成するインターバルドットプロットは読みやすいフォーマットですの図

読み方のポイント #

  • 横線の長さが不確実性を表します。線が短いほど推定が安定しています。
  • 0 を跨ぐかどうかを基準線で確認すれば、効果の有無を即座に判断できます。
  • 点を大小で強調すると、重み付けやデータ量も一緒に伝えることができます。

いつ使うか #

  • 適している場面: 推定値と信頼区間を並べて複数の指標やグループを比較したいとき。不確実性の表現に適しています。
  • 不向きな場面: 信頼区間の計算前提(信頼水準やサンプルサイズ)を明記しないと誤解を招きます。
  • 代替手段: フォレストプロット形式にすればメタ分析的な文脈でより標準的な表現になります。

よくある失敗パターン #

  • 信頼区間の幅の解釈ミス: 区間が広い=不確実性が高いことを読者が見落としがちです。区間幅の意味を注記し、サンプルサイズも併記してください。
  • 点の重なり: グループが多いと点と区間が重なって読みにくくなります。縦方向に jitter を加えるかファセットに分割しましょう。