2次元 KDE で密度を等高線表示

中級

6.2.6

2次元 KDE で密度を等高線表示

最終更新 2020-04-08 読了時間 1 分
まとめ
  • 2変数の密度を等高線・塗りつぶしで表示する。
  • sns.kdeplotにx, yを指定して2次元描画。
  • 散布図が密集して見づらいときに使う。

seaborn.kdeplot を使うと 2 変数の密度を等高線または塗りつぶしで描けます。散布図が密集しているときに有効です。

 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
import seaborn as sns
import matplotlib.pyplot as plt

penguins = sns.load_dataset("penguins").dropna(subset=["bill_length_mm", "bill_depth_mm"])

fig, ax = plt.subplots(figsize=(5.5, 4.5))
sns.kdeplot(
    data=penguins,
    x="bill_length_mm",
    y="bill_depth_mm",
    hue="species",
    fill=True,
    thresh=0.05,
    levels=6,
    alpha=0.6,
    ax=ax,
)

ax.set_xlabel("くちばし長 (mm)")
ax.set_ylabel("くちばし深さ (mm)")
ax.set_title("ペンギン種別の 2 次元 KDE")
ax.grid(alpha=0.2)

fig.tight_layout()

plt.show()

散布図が密集しているときに有効ですの図

読み方のポイント #

  • 等高線が密な箇所ほどデータが集まっている。色の濃淡で頻度を直感的に把握できる。
  • thresh を調整すると僅かな密度の輪郭を省略できる。
  • 大量データでは計算が重い場合があるため、サンプリングやbw_adjustで帯域を調整する。

いつ使うか #

  • 適している場面: 2変数の同時分布を等高線で表示したいとき。密集領域と疎な領域を滑らかに描けます。
  • 不向きな場面: 帯域幅パラメータの選択で結果が大きく変わるため、パラメータ感度に注意が必要です。
  • 代替手段: Hexbin プロットを使えばパラメータ依存なくデータの密度分布を可視化できます。

よくある失敗パターン #

  • 帯域幅の過剰な平滑化: 帯域幅が大きすぎるとデータの局所構造(クラスタ等)が消えてしまいます。複数の帯域幅を試して確認してください。
  • 等高線レベルの不適切な設定: レベル数が少なすぎると密度の勾配が伝わらず、多すぎると煩雑になります。5〜10 段階を目安に調整しましょう。