論文・記事に 「散布図」「ヒートマップ」「散布図行列」「相関プロット」「バブルチャート」「クロス集計」 として登場する 2変量以上の可視化群。 EDA・モデル評価・結果報告のすべての場面で必須のツール。
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:
| 手法 | 変数の型 | サンプルサイズ | 主な用途 |
|---|---|---|---|
| 散布図 | 連続 × 連続 | 10〜数千 | 相関、 回帰、 外れ値 |
| Hexbin | 連続 × 連続 | 10000〜 | 大量データの密度 |
| 2D KDE | 連続 × 連続 | 100〜数千 | 滑らかな密度 |
| バブル | 連続 × 連続 × サイズ | 〜数百 | 3変数の同時表示 |
| ヒートマップ | 行列形式 | 任意 | 相関行列、 混同行列 |
| 散布図行列 | 複数連続変数 | 任意(3〜10変数) | 多変量 EDA |
| クロス集計 | カテゴリ × カテゴリ | 任意 | 独立性検定 |
2 つの連続変数の関係を $(x_i, y_i)$ の点で表現。 探索的データ解析の最も重要な可視化。 相関係数や回帰分析の前に必ず描く。
SSDSE-B-2026 の家計支出から、 食料費と教育費の関係を散布図で確認すると正の相関($r \approx 0.68$)が見えます。 ただし、 相関係数 $r$ の数値だけでは「線形か」「外れ値があるか」が分からないため、 散布図と必ずセットで確認します。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import matplotlib.pyplot as plt import seaborn as sns import 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'] food = pd.to_numeric(d23['L322101'], errors='coerce') / 1000 edu = pd.to_numeric(d23['L322108'], errors='coerce') / 1000 # matplotlib plt.scatter(food, edu, alpha=0.6) # seaborn(回帰直線付き) sns.regplot(x=food, y=edu) # 色分け(カテゴリ変数で) sns.scatterplot(x='食料費', y='教育費', hue='地域', data=d23) # 透明度で密度を表現 plt.scatter(food, edu, alpha=0.1) # 大量データ用 |
大量データ($n > 10000$)の散布図は点が重なり「黒い塊」になりがち。 そんなとき六角形のグリッドに集計するのが Hexbin。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。1 2 3 4 5 | plt.hexbin(x, y, gridsize=30, cmap='viridis') plt.colorbar(label='頻度') # seaborn sns.jointplot(x='x', y='y', data=df, kind='hex') |
2変数の同時密度関数を滑らかに推定。 等高線で密度を可視化。
点のサイズで3つ目の変数を表現。 4つ目を色で表現すれば 4変量可視化に拡張可能。
2次元行列の値を色の濃淡で表現。 主な用途:
注意:色覚多様性に配慮し赤緑配色を避ける。 'viridis' は色覚バリア対応。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。1 2 3 4 5 6 7 8 9 10 11 12 13 | import seaborn as sns # 相関行列のヒートマップ corr = df.corr() sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', center=0, vmin=-1, vmax=1) # 混同行列 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_true, y_pred) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues') # クラスター付き(階層クラスタリングで並び替え) sns.clustermap(corr, cmap='RdBu_r', center=0) |
$d$ 変数の全ペアの散布図を $d \times d$ グリッドで描く。 多変量データの探索的解析の標準ツール。 対角には各変数のヒストグラム(または KDE)を置く。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。1 2 3 4 5 6 7 8 9 10 | import seaborn as sns # 基本 sns.pairplot(df[['食料費','住居費','教育費','光熱費']]) # カテゴリで色分け + 回帰直線 sns.pairplot(df, vars=['食料費','教育費','住居費'], hue='地域', kind='reg') # 対角を KDE に sns.pairplot(df, diag_kind='kde') |
カテゴリ × カテゴリの 2変量集計。 例えば「性別 × 購買意向」の集計表。 関連性はχ²検定で検証。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd ct = pd.crosstab(df['性別'], df['購入'], margins=True) ct = pd.crosstab(df['性別'], df['購入'], normalize='index') # 行ごとに正規化(条件付き確率) # ヒートマップで可視化 import seaborn as sns sns.heatmap(pd.crosstab(df['性別'], df['購入']), annot=True, fmt='d', cmap='Blues') # モザイク図 from statsmodels.graphics.mosaicplot import mosaic mosaic(df, ['性別', '購入']) |
| ❌ 誤解 | ✅ 正しい理解 |
|---|---|
| 散布図 で「強い相関」に見えれば因果 | 相関≠因果。 散布図は出発点でしかない |
| 散布図が直線的なら $r$ も高い | 外れ値・非線形があると一致しない。 アンスコムの四重奏 |
| ヒートマップは赤緑が分かりやすい | 色覚多様性に注意。 viridis 系を推奨 |
| 大量データでも散布図で OK | 点が重なり密度が見えない。 Hexbin / 2D KDE |
| 散布図行列で全部見れる | 10変数を超えると小さくて読めない。 PCA / 相関ヒートマップ |
| クロス集計の度数だけ見ればよい | 行・列で正規化した条件付き確率も見る |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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') |
Pearson $r$ は線形な関係しか捉えないが、 単調な曲線なら高い相関を示すことがある。 Spearman 順位相関で再確認、 多項式項を含めた回帰、 非線形変換(log)の検討が必要。 アンスコムの四重奏(同じ $r$ でも形が全く違う 4 例)は古典的な警告。
対角は「同じ変数同士の相関」=1。 非対角は $r_{ij} = r_{ji}$ なので対称。 だからヒートマップでは下三角だけ描く(mask で上三角を隠す)と冗長性を減らせる。
連続2 を $x, y$ 軸に、 カテゴリを色(hue)で表現。 sns.scatterplot(x=..., y=..., hue=..., data=df)。 群ごとの傾向の違いが一目で分かる。 さらに 4 つ目(連続)があれば点のサイズで(バブル化)。
選択肢:(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.679$、 95% CI: [0.483, 0.808]、 $p<0.001$)が見られた。 1点(東京都)が右上に外れているが、 これを除いても相関は安定して有意。 散布図行列で他変数(住居費・光熱費)との関係も確認し、 住居費とは弱い負の相関、 光熱費とは中程度の正の相関を確認した。」
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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 | import matplotlib.pyplot as plt import seaborn as sns # 散布図 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') # ヒートマップ sns.heatmap(df.corr(), annot=True, cmap='RdBu_r', center=0) sns.clustermap(df.corr()) # 階層クラスタリング付き # 散布図行列 sns.pairplot(df[['食料費','住居費','教育費']], hue='地域', kind='reg') # クロス集計 import pandas as pd ct = pd.crosstab(df['性別'], df['購入']) 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.corr(), color_continuous_scale='RdBu_r', zmin=-1, zmax=1) |
| 種類 | 用途 | 推奨 |
|---|---|---|
| 連続型(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変量可視化の主要グラフ・概念・関連手法。
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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) cols = df.select_dtypes('number').columns x_col, y_col = cols[0], cols[1] 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') |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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.select_dtypes('number').iloc[:, :5] sns.pairplot(num, diag_kind='kde', plot_kws={'alpha':0.5,'s':30}) |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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.select_dtypes('number').iloc[:, :8].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) |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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') |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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) |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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) |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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') |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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') |
data/raw/SSDSE-B-2026.csv。 列 A4101 (食料費)と A4301 (教育費)。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 枚の図にする」。 量×量=散布図、 量×質=箱ひげの群比較、 質×質=モザイクやヒートマップ。 SSDSE-B-2026 では、 A1101(人口)と L3221(消費支出)の散布図が定番で、 都市規模の大きい県ほど 1 世帯あたり支出が高めという緩い正相関が見える。
2 変量の可視化 は「可視化」カテゴリの中核概念。 初めて触れる読者は、 まずこの「🎨 直感」セクションだけ通読し、 必要になった時点で「📐 数式」「🐍 Python」「⚠️ 落とし穴」へ戻る読み方が定着しやすいです。
直感の次は、 厳密な定義を確認します。 数式は言語の一種で、 一度書き慣れれば「言葉より速く伝えられる」便利な道具。 慣れていない方は、 各記号が何を表すかを下の「🔬 記号読み解き」で 1 つずつ確認してください。
上の数式を眺めるだけでは身につかないので、 各記号がどんな役割を担っているかを言葉で押さえます。 「数式を音読する習慣」がつくと、 論文や教科書を読むスピードが体感で 2 倍ほど上がります。
数式だけでは「実感」が湧きにくいので、 実データ data/raw/SSDSE-B-2026.csv(47 都道府県 × 16 年)で 1 度手計算してみると理解が定着します。
SSDSE-B-2026 (2023) で A1101 と L3221 の相関 r ≈ 0.40。 散布図に都道府県名ラベルを付けると、 東京・神奈川・愛知が右上、 鳥取・島根が左下に配置される。 「人口 → 都市規模 → 物価 → 消費」の連鎖を仮説として読み解ける。
| 都道府県 | A1101 総人口 | A1303 65 歳以上 | L3221 消費支出 |
|---|---|---|---|
| 東京都 | 14,086,000 | 3,205,000 | 341,320 |
| 神奈川県 | 9,229,000 | 2,390,000 | 306,565 |
| 大阪府 | 8,763,000 | 2,424,000 | 271,246 |
| 愛知県 | 7,477,000 | 1,923,000 | 300,221 |
| 埼玉県 | 7,331,000 | 2,012,000 | 344,092 |
| 千葉県 | 6,257,000 | 1,756,000 | 306,943 |
上記は SSDSE-B-2026 (2023) からの抜粋。 手計算で確認した値が、 後述の Python 実装で得る値と一致することを確認すると、 「数式とコードの対応関係」がクリアに見えるようになります。
公的統計(SSDSE-B-2026)を題材に、 最小限の Python コードで 2 変量の可視化 を動作させます。 まずはこのまま実行してみてください。
# 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])
上のコードで動かない場合は、 ①必要なパッケージがインストール済みか(pip install pandas scikit-learn scipy statsmodels matplotlib)、 ②データファイルが data/raw/SSDSE-B-2026.csv に存在するか、 ③encoding='cp932' になっているかを確認してください。
2 変量の可視化 を使うときに初学者が踏みやすい失敗パターン。 1 度経験してしまえば次から避けられますが、 先に知っておくに越したことはありません。
この 2 変量可視化 ページで出てくる主要キーワードを一覧します。チップをクリックすると該当箇所へジャンプできます。
あなたは、可視化 の入口で「2 変量可視化(Bivariate Visualization)」という用語に出会ったところです。 この用語は 2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。
本ページでは、まず数式や形式的定義よりも、実データ(SSDSE-B-2026, 47 都道府県)で具体的な値を見ます。 そのあと、数式 → 計算 → Python 実装 → 落とし穴 → 関連用語、という順で「使える知識」に組み立てていきます。
2 変量可視化 の本質は、ひとことで言うと「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」です。 数式に踏み込む前に、まずイメージで掴みましょう。
ヒント:直感が掴めたら、次の「数式または定義」セクションで形式化を確認してください。 形式化と直感がつながれば、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$ を「数学者の声」ではなく、「現場の声」で読み直してみます。
合言葉:「定義は短い、解釈は長い」。2 変量可視化 はたった 1 行の式ですが、それを 47 都道府県データに当てると、5 種類のチェックリスト(線形性・独立性・等分散・正規性・外れ値)が芋づる式に出てきます。
数式が読めたら、すぐに 実データ(SSDSE-B-2026, 47 都道府県, 2023 年度)で計算しましょう。 抽象を 47 行の表に落とすと、急に理解できることがあります。
# 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 の実装は「読む → 集計 → 描く → 報告」を一直線に書きます。長いコードよりも、各ステップが分離していることが大事です。
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())
# 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)を描きます。」
合言葉:レポート提出前に「ゼロ起点で 1 枚描き直す」「外れ値を 1 県外して再計算」「逆方向の因果を 1 行で否定する」を必ずやる。
本ページに登場した Python コードはすべて以下のテンプレートで読み解けます:
覚え方:「Read → Roll up → Render → Read it back」。 最後の「Read it back」は、出力された数字や図を口に出して 1 度言うこと。 これで 2 変量可視化 の現場運用は十分に回ります。
使います。前処理(特徴量 → 入力ベクトル)、評価(指標の可視化)、解釈(係数の可視化)など、機械学習のあらゆる工程で 2 変量可視化 は登場します。
記述統計や 1 変量・2 変量の可視化には十分。ただし複数の説明変数を同時に検討するときは、自由度が枯れます。bootstrap や情報量規準(AIC/BIC)で補強しましょう。
独立行政法人統計センター(NSTAC)「SSDSE」サイトから無料でダウンロードできます。本ページの実装はすべて data/raw/SSDSE-B-2026.csv を前提にしています。
SSDSE は教育目的での利用が許諾されています(出典明示、改変記録)。論文公開時は出典欄に「総務省統計局, SSDSE-B-2026」を必ず書きましょう。
① ヒストグラム 1 枚を描く → ② 平均・中央値・標準偏差を読み上げる → ③ 上位 3 県・下位 3 県を暗記する → ④ 2 変量の相関を 1 つ確認する → ⑤ レポート 1 行にまとめる。これを 47 都道府県データで 3 回回せば、用語の地形が掴めます。
本リポジトリの 論文一覧 から「可視化」カテゴリの論文を見ると、2 変量可視化 を実際に使った再現コードが付いています。
「目的 → データ → 2 変量可視化 の選択理由 → 結果(図 + 数値)→ 解釈 → 限界(n=47, 単年)→ 次の一手」の順が王道です。
用語は単独では覚えづらいので、前提・並列・発展の 3 方向で 16 件並べます。
勧め方:1 日 1 リンク。クリックして読んだら、2 変量可視化 のページに戻り、「2 変量可視化 とこの用語はどう違う?」を 1 行書く。
合言葉:5 STEP のうちどれか 1 段でも飛ばすと、結論が「数字だけ」になり、読者の腑に落ちなくなります。 2 変量可視化 は「数字 + 物語」のセットで完成です。
np.random.seed で作って「再現実験しました」と書く(教育用途では SSDSE-B-2026 を使うのが必須)iloc[:, 5] のように位置で参照し、SSDSE のバージョン違いで壊れるコードを書くx1, x2, x3 のように匿名化し、読者が意味を追えないコードにする2 変量可視化 は、19 世紀末〜 20 世紀初頭の統計学黎明期から発達してきました。可視化 の中核として、Galton、Pearson、Fisher、Yule などが基礎を築き、現代では SSDSE のような公的データを使った教育素材で広く扱われています。
2 変量可視化 は、観測ペア $(x_i, y_i)_{i=1}^{n}$ から条件付き期待値 $E[y \mid x]$ または分布 $P(y \mid x)$ を推定する道具です。 線形・非線形・パラメトリック・ノンパラメトリックという 4 つの軸の中で、2 変量可視化 は「可視化」という棚に並んでいます。
df.dropna() の前に必ず欠損率を df.isna().mean() で測る。2 変量可視化 は 記述統計・データサイエンス・機械学習 の交差点に位置します。 どの分野から入っても、いずれは 2 変量可視化 を通ります。
同じテーマで使い回せる narration を 5 つ並べておきます。コピペして「コード解説」欄に貼ってください。
2 変量可視化 を学ぶときに使う SSDSE-B-2026 は、47 都道府県 × 約 110 列 × 複数年度のパネルデータです。 本ページでは「2023 年度の 47 行」を主に使います。 以下に、よく登場する代表的なカラムを示します。
| SSDSE コード | 日本語名 | 単位 | 2 変量可視化 での主な使い方 |
|---|---|---|---|
| Code | 地域コード | — | JOIN キー |
| Prefecture | 都道府県名 | — | カテゴリ軸・ラベル |
| A1101 | 総人口 | 人 | 説明変数(規模) |
| A1303 | 65 歳以上人口 | 人 | 高齢化率の分子 |
| A4101 | 出生数 | 人 | 人口動態の説明変数 |
| A4200 | 死亡率 | ‰ | 目的変数の代表 |
| B4101 | 年平均気温 | ℃ | 気候系の説明変数 |
| L3221 | 消費支出 | 円 | 家計の目的変数 |
使い方のコツ:列名はすべて A1101 のような英数記号です。SSDSE のコードブックで日本語ラベルを確認しながら使ってください。
本ページの例では A1303, A4200(65 歳以上人口比 × 死亡率)を中心に使っています。
解説は最小限。コードは 10 行以内。これで 2 変量可視化 の最短ルートが手に入ります。
import pandas as pddf = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])df = df[df['SSDSE-B-2026'] == 2023]col = 'A1303'print(df[['Prefecture', col]].sort_values(col, ascending=False).head())import matplotlib.pyplot as pltdf.plot.hist(y=col, bins=20)plt.title('65 歳以上人口比 × 死亡率(SSDSE-B-2026, 2023)')plt.savefig('figures/viz-bivariate.html_r18_hist.png', dpi=120)plt.show()注意:10 行で動かせる、というだけで、これがゴールではありません。 2 変量可視化 の本当の難しさは「描いた図をどう解釈するか」「報告にどう落とすか」にあります。
2 変量可視化 の結果を、ゼミ・卒論・社内会議で報告するときの定型文を 3 つ用意しました。 最初は丸ごとコピー、慣れたら差し替えて使ってください。
「本研究では、SSDSE-B-2026(n=47, 2023 年度)を用いて 2 変量可視化 を確認した。 主たる説明変数は A1303, A4200(65 歳以上人口比 × 死亡率)であり、47 都道府県を対象とした分布の確認、相関の評価、2 変量可視化 を用いた分析を実施した。 分析の結果、上位 3 県・下位 3 県の特徴と、SSDSE-B-2026 の高齢化率と死亡率を散布図にすると、47 点が右上がりの強い直線関係(r ≈ +0.97)を描きます。」
「65 歳以上人口比 × 死亡率 を 47 都道府県で比較したところ、東京・神奈川・大阪など大都市圏が突出していることが分かった。 2 変量可視化 を用いた分析から、地域差は単に人口規模の違いだけでは説明できず、複数要因の組み合わせで生じていると示唆された。 今後の打ち手は、上位県のベストプラクティスを参考にしつつ、下位県への支援策を検討することである。」
「皆さん、2 変量可視化 はひとことで言うと『2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。』です。 今回は SSDSE-B-2026(総務省統計局, 47 都道府県, 2023 年度)を使って、実際の数字でこの考え方を確かめました。 皆さん自身でも、別の指標(人口、出生率、家計支出など)に置き換えて同じ手順を試してみてください。」
同じ用語でも、見る立場によって意味が変わります。3 つの視点を切り替えて、用語の輪郭を立体的に掴みましょう。
統計学者にとって 2 変量可視化 は「データから母集団を推定する道具」です。 確率モデル・尤度・不偏性・効率性・一致性などの数学的性質に注目し、漸近理論で性能保証を行います。 47 都道府県データは「小標本(n=47)」と分類され、bootstrap や情報量規準による補強が必要になります。
データサイエンティストにとって 2 変量可視化 は「ビジネス課題を数字で答えるパイプラインの 1 部品」です。 モデルの理論的性質より、運用性・解釈性・更新コストを重視します。 SSDSE のような公的データを用いるときは「データの出典・更新頻度・ライセンス」を最優先で確認します。
教育の現場では 2 変量可視化 は「初学者が躓きやすいポイント」を含む単元です。 抽象的な数式よりも、具体的な 47 都道府県データで手を動かし、図を描き、結果を口頭で説明できるようになることが目標になります。 本ページの並び(直感 → 数式 → 計算 → Python → 落とし穴)は、まさにこの教育的アプローチに沿っています。
視点切り替えの効果:1 つの用語を 3 通りに眺めると、自分が今どの立場で議論しているか自覚できます。 論文を読むときは ①、現場で使うときは ②、人に教えるときは ③ ── と意識的に切り替えてください。
2 変量可視化 と似た用語を、使い分けの観点から並べます。違いを言語化できれば、迷いが減ります。
| 用語 | 目的 | 入力 | 出力 | 強み | 弱み |
|---|---|---|---|---|---|
| 2 変量可視化 | 2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。 | 47 都道府県 × 約 110 変数 | 図 + 表 + 200 字レポート | 直感的、再現容易 | 小標本(n=47)の制約 |
| 相関係数 | 2 変量の同調を 1 数で要約 | x, y の 47 ペア | r ∈ [−1, +1] | シンプル | 非線形は捉えられない |
| 線形回帰 | 条件付き期待値の線形近似 | 説明変数群 | 回帰係数・予測値 | 解釈容易 | 非線形には弱い |
| ロジスティック回帰 | 2 値分類 | 説明変数群 | 確率 + 係数 | 分類問題の標準 | 線形決定境界 |
| ランダムフォレスト | 非線形分類・回帰 | 大量変数 | 予測 + 重要度 | 非線形対応 | 解釈やや難 |
2 変量可視化 は 可視化 の中で「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」を担う基本道具です。可視化 の他のトピックは、この基本の応用または並列の道具にあたります。
使えます。SSDSE-A(市区町村)、SSDSE-C(年次推移)、SSDSE-D・E(個票)など、2 変量可視化 の手順はそのまま適用できます。粒度(県・市・個人)に応じて n が変わるので、結果の信頼性も変わります。
SSDSE は年に 1 度更新されます。2 変量可視化 のコード自体は変更不要ですが、結果(数値・図)は最新年度のものに置き換えてレポートしましょう。出典欄に「SSDSE-B-2027(仮)」と書き換えるのを忘れずに。
できます。ピボット → グラフ → 関数 で代表値や相関は出ます。ただし、再現性・履歴管理・自動化の面で Python に劣ります。学習用には Python を強く勧めます。
進めます。2 変量可視化 は機械学習の「特徴量設計」と「結果解釈」の両端で必須です。AI と聞くと深層学習を連想しがちですが、SSDSE のような表形式データでは線形モデル + 2 変量可視化 の組み合わせで十分実用になります。
3 つ確認します:①ファイルパス(data/raw/SSDSE-B-2026.csv)が合っているか、②エンコーディングが cp932 か、③ヘッダ 2 行目の日本語ラベルを skiprows で飛ばしたか。これで 9 割解決します。
figures/ ディレクトリが存在しない可能性があります。import os; os.makedirs('figures', exist_ok=True) を先頭に追加してください。
本ページの 12 セクションを順に読み進めるのが最短です。特に「直感 → 数式 → 計算 → Python」の 4 段が腑に落ちれば、用語の 80 % は理解できたとみなせます。
このカードを印刷し、SSDSE-B-2026 で 1 回手を動かせば、用語の「使える形」が定着します。 2 変量可視化 はあくまで「2 つの変数の関係(相関・分布の重なり・因果の手掛かり)を 1 枚の図で表現する手法群。」というシンプルな考え方の道具ですので、迷ったらこの 1 行に戻ってください。