パラレルコーディネートで多次元データを俯瞰

中級

6.7.27

パラレルコーディネートで多次元データを俯瞰

最終更新 2026-03-06 読了時間 1 分
まとめ
  • 各特徴量を平行な縦軸に配置し、サンプルを折れ線で結んで多次元の傾向やクラスタを一望する。
  • pandas.plotting.parallel_coordinates で数行、matplotlib で細かいカスタマイズも可能。
  • 高次元データの探索的分析(EDA)で、クラス間の特徴量パターンの違いを見つけたいときに使う。

パラレルコーディネート(平行座標プロット)は、次元ごとに縦軸を並べ、各サンプルを折れ線で結ぶことで 4 次元以上のデータを 2D に展開する手法。クラスごとに色分けすると、どの特徴量でグループが分離しているかが直感的にわかる。

 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 pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import parallel_coordinates

rng = np.random.default_rng(42)
n = 60

df = pd.DataFrame({
    "体力": np.concatenate([rng.normal(70, 8, n), rng.normal(55, 10, n), rng.normal(80, 6, n)]),
    "技術": np.concatenate([rng.normal(65, 7, n), rng.normal(75, 8, n), rng.normal(60, 9, n)]),
    "判断力": np.concatenate([rng.normal(60, 9, n), rng.normal(70, 7, n), rng.normal(75, 5, n)]),
    "スピード": np.concatenate([rng.normal(75, 6, n), rng.normal(50, 12, n), rng.normal(85, 5, n)]),
    "タイプ": ["攻撃型"] * n + ["技巧型"] * n + ["万能型"] * n,
})

fig, ax = plt.subplots(figsize=(9, 5))
parallel_coordinates(
    df, class_column="タイプ", ax=ax,
    color=["#2563eb", "#10b981", "#ef4444"], alpha=0.35, linewidth=0.8,
)

ax.set_title("選手タイプ別 能力プロファイル")
ax.set_ylabel("スコア")
ax.legend(loc="upper right")
ax.grid(axis="y", alpha=0.2)

fig.tight_layout()
plt.show()

パラレルコーディネートによる選手タイプ別能力プロファイル

読み方のポイント #

  • 色ごとの折れ線の「帯」がどの軸で分離しているかを確認する。上の例ではスピード軸で攻撃型と技巧型が明確に分かれている。
  • 帯が太い(分散が大きい)軸はグループ内のばらつきが大きいことを示す。
  • 軸の並び順を変えると見え方が変わるため、関心のある特徴量を隣同士に配置するとパターンを発見しやすい。

いつ使うか #

  • 適している場面: 4〜10 次元程度のデータでクラス間のプロファイル差を探索したいとき。特徴量エンジニアリングの初期段階で有用。
  • 不向きな場面: サンプル数が 500 を超えると線が重なって判別困難になる。次元が 15 以上あると軸ラベルが読めない。
  • 代替手段: 次元が多すぎる場合は PCA や t-SNE で 2〜3 次元に圧縮してから散布図。グループ平均のみ見たいならレーダーチャート。

よくある失敗パターン #

  • スケール未統一: 特徴量のスケールが異なると一部の軸が潰れて読めない。事前に標準化(z-score)するか、軸ごとに 0–1 に正規化してから描画する。
  • 線が多すぎて真っ黒: alpha を 0.1〜0.3 に下げるか、クラスごとの中央値ラインだけを太く重ねて描画する。