グラフの目的は「データを分かりやすく伝える」こと。 軸・凡例・出典・スケールを必ず明示してください。
本ページでは レーダーチャート を、 定義・前提条件・使い方・落とし穴の順に整理して解説します。 厳密な定義より、 まず何を、 いつ、 どう使うかを理解することを優先してください。
複数項目を放射状に配置
英語名 Radar Chart。 同義・関連語:クモの巣図。
この用語を理解・使用するときは、 次のような前提を意識してください:
SSDSE-B-2026 のような公的統計データを Python で扱う際の基本パターン:
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1) print(df.shape) print(df.dtypes) print(df.describe()) # 「レーダーチャート」の文脈で扱う場合の例: # 分野: 可視化 # 関連手法は同カテゴリの他用語を参照してください。 |
具体的なコードは 1変量の可視化 を参照してください。
分析結果を報告するときに含めるべき情報:
レーダーチャート(Radar Chart) は、 多次元データ(複数指標)のプロファイル比較に使われる円形グラフ。 3〜8 指標程度の比較に適し、 9 指標以上では認知負荷が急増します。
| 用途 | レーダー適 | 代替 |
|---|---|---|
| 多指標プロファイル | ○ | 平行座標 |
| 時系列比較 | × | 折れ線 |
| 分布の形 | × | 箱ひげ |
| 相関 | × | 散布図/ヒートマップ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # matplotlib で 47 都道府県の主要 5 指標をレーダーチャート(東京vs沖縄)
import pandas as pd, numpy as np, matplotlib.pyplot as plt
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
df['高齢化率'] = df['A1301'] / df['A1101'] * 100
cols = ['高齢化率','A1101','A4101','C3301','E1101']
labels = ['高齢化率','総人口','出生数','製造業出荷','学校数']
metrics = df.set_index('Prefecture')[cols]
norm = (metrics - metrics.min()) / (metrics.max() - metrics.min())
angles = np.linspace(0, 2*np.pi, len(cols), endpoint=False).tolist()
angles += angles[:1]
fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(polar=True))
for pref in ['東京都','沖縄県']:
vals = norm.loc[pref].tolist(); vals += vals[:1]
ax.plot(angles, vals, label=pref)
ax.fill(angles, vals, alpha=0.2)
ax.set_xticks(angles[:-1]); ax.set_xticklabels(labels)
ax.legend(loc='upper right'); plt.tight_layout(); plt.savefig('radar.png', dpi=150) |
1 2 3 4 5 6 7 | # plotly Express で同様
import plotly.express as px
long = norm.loc[['東京都','沖縄県']].reset_index().melt(id_vars='Prefecture')
long.columns = ['Prefecture','metric','value']
fig = px.line_polar(long, r='value', theta='metric',
color='Prefecture', line_close=True)
fig.write_html('radar.html') |
1 2 3 4 5 | # 正規化方法の選択 : min-max vs standardization
from sklearn.preprocessing import StandardScaler
norm2 = pd.DataFrame(StandardScaler().fit_transform(metrics),
index=metrics.index, columns=metrics.columns)
print(norm2.loc['東京都']) |
1 2 3 4 5 6 7 8 | # レーダーの面積で「指標豊かさ」を比較
areas = []
for pref in metrics.index:
v = norm.loc[pref].values
area = 0.5 * np.sum(v * np.roll(v, -1) * np.sin(2*np.pi/len(v)))
areas.append((pref, area))
top3 = sorted(areas, key=lambda x: -x[1])[:3]
print('面積トップ3:', top3) |
| 用途 | レーダー | 代替 | SSDSE 例 |
|---|---|---|---|
| プロファイル | ○ | 平行座標 | 東京vs沖縄 |
| 時系列 | × | 折れ線 | 高齢化率推移 |
| 分布 | × | 箱ひげ | 県別ばらつき |
| 相関 | × | 散布図 | 2変数関係 |
| 構成比 | △ | 棒/円 | 年齢構成 |
1 2 3 4 5 6 7 8 | import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='utf-8', skiprows=1)
df['高齢化率'] = df['A1301']/df['A1101']*100
cols = ['高齢化率','A1101','A4101']
raw = df.set_index('Prefecture')[cols].loc[['東京都','沖縄県']]
print(raw) # スケール差で潰れる例
norm = (raw - raw.min()) / (raw.max() - raw.min())
print(norm) |
1 2 3 4 5 6 7 8 9 | import numpy as np, matplotlib.pyplot as plt
labels = ['高齢化率','出生率','学校数','医療','製造']
vals_a = [0.9, 0.2, 0.7, 0.8, 0.4]; vals_b = [0.3, 0.8, 0.5, 0.6, 0.9]
angles = np.linspace(0,2*np.pi,len(labels),endpoint=False); angles = np.append(angles, angles[0])
vals_a += vals_a[:1]; vals_b += vals_b[:1]
fig, ax = plt.subplots(subplot_kw=dict(polar=True))
ax.plot(angles, vals_a); ax.plot(angles, vals_b)
ax.set_xticks(angles[:-1]); ax.set_xticklabels(labels)
plt.tight_layout(); plt.savefig('compare.png', dpi=150) |
1 2 | labels = [f'指標{i}' for i in range(10)]
if len(labels) > 8: print('WARNING: 8 指標を超えたら平行座標を検討') |
レーダーチャート は古典的可視化手法の一つで、 統計可視化の標準教科書 (Tufte, Cleveland) でも扱われます。
matplotlib (2003-) は MATLAB ライクな API で広く普及。 ggplot2 (R, 2007) で文法 of graphics が確立。 Vega-Lite / Altair (2017) が宣言型表現を Web に持ち込みました。
近年は SVG/Canvas/WebGL の多層実装が普及し、 大規模データでもブラウザ可視化が可能に。 GPU 利用の Datashader, deck.gl が研究機関で活躍。