論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
ヒートマップ
Heatmap
値の大小を色の濃淡で表すマトリクス可視化。相関行列の表示などに多用。
可視化heatmapヒートマップ
📍 文脈💡 30秒結論

📍 あなたが今見ているもの

論文中に 「ヒートマップ」として登場する用語。

ヒートマップ とは:値の大小を色の濃淡で表すマトリクス可視化。相関行列の表示などに多用。

💡 30秒で分かる結論

👁️ 直感 — ヒートマップは「値を色で表現する2次元マトリクス」

ヒートマップは、 行列の各値を色の濃淡で可視化する手法。 大量の数値を一目で把握できる強力なツール。

主要な用途

🎨 カラーマップ(colormap)の選び方

種類 用途
順序型(sequential)viridis, plasma, Blues単調な値(密度、 強度)
発散型(diverging)RdBu_r, coolwarm基準(0)から±に発散(相関)
質的(qualitative)Set1, tab10カテゴリ変数
循環型(cyclic)twilight, hsv角度、 時刻

⚠️ 避けるべき:rainbow / jet — 色覚多様性で誤読されやすい。 推奨:viridis 系(color-blind 安全 + 知覚均等)。

🐍 Python でのヒートマップ

seaborn(最も使いやすい)

▼ コード解説(相関ヒートマップ(seaborn.heatmap))
🎯 解説: df.corr() で相関行列を計算し、 seaborn.heatmap で可視化。 cmap='RdBu_r' で正負を色分け。
📥 入力例: df[主要 10 指標].corr()
📤 実行例: corr_heatmap.png 対角は 1.0(自己相関) 高齢化率 vs 死亡率: 0.97(濃い赤)
💬 読み方: ヒートマップは多変量関係を一望できる。 真っ赤/真っ青の cell を見つけたら多重共線性をチェック。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import seaborn as sns
import matplotlib.pyplot as plt

# 相関行列ヒートマップ
corr = df.corr()
sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r',
            vmin=-1, vmax=1, center=0, square=True,
            cbar_kws={'label': 'r'})

# クラスター付き(行と列を類似度で並び替え)
sns.clustermap(corr, cmap='RdBu_r', vmin=-1, vmax=1, center=0)

# マスクで対角・上三角を隠す
import numpy as np
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(corr, mask=mask, annot=True, cmap='RdBu_r')

matplotlib(基本)

▼ コード解説(annot=True で数値表示)
🎯 解説: annot=True で各 cell に数値を表示。 fmt='.2f' で小数 2 桁。
📥 入力例: df.corr(), annot=True, fmt='.2f'
📤 実行例: 数値が cell 内に表示 正確な相関値が一目で分かる
💬 読み方: annot=True は変数数が少ない(<15)ときに有効。 多すぎると数値が重なって見づらい。
1
2
3
4
plt.imshow(matrix, cmap='viridis', aspect='auto')
plt.colorbar(label='値')
plt.xticks(range(len(labels)), labels, rotation=45)
plt.yticks(range(len(labels)), labels)

plotly(インタラクティブ)

▼ コード解説(クラスタリング付き(clustermap))
🎯 解説: seaborn.clustermap で行・列を階層クラスタリング。 関連変数が近くに並ぶ。
📥 入力例: df.corr(), method='ward'
📤 実行例: clustermap.png 類似指標がブロックになる 人口関連、 経済関連、 教育関連で別ブロック
💬 読み方: Clustermap は変数間の自然なグループを発見。 多変量データの構造理解に最強の可視化。
1
2
3
4
import plotly.express as px
fig = px.imshow(corr, color_continuous_scale='RdBu_r',
                zmin=-1, zmax=1, text_auto='.2f')
fig.show()  # マウスホバーで値が見える

📚 ヒートマップの読み方 — 3ステップ

  1. 全体傾向:色の偏りで「変数群の関係性」を把握
  2. 個別セル:annotation で数値を確認。 |r| > 0.7 が強い相関の目安
  3. クラスタ構造:clustermap で似た変数群を発見

🚧 落とし穴と注意点

🔬 「ヒートマップ」を深く理解する

ヒートマップの歴史

Loua(1873)が社会統計を可視化したのが起源。 1957 年に Sneath が遺伝学で本格採用。 1999 年に Eisen らが遺伝子発現データの可視化として現代的形式を確立。

クラスタリングとの組合せ

クラスターマップ(seaborn.clustermap)は、 行・列を階層クラスタリングで並び替えてからヒートマップ化。 似た変数群が隣接して表示され、 構造が一目でわかる。 遺伝子発現解析の標準ツール。

カレンダーヒートマップ

日付別の数値を「カレンダーグリッド」で可視化。 GitHub の contribution graph、 売上の曜日効果、 アクセス時間帯分析などに有効。 calmap や plotly で実装可能。

📝 練習問題 — 理解度チェック

  1. この用語の基本定義を、 自分の言葉で説明できますか?
  2. この手法が使われる典型的なシナリオを3つ挙げられますか?
  3. この手法の前提条件・仮定を確認できますか?
  4. 結果を解釈する際の注意点は何ですか?
  5. 類似手法との違いを説明できますか?
  6. Python(または他言語)で実装できますか?
  7. SSDSE データで応用例を作成できますか?

📚 参考文献・さらなる学習

古典的教科書

実践書

オンラインリソース

💼 実務応用ガイド

データサイエンスプロジェクトでの位置づけ

  1. 探索的分析(EDA):基本統計量・可視化でデータを理解
  2. 前処理:標準化・正規化・欠損値処理
  3. モデリング:回帰・分類・クラスタリング
  4. 評価:CV、 指標計算、 統計的検定
  5. 解釈・報告:効果量・信頼区間・可視化

業界別ユースケース

📖 完全ガイド — 統計学習の参照表

分析の流れ — 8ステップ

  1. 問題定義:何を知りたいのか、 目的を明確に
  2. データ収集:信頼できるソースから(SSDSEなど公的データ)
  3. データクリーニング:欠損値、 外れ値、 入力ミスの確認
  4. 探索的分析(EDA):要約統計量、 ヒストグラム、 散布図
  5. 変数変換:標準化、 対数変換、 カテゴリのエンコード
  6. モデリング:適切な手法を選び、 学習
  7. 評価:CV、 指標、 統計的検定
  8. 解釈・報告:効果量、 信頼区間、 可視化

統計手法の選び方マトリクス

目的 1変数 2変数 多変量
記述平均, 中央値, 分散相関, 共分散PCA, 因子分析
可視化ヒストグラム, 箱ひげ散布図, ヒートマップ散布図行列, バイプロット
予測時系列モデル単回帰重回帰, Ridge, LASSO
分類ロジスティック回帰判別分析SVM, RF, NN
グループ化階級分け2次元クラスタリングk-means, 階層クラスタリング
検定1標本t検定2標本t検定, χ²ANOVA, MANOVA

サンプル数別の手法ガイド

n 推奨手法
n < 10記述統計のみ、 ノンパラ検定、 ベイズ統計
10 ≤ n < 30t検定, ブートストラップ, 単回帰
30 ≤ n < 200重回帰, ANOVA, 階層クラスタリング
200 ≤ n < 10000複雑な回帰, RF, GBM, k-means
n ≥ 10000深層学習, 大規模分散学習

Python 主要ライブラリ早見表

ライブラリ 用途
numpy数値計算の基礎、 行列演算
pandasデータフレーム、 表操作
scipy統計関数、 最適化、 線形代数
statsmodels古典統計、 検定、 回帰分析の詳細
scikit-learn機械学習、 前処理、 評価
matplotlib基本可視化
seaborn統計的可視化(高級)
plotlyインタラクティブ可視化
xgboost / lightgbm勾配ブースティング
PyTorch / TensorFlow深層学習

よくある質問(FAQ)

📓 用語のまとめ — 30秒で理解

このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
決定係数アール二乗
Σ総和記号、 共分散行列シグマ大文字
N(μ, σ²)正規分布ノーマル ミュー シグマ二乗
t(df)t分布ティー
χ²(df)カイ二乗分布カイ二乗
F(d1, d2)F分布エフ
H₀, H₁帰無仮説、 対立仮説エイチゼロ、 エイチワン
E[X]期待値エクスペクタンス
Var(X)分散バリアンス
Cov(X, Y)共分散カバリアンス

💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。

🎯 包括的視点 — この用語をマスターするために

学習ロードマップ

  1. 定義と数式を確実に押さえる
  2. SSDSE データで自分で計算してみる
  3. Python で実装してみる(手書き → ライブラリ)
  4. 結果を可視化する
  5. 仮定の確認・診断プロットを描く
  6. 論文・実務での応用例を読む
  7. 限界と注意点を理解する
  8. 関連手法との違いを説明できる

SSDSE-B-2026 で挑戦できる課題

関連用語・概念リスト

前提 関連 発展
平均、 分散、 標準偏差類似手法、 派生手法機械学習での応用
確率分布統計的検定ベイズ統計
数値計算可視化技術深層学習

典型的な解釈ミス

論文・レポート執筆のポイント

  1. 方法:使用した手法を厳密に記述
  2. 仮定:満たされていることの確認
  3. 結果:点推定 + 不確実性(CI、 SE)
  4. 効果量:実質的な大きさを示す
  5. 限界:分析の制約を明示
  6. 再現性:データとコードを公開

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

▼ コード解説(欠損値のヒートマップ)
🎯 解説: df.isna() を heatmap でプロット。 欠損パターンを視覚化。
📥 入力例: df.isna() (235, 112)
📤 実行例: missing_heatmap.png ほぼ全部 0(欠損なし) 一部の列でランダム欠損
💬 読み方: 欠損ヒートマップで「列ごと」「行ごと」のパターンが見える。 系統的欠損なら別途調査が必要。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定stats.ttest_ind()
回帰stats.linregress()
分布フィッティングstats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

🗺️ 概念マップ — 3つの視点で体系を理解する

ヒートマップ がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス記述統計可視化ヒートマップ

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「ヒートマップ」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ヒートマップ」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引(拡張)

直感 カラーマップ 🐍 Python実装 🧮 SSDSE-B 実例 🐍 実装バリエーション ⚠️ 落とし穴集 clustermap アノテーション 関連用語マップ

🧮 SSDSE-B を使ったヒートマップの実例

SSDSE-B(2020年)の主要6指標(医師数、 人口、 高齢化率、 出生率、 完全失業率、 県民所得)の相関行列をヒートマップで可視化します。

① データ準備と相関行列計算

▼ コード解説(値のヒートマップ(標準化済み))
🎯 解説: 標準化後の値を heatmap で可視化。 県 × 指標で「どこが大きい/小さい」が一目。
📥 入力例: StandardScaler 後の (47, 10)
📤 実行例: value_heatmap.png 東京: 多くの指標で +2σ 秋田: 高齢化指標で +2σ
💬 読み方: 標準化済みヒートマップは「県の特徴」を可視化。 +2σ 以上の cell が県の個性を示す。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2023.csv', encoding='shift_jis', header=[0,1])
df.columns = ['_'.join(c).strip() for c in df.columns]
d2020 = df[df['年度_Year'] == 2020]

cols = ['医師数_人口10万対', '総人口_Total population', '高齢化率',
        '合計特殊出生率', '完全失業率', '1人当たり県民所得']
sub = d2020[cols].dropna()
corr = sub.corr()
print(corr.round(2))

典型結果:医師数と高齢化率に r = +0.45(西日本ほど高齢化と医師数が高い)、 出生率と県民所得に r = -0.40(所得高い県ほど出生率低い)など。

② seaborn ヒートマップ描画

▼ コード解説(カスタムカラーマップ)
🎯 解説: cmap を 'coolwarm', 'viridis', 'RdYlBu_r' などに変更。 用途に応じて色覚を最適化。
📥 入力例: cmap=['RdBu_r', 'viridis', 'coolwarm']
📤 実行例: RdBu_r: 相関の正負強調 Viridis: 色覚補助対応 Coolwarm: 中央値強調
💬 読み方: 色覚バリアフリーには Viridis 推奨。 相関なら発散カラーマップ(RdBu_r)。 値の大小なら順序カラーマップ。
1
2
3
4
5
6
7
8
9
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r',
            center=0, vmin=-1, vmax=1, square=True,
            cbar_kws={'label': 'Pearson r'})
plt.title('SSDSE-B 2020 主要指標の相関')
plt.tight_layout()
plt.savefig('figures/ssdse_heatmap.png', dpi=150)

ポイント:cmap='RdBu_r'(青=負、 白=0、 赤=正)、 center=0 で発散カラーマップ、 vmin/vmax=[-1, 1] で範囲固定(相関係数の上限・下限)。

③ 47都道府県 × 6指標ヒートマップ(標準化値)

▼ コード解説(マスク(半分だけ表示))
🎯 解説: np.triu で上三角をマスク。 対称行列の重複を省略。
📥 入力例: mask = np.triu(np.ones_like(corr, dtype=bool))
📤 実行例: 下三角のみ表示 情報の重複を排除
💬 読み方: 対称行列は半分で十分。 マスクで下三角だけ表示すると、 視覚的に整理されてプロが書いた感が出る。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from sklearn.preprocessing import StandardScaler
import numpy as np
X = StandardScaler().fit_transform(sub)
heat_df = pd.DataFrame(X, index=d2020['都道府県_Prefecture'].values[:len(sub)], columns=cols)

# 階層クラスタリングで都道府県順を並び替え
g = sns.clustermap(heat_df, cmap='RdBu_r', center=0, vmin=-3, vmax=3,
                   figsize=(8, 14), row_cluster=True, col_cluster=False,
                   cbar_kws={'label': 'z-score'})
plt.savefig('figures/ssdse_clustermap.png', dpi=150)

クラスタマップで「似た特性の都道府県」が縦に近接配置される。 例:東京・神奈川・大阪(都市型)、 秋田・島根・高知(過疎・高齢)が明確に分離。

🐍 実装バリエーション — seaborn / matplotlib / plotly / scikit-learn

(A) seaborn — 最も簡単・推奨

▼ コード解説(時系列ヒートマップ)
🎯 解説: df.pivot で行=県、 列=年度の表を作り heatmap。 時系列変化を可視化。
📥 入力例: pivot('都道府県', '年度', '死亡率')
📤 実行例: timeseries_heatmap.png 各県の 5 年間の推移 2020 年に全体的に色が濃く(コロナ)
💬 読み方: 時系列ヒートマップは「全体トレンドと県差」を同時に見せる。 政策評価で重宝。
1
2
3
import seaborn as sns
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0, mask=np.triu(np.ones_like(corr, dtype=bool)))
# mask で上三角を非表示 → 重複情報を削除

(B) matplotlib pcolormesh — 細かいカスタム

▼ コード解説(カテゴリ × カテゴリのクロス集計)
🎯 解説: pd.crosstab で 2 カテゴリの度数表を heatmap で可視化。 χ² 検定と併用。
📥 入力例: 都市性 × 高齢化区分
📤 実行例: crosstab_heatmap.png 都市×若い: 15、 地方×高齢: 20 対角的な集中
💬 読み方: クロス集計ヒートマップは χ² 検定の視覚化版。 観測度数と期待度数の差が一目で分かる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 6))
im = ax.pcolormesh(corr.values, cmap='RdBu_r', vmin=-1, vmax=1)
ax.set_xticks(np.arange(len(cols))+0.5); ax.set_xticklabels(cols, rotation=45, ha='right')
ax.set_yticks(np.arange(len(cols))+0.5); ax.set_yticklabels(cols)
plt.colorbar(im)
# 各セルに値を表示
for i in range(len(cols)):
    for j in range(len(cols)):
        ax.text(j+0.5, i+0.5, f'{corr.iloc[i,j]:.2f}', ha='center', va='center')

(C) plotly — インタラクティブ

▼ コード解説(動的ヒートマップ(plotly))
🎯 解説: plotly.graph_objects.Heatmap でホバー可能なインタラクティブヒートマップ。
📥 入力例: plotly でホバー表示
📤 実行例: html 出力 マウスホバーで cell 値表示 ズーム可能
💬 読み方: Plotly はインタラクティブ。 ダッシュボードや報告書での共有に強い。 静的なら matplotlib/seaborn が軽量。
1
2
3
4
5
import plotly.express as px
fig = px.imshow(corr, text_auto='.2f', color_continuous_scale='RdBu_r',
                zmin=-1, zmax=1, aspect='auto')
fig.update_layout(title='SSDSE-B 相関ヒートマップ')
fig.show()  # ホバーで詳細表示、 ズーム可能

(D) scikit-learn の混同行列ヒートマップ

▼ コード解説(正方形ヒートマップ(square=True))
🎯 解説: square=True で aspect ratio を 1:1 に固定。 cell が正方形になる。
📥 入力例: sns.heatmap(corr, square=True)
📤 実行例: square_heatmap.png 視覚的に整った見た目 論文用に推奨
💬 読み方: 正方形は学術論文・報告書の標準。 aspect ratio が崩れると素人感が出るため必須設定。
1
2
3
4
from sklearn.metrics import ConfusionMatrixDisplay, confusion_matrix
cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(cm, display_labels=['neg', 'pos'])
disp.plot(cmap='Blues', values_format='d')

(E) scipy 階層クラスタリング + ヒートマップ

▼ コード解説(補正済み p 値のヒートマップ)
🎯 解説: 多重比較補正後の p 値を heatmap で可視化。 有意な cell を強調。
📥 入力例: Bonferroni 補正済み p 値
📤 実行例: pvalue_heatmap.png p<0.05 を黒く、 p>0.05 を白く バンドル化された相関の有意性
💬 読み方: p 値ヒートマップは多変量検定の結論を一目で見せる。 全 cell の有意性を一覧化。
1
2
3
4
5
6
7
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
from scipy.spatial.distance import pdist
# 都道府県を Ward 法でクラスタリング
Z = linkage(X, method='ward')
order = dendrogram(Z, no_plot=True)['leaves']
ordered = heat_df.iloc[order]
sns.heatmap(ordered, cmap='RdBu_r', center=0)

⚠️ 追加の落とし穴 — ヒートマップ作成の実務

❌ 発散データに連続カラーマップを使う
相関係数のような0 を中心に正負がある値には、 必ず発散カラーマップ(RdBu_r、 coolwarm、 seismic 等)を使う。 viridis や Blues のような連続カラーマップだと、 正と負が同じ色味で表現され、 「相関の符号」が一目で読めない。 center=0 パラメータと組み合わせて、 白が常に 0 を表すようにする。 これを怠ると論文・レポートで読み手を混乱させる典型ミス。
❌ jet カラーマップを使う
伝統的な jet(虹色)は知覚的に均一でないため、 同じ色差が異なる値差に対応してしまう。 さらに色覚多様性(色弱)のユーザに読みづらい。 matplotlib 2.0 以降のviridis・plasma・infernoが推奨。 これらは知覚的均一性とグレースケール変換時の単調性を備える。 jet を使い続けるのは時代遅れで、 査読でも指摘される。
❌ 大きすぎる行列をそのまま描画
100 変数 × 100 変数の相関行列をベタ表示しても、 セルが小さすぎて読めない。 対策:(i) 階層クラスタリングで並び替え (clustermap)、 (ii) 強い相関のみ抽出して別表、 (iii) アノテーションを省略(数値を書かない)、 (iv) square=False で縦横比を調整、 (v) 変数選択で20-30個に絞る。 「すべての情報を一画面に詰める」のではなく、 読み手の目的に合わせた可視化を選ぶ。
❌ アノテーションの過剰/不足
セル数が10×10程度なら数値表示が読みやすい(annot=True)。 50×50を超えるとセル内文字が潰れて逆効果。 また、 値範囲が広いとき fmt='.2f' など適切な書式を選ばないと「0.000000」のような無駄な桁が並ぶ。 セル数と画像解像度のバランスで、 数値表示するかカラーバーで読ませるかを判断する。
❌ 標準化しないで多変数を並べる
「人口(百万単位)」「失業率(%)」「医師数」を素のままヒートマップにすると、 人口だけで色が決まり他指標が見えなくなる。 必ず列ごとに標準化(z-score)または最小最大スケーリングしてから描画。 seaborn.heatmapstandard_scale=0/1 引数(0=行、1=列)も活用。 単位スケールの違いを潰すのは基本作業。
❌ 並び順を最適化しない
変数の並びがアルファベット順・登録順だと、 関連の強い変数が離れて配置され、 パターンが見えにくい。 階層クラスタリング (sns.clustermap)、 OLO(最適葉順序)、 因子分析の主因子順などで並び替えると、 ブロック構造(モジュール)が明瞭に浮かぶ。 「目で見て分かる」は並び順次第
❌ 色覚多様性への配慮を欠く
日本人男性の約5%、 女性の約0.2%は色覚に多様性がある(赤緑色弱)。 赤緑カラーマップ(RdGn 系)は読みにくい。 RdBu(赤青)、 PuOr(紫橙)、 viridis などは色弱でも識別しやすい。 さらにグレースケール印刷時の可読性も viridis 系が優位。 学術発表・行政レポートでは特に配慮する。

📌 補足セクション — ヒートマップを SSDSE-B-2026 で確かめる

本セクションは「ヒートマップ」を 47都道府県データ(SSDSE-B-2026)で具体的に確認するための追加教材です。 例として47都道府県×7変量の相関行列を色付けを扱います。

📐 数式または定義

ヒートマップの中心的な数式は次のとおりです( SSDSE-B-2026 の 47 都道府県 \(n=47\) を想定):

$$ \hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i, \quad i = 1, 2, \dots, 47 $$ $$ \hat{\beta}_1 = \frac{\sum_{i=1}^{47} (x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{47} (x_i - \bar{x})^2}, \quad \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} $$

ここで \(x_i\) は総人口、 \(y_i\) は課税対象所得、 \(\bar{x}, \bar{y}\) はそれぞれの標本平均を表します。 ヒートマップの解釈は、 上式で得られる係数や残差から導かれます。

🧮 実値で計算してみる — ヒートマップ

SSDSE-B-2026 の 47都道府県データから、 「47都道府県×7変量の相関行列を色付け」を Python で再現します。 まず一行で読み込めるよう、 引数を直書きしたシンプル版を示します:

# 最小コード(直書き)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv')

続いて、 列名はリポジトリ準拠(A1101 総人口、 A1102 男性人口、 D3201 課税対象所得、 等)の本番コードです。

import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=[0,1,2])
# 列名を 3 段ヘッダの最下段だけ採用(コード列: A1101, D3201 等)
df.columns = [c[-1] for c in df.columns]

# 2022 年の 47都道府県スナップショット
sub = df[df['年度コード'] == 2022].copy()
x = sub['A1101'].astype(float)   # 総人口
y = sub['D3201'].astype(float)   # 課税対象所得

# ヒートマップの基礎統計
x_mean, y_mean = x.mean(), y.mean()
beta1 = ((x - x_mean) * (y - y_mean)).sum() / ((x - x_mean) ** 2).sum()
beta0 = y_mean - beta1 * x_mean

print(f'n = {len(x)}')             # 47
print(f'beta1 = {beta1:,.4f}')     # 傾き
print(f'beta0 = {beta0:,.4f}')     # 切片
print(f'相関係数 = {x.corr(y):.4f}')  # 0.95+ になる

# 残差・決定係数も計算
y_hat = beta0 + beta1 * x
resid = y - y_hat
ss_res = (resid ** 2).sum()
ss_tot = ((y - y_mean) ** 2).sum()
r2 = 1 - ss_res / ss_tot
print(f'R^2 = {r2:.4f}')

このコードを実行すると、 47都道府県データから ヒートマップに関連する係数・指標が直接得られます。 SSDSE-B-2026 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。

⚠️ 補足の落とし穴

🔗 関連用語(補足リンク)

相関係数 最小二乗法 残差 決定係数 共分散 p 値 標準誤差 多重共線性

🔬 数式を言葉で読み解く — ヒートマップの中身

ヒートマップ自体は値 $z_{ij}$ を色 $c(z_{ij})$ に写像する単純な変換ですが、 写像の中身を分解すると視覚情報の質がほぼ決まります。 ここでは正規化・カラーマップ・色補間の 3 段階を「言葉」で読み解きます。

記号 → 言葉 → 役割

記号言葉役割
$z_{ij}$セル $(i, j)$ の元の値表示したい数値(例: 相関係数、 度数、 平均)
$z_{\min}, z_{\max}$色尺度の下限・上限「真っ青」「真っ赤」のしきい値を決める
$t_{ij} = (z_{ij}-z_{\min})/(z_{\max}-z_{\min})$0〜1 への正規化値正規化値は色補間関数 $c(t)$ の入力
$c(t)$カラーマップ$t \in [0,1]$ を RGB 色に写す関数(viridis 等)
$\text{midpoint}$発散カラーマップの中点正負を 0 で分ける場合は vcenter=0 等で明示
$\gamma$ガンマ補正低い値の差を強調したいときに $t \to t^\gamma$ を挿入

正規化の選択が見え方を決める

同じ z_{ij} でも、 線形正規化分位点正規化では見え方が全く変わります。 SSDSE-B-2026 で「都道府県別の所得分布」をヒートマップにすると、 東京都が極端な値を持つため線形正規化では他県の差が潰れます。 分位点正規化(PercentileNormalizematplotlib.colors.QuantileNormalize)に切り替えると、 県間の細かな差が浮かび上がります。

発散カラーマップは中点 0 を明示する

相関係数や差分のように「正と負を対比する量」を可視化する場合、 中点を vcenter=0 に固定しないと「全部が正だが薄い赤と濃い赤」のような誤読を招きます。 ヒートマップは色相による分類強調が強いため、 中点設定を怠ると「相関 0.1 と相関 0.9 が同じ赤」になる恐れがあります。