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

🔖 キーワード索引

「heatmap」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「heatmap」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

heatmap統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「heatmap の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

色の濃さで数字を表す地図のようなものです。

たくさんの数値をパッと見て理解するために使います。

カレンダーに勉強時間を色で塗るようなイメージです。

ヒートマップの基本的な使い方を学びましょう。

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

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

主要な用途

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

🍰 まずはやさしく

データの値を色で塗り分ける方法です。

複雑なデータの関係を分かりやすくするために使います。

都道府県ごとのデータを分析するときに役立ちます。

定義から注意点までを順番に解説します。

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

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

本ページでは「heatmap」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「heatmap」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

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

🍰 まずはやさしく

色の塗り方を変えるパレットのようなものです。

データの種類に合わせて最適な色を選ぶために使います。

スマホの画面で温度の変化を色で分ける感覚です。

おすすめの色選びと注意点について読みましょう。

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

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

📐 数式または定義

🍰 まずはやさしく

数値を色に変換するルールのことです。

データから構造を正しく取り出すために使います。

テストの点数を色の濃さで分ける仕組みに似ています。

ヒートマップを定義する数式について学びましょう。

heatmap の定義や代表的な数式を以下に示す。 数式の各記号の意味は次節で言葉に翻訳する。

heatmap は文脈に応じて複数の定式化があるが、 教育目的では最も基本的な形を抑えることが重要。 具体的な値での計算例は後続セクションを参照。

$$\text{heatmap}: f(\mathbf{X}, \boldsymbol{\theta}) \to y$$

記号の対応はこうです。 ヒートマップの各セルは $(i, j)$ の 2 つの添字で位置が決まり、 セルの色が値 $v_{ij}$ を表します。 相関行列のヒートマップなら $v_{ij} = r_{ij}$(変数 $i$ と $j$ の相関係数)で、 $r_{ii} = 1$ の対角線が必ず最も濃くなります。 本ページの回帰式では $\hat{\beta}_1 = \sum (x_i - \bar{x})(y_i - \bar{y}) / \sum (x_i - \bar{x})^2$ が使われており、 $i$ は 47 都道府県を走る添字、 $\bar{x}, \bar{y}$ は平均です。 ヒートマップで「色が濃い」ことと「関係が強い」ことは同じではありません——色は $v$ をカラーマップに写した結果であって、 写し方(範囲・カラーマップ・中心値)を変えれば同じ $v$ が別の濃さになります。 発散型データでは中心を 0 に固定した diverging カラーマップを選ぶこと。

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

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

ヒートマップの歴史

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

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

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

カレンダーヒートマップ

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

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

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

ヒートマップ自体は値 $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)に切り替えると、 県間の細かな差が浮かび上がります。

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

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

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

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

SSDSE-B(2023年)の主要6指標(総人口、 高齢化率、 年少人口割合、 合計特殊出生率、 年平均気温、 消費支出)の相関行列をヒートマップで可視化します。

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

▼ コード解説(主要 6 指標の相関行列を計算)
🎯 解説: 2023 年度の 47 都道府県について、 総人口・高齢化率・年少人口割合・合計特殊出生率・年平均気温・消費支出の 6 指標を作り、 corr() で 6×6 の相関行列を表示する。
📥 入力例: d = 2023 年度の 47 行(英語コード見出し) 高齢化率 = A1303 / A1101 × 100、 年少人口割合 = A1301 / A1101 × 100 A4103 = 合計特殊出生率、 B4101 = 年平均気温、 L3221 = 消費支出
📤 実行例(実測) A1101 高齢化率 年少人口割合 A4103 B4101 消費支出 A1101 1.00 -0.71 -0.07 -0.56 0.12 0.33 高齢化率 -0.71 1.00 -0.46 0.20 -0.45 -0.31 年少人口割合 -0.07 -0.46 1.00 0.70 0.73 -0.25 A4103 -0.56 0.20 0.70 1.00 0.50 -0.47 B4101 0.12 -0.45 0.73 0.50 1.00 -0.23 消費支出 0.33 -0.31 -0.25 -0.47 -0.23 1.00
💬 読み方: 対角の 1.00 を除いて最も強いのは年少人口割合と年平均気温の +0.73、 次いで総人口と高齢化率の −0.71。 合計特殊出生率は年少人口割合と +0.70 だが総人口とは −0.56 で、 人口の多い県ほど出生率が低い。 この 6×6 の表がそのまま次のブロックでヒートマップの色になる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]        # 2023 年・47 都道府県
cols = ['A1101', '高齢化率', '年少人口割合', 'A4103', 'B4101', '消費支出']
sub = pd.DataFrame({
    'A1101': d['A1101'],
    '高齢化率': d['A1303'] / d['A1101'] * 100,        # 65歳以上 ÷ 総人口
    '年少人口割合': d['A1301'] / d['A1101'] * 100,    # 15歳未満 ÷ 総人口
    'A4103': d['A4103'],
    'B4101': d['B4101'],
    '消費支出': d['L3221'],
})[cols]
corr = sub.corr()
print(corr.round(2))

典型結果:総人口と高齢化率に r = -0.71(大都市ほど高齢化率が低い)、 年平均気温と年少人口割合に r = +0.73(温暖な地域ほど子どもの割合が高い)、 合計特殊出生率と年少人口割合に r = +0.70(出生率が高い県ほど子どもが多い)、 総人口と合計特殊出生率に r = -0.56(人口の多い都市部ほど出生率が低い)など。

② seaborn ヒートマップ描画

▼ コード解説(seaborn で相関行列を描いて保存)
🎯 解説: 直前の corr(6×6)を sns.heatmap で描き、 cmap='RdBu_r'・center=0・vmin=-1/vmax=1 で色の意味を固定して html/figures/ssdse_heatmap.png に保存する。
📥 入力例: corr = 直前のブロックで作った 6×6 の相関行列(2023 年度・47 都道府県)
📤 実行例(実測) このブロックは標準出力を出さない(html/figures/ssdse_heatmap.png を保存するだけ)。
💬 読み方: 図では総人口×高齢化率の −0.71 が濃い青、 年少人口割合×年平均気温の +0.73 が濃い赤になり、 総人口×年少人口割合の −0.07 はほぼ白になる。 vmin=-1, vmax=1 を固定しているので、 別の年度で描いた図と並べても同じ色が同じ r を表す。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

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 2023 主要指標の相関')
plt.tight_layout()
plt.savefig('html/figures/ssdse_heatmap.png', dpi=150)

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

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

▼ コード解説(47 都道府県 × 6 指標を標準化して clustermap)
🎯 解説: sub(47 行 × 6 指標)を StandardScaler で列ごとに z 値にし、 行(都道府県)だけを階層クラスタリングで並べ替えた clustermap を html/figures/ssdse_clustermap.png に保存する。
📥 入力例: sub = 2023 年度の 47 都道府県 × 6 指標(総人口・高齢化率・年少人口割合・合計特殊出生率・年平均気温・消費支出)
📤 実行例(実測) このブロックは標準出力を出さない(html/figures/ssdse_clustermap.png を保存するだけ)。
💬 読み方: vmin=-3, vmax=3 で色を切っているので、 東京都の総人口(z = +4.13)や沖縄県の年少人口割合(z = +4.36)は上限の濃い赤に張り付き、 +3 を超えた分の差は色に出ない。 東京都は高齢化率が z = −2.67 と低く、 1 行の中に濃い赤と濃い青が並ぶ。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

from sklearn.preprocessing import StandardScaler
import numpy as np
X = StandardScaler().fit_transform(sub)
heat_df = pd.DataFrame(X, index=d['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('html/figures/ssdse_clustermap.png', dpi=150)
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

クラスタマップで「似た特性の都道府県」が縦に近接配置される。 例:既定の平均連結法では東京都と沖縄県がどの県とも離れて単独の枝になり、 北海道・青森・岩手・秋田・山形の 5 道県、 埼玉・千葉・神奈川・愛知・大阪などの都市圏、 島根・高知などの西日本の県がそれぞれまとまる。

合成データで 3 変数の相関行列を計算する。

Step 1: データ

x1 = [2, 4, 7, 5, 3] x2 = [3, 7, 12, 9, 4] x3 = [10, 8, 5, 6, 9]

Step 2: 相関行列

r(x1,x2) ≈ +0.990 (正の強相関) r(x1,x3) ≈ -0.978 (負の強相関) r(x2,x3) ≈ -0.984 行列対角 = 1.0

🐍 Python で再現

1
2
3
4
import numpy as np
X = np.array([[2,4,7,5,3],[3,7,12,9,4],[10,8,5,6,9]])
corr = np.corrcoef(X)
print(corr.round(3))

📤 実行結果

[[ 1. 0.99 -0.978] [ 0.99 1. -0.984] [-0.978 -0.984 1. ]]

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python でのヒートマップ

seaborn(最も使いやすい)

▼ コード解説(相関ヒートマップ・clustermap・マスクの 3 通り)
🎯 解説: 最新年度(2023)の 47 都道府県で総人口・65歳以上人口・出生数・死亡数・婚姻件数・消費支出の相関行列を作り、 heatmap、 clustermap、 上三角をマスクした heatmap の 3 通りで描く。
📥 入力例: header=1 で日本語の見出しを使い、 年度 == 2023 の 47 行 × 6 列
📤 実行例(実測) このブロックは標準出力を出さない(図を 3 つ描くだけ)。
💬 読み方: 人数を数える 5 列(総人口・65歳以上人口・出生数・死亡数・婚姻件数)どうしは r = 0.962〜0.999 で、 ほぼ全セルが同じ濃い赤になる。 65 歳以上人口と死亡数の 0.999 も県の人口規模を測っているだけなので、 人口千人あたりの率に直してから相関を取らないと規模以外の関係は見えない。 消費支出だけは 0.307〜0.333 と淡い。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['年度'] == df['年度'].max()]
df = df[['総人口', '65歳以上人口', '出生数', '死亡数', '婚姻件数',
         '消費支出(二人以上の世帯)']]

# 相関行列ヒートマップ
# 地域コードや都道府県名は数値ではないので、corr は数値列だけで取る
corr = df.corr(numeric_only=True)
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(基本)

▼ コード解説(matplotlib の imshow で 5×5 相関行列)
🎯 解説: 2023 年度 47 都道府県の総人口・15歳未満・65歳以上・出生数・消費支出(A1101・A1301・A1303・A4101・L3221)の相関行列を plt.imshow で描き、 軸に日本語ラベルを付ける。
📥 入力例: _d = 2023 年度の 47 行 matrix = 上の 5 列の 5×5 相関行列
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: viridis は中心を持たない順序カラーマップで、 vmin/vmax も指定していないので、 色の範囲は実際の最小 0.307(出生数×消費支出)〜 1.0 に引き伸ばされる。 そのため 0.3 程度の弱い正の相関が最も暗い紫になり、 負の相関のように見えてしまう。 相関行列なら RdBu_r と vmin=-1, vmax=1 を指定する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

# ── この抜粋だけで動くように、47 都道府県・最新年度を読み込む ──
_d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
_d = _d[_d['SSDSE-B-2026'] == 2023]
import numpy as np
import matplotlib.pyplot as plt

# ── この抜粋だけで動くように、行列とラベルを用意する ──
_cols = ['A1101', 'A1301', 'A1303', 'A4101', 'L3221']
labels = ['総人口', '15歳未満', '65歳以上', '出生数', '消費支出']
matrix = _d[_cols].astype(float).corr().values   # 相関行列(5×5)

plt.imshow(matrix, cmap='viridis', aspect='auto')
plt.colorbar(label='値')
plt.xticks(range(len(labels)), labels, rotation=45)
plt.yticks(range(len(labels)), labels)
plt.tight_layout()
plt.show()

plotly(インタラクティブ)

▼ コード解説(plotly でインタラクティブな相関ヒートマップ)
🎯 解説: 直前までの corr を plotly.express.imshow で描き、 マウスを乗せると値が出るインタラクティブなヒートマップにする。 text_auto='.2f' で各セルに小数 2 桁を書き込む。
📥 入力例: corr = 3 通りのヒートマップのブロックで作った 6×6 の相関行列(総人口・65歳以上人口・出生数・死亡数・婚姻件数・消費支出)
📤 実行例(実測) このブロックは標準出力を出さない(fig.show() でブラウザに図が開く)。
💬 読み方: RdBu_r と zmin=-1, zmax=1 の組み合わせなので、 人数系 5 列どうしの 0.96〜1.00 は濃い赤、 消費支出との 0.31〜0.33 は淡い赤になり、 青いセルは 1 つも出ない。 ホバーで正確な値が読めるので、 annot の数字が重なる大きな行列でも使える。
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 で似た変数群を発見

🚧 落とし穴と注意点

  • サンプルサイズを確認(小標本では結果が不安定)
  • 仮定の検証(正規性、 独立性、 等分散性)
  • 外れ値の影響を散布図で確認
  • 多重比較問題(複数検定時は補正を)
  • p値だけで判断しない、 効果量と信頼区間を併記
  • 因果関係を主張するには別の根拠が必要

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

ヒートマップの歴史

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

カレンダーヒートマップ

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

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

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

古典的教科書

  • Casella & Berger "Statistical Inference"
  • Wasserman "All of Statistics"
  • Hastie, Tibshirani & Friedman "The Elements of Statistical Learning"
  • Gelman & Hill "Data Analysis Using Regression and Multilevel/Hierarchical Models"

実践書

  • VanderPlas "Python Data Science Handbook"
  • McKinney "Python for Data Analysis"
  • James, Witten, Hastie & Tibshirani "An Introduction to Statistical Learning"

オンラインリソース

  • scikit-learn 公式ドキュメント
  • statsmodels 公式ドキュメント
  • scipy.stats リファレンス
  • SSDSE データ(統計データ活用コンペティション)

💼 実務応用ガイド

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

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

業界別ユースケース

  • マーケティング:顧客セグメンテーション、 ROI 分析、 A/Bテスト
  • 金融:ポートフォリオ最適化、 リスク評価、 信用スコアリング
  • 医療:臨床試験、 疫学研究、 診断モデル
  • 製造:品質管理、 予測保全、 工程最適化
  • 公共政策:社会統計、 政策効果分析、 計画立案

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

分析の流れ — 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)

  • Q: 正規分布じゃないデータをどう扱う?
    A: 対数変換、 Box-Cox 変換、 ノンパラ検定、 ブートストラップ
  • Q: 外れ値を除くべき?
    A: ドメイン知識で判断。 機械的に除くより、 ロバスト手法を検討
  • Q: サンプルサイズはいくつあれば十分?
    A: 効果量と検出力から事前計算(power analysis)
  • Q: p < 0.05 で「効果あり」と結論していい?
    A: 効果量と信頼区間も併記。 多重比較補正も
  • Q: 相関があれば因果がある?
    A: ない。 RCT、 IV、 DiD などの因果推論手法が必要

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

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

必ず押さえるべき記号

記号 意味 読み方
μ母平均ミュー
σ母標準偏差シグマ
σ²母分散シグマ二乗
x̄標本平均エックスバー
s標本標準偏差エス
n標本サイズエヌ
pp値、 比率ピー
α有意水準アルファ
β回帰係数、 第二種誤り率ベータ
r相関係数アール
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 で挑戦できる課題

  • 47都道府県データで実装
  • 東日本 vs 西日本のグループ比較
  • 都市規模別の傾向
  • 家計支出パターンの解析
  • 地域別の経済指標の関連性

関連用語・概念リスト

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

典型的な解釈ミス

  • 統計的有意性と実質的意義の混同
  • 相関と因果の混同
  • サンプルサイズの過小評価
  • 外れ値の機械的除去
  • 仮定確認の省略
  • 多重比較問題の無視

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

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

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

📍 学習の3ステップ

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

🔧 Python実装パターン

▼ コード解説(家計 3 項目の記述統計と散布図行列)
🎯 解説: 2023 年度の 47 都道府県について df.describe() で記述統計を出し、 食料費・教育費・住居費(二人以上の世帯)の散布図行列を sns.pairplot で描く。
📥 入力例: header=1 の日本語見出し、 年度 == 2023 の 47 行 × 112 列
📤 実行例(実測) このブロックは標準出力を出さない。 df.describe() は print していないので、 スクリプトとして実行すると表は出ず、 Jupyter のセル末尾に置いたときだけ表示される。
💬 読み方: 3 項目の相関は食料費×教育費が 0.728 と強く、 住居費は両者とほぼ無相関(−0.003、 −0.026)で、 散布図行列でも住居費の行だけ点が丸く散らばる。 教育費は東京都 24,160 円から秋田県 4,316 円まで 5.6 倍の開きがあり、 右上の 1 点が東京都にあたる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
# 日本語の項目名(食料費など)を使うので header=1 で 2 行目を見出しにする
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['年度'] == df['年度'].max()]      # 最新年度の 47 行

# 基本統計量
df.describe()

# 可視化
# SSDSE-B の実際の列名は「(二人以上の世帯)」まで含む
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()

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

  • 外れ値の影響:散布図・ 箱ひげ図で確認、 ロバスト手法も検討
  • サンプルサイズ不足:power analysis で事前に確認
  • 仮定の違反:正規性、 独立性、 等分散性をチェック
  • 多重比較問題:補正(Bonferroni、 FDR)を適用
  • p-hacking:事前登録(pre-registration)で防ぐ
  • 因果と相関の混同:観察データから因果結論を出さない

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

  • 点推定:得られた値
  • 不確実性:信頼区間または標準誤差
  • サンプルサイズ:n を明記
  • 効果量:実質的な意義
  • p値:統計的有意性
  • 仮定の確認:診断プロット

🌐 関連分野での応用

  • マーケティング:A/Bテスト、 顧客分析
  • 医療:臨床試験、 疫学研究
  • 金融:リスク管理、 ポートフォリオ
  • 製造:品質管理、 工程最適化
  • 公共政策:効果評価、 計画立案
  • 研究:仮説検証、 探索的解析

🎓 さらに学ぶための文献

  • Wasserman "All of Statistics"
  • Hastie, Tibshirani & Friedman "The Elements of Statistical Learning"
  • Gelman & Hill "Data Analysis Using Regression"
  • VanderPlas "Python Data Science Handbook"

🔗 統計用語ネットワーク

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

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

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 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つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

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

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

中心に ヒートマップ を置き、 そこから 散布図・相関係数・ヒストグラム・箱ひげ図・回帰直線・共分散 など 計 8 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

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

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

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

  • カテゴリ円をクリック:その内部にズームイン
  • 白背景クリック:1階層戻る
  • 用語円をクリック:詳細ページへ遷移
  • マウスホバー:階層パス表示
📍現在地:統計・データサイエンス

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

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

  • カテゴリ矩形をクリック:その内部にドリルダウン
  • パンくず(上のリンク)クリック:その階層に戻る
  • 用語矩形をクリック:詳細ページへ遷移
  • マウスホバー:階層パスと値を表示

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

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

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは ヒートマップ の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 可視化 → ヒートマップ という入れ子の位置を示します。 「可視化には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

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

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

▼ コード解説(6 指標の相関行列(再掲))
🎯 解説: 2023 年度 47 都道府県の 6 指標(総人口・高齢化率・年少人口割合・合計特殊出生率・年平均気温・消費支出)を 1 つの表にまとめ、 相関行列を小数 2 桁で表示する。
📥 入力例: d = SSDSE-B-2026 の年度列が 2023 の 47 行 比率の 2 列は A1303・A1301 を A1101 で割って % にする
📤 実行例(実測) A1101 高齢化率 年少人口割合 A4103 B4101 消費支出 A1101 1.00 -0.71 -0.07 -0.56 0.12 0.33 高齢化率 -0.71 1.00 -0.46 0.20 -0.45 -0.31 年少人口割合 -0.07 -0.46 1.00 0.70 0.73 -0.25 A4103 -0.56 0.20 0.70 1.00 0.50 -0.47 B4101 0.12 -0.45 0.73 0.50 1.00 -0.23 消費支出 0.33 -0.31 -0.25 -0.47 -0.23 1.00
💬 読み方: 消費支出は他の 5 指標との相関がどれも |r| ≤ 0.47 と弱めで、 最大は合計特殊出生率との −0.47。 年少人口割合×年平均気温の +0.73 は沖縄県 1 県に引っ張られている面があり、 沖縄県を除くと 0.62 に下がる。 色を見る前に、 強い相関のセルは散布図で外れ値を確かめておく。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]        # 2023 年・47 都道府県
cols = ['A1101', '高齢化率', '年少人口割合', 'A4103', 'B4101', '消費支出']
sub = pd.DataFrame({
    'A1101': d['A1101'],
    '高齢化率': d['A1303'] / d['A1101'] * 100,        # 65歳以上 ÷ 総人口
    '年少人口割合': d['A1301'] / d['A1101'] * 100,    # 15歳未満 ÷ 総人口
    'A4103': d['A4103'],
    'B4101': d['B4101'],
    '消費支出': d['L3221'],
})[cols]
corr = sub.corr()
print(corr.round(2))

② seaborn ヒートマップ描画

▼ コード解説(相関行列のヒートマップを PNG に保存)
🎯 解説: corr を annot=True・RdBu_r・vmin=-1/vmax=1 の sns.heatmap で描き、 タイトルを付けて html/figures/ssdse_heatmap.png に保存する。
📥 入力例: corr = 6×6 の相関行列(2023 年度・47 都道府県)
📤 実行例(実測) このブロックは標準出力を出さない(PNG を 1 枚保存するだけ)。
💬 読み方: 36 セルのうち対角の 6 つは必ず 1.00 で最も濃い赤になるので、 色の強さを比べるときは対角を除いた 15 組を見る。 annot=True で数値も重ねているので、 年平均気温×消費支出の −0.23 のような淡い色も値で確認できる。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

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 2023 主要指標の相関')
plt.tight_layout()
plt.savefig('html/figures/ssdse_heatmap.png', dpi=150)

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

▼ コード解説(z 値で並べた clustermap を保存)
🎯 解説: 6 指標を StandardScaler で平均 0・標準偏差 1 にそろえ、 都道府県を行クラスタリングした clustermap(色は z = −3〜+3)を html/figures/ssdse_clustermap.png に保存する。
📥 入力例: sub = 2023 年度 47 行 × 6 指標 heat_df の行ラベル = 都道府県名
📤 実行例(実測) このブロックは標準出力を出さない(PNG を 1 枚保存するだけ)。
💬 読み方: 行の並び替えは z 値のユークリッド距離で行われるので、 年少人口割合 +4.36・年平均気温 +3.45 など 4 指標で |z| > 2 の沖縄県は他県から離れた位置に来る。 列は col_cluster=False で 6 指標の順のままなので、 指標どうしの似方も見たいときは col_cluster=True に変える。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import os
os.makedirs('html/figures', exist_ok=True)  # 保存先のフォルダを作っておく

from sklearn.preprocessing import StandardScaler
import numpy as np
X = StandardScaler().fit_transform(sub)
heat_df = pd.DataFrame(X, index=d['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('html/figures/ssdse_clustermap.png', dpi=150)

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

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

▼ コード解説(上三角をマスクした相関ヒートマップ)
🎯 解説: corr の上三角(対角を含む)を np.triu のマスクで隠し、 下三角だけを coolwarm で描く。
📥 入力例: corr = 主要 6 指標の相関行列(総人口・高齢化率・年少人口割合・合計特殊出生率・年平均気温・消費支出)
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: 6×6 のうち対角を含む 21 セルが隠れ、 残る 15 セルに 15 組の相関が 1 回ずつ並ぶ。 対角の 1.00 も隠れるので、 vmin/vmax を指定しないこの図では色の両端が実際の最大 |r| = 0.73(年少人口割合×年平均気温)付近に割り当てられ、 淡い色でも ±0.7 近い値を表すことがある。
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 — 細かいカスタム

▼ コード解説(pcolormesh で塗って値を書き込む)
🎯 解説: matplotlib の pcolormesh で corr(6×6)を RdBu_r・vmin=-1/vmax=1 で塗り、 ax.text で各セルに小数 2 桁の値を書き込む。
📥 入力例: corr(6×6 の相関行列)と cols(6 指標の名前)
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: pcolormesh は行 0 を下端に描くので、 seaborn と違って総人口(A1101)の行が一番下に来て、 対角線は左下から右上へ走る。 総人口×高齢化率の −0.71 は左下の角の隣に出る。 表と同じ向きで読みたいときは ax.invert_yaxis() を足す。
 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.express.imshow で corr を描き、 タイトルを付けて表示する。 aspect='auto' でセルを図の枠に合わせて引き伸ばす。
📥 入力例: corr(6×6 の相関行列)
📤 実行例(実測) このブロックは標準出力を出さない(fig.show() でブラウザに図が開く)。
💬 読み方: aspect='auto' なので枠に合わせてセルが長方形になる。 ホバーすると行名・列名・値が出るので、 年少人口割合×年平均気温の 0.73 のような値を数字で確かめられる。 静的な報告書に貼るなら fig.write_image で画像にする(kaleido が必要)。
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 の混同行列ヒートマップ

▼ コード解説(混同行列をヒートマップで表示)
🎯 解説: 2023 年度の 47 都道府県を「総人口が中央値より多いか」で 2 クラスに分け、 出生数と 65 歳以上人口を標準化してロジスティック回帰で当て、 混同行列を ConfusionMatrixDisplay で表示する。
📥 入力例: _d = 2023 年度の 47 行 特徴量: A4101(出生数)・A1303(65 歳以上人口) 正解: y_true = A1101 が中央値より大きい(1 が 23 県、 0 が 24 県)
📤 実行例(実測) このブロックは標準出力を出さない(混同行列の図を描く)。 図のセルは confusion_matrix(y_true, y_pred) = [[24, 0], [5, 18]]。
💬 読み方: 対角の 24 と 18 が正解、 左下の 5 が「人口が中央値より多いのに少ないと予測」した県で、 正解率は 42/47 = 89.4%。 学習に使った 47 県をそのまま当てているので、 これは未知データへの性能ではない。 Blues は件数の多いセルほど濃いので、 誤りの 5 件は淡い色になり見落としやすい。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd

# ── この抜粋だけで動くように、47 都道府県・最新年度を読み込む ──
_d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
_d = _d[_d['SSDSE-B-2026'] == 2023]
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import ConfusionMatrixDisplay, confusion_matrix

# ── この抜粋だけで動くように、2 クラスの正解と予測を作る ──
_X = StandardScaler().fit_transform(_d[['A4101', 'A1303']].astype(float))
y_true = (_d['A1101'] > _d['A1101'].median()).astype(int).values
y_pred = LogisticRegression(max_iter=1000).fit(_X, y_true).predict(_X)

cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(cm, display_labels=['neg', 'pos'])
disp.plot(cmap='Blues', values_format='d')

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

▼ コード解説(Ward 法で都道府県を並べ替えたヒートマップ)
🎯 解説: 標準化済みの X(47 県 × 6 指標)を Ward 法で階層クラスタリングし、 デンドログラムの葉の順に heat_df の行を並べ替えて heatmap を描く。
📥 入力例: X, heat_df = 2023 年度 47 都道府県 × 6 指標の z 値
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: 葉の順は沖縄県・長崎県・宮崎県・鹿児島県…と九州・四国の県から始まり、 中ほどに東京都・愛知県・大阪府・神奈川県などの都市圏がまとまり、 末尾は青森県・秋田県・北海道・長野県・岩手県・山形県と東日本の県が並ぶ。 fcluster(Z, 3, 'maxclust') で 3 群に切ると 16 県・8 都府県・23 道府県に分かれる。
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.heatmap の standard_scale=0/1 引数(0=行、1=列)も活用。 単位スケールの違いを潰すのは基本作業。
❌ 並び順を最適化しない
変数の並びがアルファベット順・登録順だと、 関連の強い変数が離れて配置され、 パターンが見えにくい。 階層クラスタリング (sns.clustermap)、 OLO(最適葉順序)、 因子分析の主因子順などで並び替えると、 ブロック構造(モジュール)が明瞭に浮かぶ。 「目で見て分かる」は並び順次第。
❌ 色覚多様性への配慮を欠く
日本人男性の約5%、 女性の約0.2%は色覚に多様性がある(赤緑色弱)。 赤緑カラーマップ(RdGn 系)は読みにくい。 RdBu(赤青)、 PuOr(紫橙)、 viridis などは色弱でも識別しやすい。 さらにグレースケール印刷時の可読性も viridis 系が優位。 学術発表・行政レポートでは特に配慮する。

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

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

▼ コード解説(下三角だけの相関ヒートマップ(再掲))
🎯 解説: np.triu(np.ones_like(corr, dtype=bool)) で対角と上三角を True にしたマスクを作り、 sns.heatmap の mask 引数に渡して下三角だけを描く。
📥 入力例: corr = 6×6 の相関行列(2023 年度・47 都道府県)
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: 相関行列は r_ij = r_ji なので、 上三角を隠しても情報は減らない。 annot=True の数値は下三角の 15 個だけになり、 例えば総人口×高齢化率の −0.71 は 1 か所にだけ出る。 別の図と色を比べたいときは vmin=-1, vmax=1 を足して色の範囲を固定する。
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 — 細かいカスタム

▼ コード解説(pcolormesh で相関行列を細かく描く)
🎯 解説: pcolormesh の各セルの中心(j+0.5, i+0.5)に ax.text で相関係数を書き、 目盛りを 0.5 ずらして 6 指標の名前をセルの中央に合わせる。
📥 入力例: corr(6×6)と cols(6 指標の名前のリスト)
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: セル内の文字は色に関係なく黒なので、 |r| が 0.7 前後の濃い色(総人口×高齢化率 −0.71、 年少人口割合×年平均気温 +0.73)のセルでは数字が読みにくくなる。 値の絶対値が大きいセルだけ白文字にするなど、 文字色を切り替えると読みやすい。
 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.express.imshow に corr を渡し、 text_auto='.2f'・RdBu_r・zmin=-1/zmax=1 で描いてタイトルを付ける。
📥 入力例: corr(6×6 の相関行列)
📤 実行例(実測) このブロックは標準出力を出さない(fig.show() でブラウザに図が開く)。
💬 読み方: セルに値が書かれるので、 ホバーしなくても総人口×合計特殊出生率の −0.56 のような値が読める。 fig.write_html('heatmap.html') で保存すれば、 Python が無い人にもブラウザで動かして見てもらえる。
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 の混同行列ヒートマップ

▼ コード解説(予測結果から混同行列を作って描く)
🎯 解説: 直前のブロックの y_true・y_pred から confusion_matrix を計算し、 neg / pos のラベルを付けて整数表示のヒートマップにする。
📥 入力例: y_true, y_pred = 47 都道府県分の正解と予測(人口が中央値より多い = 1)
📤 実行例(実測) このブロックは標準出力を出さない(図のセルは [[24, 0], [5, 18]])。
💬 読み方: 右上の 0 は「人口が少ない県を多いと誤る」ケースが 1 件も無いことを示し、 誤りの 5 件はすべて「多い県を少ないと予測」の側に偏っている。 display_labels の neg / pos は 0 / 1 の順に付くので、 ラベルの順番を入れ替えるとセルの意味も入れ替わる。
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 階層クラスタリング + ヒートマップ

▼ コード解説(Ward 法の順に並べたヒートマップ(再掲))
🎯 解説: linkage(X, method='ward') の結果から dendrogram(no_plot=True) で葉の順番だけを取り出し、 その順に heat_df を並べ替えて sns.heatmap で描く。
📥 入力例: X, heat_df = 2023 年度 47 都道府県 × 6 指標の z 値
📤 実行例(実測) このブロックは標準出力を出さない(図を 1 つ描くだけ)。
💬 読み方: 並べ替えるのは行だけで、 heatmap 自体にはデンドログラムが描かれないので、 どこで群が切れるかは図から読めない。 4 群に切ると沖縄県だけが 1 県で独立した群になり、 年少人口割合(z = +4.36)と年平均気温(z = +3.45)が他県と大きく離れていることが分かる。 樹形図も並べたいなら sns.clustermap(heat_df, method='ward') を使う。
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)
📤 実行例(実測) このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。

⚠️ よくある落とし穴

ヒートマップは「色で量を見せる」図なので、 色の選び方と並べ方を誤ると、 データに無い構造が見えたり、 ある構造が消えたりする。 実際に起きやすい 5 つを挙げる。

❌ カラーマップに虹色(jet)を使う
虹色は明度が単調に変わらないため、 実際には差が無いところに境目が見え、 差があるところが平坦に見える。 白黒印刷でも順序が失われる。 明度が一方向に変わる viridis や magma を既定にし、 正負の対称な量なら中心を白にする RdBu_r を使う。
❌ 相関行列で色の中心を 0 に置かない
相関は −1〜+1 の対称な量なので、 center=0 と vmin=-1, vmax=1 を指定しないと、 たまたま全部が正のときに弱い正の相関まで濃い色になる。 同じ図を並べて比較するときも、 スケールを固定しないと色の意味がページごとに変わってしまう。
❌ 行や列を元の順番のまま並べる
都道府県コード順のまま描くと、 似た性質の県が離れて配置され、 塊(クラスタ)が見えない。 階層クラスタリングで並べ替える(clustermap)と、 同じ傾向のグループが対角線上に集まって構造が読める。 並べ替えたときは、 何の距離で並べたかを必ず書く。
❌ スケールの違う列をそのまま並べる
総人口(百万単位)と合計特殊出生率(1 前後)を同じヒートマップに載せると、 人口の列だけが色を占有し、 他の列はすべて同じ色になる。 列ごとに標準化してから描くか、 単位系の近い列だけをまとめる。
❌ セルが多すぎて 1 つも読めない
47 都道府県 × 100 列を 1 枚に詰めると、 セルが数ピクセルになり値も軸ラベルも読めない。 図の目的が「全体の雰囲気」なら粗くてよいが、 個々の値を伝えたいなら列を絞るか分割する。 数値を重ねて書く(annot=True)のは 15×15 程度までが限界。

🔗 隣接手法への橋渡し

「ヒートマップ」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

上流の相関行列・混同行列・分割表で 2 次元データを準備し、 並列のクラスタマップ (seaborn clustermap)・地理ヒートマップと表現を比較し、 下流の主成分分析・階層クラスタリングで構造を抽出する。 ヒートマップは「色で大量の数値を一望」する典型可視化で、 必ず凡例・色覚バリアフリー配色 (viridis) と組み合わせる。

🌳 手法選択フロー

「heatmap」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。

典型シナリオ別の手法選択

シナリオ重視する観点候補手法
データが大規模 (n が多い、 高次元)計算コスト / メモリ / 並列化が必要47都道府県×7変量の相関行列を色付け 等
外れ値が多い / ノイズあり頑健性 / 外れ値除去 / 中央値ベース都道府県データはサンプルサイズ 47 が固定 等
解釈性を重視する線形 / 木構造 / ルールベーススケールの違い 等
予測精度を最優先するアンサンブル / ハイパラ調整 / 交差検証東京・大阪等の影響点 等

選んだ後の検証ステップ

  1. 前処理確認: 標準化 / 欠損処理 / カテゴリ変数のエンコード が適切か
  2. ハイパラ調整: 交差検証で安定する値を選ぶ
  3. 性能評価: タスクに応じた指標 (RMSE / Accuracy / F1 / AUC / シルエット等) を複数併用
  4. 頑健性チェック: 別手法 / 別シードで結果が大きく違わないか確認
  5. 解釈: 結果を分野知識と照らし合わせ、 意味のある発見になっているか検討

🎮 触って理解する — ヒートマップ設計シミュレータ

同じ行列でも、 カラースケール・正規化・並べ替えの設計で「見えるもの」が激変します。 下の図は SSDSE-B-2026(2023年度・47都道府県)の実測値から計算した 6 指標(高齢化率 = 65歳以上人口÷総人口、 合計特殊出生率、 年平均気温、 住宅地地価、 食料費、 教育費)のヒートマップです。 ボタンで設計を切り替え、 セルをタップ/クリックすると実際の値が表示されます。

📊 データ: 🎨 カラースケール:
⚖️ 正規化(県×指標のみ): 🔀 並べ替え:
👆 セルをタップすると、 その行・列と実測値がここに表示されます。

🧪 この順で試すと設計の効果が分かる

  1. 相関行列 × 発散型 → 連続型に切替:発散型では「白 = r 0、 赤 = 正、 青 = 負」と正負が一瞬で読めるが、 連続型(Viridis 風)に切り替えると r = 0 が中途半端な色になり、 正負の境界が消える。 相関には発散型が適する理由を体感。
  2. 県×指標 × 正規化なし:全体 min-max では住宅地地価(最小 13,200 円/m²・秋田 〜 最大 404,400 円/m²・東京)だけが色を独占し、 高齢化率(22.75〜39.06%)や出生率(0.99〜1.60)の差は完全に潰れる。 スケール未統一の失敗例そのもの。
  3. 列ごと z-score に切替:各指標が平均 0・SD 1 に揃い、 突然すべての列に模様が現れる。 東京(地価 +5σ 級)や沖縄(気温 +3σ 級)の個性が浮かぶ。
  4. クラスタ順に並べ替え:似た県(都市型 / 過疎・高齢型など)が隣接し、 ブロック状のパターンが浮かぶ。 相関行列でも変数のグループ(地価・食料費・教育費 vs 高齢化率)が対角ブロックにまとまる。

👁️ 直感 — ヒートマップは「行列を色で俯瞰する」道具

47×6 = 282 個の数値を表で読むのは苦痛ですが、 色に変換すれば1 秒で全体の構造(どの行・列が高いか、 ブロック構造があるか)を把握できます。 ただし色は「正確な値の読み取り」には不向きなので、 俯瞰 = ヒートマップ、 精読 = annot(数値併記)や表と役割分担するのが定石です。

🚧 よくある落とし穴(このシミュレータで再現できる)

🚀 発展 — クラスタリング併用とカラーユニバーサルデザイン

🔎 もう一段深く — ヒートマップの「色スケール独占」を実データで見抜く

👁️ 直感 — ヒートマップは「表を色に翻訳する装置」

数字が並んだ表を、 人間は 1 セルずつ順に読むしかありません。 ところがヒートマップは同じ表の値を色の濃淡に置き換えるので、 目は「面」としてムラを一度に捉えられます。 ここで決定的に重要なのは、 色は必ず「最小値〜最大値」という 1 本のスケールに写像されるという点です。 つまり「どの範囲を 1 本のスケールに載せるか」を誤ると、 見えるはずの模様が丸ごと消えます。 これが以下の落とし穴の核心です。

⚠️ 落とし穴(重要)— 生値ヒートマップは単位差で「1 列が色を独占」する

姉妹ページで扱う「正規化の必要性」を、 SSDSE-B-2026 の 2023 年・47 都道府県の 実測値で具体化します。 総人口・15 歳未満人口・65 歳以上人口・出生数の 4 列を、 全体で 1 本の min–max スケール(生値ヒートマップの既定に相当)に載せると、 色の割り当ては次のようになります(pd.read_csv(encoding='cp932', skiprows=[1]) で算出)。

列(指標) 最大値(人) 全体スケール上の色の占有帯
A1101 総人口14,086,0003.79% 〜 100.00%
A1303 65歳以上人口3,205,0001.25% 〜 22.74%
A1301 15歳未満人口1,513,0000.44% 〜 10.72%
A4101 出生数86,3480.00% 〜 0.59%

総人口の最大(東京 14,086,000)は出生数の最大(86,348)の 約 163 倍。 その結果、 全体 min–max スケールでは 総人口の列だけが色レンジの 3.79%〜100% をほぼ独占し、 残り 3 列は下位 0〜23% の帯に押し込まれます。 とくに出生数の列は 47 都道府県すべてが 0.6% 未満——最も薄い色で塗りつぶされ、 東京と鳥取の差すら見えません。 「出生数の地域差」という肝心の模様が、 単位の大きい列に踏み潰されるのです。

対策は明快です。 色は必ず「列ごと」に正規化する(各列を z 標準化、 または列内 min–max)。 そうすれば各列が独立に 0〜100% を使い切り、 全列で地域差が同じ土俵で読めるようになります。 本ページの対話ウィジェット(生値モード)で「列ごと正規化」を選ぶと、 この効果を目で確認できます。

📝 補足の落とし穴(第 2 の罠):正規化を「行ごと」にするか「列ごと」にするかで解釈が入れ替わります。 列正規化は「この指標の中で、 どの県が高いか」(指標内の相対)、 行正規化は「この県の中で、 どの指標が突出しているか」(県内の相対)を示します。 同じ色でも意味が違うので、 図には必ず「どの軸で正規化したか」を明記してください。

🚀 発展 — 相関ヒートマップは「正規化不要・並べ替えで構造が出る」

上の生値の話と対照的に、 相関行列ヒートマップは単位差の問題を持ちません。 相関係数はすでに無次元で −1〜+1 に収まっているため、 列独占は起きず、 発散カラーマップ(中点 0)に素直に載ります。 相関ヒートマップで効くのは正規化ではなく「並べ替え」です。 SSDSE-B-2026 の 2023 年には数値列が 109 列あり、 コード順のまま相関行列を描くと模様は散らばって見えます。 ここで階層クラスタリングで行・列を並べ替える(seaborn.clustermap)と、 似た変数どうしが隣接し、 対角線上に「変数群のブロック」が浮かび上がります。 生値ヒートマップは「正規化で見えるようにする」、 相関ヒートマップは「並べ替えで構造を出す」——この 2 つは別々の武器だと整理しておくと混乱しません。

🔗 関連ページ