論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説(ジャストインタイム型データサイエンス教育)
2変量の可視化(散布図・ヒートマップ)
Bivariate Visualization
2 つ以上の変数の関係を視覚化する手法群。 散布図・ヒートマップ・散布図行列が中核。
記述統計可視化bivariate viz

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

🍰 まずはやさしく

データの分析でよく使う道具のようなものです。

結果を分かりやすく報告するために使います。

部活の練習量と試合の結果をまとめます。

どんな場面でどの図を使うかを確認しましょう。

論文・記事に 「散布図」「ヒートマップ」「散布図行列」「相関プロット」「バブルチャート」「クロス集計」 として登場する 2変量以上の可視化群。 EDA・モデル評価・結果報告のすべての場面で必須のツール。

🔖 キーワード索引

論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:

🎯 散布図 🔥 ヒートマップ 📐 散布図行列 ⬡ Hexbin 🌊 2D KDE 🎈 バブルチャート 📋 クロス集計 🧭 散布図の読み方 🚧 よくある誤解 📝 練習問題 🗺️ 概念マップ

💡 30秒で分かる結論

🍰 まずはやさしく

2つのデータの関係を絵にする方法です。

データ同士にどんなつながりがあるか調べます。

勉強時間とテストの点数の関係を調べます。

図の種類と使い分けについて読みましょう。

🗂️ 章俯瞰 — 2変量可視化の選び方

手法 変数の型 サンプルサイズ 主な用途
散布図連続 × 連続10〜数千相関、 回帰、 外れ値
Hexbin連続 × 連続10000〜大量データの密度
2D KDE連続 × 連続100〜数千滑らかな密度
バブル連続 × 連続 × サイズ〜数百3変数の同時表示
ヒートマップ行列形式任意相関行列、 混同行列
散布図行列複数連続変数任意(3〜10変数)多変量 EDA
クロス集計カテゴリ × カテゴリ任意独立性検定

🎯 散布図(Scatter Plot)

2 つの連続変数の関係を $(x_i, y_i)$ の点で表現。 探索的データ解析の最も重要な可視化。 相関係数や回帰分析の前に必ず描く。

散布図の例

🧭 散布図の読み方 — 5つのチェックポイント

  1. 方向:右上がり(正)/ 右下がり(負)/ なし
  2. 強さ:点が密集(強い)/ ばらけている(弱い)
  3. 形状:直線的/ 曲線的(非線形)/ 群を成す
  4. 外れ値:全体から離れた点はないか
  5. 不等分散:$x$ の値で $y$ のばらつきが変わるか(漏斗状)
散布図のパターン

🧮 SSDSE 47都道府県の食料費 × 教育費

SSDSE-B-2026 の家計支出から、 食料費と教育費の関係を散布図で確認すると正の相関($r \approx 0.73$)が見えます。 ただし、 相関係数 $r$ の数値だけでは「線形か」「外れ値があるか」が分からないため、 散布図と必ずセットで確認します。

🐍 Python での散布図

🎯 目的:散布図で 2 変量 (食料費 × 教育費) の関係を 47 都道府県分プロットし、 相関の強さと外れ値県を視覚的に把握する。
📥 入力data/raw/SSDSE-B-2026.csv。 列 L322101 (食料費)と L322108 (教育費)、 encoding='cp932'、 header=1。
 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
30
31
32
33
34
35
36
37
38
39
40
41
42
import pandas as pd

# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 費目の正式名は「◯◯費(二人以上の世帯)」。短い別名を付けて使いやすくする
df['食料費'] = df['食料費(二人以上の世帯)']
df['住居費'] = df['住居費(二人以上の世帯)']
df['教育費'] = df['教育費(二人以上の世帯)']
df['光熱費'] = df['光熱・水道費(二人以上の世帯)']
df['消費支出'] = df['消費支出(二人以上の世帯)']
# 「地域」は SSDSE に無いので、地域コードの頭 2 桁(都道府県番号)から作る
def _blk(code):
    n = int(str(code)[1:3])
    return ('北海道' if n == 1 else '東北' if n <= 7 else '関東' if n <= 14
            else '中部' if n <= 23 else '近畿' if n <= 30 else '中国' if n <= 35
            else '四国' if n <= 39 else '九州沖縄')
df['地域'] = df['地域コード'].map(_blk)

import matplotlib.pyplot as plt
import seaborn as sns

food = df['食料費'] / 1000
edu = df['教育費'] / 1000

# matplotlib
plt.scatter(food, edu, alpha=0.6)

# seaborn(回帰直線付き)
sns.regplot(x=food, y=edu)

# 色分け(カテゴリ変数で)
sns.scatterplot(x='食料費', y='教育費', hue='地域', data=df)

# 透明度で密度を表現
plt.scatter(food, edu, alpha=0.1)   # 大量データ用
print(f'食料費と教育費の相関 r = {df["食料費"].corr(df["教育費"]):.3f}')
📤 出力:右上がりの楕円形の点群。 中程度の正の相関 (r≒0.73)、 東京都・神奈川県が右上、 沖縄県が左下に位置。
💬 解釈:外れ値県の特定が因果仮説のヒントになる。 相関が中程度でも、 非線形や外れ値は散布図でしか気づけない。

⬡ Hexbin(六角形ビン)

大量データ($n > 10000$)の散布図は点が重なり「黒い塊」になりがち。 そんなとき六角形のグリッドに集計するのが Hexbin。

Hexbin
🎯 目的:多数の点が重なって「黒い塊」になる散布図を、 六角形ビンに集計して密度 (頻度) を色で可視化する。
📥 入力:散布図と同じ 2 変量。 大量データ (n≫10000) を想定し、 gridsize でビンの粗さを調整する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ── この抜粋で使うデータを用意します ──
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]          # 2023 年の 47 都道府県
df = df.copy()
df['x'] = df['A1101'].astype(float)     # 総人口
df['y'] = df['A4101'].astype(float)     # 出生数
x, y = df['x'].values, df['y'].values

plt.hexbin(x, y, gridsize=30, cmap='viridis')
plt.colorbar(label='頻度')

# seaborn
sns.jointplot(x='x', y='y', data=df, kind='hex')
📤 出力:六角形タイルのマップ。 色が濃いビンほど点が集中。 単純な散布図では潰れて見えない密度のピークが分かる。
💬 解釈:overplotting の解決策。 色 (頻度) を対数スケールにすると、 少数派の領域の構造も潰れずに読める。

🌊 2次元 KDE

2変数の同時密度関数を滑らかに推定。 等高線で密度を可視化。

sns.kdeplot(x=food, y=edu, fill=True, cmap='Blues') sns.jointplot(x='食料費', y='教育費', data=d23, kind='kde')

🎈 バブルチャート

点のサイズで3つ目の変数を表現。 4つ目を色で表現すれば 4変量可視化に拡張可能。

バブルチャート
plt.scatter(food, edu, s=population/1000, c=region_code, alpha=0.6, cmap='viridis') # seaborn sns.scatterplot(x='食料費', y='教育費', size='人口', hue='地域', data=d23, sizes=(50, 500))

🔥 ヒートマップ(Heatmap)

2次元行列の値を色の濃淡で表現。 主な用途:

相関ヒートマップ

カラーマップの選び方

注意:色覚多様性に配慮し赤緑配色を避ける。 'viridis' は色覚バリア対応。

🎯 目的:多変数の相関行列や混同行列など、 2 次元の行列の値を色の濃淡で一望する。
📥 入力:数値列の相関行列 df.corr() や、 分類の混同行列 confusion_matrix などの 2 次元行列。
 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import pandas as pd
import scipy.cluster.hierarchy   # seaborn の clustermap が scipy を必要とする

# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 費目の正式名は「◯◯費(二人以上の世帯)」。短い別名を付けて使いやすくする
df['食料費'] = df['食料費(二人以上の世帯)']
df['住居費'] = df['住居費(二人以上の世帯)']
df['教育費'] = df['教育費(二人以上の世帯)']
df['光熱費'] = df['光熱・水道費(二人以上の世帯)']
df['消費支出'] = df['消費支出(二人以上の世帯)']
# 「地域」は SSDSE に無いので、地域コードの頭 2 桁(都道府県番号)から作る
def _blk(code):
    n = int(str(code)[1:3])
    return ('北海道' if n == 1 else '東北' if n <= 7 else '関東' if n <= 14
            else '中部' if n <= 23 else '近畿' if n <= 30 else '中国' if n <= 35
            else '四国' if n <= 39 else '九州沖縄')
df['地域'] = df['地域コード'].map(_blk)

import seaborn as sns
import numpy as np

# 相関行列のヒートマップ(文字列の列が混ざるので numeric_only=True)
cols = ['食料費', '住居費', '教育費', '光熱費', '消費支出']
corr = df[cols].corr(numeric_only=True)
sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', center=0, vmin=-1, vmax=1)

# 混同行列(例として「高齢化率が中央値超か」を予測した結果を作る)
from sklearn.metrics import confusion_matrix
aging = df['65歳以上人口'] / df['総人口']
y_true = (aging > aging.median()).astype(int)
y_pred = (df['消費支出'] < df['消費支出'].median()).astype(int)
cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
print(cm)

# クラスター付き(階層クラスタリングで並び替え)
# sns.clustermap はブラウザ版 seaborn が scipy を見つけられず動かないので、
# 並び替えを scipy で自分で計算して、ふつうの heatmap に渡す。
from scipy.cluster.hierarchy import linkage, leaves_list
from scipy.spatial.distance import squareform
_d = squareform(1 - corr.values, checks=False)
_order = leaves_list(linkage(_d, method='average'))
_sorted = corr.iloc[_order, _order]
sns.heatmap(_sorted, annot=True, fmt='.2f', cmap='RdBu_r', center=0)
print('並び替え後の順序:', list(_sorted.columns))
📤 出力:正方格子のマップ。 RdBu_r で赤=正相関・青=負相関、 対角は 1.0。 注釈 (annot) で数値も表示。
💬 解釈:色の塊 (ブロック) は変数群のまとまりを示す。 相関の高いペアは回帰・主成分分析の候補になる。

📐 散布図行列(Pair Plot)

$d$ 変数の全ペアの散布図を $d \times d$ グリッドで描く。 多変量データの探索的解析の標準ツール。 対角には各変数のヒストグラム(または KDE)を置く。

散布図行列
🎯 目的:d 変数の全ペアの散布図を d×d グリッドで一度に描き、 多変量の関係をまとめて俯瞰する。
📥 入力:数値列を複数 (例: 食料費・住居費・教育費・光熱費)。 対角には各変数の分布 (ヒスト/KDE)。
 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
30
31
32
33
34
35
import pandas as pd

# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 費目の正式名は「◯◯費(二人以上の世帯)」。短い別名を付けて使いやすくする
df['食料費'] = df['食料費(二人以上の世帯)']
df['住居費'] = df['住居費(二人以上の世帯)']
df['教育費'] = df['教育費(二人以上の世帯)']
df['光熱費'] = df['光熱・水道費(二人以上の世帯)']
df['消費支出'] = df['消費支出(二人以上の世帯)']
# 「地域」は SSDSE に無いので、地域コードの頭 2 桁(都道府県番号)から作る
def _blk(code):
    n = int(str(code)[1:3])
    return ('北海道' if n == 1 else '東北' if n <= 7 else '関東' if n <= 14
            else '中部' if n <= 23 else '近畿' if n <= 30 else '中国' if n <= 35
            else '四国' if n <= 39 else '九州沖縄')
df['地域'] = df['地域コード'].map(_blk)

import seaborn as sns

# 基本
sns.pairplot(df[['食料費','住居費','教育費','光熱費']].dropna())

# カテゴリで色分け + 回帰直線
sns.pairplot(df.dropna(subset=['食料費','教育費','住居費']),
             vars=['食料費','教育費','住居費'], hue='地域', kind='reg')

# 対角を KDE に
sns.pairplot(df[['食料費','住居費','教育費']].dropna(), diag_kind='kde')
📤 出力:対角に分布、 非対角に散布図の格子。 右上がりのセルと無相関の丸いセルが一目で判別できる。
💬 解釈:強い相関ペアを絞り込む一次スクリーニングに有効。 説明変数どうしの高相関 (多重共線性) の予兆も見える。

📋 クロス集計とモザイク図

カテゴリ × カテゴリの 2変量集計。 例えば「性別 × 購買意向」の集計表。 関連性はχ²検定で検証。

🎯 目的:カテゴリ × カテゴリの 2 変量を集計し、 度数表・モザイク図・ヒートマップで関連を可視化する。
📥 入力:2 つのカテゴリ変数 (例: 性別 × 購入)。 pd.crosstab で度数表を作り、 normalize で条件付き割合に。
 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import pandas as pd

# ── この抜粋で使うデータを用意します(SSDSE-B の 47 都道府県・最新年度)──
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df['年度'] = pd.to_numeric(df['年度'], errors='coerce')
df = df[df['年度'] == df['年度'].max()].copy()
for _c in df.columns[3:]:
    df[_c] = pd.to_numeric(df[_c], errors='coerce')

# 費目の正式名は「◯◯費(二人以上の世帯)」。短い別名を付けて使いやすくする
df['食料費'] = df['食料費(二人以上の世帯)']
df['住居費'] = df['住居費(二人以上の世帯)']
df['教育費'] = df['教育費(二人以上の世帯)']
df['光熱費'] = df['光熱・水道費(二人以上の世帯)']
df['消費支出'] = df['消費支出(二人以上の世帯)']
# 「地域」は SSDSE に無いので、地域コードの頭 2 桁(都道府県番号)から作る
def _blk(code):
    n = int(str(code)[1:3])
    return ('北海道' if n == 1 else '東北' if n <= 7 else '関東' if n <= 14
            else '中部' if n <= 23 else '近畿' if n <= 30 else '中国' if n <= 35
            else '四国' if n <= 39 else '九州沖縄')
df['地域'] = df['地域コード'].map(_blk)

import seaborn as sns
import matplotlib.pyplot as plt

# SSDSE-B に「性別」「購入」の列は無いので、実データから 2 つのカテゴリ列を作る
df['人口規模'] = pd.cut(df['総人口'], bins=[0, 1_500_000, 3_000_000, 1e9],
                       labels=['小', '中', '大']).astype(str)
df['支出水準'] = ((df['消費支出'] > df['消費支出'].median())
                 .map({True: '高', False: '低'}))

ct = pd.crosstab(df['人口規模'], df['支出水準'], margins=True)
print(ct)
print(pd.crosstab(df['人口規模'], df['支出水準'], normalize='index').round(3))  # 行ごとに正規化

# ヒートマップで可視化
sns.heatmap(pd.crosstab(df['人口規模'], df['支出水準']), annot=True, fmt='d', cmap='Blues')

# モザイク図
from statsmodels.graphics.mosaicplot import mosaic
mosaic(df, ['人口規模', '支出水準'])
plt.close('all')
📤 出力:行×列の集計表とその塗り分け。 モザイク図では各セルの面積が度数に比例して表示される。
💬 解釈:関連の有無は χ² 検定 で定量化する。 行ごとの正規化で条件付き確率の差が読める。

🚧 よくある誤解

❌ 誤解✅ 正しい理解
散布図 で「強い相関」に見えれば因果相関≠因果。 散布図は出発点でしかない
散布図が直線的なら $r$ も高い外れ値・非線形があると一致しない。 アンスコムの四重奏
ヒートマップは赤緑が分かりやすい色覚多様性に注意。 viridis 系を推奨
大量データでも散布図で OK点が重なり密度が見えない。 Hexbin / 2D KDE
散布図行列で全部見れる10変数を超えると小さくて読めない。 PCA / 相関ヒートマップ
クロス集計の度数だけ見ればよい行・列で正規化した条件付き確率も見る

📝 練習問題

問1:SSDSE 47都道府県データで、 食料費・教育費・住居費の散布図行列を描け。
🎯 目的:練習: 食料費・教育費・住居費の 3 変数で散布図行列を描き、 全ペアの相関を一度に確認する。
📥 入力data/raw/SSDSE-B-2026.csv。 列 L322101 (食料費)・L322108 (教育費)・L322102 (住居費)、 2023 年、 千円換算。
1
2
3
4
5
6
7
8
9
import seaborn as sns, pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
data = df.iloc[1:].copy()
data['年度'] = data['SSDSE-B-2026']
d23 = data[data['年度']=='2023']
cols = ['L322101', 'L322108', 'L322102']
sub = d23[cols].apply(pd.to_numeric, errors='coerce').dropna() / 1000
sub.columns = ['食料費', '教育費', '住居費']
sns.pairplot(sub, kind='reg', diag_kind='kde')
📤 出力:3×3 の格子。 対角は KDE、 非対角は回帰直線つき散布図。 食料費と教育費のセルが最も右上がり。
💬 解釈:模範解答の一例。 3 変数程度なら pairplot が全ペア関係の把握に最も速い。
問2:相関係数 $r=0.8$ なのに散布図で「曲線」が見えた。 何を意味するか?

Pearson $r$ は線形な関係しか捉えないが、 単調な曲線なら高い相関を示すことがある。 Spearman 順位相関で再確認、 多項式項を含めた回帰、 非線形変換(log)の検討が必要。 アンスコムの四重奏(同じ $r$ でも形が全く違う 4 例)は古典的な警告。

問3:「相関行列のヒートマップで対角が全て1で対称」というのはなぜ?

対角は「同じ変数同士の相関」=1。 非対角は $r_{ij} = r_{ji}$ なので対称。 だからヒートマップでは下三角だけ描く(mask で上三角を隠す)と冗長性を減らせる。

問4:3 変数(連続2 + カテゴリ1)を 1 つの散布図で表すには?

連続2 を $x, y$ 軸に、 カテゴリを色(hue)で表現。 sns.scatterplot(x=..., y=..., hue=..., data=df)。 群ごとの傾向の違いが一目で分かる。 さらに 4 つ目(連続)があれば点のサイズで(バブル化)。

問5:100,000 件のデータで散布図を描くとほぼ真っ黒。 どう改善する?

選択肢:(a) alpha=0.1 で透明度、 (b) Hexbin で密度集計、 (c) 2D KDE で滑らかな密度、 (d) サブサンプリング(無作為 1000 件)。 (a)(b)(c) を組み合わせるのが現代的。 Hexbin + colorbar が最も実用的。

💼 実務での応用

📋 報告フォーマット

「47都道府県の食料費と教育費の散布図(n=47、 SSDSE-B-2026、 2023年)では、 明確な正の相関(Pearson $r=0.728$、 95% CI: [0.557, 0.839]、 $p<0.001$)が見られた。 1点(東京都)が右上に外れているが、 これを除いても相関は $r=0.651$ と安定して有意。 散布図行列で他変数(住居費・光熱・水道費)との関係も確認し、 教育費は住居費とはほぼ無相関、 光熱・水道費とは弱い負の相関であった。」

🐍 ライブラリ早見表 — 2変量可視化

🎯 目的:2 変量可視化の主要ライブラリ (matplotlib/seaborn/plotly) の代表的な呼び出しを 1 か所に集約する。
📥 入力:散布図・Hexbin・2D KDE・ヒートマップ・散布図行列・クロス集計の各スニペット。 用途に応じて選ぶ。
 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# ── この抜粋で使うデータを用意します ──
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df[df['年度'] == df['年度'].max()].copy()   # 最新年度の 47 都道府県
# 費目の正式名は「◯◯費(二人以上の世帯)」。短い別名を付けて使う
df['食料費'] = df['食料費(二人以上の世帯)']
df['住居費'] = df['住居費(二人以上の世帯)']
df['教育費'] = df['教育費(二人以上の世帯)']
df['人口'] = df['総人口']
def _blk(code):
    n = int(str(code)[1:3])
    return ('北海道' if n == 1 else '東北' if n <= 7 else '関東' if n <= 14
            else '中部' if n <= 23 else '近畿' if n <= 30 else '中国' if n <= 35
            else '四国' if n <= 39 else '九州沖縄')
df['地域'] = df['地域コード'].map(_blk)
x, y = df['食料費'].values, df['教育費'].values


# 散布図
plt.scatter(x, y, alpha=0.6)
sns.scatterplot(x='食料費', y='教育費', hue='地域', size='人口', data=df)
sns.regplot(x='食料費', y='教育費', data=df)           # 回帰直線つき

# Hexbin
plt.hexbin(x, y, gridsize=30, cmap='viridis')

# 2D KDE
sns.kdeplot(x=x, y=y, fill=True, cmap='Blues')
sns.jointplot(x='食料費', y='教育費', data=df, kind='kde')

# ヒートマップ
# df には地域コードなど文字列の列も入っているので、費目だけで相関を取る
_cols = ['食料費', '住居費', '教育費', '人口']
sns.heatmap(df[_cols].corr(), annot=True, cmap='RdBu_r', center=0)
# sns.clustermap はブラウザ版 seaborn が scipy を見つけられないので使わない
# (必要なら scipy で並び替えてから heatmap に渡す)

# 散布図行列
# hue に使う列も一緒に渡さないと KeyError になる
sns.pairplot(df[['食料費', '住居費', '教育費', '地域']], hue='地域', kind='reg')

# クロス集計
import pandas as pd
# 「性別」「購入」は SSDSE に無いので、<架空の>アンケートを作る
_rng = np.random.default_rng(0)
_survey = pd.DataFrame({'性別': _rng.choice(['男', '女'], 200),
                        '購入': _rng.choice(['あり', 'なし'], 200)})
ct = pd.crosstab(_survey['性別'], _survey['購入'])
sns.heatmap(ct, annot=True, fmt='d')

# plotly(インタラクティブ)
import plotly.express as px
px.scatter(df, x='食料費', y='教育費', color='地域', size='人口', hover_name='都道府県')
px.imshow(df[_cols].corr(), color_continuous_scale='RdBu_r', zmin=-1, zmax=1)
📤 出力:目的別のコード早見。 まず seaborn で素早く、 仕上げは matplotlib、 共有は plotly、 という使い分け。
💬 解釈:コピペ用の逆引き表。 同じデータでも図の種類で見えてくる構造が変わる点に注意する。

🎨 カラーマップの選び方

種類 用途 推奨
連続型(sequential)単調値(頻度、 強度)viridis, plasma, Blues, YlOrRd
発散型(diverging)基準(0)から±に意味(相関、 残差)RdBu_r, coolwarm, BrBG
カテゴリ型(qualitative)カテゴリ分けtab10, Set2, Paired
循環型(cyclic)角度、 時刻twilight, hsv

避けるべき:rainbow / jet — 色覚多様性で誤読されやすい。 viridis は色覚バリア対応 + 知覚的に均等。

⚖️ 可視化の倫理 — 誤解を招かないために

参考:Edward Tufte「The Visual Display of Quantitative Information」(1983)— 可視化倫理の古典。

🔖 キーワード索引(補強)

2変量可視化の主要グラフ・概念・関連手法。

散布図 クロス集計 ヒートマップ バブルチャート 層別散布図 散布図行列 条件付き分布 回帰直線重畳 六角ビニング 2次元 KDE アンサンブル平均 jointplot pairplot violin plot 並行座標 モザイク図 100% 積み上げ log スケール

🧮 SSDSE-B-2026 で実値計算 — 2変量可視化の実例

例1:食料費 × 教育費の散布図 + 回帰直線

🎯 目的:SSDSE-B-2026 の食料費 × 教育費を 47 都道府県分プロットし、 回帰直線で傾向を確認する。
📥 入力data/raw/SSDSE-B-2026.csv。 列 L322101 (食料費)と L322108 (教育費)、 encoding='cp932'、 header=1。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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['年度'] == 2023]
x_col, y_col = '食料費(二人以上の世帯)', '教育費(二人以上の世帯)'

sns.regplot(data=df, x=x_col, y=y_col, scatter_kws={'s':50,'alpha':0.7})
plt.title(f'{x_col} vs {y_col}')
plt.savefig('scatter_regline.png', dpi=120, bbox_inches='tight')
📤 出力:右上がりの点群と回帰直線。 中程度の正の相関 (r≒0.73)、 東京都・神奈川県が右上、 沖縄県が左下。
💬 解釈:外れ値県が因果仮説のヒント。 回帰直線からの残差が大きい県が「説明しきれない特徴」を持つ。

例2:散布図行列(pairplot)で5変数を一気に俯瞰

🎯 目的:数値 5 列の全ペアを散布図行列 (pairplot) で俯瞰し、 相関の強い/弱いペアと非線形をまとめて発見する。
📥 入力data/raw/SSDSE-B-2026.csv の消費支出内訳 5 列 (食料費・住居費・光熱・水道費・家具・家事用品費・被服費、 2023 年)。
1
2
3
4
5
6
import pandas as pd
import seaborn as sns

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
num = df[df['年度'] == 2023].filter(like='二人以上の世帯').iloc[:, 1:6]
sns.pairplot(num, diag_kind='kde', plot_kws={'alpha':0.5,'s':30})
📤 出力:5×5 の格子。 対角は各変数の分布 (KDE)、 非対角は散布図。 右上がりのセルと丸いセルが判別できる。
💬 解釈:強い相関ペアを絞り込む一次スクリーニングに有効。 多重共線性の予兆もここで気づける。

例3:ヒートマップで相関行列の俯瞰

🎯 目的:数値 8 列の相関行列をヒートマップで可視化し、 多数のペアの相関の符号と強さを 1 枚で俯瞰する。
📥 入力data/raw/SSDSE-B-2026.csv の消費支出内訳 8 列(食料費〜教育費、 2023 年)の相関行列 (.corr())。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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)
corr = df[df['年度'] == 2023].filter(like='二人以上の世帯').iloc[:, 1:9].corr()

plt.figure(figsize=(9, 7))
sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', center=0,
            vmin=-1, vmax=1, square=True, cbar_kws={'shrink':0.8})
plt.title('相関行列ヒートマップ')
plt.tight_layout()
plt.savefig('corr_heatmap.png', dpi=120)
📤 出力:8×8 の対称行列。 赤=正相関・青=負相関、 対角は 1.0。 食料費と教育費のセルは濃い赤。
💬 解釈:色の塊 (ブロック構造) は変数群のまとまりを示し、 次段の回帰・主成分分析の候補になる。

例4:層別散布図(地域ブロック別の色分け)

🎯 目的:地域ブロックで色分けした散布図で、 群ごとに関係が変わらないか (層別効果・シンプソンのパラドックス) を確認する。
📥 入力data/raw/SSDSE-B-2026.csv の数値先頭 2 列 + 都道府県名を地域ブロックへ写像した色分けキー。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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)

block_map = {
    '北海道':'北海道', '青森県':'東北','岩手県':'東北','宮城県':'東北','秋田県':'東北','山形県':'東北','福島県':'東北',
    '茨城県':'関東','栃木県':'関東','群馬県':'関東','埼玉県':'関東','千葉県':'関東','東京都':'関東','神奈川県':'関東',
}
df['ブロック'] = df['都道府県'].map(block_map).fillna('その他')

cols = df.select_dtypes('number').columns
sns.scatterplot(data=df, x=cols[0], y=cols[1], hue='ブロック', s=80)
plt.savefig('scatter_by_block.png', dpi=120, bbox_inches='tight')
📤 出力:同じ散布図を地域ブロック別の色で重ね描き。 関東が右上、 地方ブロックが左下など群のまとまりが見える。
💬 解釈:全体では正相関でも、 ブロック内では無相関/逆相関のことがある。 層別で初めて見える構造に注意。

⚠️ 2変量可視化の落とし穴(補強・各 100 文字以上)

① 散布図のオーバープロット
n=10000 を超えると点が重なり合い、 密度の高い場所ほど真っ黒に潰れて構造が見えなくなる。 alpha=0.1 の透明度、 hexbin プロット、 2次元 KDE、 ダウンサンプリングなどで対処する。 「全データを点で描く」のは 1000件以下が目安。 大規模データではビニング系の手法を最初から検討する。
② 軸スケールの選択ミス(線形 vs log)
所得・人口・売上のように桁が広い変数を線形軸で散布図にすると、 大都市の数点に押し潰されて中小県の構造が完全に消える。 log スケールにすれば桁ごとの差が見え、 ベキ則関係が直線として現れる。 「分布が正で歪んでいるか」「桁が3桁以上か」を基準にスケールを選ぶ。
③ 全データに 1 本の回帰直線を引いて層を見落とす
シンプソンのパラドックス的に、 全体で正の相関でも、 サブグループに分けると逆相関のことがある。 散布図に hue を当てて層別に線を引き、 グループ間で傾きが大きく違わないか確認する。 これを怠ると交絡変数を見逃した結論を出してしまう。 hue は地域・年齢・性別など意味のある変数を選ぶ。
④ ヒートマップで色覚多様性を考慮しない
赤緑のカラーマップ(jet, rainbow)は色覚特性によっては区別できず、 1割近い読者に内容が伝わらない。 シーケンシャル系(viridis, magma)や発散系(RdBu_r)の色覚バリアフリー(CVD-safe)パレットを使う。 また値ゼロを中心に発散させるなら必ず vmin=-1, vmax=1 など対称に設定。
⑤ クロス集計を絶対度数だけで比較
カテゴリ A の総数が 1000、 カテゴリ B が 100 の場合、 度数で並べると A の影響だけ目立つ。 相対度数(行%・列%)に正規化したヒートマップやモザイク図を併用すれば、 構成比の違いが正しく見える。 χ²検定の解釈と同じく「期待度数からの乖離」を観察するのが本道。
⑥ 散布図にトレンド線を引いただけで因果と思い込む
散布図 + 回帰直線は「相関を見る」までで「因果」ではない。 r=0.8 の強い相関でも交絡因子のせいかもしれない。 必ず偏相関・重回帰・DAG(因果ダイアグラム)を併用し、 観察データの限界を強調する。 グラフは「説得」より「探索」のために使う、 という姿勢を守る。
⑦ 3次元散布図に頼りすぎる
3D 散布図は見栄えはするが、 視点依存で奥行きが歪み、 同じデータが視点違いで真逆に見える。 学術発表でも非推奨。 代わりに 2D 散布図 + 色・サイズで3変数目を表現するか、 散布図行列(pairplot)を使う。 3次元以上は PCA で 2次元に落とすほうが解釈しやすい。

🐍 Python 実装バリエーション(matplotlib / seaborn / plotly / scipy)

1. matplotlib — 基本のスキャッタ

🎯 目的:matplotlib の plt.scatter だけで、 数値 2 列の基本の散布図をグリッドつきで描く。
📥 入力data/raw/SSDSE-B-2026.csv を header=1 で読み、 数値列の先頭 2 列を x・y に使う。
1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
cols = df.select_dtypes('number').columns
plt.scatter(df[cols[0]], df[cols[1]], s=50, alpha=0.7, edgecolor='k')
plt.xlabel(cols[0]); plt.ylabel(cols[1])
plt.grid(alpha=0.3)
plt.savefig('basic_scatter.png', dpi=120)
📤 出力:素の散布図 (basic_scatter.png)。 点の透明度と枠線で重なりを緩和した最小構成。
💬 解釈:最も自由度が高い基盤 API。 論文の最終図は細部制御のため matplotlib で仕上げることが多い。

2. seaborn — jointplot で周辺分布つき

🎯 目的:seaborn の jointplot(kind='hex') で、 散布図の周辺に各軸のヒストグラム (周辺分布) を添える。
📥 入力data/raw/SSDSE-B-2026.csv を header=1 で読み、 数値列の先頭 2 列を x・y に使う。
1
2
3
4
5
6
import seaborn as sns
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
cols = df.select_dtypes('number').columns
sns.jointplot(data=df, x=cols[0], y=cols[1], kind='hex', height=8)
📤 出力:中央に Hexbin、 上と右に周辺分布。 両軸の歪み (右に長い裾) と密度のピークが同時に読める。
💬 解釈:2 変量の関係と各変数の分布を 1 枚で確認できる。 kind を 'kde'/'reg' に替えると表現が変わる。

3. scipy — gaussian_kde で 2次元密度推定

🎯 目的:scipy の gaussian_kde で各点の 2 次元密度を推定し、 点の色として重ねて密集度を表す。
📥 入力data/raw/SSDSE-B-2026.csv を header=1 で読み、 数値列の先頭 2 列を x・y に使う。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import pandas as pd
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
cols = df.select_dtypes('number').columns
x = df[cols[0]].dropna().values
y = df[cols[1]].dropna().values
xy = np.vstack([x, y])
density = gaussian_kde(xy)(xy)

plt.scatter(x, y, c=density, s=60, cmap='viridis')
plt.colorbar(label='density')
plt.savefig('kde_scatter.png', dpi=120, bbox_inches='tight')
📤 出力:密度で色付けした散布図 (kde_scatter.png)。 色が明るいほど周囲に点が密集している領域。
💬 解釈:Hexbin より滑らかに密度を表現できる。 点そのものを残しつつ密集度を見たいときに向く。

4. plotly — インタラクティブ散布図

🎯 目的:plotly の px.scatter で、 ホバー・ズーム可能なインタラクティブ散布図を HTML 出力する。
📥 入力data/raw/SSDSE-B-2026.csv を header=1 で読み、 数値列の先頭 2 列に OLS トレンドラインを重ねる。
1
2
3
4
5
6
7
8
import plotly.express as px
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1)
cols = df.select_dtypes('number').columns
fig = px.scatter(df, x=cols[0], y=cols[1], hover_name='都道府県',
                 trendline='ols', size_max=12)
fig.write_html('interactive_scatter.html')
📤 出力:interactive_scatter.html。 点にカーソルを合わせると都道府県名が表示され、 拡大縮小もできる。
💬 解釈:Web ダッシュボードや Notebook 共有に最適。 探索の対話性が高く、 外れ値の特定が速い。

5. pandas — クロス集計 + ヒートマップ

🎯 目的:pandas の crosstab でカテゴリ 2 変量を集計し、 seaborn のヒートマップで塗り分ける。
📥 入力:2 つのカテゴリ変数の組 (例: 性別 × 購入)。 度数表を作り、 必要なら割合に正規化する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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['人口層'] = pd.qcut(df.select_dtypes('number').iloc[:,0], q=3, labels=['小','中','大'])
df['経済層'] = pd.qcut(df.select_dtypes('number').iloc[:,1], q=3, labels=['低','中','高'])
ct = pd.crosstab(df['人口層'], df['経済層'])
sns.heatmap(ct, annot=True, cmap='YlOrRd', fmt='d')
plt.savefig('crosstab_heatmap.png', dpi=120, bbox_inches='tight')
📤 出力:度数表とその塗り分け。 濃いセルほど該当件数が多く、 カテゴリ間の偏りが一目で分かる。
💬 解釈:関連の有無は χ² 検定 で定量化する。 正規化で条件付き割合の差が読める。

🎨 直感で掴む — 2 変量の可視化

🍰 まずはやさしく

2つの情報を1枚の図にまとめることです。

パッと見てデータの傾向をつかむために使います。

スマホの利用時間と睡眠時間の関係を見ます。

まずは直感的に図の意味を理解しましょう。

2 変量の可視化は「2 つの変数の関係を 1 枚の図にする」。 量×量=散布図、 量×質=箱ひげの群比較、 質×質=モザイクやヒートマップ。 SSDSE-B-2026 では、 A1101(人口)と L3221(消費支出)の散布図が定番で、 都市規模の大きい県ほど 1 世帯あたり支出が高めという緩い正相関が見える。

💡 学習のコツ:直感で全体像を掴んだら、 次の「📐 定義・数式」で正確な意味を押さえ、 最後に「🧮 実値で計算してみる」で SSDSE-B-2026 の都道府県データを使った計算をなぞるのが効率的です。 比喩は厳密ではないので、 必ず数式と並べて確認してください。

2 変量の可視化 は「可視化」カテゴリの中核概念。 初めて触れる読者は、 まずこの「🎨 直感」セクションだけ通読し、 必要になった時点で「📐 数式」「🐍 Python」「⚠️ 落とし穴」へ戻る読み方が定着しやすいです。

📐 定義・数式 — 2 変量の可視化

🍰 まずはやさしく

図の仕組みを数式(計算式)で表したものです。

正確な意味を正しく理解するために使います。

買い物で使う金額と個数の関係を計算します。

数式が何を表しているかを詳しく読みましょう。

直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを下の「🔬 数式を言葉で読み解く」で 1 つずつ確認してください。

【2 変量の可視化 の中心定義式】
$$ r = \frac{1}{n-1}\sum_{i} \frac{(x_i-\bar{x})(y_i-\bar{y})}{s_x s_y} $$
この式が「2 変量の可視化」の骨格。 派生形・拡張形はここから生まれる。
📌 読み方のコツ:数式を見たら「左辺は何を定義しているか」「右辺の各項は何の合計・積・比か」を声に出して読み下してみる。 これだけで理解が大きく進みます。

🔬 数式を言葉で読み解く — 数式を「言葉」に翻訳

上の数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。

左辺(結果側)
2 変量の可視化 で定義したい量。 解釈の対象。 単位・スケールを必ず確認する。
右辺(構成要素)
観測できる入力変数(SSDSE-B-2026 でいえば A1101・L3221 など)と推定対象パラメータ(β, σ 等)の組合せ。
添字 i, j, t
i=サンプル(県)、 j=変数、 t=時点。 SSDSE-B-2026 は i ∈ {1..47} 県、 t ∈ {2008..2023}。
和記号 Σ
「足し合わせ」を表す。 添字 i が 1 から n まで動く範囲を明示するのが習慣。
期待値 E[·]、 分散 Var[·]
「ランダム変数の平均」と「ばらつき」。 SSDSE-B-2026 のような集計値でも、 標本誤差・年次変動の文脈で使える。
📚 補足:同じ記号でも分野・教科書によって意味が違うことがあります(例: $\hat{y}$ は予測値だが、 統計の文脈では推定量を意味することも)。 不明確なときは、 必ずその文書の記号定義表を確認しましょう。

🧮 実値で計算してみる — SSDSE-B-2026

数式だけでは「実感」が湧きにくいので、 実データ data/raw/SSDSE-B-2026.csv(47 都道府県 × 16 年)で 1 度手計算してみると理解が定着します。

SSDSE-B-2026 (2023) で A1101 と L3221 の相関 r ≈ 0.33。 散布図に都道府県名ラベルを付けると、 東京・神奈川・愛知が右上、 鳥取・島根が左下に配置される。 「人口 → 都市規模 → 物価 → 消費」の連鎖を仮説として読み解ける。

都道府県A1101 総人口A1303 65 歳以上L3221 消費支出
東京都14,086,0003,205,000341,320
神奈川県9,229,0002,390,000306,565
大阪府8,763,0002,424,000271,246
愛知県7,477,0001,923,000300,221
埼玉県7,331,0002,012,000344,092
千葉県6,257,0001,756,000306,943

上記は SSDSE-B-2026 (2023) からの抜粋。 手計算で確認した値が、 後述の Python 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。

🐍 Python 実装 — 2 変量の可視化

公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで 2 変量の可視化 を動作させます。 まずはこのまま実行してみてください。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 296,888 東京都 14,086,000 3,205,000 341,320 沖縄県 1,468,000 350,000 251,222 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 2 変量の可視化 を SSDSE-B-2026 で実行する最小コード
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 2023 年のみ抽出
print(df.shape)  # (47, 112)
print(df[['Prefecture','A1101','A1303','L3221']].head())

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8,6))
ax.scatter(df['A1101'], df['L3221'], alpha=0.6, color='#FF7043')
ax.set_xlabel('A1101 総人口')
ax.set_ylabel('L3221 消費支出')
ax.set_title('SSDSE-B-2026 (2023): 人口 vs 消費支出')
for i,row in df.iterrows():
    if row['A1101'] > 5_000_000:
        ax.annotate(row['Prefecture'], (row['A1101'], row['L3221']))
plt.savefig('bivariate_demo.png', dpi=100)
print('Pearson r:', df[['A1101','L3221']].corr().iloc[0,1])

▶ 実行 を押せばこのページの中でそのまま動きます(ライブラリもデータも同梱済みで、 準備は要りません)。 手元の Python に移して動かすときは pip install matplotlib numpy pandas scikit-learn scipy seaborn statsmodels が必要です。 読んでいるデータは data/raw/SSDSE-B-2026.csv。 日本語を含むので encoding='cp932' の指定を落とさないでください。

⚠️ よくある落とし穴 — 2 変量の可視化

2 変量の可視化 を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。

❌ 線形相関だけで関係を判断
U 字や指数関係を見逃す。 散布図を必ず併用する(Anscombe の四つ組)。
❌ 点が重なって見えない
Overplotting。 透過度 alpha や jitter、 hexbin、 2D KDE を使う。
❌ 外れ値で相関が膨らむ/消える
東京都を除くと相関が大きく動く場面が多い。 ロバスト指標(Spearman)を併用。
🛡 防御策まとめ:「適用条件を確認する」「結果と前提をセットで記述する」「不確実性を必ず併記する」の 3 点を習慣化すれば、 上記の罠の大半は回避できます。

📊 補足図 — 2 変量可視化の典型 4 パターン

散布図の典型 4 パターン(正の相関・負の相関・無相関・非線形)

→ 2 変量を散布図で見ると、 「正の相関」「負の相関」「無相関」「非線形(U 字・S 字)」がひと目で見分けられる。 ピアソン相関は 線形関係のみ を測るため、 非線形パターンを 0 近傍で見落とすことがある。

🧪 理解度チェック — 2 変量可視化

以下 5 問を解いて理解度を確認してください。

  1. Q1. 散布図とヒートマップの使い分け基準を 1 行で述べよ(変数の型・データ量)。
  2. Q2. 点が 1 万件を超える散布図で「黒一色の塊」になる現象を何と呼ぶか? 対処法 2 つを挙げよ(hexbin・alpha・サンプリング)。
  3. Q3. ピアソン相関係数 0 を見て「関係なし」と結論するリスクを 1 行で述べよ(非線形・外れ値)。
  4. Q4. SSDSE-B-2026 の「人口」と「総生産」を散布図にするとき、 軸スケールはどう選ぶべきか? 線形 vs 対数。
  5. Q5. ヒートマップで「色の選択」を間違えると誤読を招く例を挙げよ(虹色のカラーマップ問題、 連続値に分類用パレット)。

📊 2 変量可視化手法の選び方(補足表)

手法適する変数の型データ量目安読み取れること
散布図連続 × 連続〜1,000 件関係の形・外れ値
hexbin / 2D ヒスト連続 × 連続1,000〜10 万件密度の集中
相関ヒートマップ連続変数の行列変数 10〜50 個多変量間の関係構造
箱ひげ(並列)カテゴリ × 連続中央値・四分位群間比較
クロス集計表カテゴリ × カテゴリセル数 2x2〜10x10連関・独立性検定
バブルチャート連続 × 連続 + 1 補助〜500 件3 変量の同時表現

→ 「変数の型 × データ量」で選ぶ。 連続 × 連続 で 1 万件以上なら hexbin。 カテゴリ × 連続なら箱ひげ。 多変量同士の概観は相関ヒートマップが最強。

⚠️ 落とし穴(追加 3 件)

関連: 散布図 / 相関 / 箱ひげ図 / ヒストグラム / 棒グラフ

📚 詳細解説 — 散布図とヒートマップの実務

散布図は 2 変量の関係を「点の雲」として描く最も古典的かつ強力な可視化である。 統計学者 John Tukey は「探索的データ解析(EDA)」を提唱したとき、 散布図を中心に据えた。 1 万件以下なら散布図、 それを超えると hexbin(六角形ビン)や 2D ヒストグラム に切り替える。 hexbin は四角形ビンよりエッジ効果が小さく、 密度を直感的に読み取れる。

SSDSE-B-2026 の都道府県データのように n=47 の小規模データでは、 散布図上に都道府県名のラベルを付けるのが鉄則。 東京・大阪・愛知などの大都市が右上に外れ値として位置することが多く、 これを除いた回帰直線も併記すると「全国共通の傾向」と「大都市の例外性」を分離して議論できる。 ラベル衝突は adjustText ライブラリで自動回避できる。

相関ヒートマップは多変量の概観に必須。 seaborn.heatmap(df.corr(), annot=True, cmap='RdBu_r', center=0, vmin=-1, vmax=1) が定番。 vmin/vmax を必ず明示 して、 色の中央値 0 を保つことが重要(自動スケールだと相関 0.3 と 0.9 が同じ赤に見えてしまう)。 階層クラスタリングと組み合わせた クラスタマップseaborn.clustermap)は、 似た変数同士をまとめて並べ替えるため、 多変量の構造発見に強力。

カテゴリ × 連続の比較では並列箱ひげ図が標準だが、 ストリッププロット(点の散布)や バイオリンプロット(密度の左右対称表示)を重ねるとより情報量が増える。 群が 5 以上なら swarm plot で全データ点を非重複配置すると外れ値も見える。 群サイズが極端に異なる場合は箱の幅を n に比例させる varwidth オプションを使う。

カテゴリ × カテゴリのクロス集計は モザイクプロットヒートマップ + 注釈 が読みやすい。 セル度数の独立性は χ² 検定で判定。 セル度数が 5 未満ならフィッシャーの正確検定に切り替える。 SSDSE-B-2026 の都道府県を「人口階級 × 高齢化率階級」でクロス集計すると、 「高齢化が高く人口が少ない地方県」という塊が浮かび上がる。

バブルチャートは「散布図 + 第 3 変数を点サイズで」表現する手法。 例: 横軸 = 人口、 縦軸 = 1 人当たり総生産、 サイズ = 面積、 色 = 地方区分。 ただし サイズは直径ではなく面積で正規化 しないと心理的に過大評価される。 matplotlib では s=area で面積指定が標準。

時系列を 2 変量可視化する場合、 散布図ではなく 折れ線の 2 軸プロット が主流。 ただし 2 軸の単位が違うと「同期して動いている」かのような誤読を招くので、 必ず両軸の最小・最大を明示し、 標準化(z 変換)した値で 1 軸にまとめる方が安全な場合も多い。 動的に観察したいなら アニメーション散布図(年ごとに点が動く)が有効で、 Plotly の animation_frame オプションが代表例。

最後に、 Anscombe の 4 組 を必ず思い出すこと。 平均・分散・相関係数がすべて同一なのに、 散布図は全く違う形になる 4 つのデータセット。 「数値だけで判断せず必ず可視化する」という EDA の原則を示す古典例。 これと現代的な Datasaurus Dozen(恐竜の絵柄など 13 種類)を併記すると、 学習者の印象に残りやすい。

📚 さらに踏み込んで — 実務での 2 変量可視化の選び方

実務では「目的 × 受け手 × データ量」で可視化を決める。 たとえば 探索的解析(EDA) の場面では、 自分自身が外れ値や非線形性を発見したいので、 散布図 + 回帰直線 + LOWESS(局所回帰)を 1 枚に重ねるのが定石。 seaborn.regplotseaborn.lmplot はこれを一行で実現する。 order=2lowess=True オプションで非線形性も即座に確認できる。

報告書・論文向け ではノイズを削ぎ落とした最小限の表現が好まれる。 散布図なら点サイズを小さく、 軸ラベルを大きく、 グリッドを薄く。 ヒートマップなら色数を 5-7 階級に離散化し、 凡例を明示。 カラーブラインドネス(色覚多様性)を意識して、 viridis や cividis のような色覚バリアフリーパレットを選ぶことも 2026 年現在の標準。 Nature や IEEE のガイドラインも明記している。

ダッシュボード・経営向け では「動かせる・絞り込める」が重要。 Tableau / Power BI / Plotly Dash で インタラクティブな散布図 を作り、 ホバーで都道府県名を表示、 クリックで詳細表示、 期間スライダーで時系列変化を見せる、 などが現実的。 静的な PDF ではなく Web に埋め込む前提で設計する。

最近のトレンドとして、 jointplot(散布図 + 周辺ヒストグラム)と pairplot(変数 n 個の散布図行列)は EDA の鉄板。 SSDSE-B-2026 の主要変数 6 個で pairplot を描くと、 36 枚(うち対角 6 枚が周辺分布、 残り 30 枚が散布図)が一気に得られる。 seaborn.pairplot(df, kind='reg', diag_kind='kde') でさらに回帰直線と密度推定が乗る。 これだけで「全体の関係構造」「外れ値」「分布形状」を 30 秒で把握できる。

注意すべき落とし穴として シンプソンのパラドックス がある。 全体での 2 変量関係と、 群別での関係が逆方向になる現象。 散布図に群別の色を付けると一目で分かる。 SSDSE-B-2026 でも「人口」と「1 人当たり所得」を全国でプロットすると弱い正の相関だが、 「首都圏 / 地方都市 / 地方郡部」で色分けすると群内では負の相関に転じることがある。 これを見逃すと施策判断を間違える。

📚 実装ライブラリの選び方

2026 年現在、 Python での 2 変量可視化には複数の選択肢がある。 matplotlib は基盤ライブラリで自由度最大、 細部まで制御可能。 学術論文の最終図はほぼ matplotlib。 seaborn は matplotlib のラッパーで統計可視化に特化、 regplotjointplotpairplot など EDA で頻用。 デフォルトの配色が美しく学習コストが低い。

plotly はインタラクティブな HTML 出力に強く、 ホバー・ズーム・パンが標準搭載。 Web ダッシュボードや Jupyter Notebook での共有に最適。 altair は宣言的文法(Vega-Lite ベース)で、 「データ + マーク + エンコーディング」を簡潔に記述できる。 bokeh は plotly と並ぶ Web 系の選択肢で、 大規模データのストリーミング描画が得意。

R 系では ggplot2 が文法的可視化のデファクト。 「データ + aes + geom + scale + coord + theme」のレイヤー設計が美しい。 ヒートマップは geom_tile()、 散布図は geom_point() + geom_smooth()。 SAS や SPSS、 Stata にもそれぞれ標準の 2 変量可視化があるが、 学術・産業界とも近年は ggplot2 と seaborn が事実上の二大標準である。

大規模データ(100 万件以上)の可視化には datashader(Python)や vaex が登場している。 これらは描画前に GPU 加速で集約・ビン化を行い、 ピクセル単位で密度を計算するため、 hexbin より滑らかで高精細な結果が得られる。 NYC Taxi の 1 億件データセットでも数秒で散布図が出る。 Web ダッシュボード(HoloViews + Bokeh)への組み込みもしやすい。

最後に、 SSDSE-B-2026 の実データ例 として、 47 都道府県の「総人口(千人, A1101)」と「消費支出(円, L3221)」を散布図にすると、 中程度の正の関係(相関 0.33 程度)に加えて、 東京都・埼玉県などが右上寄りに位置する。 ここに seaborn の regplot(x='A1101', y='L3221', data=df) で回帰直線と 95% 信頼区間を重ねれば、 「弱いながら右上がり」「人口規模だけでは消費支出は決まらない」という構造が一目で読み取れる。 同じデータで jointplot(kind='reg') を使えば、 周辺ヒストグラムが両軸の歪んだ分布(右に長い裾)を同時に示してくれる。

📚 2 変量から多変量へ — 拡張のステップ

2 変量可視化に習熟したら、 自然な発展先は 多変量可視化 である。 散布図行列(pairplot, SPLOM)は最も素直な拡張で、 d 変数あれば d×d 枚の小さな散布図を格子状に並べる。 ただし d > 10 になると見づらいので、 並行座標プロット(parallel coordinates)放射状プロット(radar chart)Chernoff faces といった多変量可視化に切り替える。

高次元データを 2 次元に落とすアプローチとして、 PCA(主成分分析) による次元削減後の散布図、 t-SNEUMAP による非線形次元削減が定石。 SSDSE-B-2026 の 30 特徴量を UMAP で 2 次元にすると、 都道府県の類似グループが視覚的なクラスタとして表れる。 これに クラスタリング結果による色分け を重ねれば、 「数値表だけでは見えなかった構造」を一目で示せる。

時間軸を含む 3 変量可視化では、 ガントチャート風散布図(横軸=時刻、 縦軸=対象、 色=値)や カレンダーヒートマップ(GitHub の commit 履歴のような形式)が有効。 地理データを含むなら コロプレス図(地図塗り分け)が直感的。 SSDSE-B-2026 を都道府県地図に塗ると、 「東京-大阪-愛知の三角」「太平洋ベルト地帯」のような空間構造が即座に見える。 Plotly や Folium、 GeoPandas が代表的な実装ライブラリ。

2 変量可視化は単独で完結する技術ではなく、 記述統計(要約統計量)と組み合わせて初めて意味を持つ。 散布図を描いたら必ず、 平均・標準偏差・相関係数・p 値・回帰係数を併記する。 「数値だけ」「絵だけ」のどちらか一方は判断材料として不十分。 学術論文では「図 + 表 + 検定結果」のセットが標準である。 これは Tufte が「データ可視化の原則」で繰り返し強調する点でもある。

最後に「絵が物を言う」原則を改めて確認しておく。 統計家の Anscombe や Cleveland、 Tukey が口を揃えて指摘するように、 同じ要約統計量を持つデータでも、 形が違えば結論も違う。 散布図・ヒートマップ・箱ひげ図といった 2 変量可視化は、 数値の裏にある「形」を可視化するための強力な道具である。 SSDSE-B-2026 のような公的データを題材に、 様々なパターンで可視化を試すことが、 データサイエンス入門として最も効果的な学習法と言える。 慣れたら必ず多変量・時間軸・空間軸へと進めていくのが、 EDA から本格分析への王道である。

🧮 数式に値を入れて手で計算する: 二変量の相関係数

合成 6 点で 2 変数の相関係数を計算する。

Step 1: データ

xy
12
24
35
47
59
611

Step 2: 相関係数 r

平均 x̄=3.5、 ȳ=6.33 共分散 Cov(x,y) ≈ 5.167 σx ≈ 1.708、 σy ≈ 3.037 r = 5.167 / (1.708×3.037) ≈ 0.996

🐍 Python で再現

1
2
3
4
5
import numpy as np
x = np.array([1,2,3,4,5,6])
y = np.array([2,4,5,7,9,11])
r = np.corrcoef(x, y)[0, 1]
print(f"r: {r:.3f}")

📤 実行結果

r: 0.996

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

🌳 手法選択フロー (補助)

2 変量可視化は「変数の型」と「観測数」で図を決める。

  1. 2 変数の型は? 連続×連続 → 散布図、 連続×カテゴリ → 並列箱ひげ、 カテゴリ×カテゴリ → ヒートマップ
  2. 観測数 N は? N<1000 → 散布図そのまま、 N>=1000 → 半透明 (alpha=0.3) or hexbin で過剰描画回避
  3. 軸スケールは? 桁違い → log 軸、 範囲近い → linear 軸。 SSDSE-B-2026 の総人口対消費支出は両軸 linear で OK (相関 r≒0.33)

視覚で発見 → 数値で定量化 (相関係数・回帰) → 報告という流れが標準。

🔗 隣接手法への橋渡し (補助)

散布図 / ヒートマップは EDA の中核プロセスで、 以下と接続する。

2 変量可視化は「気付き」、 相関係数・回帰は「数値での裏付け」。 両方をセットで報告する。

🗺 概念マップ (補助)

2 変量可視化の知識ネットワーク。

中央に「2 変量可視化」を置き、 (a) 上位 = データ可視化全般 / EDA、 (b) 並列 = 散布図 / 箱ひげ / ヒートマップ / モザイクプロット、 (c) 派生 = Hexbin / 2D KDE / バイオリン、 (d) 前段 = データクリーニング / 対数変換 / 1 人あたり変換、 (e) 後段 = 相関係数 / 単回帰 / χ² 検定、 (f) 応用 = 関係性発見 / 異常検出 / グループ比較 が枝として伸びる。

SSDSE-B-2026 の場合、 「総人口 × 消費支出」散布図 → 相関 r≒0.33 → 「東京都・埼玉県が上方」発見 → 「1 世帯あたり」で正規化 → 再可視化、 という探索サイクルが基本パターン。

🔖 キーワード索引

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

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

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

💡 30秒で分かる結論

2 変量可視化 (viz bivariate) を 30 秒で把握する重要ポイント:

📍 文脈ボックス

本ページでは「2 変量可視化 (viz bivariate)」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の「総人口 × 消費支出」「食料費 × 教育費」のような変数ペアを題材に、 散布図/箱ひげ/ヒートマップを使い分ける手順を再現する。

2 変量可視化は EDA カテゴリの中核プロセスで、 単変量分布の把握 → 2 変量関係発見 → 多変量可視化 (散布図行列・PCA バイプロット) と段階的に拡張する起点。 本ページは「変数型の組合せ別の図選択 → 過剰描画対策 → 相関係数/回帰での定量化への橋渡し」の 5 視点で構成される。

🎨 直感で掴む

2 変量可視化 (viz bivariate) は「2 つの変数の関係を 1 枚の図に描く」手法群だ。 単変量は分布、 2 変量は関係性に焦点が移る。 代表は散布図、 ヒートマップ、 並列箱ひげ図、 二次元密度図、 モザイクプロットの 5 種類で、 変数の型 (連続 / カテゴリ) の組み合わせで使い分ける。

SSDSE-B-2026 で「総人口」と「消費支出」の関係を見たいとき、 散布図にすれば「人口が多い県ほど消費支出もやや高い」「東京都・埼玉県が上方にある」「人口規模だけでは説明できない散らばりがある」といった発見が一目で得られる。 数値だけでは見落とす外れ値、 非線形性、 群構造を視覚で捉えるのが 2 変量可視化の役割だ。

本ページでは、 「連続×連続 → 散布図、 連続×カテゴリ → 並列箱ひげ図、 カテゴリ×カテゴリ → ヒートマップ/モザイク」の選択軸を中心に、 SSDSE-B-2026 で実際にプロットしながら、 何が見えて何が見えないかを確認していく。

📐 数式または定義

2 変量可視化は描画関数で定義される。 各図ごとに対応する数式・定義は以下。

散布図 (連続 × 連続): 各点 $(x_i, y_i)$ を 2 次元平面上にプロット。

$$\text{Scatter}(\{(x_i, y_i)\}_{i=1}^n) \to \text{点 } (x_i, y_i) \text{ を描画}$$

並列箱ひげ図 (連続 × カテゴリ): カテゴリ $g \in \{1,\dots,G\}$ ごとに 5 数要約 (最小, Q1, 中央値, Q3, 最大) を描画。

$$\text{BoxPlot}(\{y_i\}, \{g_i\}) \to \{(Q_1^g, Q_2^g, Q_3^g, Q_1^g - 1.5\text{IQR}, Q_3^g + 1.5\text{IQR})\}_{g=1}^G$$

ヒートマップ (カテゴリ × カテゴリ): 集計表 $C_{ij} = \text{count}(X=i, Y=j)$ を色で表現。

$$\text{Heatmap}(C) \to \text{セル }(i,j) \text{ を色強度 } \phi(C_{ij}) \text{ で塗る}$$

ここで $\phi$ は値→色のマッピング (例: linear, log)。

🔬 数式を言葉で読み解く

前節の数式に含まれる記号を、 日本語の意味に翻訳する。

2 変量可視化は「2 つの変数の値の対応関係」を視覚化するための数学的写像であり、 統計量を計算する前にデータの素顔を観察する重要な前工程となる。

🧮 実値で計算してみる

SSDSE-B-2026 で「総人口」と「消費支出」の散布図を作るための値計算を 6 都道府県で示す。 散布図は 1 点ごとに座標を取るだけなので、 「数値 → 図」のマッピングが計算の主体。

都道府県x: 総人口 (千人)y: 消費支出 (円)散布図上の位置
東京都14086341320(14086, 341320) ← 人口最大
神奈川県9229306565(9229, 306565)
大阪府8763271246(8763, 271246)
愛知県7477300221(7477, 300221)
埼玉県7331344092(7331, 344092) ← 消費支出最大
千葉県6257306943(6257, 306943)

視覚的観察: 6 点は緩やかな右上がりだが直線傾向は弱い (相関 r≒0.36)。 東京都は総人口が最大だが消費支出は埼玉県が最大 → 「人口規模だけでは消費支出は決まらない」。 1 世帯あたりに正規化すると順位が入れ替わる、という発見につながる。

🐍 Python 実装

🎯 このコードでやること: SSDSE-B-2026 から「総人口」と「消費支出」を読み込み、 散布図 + 回帰直線を matplotlib で描画。 相関係数も算出する。

📥 入力データ: SSDSE-B-2026 の 47 都道府県データ、 列 A1101 (総人口) と L3221 (消費支出)。 2023 年のみ抽出。

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]
x, y = df['A1101'], df['L3221']
r, p = pearsonr(x, y)
print(f'Pearson r = {r:.3f}, p = {p:.2e}')
plt.scatter(x, y)
plt.xlabel('Population (1000)'); plt.ylabel('Consumption (JPY)')
plt.savefig('scatter.png', dpi=120)

📤 実行結果:

Pearson r = 0.332, p = 2.24e-02 (scatter.png に 47 点が描画される、 東京都・埼玉県が上方に位置)

💬 結果の読み方: r≒0.33 は中程度の正の相関。 散布図を見ると、 人口が多い県ほど消費支出もやや高い傾向はあるが、 埼玉県のように人口が最大でなくても消費支出が高い県があり、 人口規模だけでは説明できない。 1 世帯あたりに正規化して再可視化すると関係が変わることもある (=要因変換のヒント)。

⚠ 落とし穴

2 変量可視化の典型的な落とし穴を列挙する。

🗺 概念マップ

viz bivariate を中心に、 関連する概念・上位カテゴリ・応用領域を放射状に配置した。

2 変量可視化 前提: ヒストグラム・箱ひげ 並列: クロス集計・カテゴリ表 発展: 3 変量以上 (色・サイズ) 応用: 散布図行列 pair plot 対比: ヒートマップ・2D 密度 統合: 回帰直線・信頼帯

2 変量可視化を中心に、 関連する技法・上位カテゴリ・応用領域を放射状に配置した。 中央から伸びる枝は、 (a) 前提として 1 変量可視化 (ヒストグラム・箱ひげ図) で各変数の分布を理解、 (b) 並列としてクロス集計 (両者ともペアの関係性可視化)、 (c) 発展として 3 変量以上の多変量可視化 (散布図行列・カラー次元追加)、 (d) 対比としてヒートマップ (連続 2 値 vs カテゴリ 2 値)、 (e) 統合として回帰分析 (散布図 + 回帰直線 + 信頼帯)、 (f) 応用として散布図行列 (pair plot) を示す。

SSDSE-B-2026 の 47 都道府県データで言えば、 「総人口 vs 消費支出」「食料費 vs 教育費」のような変数ペア間関係の発見に直結し、 単独の「散布図を描ける」段階から、 「散布図 + 周辺ヒストグラム + 回帰直線」を組み合わせて構造を読み解く段階に進むための起点となる。

🔗 隣接手法への橋渡し

2 変量可視化は EDA (探索的データ分析) の中核プロセスとして、 以下と接続する。

隣接手法関係接続のポイント
単変量可視化前段 / 並列各軸の分布を先に確認すると外れ値・歪みを散布図で誤読しない
多変量可視化上位 / 拡張3 変数以上の関係は散布行列、 パラレル座標、 PCA バイプロットで表現
相関分析後段 / 定量化散布図で見えた傾向を Pearson/Spearman r で数値化
単回帰分析後段 / モデル化散布図に回帰直線をオーバーレイし、 残差プロットへ展開
対数変換前段 (前処理)散布図で右上がりの曲線 → log 軸で線形化
カイ二乗検定後段 (カテゴリ用)ヒートマップで見える分布偏りを χ² で有意性検定

SSDSE-B-2026 の標準ワークフロー: ヒストグラム (単変量) → 散布図 (2 変量) → 相関係数 → 単回帰 → 残差診断、 という連鎖が定石。

🌳 手法選択フロー

2 変量可視化は「2 つの変数の型の組み合わせ」で図を選ぶ。

変数型 × 変数型 別の図選択

変数 A変数 B推奨図
連続連続散布図 (基本)。 点数 1000 超 → hexbin/2D KDE
連続カテゴリ並列箱ひげ図 / バイオリンプロット / ストリッププロット
カテゴリカテゴリヒートマップ / モザイクプロット / 積み上げ棒グラフ
時系列 (連続)連続折れ線グラフ (時系列性が主) / 散布図 (時系列性が副)
順序カテゴリ連続並列箱ひげ図 (順序で並べる) / ライン折れ線
連続 (右裾)連続 (右裾)対数軸散布図 (両軸 log) で線形化

選んだ後の検証ステップ

  1. 軸スケールの確認: 範囲が桁違いなら log 軸、 範囲が近ければ linear 軸
  2. 過剰描画チェック: 点が重なって見えないなら alpha、 jitter、 hexbin に切り替え
  3. 外れ値の検証: 外れ値を含む/除く両方で図を描き、 結論が変わらないか確認
  4. カラーマップ: ヒートマップは perceptually uniform (viridis/plasma) を選ぶ
  5. 定量化への橋渡し: 視覚で見えた傾向を相関係数・回帰・検定で数値化して報告

🔖 キーワード索引

この 2 変量可視化 ページで出てくる主要キーワードを一覧します。チップをクリックすると該当箇所へジャンプできます。

散布図ヒートマップHexbin2 次元 KDEバブルチャート相関pairplotクロス集計層化カラーマップ

💡 30 秒で分かる結論

📍 文脈ボックス── あなたが今見ているもの

あなたは、可視化 の入口で「2 変量可視化(Bivariate Visualization)」という用語に出会ったところです。 この用語は 2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。

本ページでは、まず数式や形式的定義よりも、実データ(SSDSE-B-2026, 47 都道府県)で具体的な値を見ます。 そのあと、数式 → 計算 → Python 実装 → 落とし穴 → 関連用語、という順で「使える知識」に組み立てていきます。

SSDSE-B-2026 補足:SSDSE-B-2026 の高齢化率と死亡率を散布図にすると、47 点が右上がりの強い直線関係(r ≈ +0.97)を描きます。

🎨 直感で掴む── 2 変量可視化 を絵で理解

2 変量可視化 の本質は、ひとことで言うと「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」です。 数式に踏み込む前に、まずイメージで掴みましょう。

ヒント:直感が掴めたら、次の「数式または定義」セクションで形式化を確認してください。 形式化と直感がつながれば、2 変量可視化 はもう武器です。

📐 数式または定義── 2 変量可視化 を形式化する

2 変量可視化 を一般化して書くと、観測ペア $(x_1, y_1), \dots, (x_n, y_n)$(ここでは $n = 47$ 都道府県)に対して、次の関係を仮定します。

$$ \boxed{\quad y = f(x_1, x_2, \dots, x_p; \theta) + \varepsilon \quad} $$

ここで $\theta$ は推定したいパラメータ、$\varepsilon$ はモデルでは説明しきれない誤差項。 2 変量可視化 の流派ごとに、$f$ の形(線形・ロジスティック・木)、$\varepsilon$ の分布(正規・二項・ポアソン)が変わります。

記号 意味 SSDSE-B での例
$x$説明変数A1303(65 歳以上人口比 × 死亡率)
$y$目的変数死亡率・出生率など
$n$標本数47(都道府県数)
$\theta$パラメータ傾き・切片など
$\varepsilon$誤差項モデルで説明しきれない残り

🔬 数式を言葉で読み解く

上の式 $y = f(x; \theta) + \varepsilon$ を「数学者の声」ではなく、「現場の声」で読み直してみます。

  1. $y = f(x; \theta)$:「あなたが説明したい量($y$)は、手元の説明材料($x$)から、ある関数 $f$ で計算できると 仮に 置く」
  2. $+ \varepsilon$:「とはいえ、$y$ は完全には $x$ で決まらない。残りは 誤差項 $\varepsilon$ として認める」
  3. パラメータ $\theta$ の推定:「データを 47 個並べ、$y$ と $f(x;\theta)$ の差をできるだけ小さくする $\theta$ を選ぶ」
  4. 不確かさの定量化:「$\theta$ も $f$ もデータから推定したので、信頼区間と $p$ 値で『どれくらい確信できるか』を必ず併走させる」

合言葉:「定義は短い、解釈は長い」。2 変量可視化 はたった 1 行の式ですが、それを 47 都道府県データに当てると、5 種類のチェックリスト(線形性・独立性・等分散・正規性・外れ値)が芋づる式に出てきます。

🧮 実値で計算してみる── SSDSE-B-2026 で 2 変量可視化

数式が読めたら、すぐに 実データ(SSDSE-B-2026, 47 都道府県, 2023 年度)で計算しましょう。 抽象を 47 行の表に落とすと、急に理解できることがあります。

▼ コード解説(SSDSE-B-2026 から A1303, A4200 を読む)
🎯 解説: 47 都道府県 × 1 年分(2023)を抽出し、2 変量可視化 の代表値(平均・中央値・標準偏差・最大/最小)を一気に確認する。
📥 入力例: data/raw/SSDSE-B-2026.csv(cp932, ヘッダ 2 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import pandas as pd

# df2023 はこのあとのブロックで作っているので、ここでも用意しておく
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df2023 = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)

# 2 変量可視化 の代表値を SSDSE-B-2026 で確認
col = 'A1303'
s = df2023[col].astype(float)

print('n            :', len(s))             # 47
print('mean         :', round(s.mean(), 2))
print('median       :', round(s.median(), 2))
print('std          :', round(s.std(),  2))
print('min / max    :', s.min(), '/', s.max())
print('Top 3 prefs  :')
print(df2023.nlargest(3, col)[['Prefecture', col]])

結果を見ると、47 都道府県のうち上位 3 県が突出しているか、なだらかに分布しているか、すぐ分かります。 この「分布の形」が見えると、2 変量可視化 を語る土台ができたことになります。

🐍 Python 実装── 2 変量可視化 のミニ完全版

Python の実装は「読む → 集計 → 描く → 報告」を一直線に書きます。長いコードよりも、各ステップが分離していることが大事です。

① データ読み込み

▼ コード解説(SSDSE-B-2026 を pandas で読む)
🎯 解説: encoding='cp932' が必須。 2 行目は日本語ラベルなので skiprows で飛ばす。
📥 入力例: data/raw/SSDSE-B-2026.csv(東京・大阪などを含む 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# SSDSE-B-2026 を読み込み(65 歳以上人口比 × 死亡率)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 2023 年度(最新)だけ抽出
df2023 = df[df['SSDSE-B-2026'] == 2023].copy()
print(df2023.shape)         # (47, ...)
print(df2023[['Prefecture', 'A1303']].head())

② 集計と可視化

▼ コード解説(matplotlib で 47 都道府県の棒グラフ)
🎯 解説: sort_values + plot.bar で降順可視化。 都道府県名は x ラベル、 縦軸が A1303。
📥 入力例: 2023 年, 47 都道府県, 65 歳以上人口比 × 死亡率
# 2 変量可視化 を 47 都道府県でビジュアル化
fig, ax = plt.subplots(figsize=(9, 6))
df2023.sort_values(col, ascending=False).plot.bar(
    x='Prefecture', y=col, ax=ax, color='#00897B', legend=False)
ax.set_title('65 歳以上人口比 × 死亡率(SSDSE-B-2026, 2023)')
ax.set_ylabel(col)
ax.set_xlabel('都道府県')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig('figures/viz-bivariate.html_r18_bar.png', dpi=120)
plt.show()

③ 報告用テンプレ

レポート文例:「SSDSE-B-2026(2023 年度, n=47)に基づいて 2 変量可視化 を確認したところ、平均は X、標準偏差は Y、上位 3 県は東京・神奈川・大阪であった。 SSDSE-B-2026 の高齢化率と死亡率を散布図にすると、47 点が右上がりの強い直線関係(r ≈ +0.97)を描きます。」

⚠️ 落とし穴── 2 変量可視化 で踏みやすい 5 つ

合言葉:レポート提出前に「ゼロ起点で 1 枚描き直す」「外れ値を 1 県外して再計算」「逆方向の因果を 1 行で否定する」を必ずやる。

🎙 narration まとめ── コード解説の総括

本ページに登場した Python コードはすべて以下のテンプレートで読み解けます:

▼ コード解説(テンプレート)
🎯 解説: ① 読む → ② 集計 → ③ 描く → ④ 検定 → ⑤ 報告。 中間結果を必ず print して人間が確認できるようにする。
📥 入力例: SSDSE-B-2026.csv(47 都道府県 × 約 110 列)
📤 出力例: 図 1 枚 + 統計量 1 表 + レポート文 1 段落

覚え方:「Read → Roll up → Render → Read it back」。 最後の「Read it back」は、出力された数字や図を口に出して 1 度言うこと。 これで 2 変量可視化 の現場運用は十分に回ります。

❓ FAQ── よくある質問 7 連

Q1. 2 変量可視化 は機械学習でも使う?

使います。前処理(特徴量 → 入力ベクトル)、評価(指標の可視化)、解釈(係数の可視化)など、機械学習のあらゆる工程で 2 変量可視化 は登場します。

Q2. n=47 で十分?

記述統計や 1 変量・2 変量の可視化には十分。ただし複数の説明変数を同時に検討するときは、自由度が枯れます。bootstrap や情報量規準(AIC/BIC)で補強しましょう。

Q3. SSDSE-B-2026 はどこで手に入る?

独立行政法人統計センター(NSTAC)「SSDSE」サイトから無料でダウンロードできます。本ページの実装はすべて data/raw/SSDSE-B-2026.csv を前提にしています。

Q4. ライセンスは?

SSDSE は教育目的での利用が許諾されています(出典明示、改変記録)。論文公開時は出典欄に「総務省統計局, SSDSE-B-2026」を必ず書きましょう。

Q5. 2 変量可視化 を最短で身につけるには?

① ヒストグラム 1 枚を描く → ② 平均・中央値・標準偏差を読み上げる → ③ 上位 3 県・下位 3 県を暗記する → ④ 2 変量の相関を 1 つ確認する → ⑤ レポート 1 行にまとめる。これを 47 都道府県データで 3 回回せば、用語の地形が掴めます。

Q6. 2 変量可視化 に関する代表的な論文は?

本リポジトリの 論文一覧 から「可視化」カテゴリの論文を見ると、2 変量可視化 を実際に使った再現コードが付いています。

Q7. 報告書ではどの順で書く?

「目的 → データ → 2 変量可視化 の選択理由 → 結果(図 + 数値)→ 解釈 → 限界(n=47, 単年)→ 次の一手」の順が王道です。

📚 さらに踏み込む── 用語ネットワーク 16 件

用語は単独では覚えづらいので、前提・並列・発展の 3 方向で 16 件並べます。

勧め方:1 日 1 リンク。クリックして読んだら、2 変量可視化 のページに戻り、「2 変量可視化 とこの用語はどう違う?」を 1 行書く。

✅ 使う前のチェックリスト

🧪 ミニケース── 2 変量可視化 を 5 段階で完走する

  1. STEP 1:問いを書く ── 47 都道府県のうち「65 歳以上人口比 × 死亡率」が大きい県と小さい県では、暮らしぶりにどんな差があるか?
  2. STEP 2:データを読む ── SSDSE-B-2026 から A1303, A4200 を取り出し、2023 年度・47 行に絞る。
  3. STEP 3:分布を見る ── ヒストグラムと箱ひげ図で「上位 3・下位 3」を特定し、東京・神奈川・大阪などの突出を確認する。
  4. STEP 4:関係を測る ── 別の変数(人口・死亡率など)との 2 変量関係を散布図 + 相関で測る。
  5. STEP 5:報告する ── 「上位 3 県は X, Y, Z。これらは…」という 200 字レポートに落とす。

合言葉:5 STEP のうちどれか 1 段でも飛ばすと、結論が「数字だけ」になり、読者の腑に落ちなくなります。 2 変量可視化 は「数字 + 物語」のセットで完成です。

🚫 アンチパターン集── 2 変量可視化 で「やってはいけない」9 連

  1. 合成データを np.random.seed で作って「再現実験しました」と書く(教育用途では SSDSE-B-2026 を使うのが必須)
  2. カラムを iloc[:, 5] のように位置で参照し、SSDSE のバージョン違いで壊れるコードを書く
  3. 都道府県の集計順を「日本語五十音」「アルファベット」「東京から時計回り」など混在させ、図の解釈を難しくする
  4. 変数名を x1, x2, x3 のように匿名化し、読者が意味を追えないコードにする
  5. 軸を切り取って小さな差を大きく見せる(特に y 軸の最小値を 0 にしない)
  6. 外れ値の県を黙って削除する(必ず「東京を外した版」と「全件」を両方描く)
  7. p < 0.05 を「効果がある」と読み替える(本来は「偶然では説明しづらい」だけ)
  8. 相関 r を「因果の強さ」と書く(2 変量可視化 で因果は出ない)
  9. レポートの最後で「以上」と書いて閉じる(必ず「限界」と「次の一手」を 1 行ずつ)

🔎 深掘り解説── 2 変量可視化 を 30 分で 1 段深く

A. 歴史的背景

2 変量可視化 は、19 世紀末〜 20 世紀初頭の統計学黎明期から発達してきました。可視化 の中核として、Galton、Pearson、Fisher、Yule などが基礎を築き、現代では SSDSE のような公的データを使った教育素材で広く扱われています。

B. 数理的位置づけ

2 変量可視化 は、観測ペア $(x_i, y_i)_{i=1}^{n}$ から条件付き期待値 $E[y \mid x]$ または分布 $P(y \mid x)$ を推定する道具です。 線形・非線形・パラメトリック・ノンパラメトリックという 4 つの軸の中で、2 変量可視化 は「可視化」という棚に並んでいます。

C. 実装上の工夫

D. 学問体系の位置

2 変量可視化 は 記述統計データサイエンス機械学習 の交差点に位置します。 どの分野から入っても、いずれは 2 変量可視化 を通ります。

🎙 narration コレクション── 5 連ストック

同じテーマで使い回せる narration を 5 つ並べておきます。コピペして「コード解説」欄に貼ってください。

▼ コード解説(① 読み込み)
🎯 解説: SSDSE-B-2026 を読み、 2023 年度に絞る。 cp932 と skiprows=[1] を忘れない。
📥 入力例: data/raw/SSDSE-B-2026.csv
📤 出力例: 47 行 × 約 110 列の DataFrame
▼ コード解説(② 代表値)
🎯 解説: mean / median / std / min / max を一気に表示。 平均と中央値が大きく離れたら歪んだ分布。
📥 入力例: df2023[A1303.astype(float)
📤 出力例: mean 2645809 / median 1549000 / std 2797551 / min 537000 / max 14086000(2023 年 47 都道府県の総人口)
▼ コード解説(③ 可視化)
🎯 解説: matplotlib の bar / hist / boxplot を 1 枚ずつ重ねず作る。 figsize=(9,6) が標準。
📥 入力例: sort_values 後の DataFrame、 x=都道府県、 y=A1303
📤 出力例: PNG 1 枚(figures/viz-bivariate.html_r18_bar.png)
▼ コード解説(④ 関係を測る)
🎯 解説: 2 変量の関係は scipy.stats.pearsonr または df.corr() で測る。 r と p-value を同時に得る。
📥 入力例: df2023[[X, Y]](X=A1303)
📤 出力例: r = 0.9910, p = 6.3e-41(総人口と 65 歳以上人口、2023 年 47 都道府県)
▼ コード解説(⑤ 報告)
🎯 解説: 「目的→データ→2 変量可視化→結果→限界→次」の 6 段に分けて 200 字レポートに。
📥 入力例: 上で得た図 + 表 + r/p
📤 出力例: マークダウン 200 字程度

📔 ミニ用語集── 同じ話題で使う 12 語

標本(sample)
母集団から取り出した観測の集まり。本ページでは「47 都道府県, 2023 年度」が標本。
母集団(population)
標本の背後にある全体。47 都道府県は日本全土の「県別断面」と読める。
変数(variable)
各観測単位に対応する 1 つの数値・カテゴリ。SSDSE では人口・出生率など 約 110 列。
分布(distribution)
変数が取る値の頻度の形。hist / KDE / box で可視化する。
代表値(central tendency)
平均・中央値・最頻値の総称。歪んだ分布では中央値を優先。
ばらつき(dispersion)
標準偏差・IQR・分散の総称。代表値とセットで報告する。
外れ値(outlier)
分布の主部から大きく外れた観測。原因を 1 つ書ける外れ値だけ「正当な外れ値」と呼ぶ。
相関(correlation)
2 変量の同調具合。−1 〜 +1 の単数で要約。
因果(causation)
X を動かすと Y も動くという関係。相関では保証されない。
p 値(p-value)
帰無仮説下で「観測以上に極端な値」が出る確率。「効果あり」とは言えない点に注意。
信頼区間(confidence interval)
同じ実験を何度もやったとき、推定値が含まれる範囲。点推定とセットで提示。
正規化(normalization)
変数のスケールを揃える操作。Min-Max / Z-score / Robust の 3 種を覚える。

🗾 47 都道府県データの位置づけ

2 変量可視化 を学ぶときに使う SSDSE-B-2026 は、47 都道府県 × 約 110 列 × 複数年度のパネルデータです。 本ページでは「2023 年度の 47 行」を主に使います。 以下に、よく登場する代表的なカラムを示します。

SSDSE コード 日本語名 単位 2 変量可視化 での主な使い方
Code地域コードJOIN キー
Prefecture都道府県名カテゴリ軸・ラベル
A1101総人口説明変数(規模)
A130365 歳以上人口高齢化率の分子
A4101出生数人口動態の説明変数
A4200死亡率目的変数の代表
B4101年平均気温気候系の説明変数
L3221消費支出家計の目的変数

使い方のコツ:列名はすべて A1101 のような英数記号です。SSDSE のコードブックで日本語ラベルを確認しながら使ってください。 本ページの例では A1303, A4200(65 歳以上人口比 × 死亡率)を中心に使っています。

👣 ステップバイステップ── 2 変量可視化 を 10 行で実装する

解説は最小限。コードは 10 行以内。これで 2 変量可視化 の最短ルートが手に入ります。

  1. import pandas as pd
  2. df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
  3. df = df[df['SSDSE-B-2026'] == 2023]
  4. col = 'A1303'
  5. print(df[['Prefecture', col]].sort_values(col, ascending=False).head())
  6. import matplotlib.pyplot as plt
  7. df.plot.hist(y=col, bins=20)
  8. plt.title('65 歳以上人口比 × 死亡率(SSDSE-B-2026, 2023)')
  9. plt.savefig('figures/viz-bivariate.html_r18_hist.png', dpi=120)
  10. plt.show()

注意:10 行で動かせる、というだけで、これがゴールではありません。 2 変量可視化 の本当の難しさは「描いた図をどう解釈するか」「報告にどう落とすか」にあります。

📖 さらに学ぶには── 学習ロードマップ 4 段

  1. レベル 1(30 分):本ページの「30 秒で分かる結論」と「直感で掴む」だけ読む。SSDSE-B-2026 を 1 度ダウンロードして開く。
  2. レベル 2(2 時間):「Python 実装」セクションを写経し、A1303, A4200 の図を 1 枚作る。報告 200 字を書く。
  3. レベル 3(半日):「数式または定義」「数式を言葉で読み解く」を踏まえ、別の 2 つの変数で同じ分析を反復。3 通り作って比べる。
  4. レベル 4(1 週間):本リポジトリの 論文一覧 から「可視化」カテゴリの論文 1 本を完走。再現コードを動かして、2 変量可視化 の応用範囲を体感する。

📝 報告フォーマット── 2 変量可視化 を 200 字で書く

2 変量可視化 の結果を、ゼミ・卒論・社内会議で報告するときの定型文を 3 つ用意しました。 最初は丸ごとコピー、慣れたら差し替えて使ってください。

テンプレ A:研究レポート向け

「本研究では、SSDSE-B-2026(n=47, 2023 年度)を用いて 2 変量可視化 を確認した。 主たる説明変数は A1303, A4200(65 歳以上人口比 × 死亡率)であり、47 都道府県を対象とした分布の確認、相関の評価、2 変量可視化 を用いた分析を実施した。 分析の結果、上位 3 県・下位 3 県の特徴と、SSDSE-B-2026 の高齢化率と死亡率を散布図にすると、47 点が右上がりの強い直線関係(r ≈ +0.97)を描きます。」

テンプレ B:ビジネスレポート向け

「65 歳以上人口比 × 死亡率 を 47 都道府県で比較したところ、東京・神奈川・大阪など大都市圏が突出していることが分かった。 2 変量可視化 を用いた分析から、地域差は単に人口規模の違いだけでは説明できず、複数要因の組み合わせで生じていると示唆された。 今後の打ち手は、上位県のベストプラクティスを参考にしつつ、下位県への支援策を検討することである。」

テンプレ C:教育用講義スライド向け

「皆さん、2 変量可視化 はひとことで言うと『2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。』です。 今回は SSDSE-B-2026(総務省統計局, 47 都道府県, 2023 年度)を使って、実際の数字でこの考え方を確かめました。 皆さん自身でも、別の指標(人口、出生率、家計支出など)に置き換えて同じ手順を試してみてください。」

🔭 3 つの視点で 2 変量可視化 を見る

同じ用語でも、見る立場によって意味が変わります。3 つの視点を切り替えて、用語の輪郭を立体的に掴みましょう。

視点 ① 統計学者の目

統計学者にとって 2 変量可視化 は「データから母集団を推定する道具」です。 確率モデル・尤度・不偏性・効率性・一致性などの数学的性質に注目し、漸近理論で性能保証を行います。 47 都道府県データは「小標本(n=47)」と分類され、bootstrap や情報量規準による補強が必要になります。

視点 ② データサイエンティストの目

データサイエンティストにとって 2 変量可視化 は「ビジネス課題を数字で答えるパイプラインの 1 部品」です。 モデルの理論的性質より、運用性・解釈性・更新コストを重視します。 SSDSE のような公的データを用いるときは「データの出典・更新頻度・ライセンス」を最優先で確認します。

視点 ③ 教育者・学習者の目

教育の現場では 2 変量可視化 は「初学者が躓きやすいポイント」を含む単元です。 抽象的な数式よりも、具体的な 47 都道府県データで手を動かし、図を描き、結果を口頭で説明できるようになることが目標になります。 本ページの並び(直感 → 数式 → 計算 → Python → 落とし穴)は、まさにこの教育的アプローチに沿っています。

視点切り替えの効果:1 つの用語を 3 通りに眺めると、自分が今どの立場で議論しているか自覚できます。 論文を読むときは ①、現場で使うときは ②、人に教えるときは ③ ── と意識的に切り替えてください。

⚖️ 似た用語との使い分け── 8 列比較表

2 変量可視化 と似た用語を、使い分けの観点から並べます。違いを言語化できれば、迷いが減ります。

用語 目的 入力 出力 強み 弱み
2 変量可視化2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。47 都道府県 × 約 110 変数図 + 表 + 200 字レポート直感的、再現容易小標本(n=47)の制約
相関係数2 変量の同調を 1 数で要約x, y の 47 ペアr ∈ [−1, +1]シンプル非線形は捉えられない
線形回帰条件付き期待値の線形近似説明変数群回帰係数・予測値解釈容易非線形には弱い
ロジスティック回帰2 値分類説明変数群確率 + 係数分類問題の標準線形決定境界
ランダムフォレスト非線形分類・回帰大量変数予測 + 重要度非線形対応解釈やや難

❓ 拡張 FAQ── 詰まりがちな 8 つの疑問

Q1. 2 変量可視化 と「可視化」全体の関係は?

2 変量可視化 は 可視化 の中で「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」を担う基本道具です。可視化 の他のトピックは、この基本の応用または並列の道具にあたります。

Q2. 47 都道府県以外のデータで使えますか?

使えます。SSDSE-A(市区町村)、SSDSE-C(年次推移)、SSDSE-D・E(個票)など、2 変量可視化 の手順はそのまま適用できます。粒度(県・市・個人)に応じて n が変わるので、結果の信頼性も変わります。

Q3. SSDSE-B-2026 が将来更新されたら?

SSDSE は年に 1 度更新されます。2 変量可視化 のコード自体は変更不要ですが、結果(数値・図)は最新年度のものに置き換えてレポートしましょう。出典欄に「SSDSE-B-2027(仮)」と書き換えるのを忘れずに。

Q4. Excel でも同じことはできますか?

できます。ピボット → グラフ → 関数 で代表値や相関は出ます。ただし、再現性・履歴管理・自動化の面で Python に劣ります。学習用には Python を強く勧めます。

Q5. 2 変量可視化 で AI(機械学習)に進めますか?

進めます。2 変量可視化 は機械学習の「特徴量設計」と「結果解釈」の両端で必須です。AI と聞くと深層学習を連想しがちですが、SSDSE のような表形式データでは線形モデル + 2 変量可視化 の組み合わせで十分実用になります。

Q6. 「コードが動かない」ときは?

3 つ確認します:①ファイルパス(data/raw/SSDSE-B-2026.csv)が合っているか、②エンコーディングが cp932 か、③ヘッダ 2 行目の日本語ラベルを skiprows で飛ばしたか。これで 9 割解決します。

Q7. 図を保存できない場合は?

figures/ ディレクトリが存在しない可能性があります。import os; os.makedirs('figures', exist_ok=True) を先頭に追加してください。

Q8. 2 変量可視化 を勉強する優先順位は?

本ページの 12 セクションを順に読み進めるのが最短です。特に「直感 → 数式 → 計算 → Python」の 4 段が腑に落ちれば、用語の 80 % は理解できたとみなせます。

🎯 サマリーカード── 1 ページ印刷用

用語2 変量可視化(Bivariate Visualization)
カテゴリ可視化
ひとこと定義2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。
SSDSE-B での使い方SSDSE-B-2026 の高齢化率と死亡率を散布図にすると、47 点が右上がりの強い直線関係(r ≈ +0.97)を描きます。
主な道具pandas / matplotlib / scipy / statsmodels / scikit-learn
最大の注意n=47 の小標本・単位混在・因果と相関の混同
学習ステップ読む → 集計 → 描く → 検定 → 報告
代表的な関連用語相関係数・回帰分析・ヒストグラム・散布図・標準偏差

このカードを印刷し、SSDSE-B-2026 で 1 回手を動かせば、用語の「使える形」が定着します。 2 変量可視化 はあくまで「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」というシンプルな考え方の道具ですので、迷ったらこの 1 行に戻ってください。

🎮 触って理解する

スライダーで 2 変数の相関の強さ・向き を変えると、散布図の形と ピアソン相関係数 r がリアルタイムで変化します。表示を 散布図 / 2 次元ヒストグラム(ヒートマップ)/ 点密度 に切り替えたり、 回帰直線を重ねたりして、「関係が図でどう見えるか」を体感してください。 非線形の例ボタンでは、はっきりした関係があるのに r がほぼ 0 になる様子も確認できます。 (散布図の上を左右にドラッグしても相関を変えられます。スマホのタッチ操作対応)

-1(完全な負)0(無相関)+1(完全な正)
点が多いほど「過剰プロット(重なり)」を体感できます
表示:
実測ピアソン r = +0.80
回帰式 y = 0.00 + 0.80x
r² = 0.64(説明できる割合)

🧭 直感 — 「2 変数の関係を 1 枚で見る」

散布図は 2 変数を縦横の座標に置き、点の雲の傾きで関係の向き、雲の細さで関係の強さを表します。 r は「点がどれだけ 1 本の直線に沿うか」を −1〜+1 で測る数値で、上のスライダーを右に振ると点が右上がりの細い帯に、左に振ると右下がりに、中央では丸い雲になります。 点が多くて重なるときはヒートマップ点密度表示に切り替えると、「どこに点が集中しているか」が色で見えます。

⚠️ よくある落とし穴

🚀 発展 — 多変量へ

3 つ以上の変数を同時に見るときは、全変数ペアの散布図を格子状に並べた散布図行列(pairplot)や、 相関係数を色で並べた相関行列ヒートマップが定番です。まず 2 変量で「見る目」を鍛えると、多変量でも当たりを付けやすくなります。 SSDSE-B-2026(cp932 / 2023 年 47 都道府県)では、高齢化率と死亡率が右上がりの強い直線関係(本ページ本文の実測値を参照)を示すなど、実データでこの体感を確かめられます。

🔎 解説深化 — 2 変量可視化を「もう一段」深く読む

このページの他セクション(散布図の読み方・落とし穴・実装・関連用語)とは重複しない角度だけを集めた補遺です。テーマは「見え方はデータではなく描き方で変わる」という一点に絞ります。

🎨 直感 — すべての 2 変量図は「縦スライスの分布」を見る道具

2 変量可視化は結局、「X をある値に固定したとき Y はどう散らばるか」= 条件付き分布 P(Y|X) を読む作業に還元できます。グラフを X 軸に沿った縦の短冊(スライス)に切って眺めると、どの図も同じものの別表現だと分かります。

だから図の選択は本質的に (X の型 × Y の型) で決まります。連続×連続なら散布図、質的×連続なら層別箱ひげ、質的×質的ならモザイク/クロス集計ヒートマップ、という対応はこの「スライスをどう要約するか」の違いにすぎません。

⚠️ 落とし穴(重要)— 相関係数は不変でも「見た目の強さ」は描き方で激変する

① アスペクト比バンキング(縦横比で傾きの印象が変わる)。 SSDSE-B-2026・2023年・47都道府県で 保健医療費(L322106)× 教育費(L322108) をとると、実測で r = 0.557 / 回帰直線の傾き = 1.095(いずれも実際に計算した値)。r は座標の拡大縮小で不変ですが、画面上で回帰直線が何度に見えるかは図の縦横比で変わります(実データの範囲 x=[11052,21000], y=[4316,24160] から算出):

図の縦横比 (幅:高さ)回帰直線の見かけの角度受ける印象
2 : 1(横長)約 15.3°「ほぼ横ばい・弱い」
1 : 1(正方形)約 28.8°「そこそこ」
1 : 2(縦長)約 47.7°「急・強い」

同一データ・同一 r = 0.557 のまま、縦横比だけで印象が「弱い」から「強い」へ振れます。回帰直線をちょうど 45° に立てる(Cleveland の banking to 45°)縦横比は実測で 幅:高さ ≈ 0.549 : 1。教訓:見た目に頼らず r と傾きを数値で併記し、比較する複数図では縦横比を揃えること。プレゼンで「関係が強く見える散布図」は、縦横比が仕込まれていないか疑うべきです。

② 2次元密度図の「空セル」問題(点が少ないと密度は嘘をつく)。 ヒートマップ化した散布図・hexbin・2次元 KDE は「セルあたり何点あるか」で信頼度が決まります。都道府県データは n = 47 しかありません:

(いずれも 47 ÷ セル数の実算値。)1 次元のヒストグラムは数十点でも形が見えますが、2 次元は面積で薄まるため必要点数が桁違いに増えます。n=47 で細かい hexbin/KDE を描くと、実体のない「まだら模様」を構造と誤読しがちです。少数データでは素の散布図+都道府県ラベルが最も正直で、密度図は数千点以上あるときの道具だと割り切りましょう。

🚀 発展 — 「同時分布 = 周辺分布 × 条件付き分布」で図を設計する

2 変量の同時分布は P(X,Y) = P(X)·P(Y|X) と分解できます。jointplot が散布図の上下右に周辺ヒストグラムを添えるのは、この 周辺分布(各軸単独の姿)条件付き分布(相手を固定した姿)を同時に見せるためです。散布図で外れて見える点が、周辺分布では「単に X が極端なだけ」と分かることも多く、両方を並べると誤読が減ります。

第 3 変数を足すとき、色分け(hue)は 5〜7 系統で飽和します。地域ブロックのようにカテゴリが多い場合は、色を増やすより 小さな倍数図(small multiples / ファセット)——同じ軸の散布図をカテゴリごとに並べる——ほうが、各条件付き分布を公平に比較でき、オーバープロットも自然に緩和されます。「色を増やしたくなったら図を分ける」が実務の目安です。

🔗 関連ページ

数値の出典:data/raw/SSDSE-B-2026.csv を pd.read_csv(encoding='cp932', skiprows=[1]) で読み、df[df['SSDSE-B-2026']==2023](47都道府県)で算出。r・傾き・見かけの角度・セルあたり点数はすべて実測値。合成データは使用していません。