論文中に 「ヒートマップ」として登場する用語。
ヒートマップ とは:値の大小を色の濃淡で表すマトリクス可視化。相関行列の表示などに多用。
ヒートマップは、 行列の各値を色の濃淡で可視化する手法。 大量の数値を一目で把握できる強力なツール。
| 種類 | 例 | 用途 |
|---|---|---|
| 順序型(sequential) | viridis, plasma, Blues | 単調な値(密度、 強度) |
| 発散型(diverging) | RdBu_r, coolwarm | 基準(0)から±に発散(相関) |
| 質的(qualitative) | Set1, tab10 | カテゴリ変数 |
| 循環型(cyclic) | twilight, hsv | 角度、 時刻 |
⚠️ 避けるべき:rainbow / jet — 色覚多様性で誤読されやすい。 推奨:viridis 系(color-blind 安全 + 知覚均等)。
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') |
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) |
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() # マウスホバーで値が見える |
Loua(1873)が社会統計を可視化したのが起源。 1957 年に Sneath が遺伝学で本格採用。 1999 年に Eisen らが遺伝子発現データの可視化として現代的形式を確立。
クラスターマップ(seaborn.clustermap)は、 行・列を階層クラスタリングで並び替えてからヒートマップ化。 似た変数群が隣接して表示され、 構造が一目でわかる。 遺伝子発現解析の標準ツール。
日付別の数値を「カレンダーグリッド」で可視化。 GitHub の contribution graph、 売上の曜日効果、 アクセス時間帯分析などに有効。 calmap や plotly で実装可能。
| 目的 | 1変数 | 2変数 | 多変量 |
|---|---|---|---|
| 記述 | 平均, 中央値, 分散 | 相関, 共分散 | PCA, 因子分析 |
| 可視化 | ヒストグラム, 箱ひげ | 散布図, ヒートマップ | 散布図行列, バイプロット |
| 予測 | 時系列モデル | 単回帰 | 重回帰, Ridge, LASSO |
| 分類 | ロジスティック回帰 | 判別分析 | SVM, RF, NN |
| グループ化 | 階級分け | 2次元クラスタリング | k-means, 階層クラスタリング |
| 検定 | 1標本t検定 | 2標本t検定, χ² | ANOVA, MANOVA |
| n | 推奨手法 |
|---|---|
| n < 10 | 記述統計のみ、 ノンパラ検定、 ベイズ統計 |
| 10 ≤ n < 30 | t検定, ブートストラップ, 単回帰 |
| 30 ≤ n < 200 | 重回帰, ANOVA, 階層クラスタリング |
| 200 ≤ n < 10000 | 複雑な回帰, RF, GBM, k-means |
| n ≥ 10000 | 深層学習, 大規模分散学習 |
| ライブラリ | 用途 |
|---|---|
| numpy | 数値計算の基礎、 行列演算 |
| pandas | データフレーム、 表操作 |
| scipy | 統計関数、 最適化、 線形代数 |
| statsmodels | 古典統計、 検定、 回帰分析の詳細 |
| scikit-learn | 機械学習、 前処理、 評価 |
| matplotlib | 基本可視化 |
| seaborn | 統計的可視化(高級) |
| plotly | インタラクティブ可視化 |
| xgboost / lightgbm | 勾配ブースティング |
| PyTorch / TensorFlow | 深層学習 |
このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。
| 記号 | 意味 | 読み方 |
|---|---|---|
| μ | 母平均 | ミュー |
| σ | 母標準偏差 | シグマ |
| σ² | 母分散 | シグマ二乗 |
| x̄ | 標本平均 | エックスバー |
| s | 標本標準偏差 | エス |
| n | 標本サイズ | エヌ |
| p | p値、 比率 | ピー |
| α | 有意水準 | アルファ |
| β | 回帰係数、 第二種誤り率 | ベータ |
| r | 相関係数 | アール |
| R² | 決定係数 | アール二乗 |
| Σ | 総和記号、 共分散行列 | シグマ大文字 |
| N(μ, σ²) | 正規分布 | ノーマル ミュー シグマ二乗 |
| t(df) | t分布 | ティー |
| χ²(df) | カイ二乗分布 | カイ二乗 |
| F(d1, d2) | F分布 | エフ |
| H₀, H₁ | 帰無仮説、 対立仮説 | エイチゼロ、 エイチワン |
| E[X] | 期待値 | エクスペクタンス |
| Var(X) | 分散 | バリアンス |
| Cov(X, Y) | 共分散 | カバリアンス |
💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。
| 前提 | 関連 | 発展 |
|---|---|---|
| 平均、 分散、 標準偏差 | 類似手法、 派生手法 | 機械学習での応用 |
| 確率分布 | 統計的検定 | ベイズ統計 |
| 数値計算 | 可視化技術 | 深層学習 |
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データは、 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、 効果量 |
ヒートマップ がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 記述統計 › 可視化 › ヒートマップ
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「ヒートマップ」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ヒートマップ」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
SSDSE-B(2020年)の主要6指標(医師数、 人口、 高齢化率、 出生率、 完全失業率、 県民所得)の相関行列をヒートマップで可視化します。
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(所得高い県ほど出生率低い)など。
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] で範囲固定(相関係数の上限・下限)。
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) |
クラスタマップで「似た特性の都道府県」が縦に近接配置される。 例:東京・神奈川・大阪(都市型)、 秋田・島根・高知(過疎・高齢)が明確に分離。
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 で上三角を非表示 → 重複情報を削除 |
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') |
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() # ホバーで詳細表示、 ズーム可能 |
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') |
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) |
center=0 パラメータと組み合わせて、 白が常に 0 を表すようにする。 これを怠ると論文・レポートで読み手を混乱させる典型ミス。square=False で縦横比を調整、 (v) 変数選択で20-30個に絞る。 「すべての情報を一画面に詰める」のではなく、 読み手の目的に合わせた可視化を選ぶ。annot=True)。 50×50を超えるとセル内文字が潰れて逆効果。 また、 値範囲が広いとき fmt='.2f' など適切な書式を選ばないと「0.000000」のような無駄な桁が並ぶ。 セル数と画像解像度のバランスで、 数値表示するかカラーバーで読ませるかを判断する。seaborn.heatmap の standard_scale=0/1 引数(0=行、1=列)も活用。 単位スケールの違いを潰すのは基本作業。sns.clustermap)、 OLO(最適葉順序)、 因子分析の主因子順などで並び替えると、 ブロック構造(モジュール)が明瞭に浮かぶ。 「目で見て分かる」は並び順次第。本セクションは「ヒートマップ」を 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 が手元にない場合は、 統計データ活用コンペティション公式ページからダウンロードしてください。
ヒートマップ自体は値 $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 で「都道府県別の所得分布」をヒートマップにすると、 東京都が極端な値を持つため線形正規化では他県の差が潰れます。 分位点正規化(PercentileNormalize や matplotlib.colors.QuantileNormalize)に切り替えると、 県間の細かな差が浮かび上がります。
相関係数や差分のように「正と負を対比する量」を可視化する場合、 中点を vcenter=0 に固定しないと「全部が正だが薄い赤と濃い赤」のような誤読を招きます。 ヒートマップは色相による分類強調が強いため、 中点設定を怠ると「相関 0.1 と相関 0.9 が同じ赤」になる恐れがあります。
ヒートマップは可視化の中でも特に「2 軸 + 値」を一画面で見せるための主役級ツールです。 散布図・棒グラフ・地図と並ぶ可視化の基本セットの一員として、 「いつヒートマップが最善か」をグループで学ぶと判断が早くなります。