🔖 キーワード索引
データ可視化を理解するためのコアキーワードを一覧表示。 各チップをクリックすると本ページ内の該当セクションへジャンプする。
💡 30秒で分かる結論
🍰 まずはやさしく
データを図にする魔法のような技術です。
データの傾向や例外をすぐに見つけるために使います。
スマホの利用時間をグラフにするようなことです。
この章では、正しい図の選び方を学びます。
データを 視覚的に表現 し、 パターン・傾向・例外を発見しやすくする技術 Tukey の EDA(探索的データ解析)以来、 分析の 必須プロセス ライブラリ:matplotlib, seaborn, plotly, Tableau, Power BI 「いい可視化 = 短時間で正しい洞察」 ─ 棒・折れ線・散布・ヒートマップが基本 4 ダメな可視化(3D 円グラフ、 軸を歪めるグラフ)は 嘘より悪い
💡 30 秒で分かる結論
データ可視化 (data visualization) とは数値・分布・関係をグラフや図で表現する技法 であり、表で 100 行眺めるより 1 枚のグラフのほうが「全体の傾向・外れ値・関係性」を一瞬で掴める。
尺度に合わせた図種を選ぶ こと。 名義は棒・円、 順序は積み上げ棒、 量的単変量はヒスト・箱ひげ、 量的二変量は散布図、 多変量はヒートマップ・ペアプロット。
ヒストグラムのビン数 k は Sturges 公式 $k=\lceil\log_2 n+1\rceil$ や Scott の公式 で決める。 ビン幅を変えると印象が大きく変わるので注意。
SSDSE-B-2026 (47 都道府県) なら棒は人口比較、 散布図は人口と出生数の関係、 ヒートマップは指標間相関 に最適。 本ページでは Python で 4 種類実装する。
落とし穴は 3D 円グラフ、 軸切断、 色覚配慮欠落、 lie factor (面積と数値の不一致)、 オーバープロット 。 Tufte の「data-ink ratio を最大化、 chartjunk を最小化」を肝に銘じる。
📍 文脈 — どこで使う概念か
🍰 まずはやさしく
データの正体をあばくための道具です。
数字だけでは気づけない特徴を見つけるために使います。
部活の記録をまとめて、弱点を探すときに役立ちます。
この章では、分析の流れの中での役割を読みます。
データビジュアライゼーション(Data Visualization)は、 統計学・デザイン・認知科学を統合した実学です。 Edward Tufte の古典「The Visual Display of Quantitative Information」(1983)以来、 「データ→図→洞察」 の流れがデータサイエンスの中心になりました。 報告・プレゼン・EDA のあらゆる場面で必要。
📍 文脈ボックス: あなたが今見ているもの
あなたは「データ可視化」のページにいます。 これは 記述統計 / 探索的データ分析 (EDA) の中核手段 です。 統計量 (平均・分散) の数値だけでは見落とす「分布形状・外れ値・グループ差」を、 図で直観に訴えて発見する役目を担います。 上位概念は 記述統計 および EDA 、 隣接する技法は 棒グラフ ・ヒストグラム ・散布図 ・箱ひげ図 ・ヒートマップ 、 発展は BI ツール ・ネットワーク可視化 ・地理可視化 です。 まずは「目的 (比較 / 分布 / 関係 / 構成 / 時系列) → 図種 → 実装」の順で考える習慣を身につけましょう。
🎨 直感で掴む — 具体例で理解する
🍰 まずはやさしく
数字の海に地図を描くようなことです。
パッと見て意味がわかるようにするために使います。
テストの点数を並べて、誰が高いか比べることです。
この章では、目的ごとのグラフの使い分けを読みます。
基本グラフの使い分け:
グラフ種類 適したデータ 例
棒グラフ カテゴリ vs 数値 都道府県別人口
折れ線 時系列 月別売上推移
散布図 2 つの数値変数 身長 vs 体重
ヒストグラム 数値の分布 年齢分布
箱ひげ図 分布の比較 群別の収入分布
ヒートマップ 2 次元の濃淡 相関行列、 時間×場所
原則:「シンプルに、 正確に、 美しく」 。 デザインは情報伝達の手段で、 装飾ではない。
🎨 直感で掴む
47 都道府県の人口を「テキスト 47 行」で見せられても、 「東京が突出している」「上位 5 都府県で日本人口の約 38% を占める」といった事実は数秒では掴めない。 ところが 横棒グラフ 1 枚 に並べれば一瞬で見抜ける。 これが可視化の本質: 人間の視覚的パターン認識能力を借りて、 数値の海から構造を引き出す こと。
3 つの目的で図種を選ぶ:
比較 (大小を見たい) → 棒グラフ、 ドットプロット
分布 (ばらつきや形を見たい) → ヒストグラム、 箱ひげ図、 バイオリンプロット
関係 (2 変数以上の連動を見たい) → 散布図、 ヒートマップ、 ペアプロット
「美しいグラフ」とは飾りが多いものではなく、 Tufte の "data-ink ratio" (インクのうち本当にデータを表す割合) が高い、 シンプルで誤読を生まない図 のこと。 3D 円グラフのような「装飾だらけで読み取り辛い図」は典型的な反面教師。
🎨 色の選び方とアクセシビリティ
色は「データの型」に応じて適切なパレットを選ぶ:
カテゴリカル (qualitative) パレット : 区別したい群が 3-8 個。 Set1, Set2, Paired, Dark2。 色相 (hue) を均等に配置。
連続値 (sequential) パレット : 低-高の単方向。 viridis, plasma, magma, cividis, Blues, Reds。 明度 (lightness) が単調変化。
発散 (diverging) パレット : 中央値を境に正負へ。 RdBu, coolwarm, PiYG, BrBG。 相関行列・偏差地図に。
カラーブラインド対応 : 男性の約 8%、 女性の約 0.5% は P 型/D 型/T 型の色覚を持つ。 赤緑の組み合わせは避け、 viridis / cividis を使うか、 色 + 形 (○△□) や色 + パターン (実線/点線) を併用する。
パレット P/D 型対応 用途
viridis ◎ (推奨) 連続値 (汎用)
cividis ◎ (最良) 連続値 (色覚配慮特化)
RdBu △ (要注意) 発散値 (中央 0)
Reds/Greens 単色 ○ 単方向連続値
jet/rainbow × (非推奨) 明度非単調・色覚弱者に不可
📖 Tufte の原則と data-ink ratio
Edward Tufte 『The Visual Display of Quantitative Information』 (1983) は可視化の古典。 以下 6 原則が現代まで通用する:
データインクを最大化する : グラフのインクのうち、 実際にデータを表す部分の割合 (data-ink ratio) を高める。 影・グラデーション・3D は無駄インク。
chartjunk (グラフのゴミ) を消す : 装飾的なロゴ・派手な色・無意味な背景は読み取りを妨げる。
多変量を 1 枚に詰める (small multiples) : 同じ図形式で多次元データを並べる。 facet/ファセット表示。
嘘の係数 (lie factor) を 1 に保つ : グラフ上の効果と実データの効果が同じスケールで対応する。
data-density を高める : 単位面積あたりの情報量を最大化。
図と注釈・キャプションを統合する : グラフ単体で意味が完結するように。
data-ink ratio の例: 棒グラフで縦軸目盛りが「0, 50, 100, 150, 200」と書いてあるが、 データは「20, 40, 60, 80, 100」の範囲。 目盛り上限の半分しか使っていない → 軸を 0-100 に絞り、 グラフ高さを半分にするとデータ密度が 2 倍に上がる。
🚫 やってはいけないグラフ実例集
アンチパターン 問題点 代替案
3D 円グラフ 奥行きで手前のスライスが過大に見える 2D 円 or 棒グラフ
軸切断 (truncated axis) 5% 差が 5 倍差に見える 0 始まり棒 or 差分プロット
二重軸グラフ スケール任意設定で偽相関を演出 小区分パネル (small multiples)
面積比較に円 人間は面積判断が苦手 (長さの 2-3 倍誤差) 棒グラフ (長さ判断は精度高)
レーダーチャート濫用 頂点順序で印象が変わる、 比較困難 並列棒・ヒートマップ
虹色 (jet/rainbow) パレット 明度非単調で偽の境界が出る、 色覚配慮不可 viridis / cividis
対数軸を線形軸と誤読 指数増加が直線に見え、 増加率を誤認 明示的に "log" ラベル + 線形版併記
📜 可視化の歴史: Playfair から現代まで
データ可視化は 18 世紀末から発展してきた知的伝統:
年 人物 貢献
1786 William Playfair 折れ線・棒・円グラフを発明
1854 John Snow ロンドンコレラ流行の点地図 (空間疫学の父)
1858 Florence Nightingale クリミア戦争死因「鶏のとさか」図 (極座標棒)
1869 Charles Joseph Minard ナポレオン軍ロシア遠征の流量地図 (6 変数を 1 枚に)
1977 John Tukey EDA 提唱、 箱ひげ図・茎葉表示を発明
1983 Edward Tufte data-ink ratio・lie factor・small multiples を体系化
1999 Leland Wilkinson Grammar of Graphics 提唱 (ggplot2 の理論基盤)
2003 Hadley Wickham R で ggplot2 を実装
2010s Tableau, D3.js, plotly インタラクティブ可視化が一般化
2020s Observable, Vega-Lite 宣言的可視化 + ノートブック融合
Minard のナポレオン軍地図は「Edward Tufte が史上最高のグラフ」と評した作品で、 軍の進路・人数・温度・場所・方向・時間の 6 変数を 1 枚に統合した傑作。 200 年以上前のアイデアが現代のインフォグラフィックの原点となっている。
📐 定義
🍰 まずはやさしく
データを視覚的に表現するデザインのことです。
相手に正しく情報を伝えるために使います。
買い物した金額を、わかりやすく図にすることです。
この章では、伝わる図を作るためのルールを読みます。
データを視覚化する技術・デザイン
英語名 Data Visualization 、 カテゴリ:可視化。
📐 良い可視化の 10 原則 まとめ
目的を確定してから図種を選ぶ — 比較・分布・関係・構成・時系列・地理
適切な図種を選ぶ — 棒は比較、 ヒストは分布、 散布図は関係
軸ラベル・タイトル・出典を必ず付ける — 図単体で意味が通る
data-ink ratio を最大化 — 装飾を削り、 データだけを残す
軸を 0 始まりにする (棒) — 軸切断は印象操作
3D を避ける — lie factor が爆発する
カラーブラインド対応 — viridis / cividis、 形やパターンも併用
注釈で重要点を強調 — 灰色の中の赤、 矢印 + 説明
1 枚 1 メッセージ — 複数結論を 1 枚に詰めない
第三者に見せて検証 — 自分には自明でも他人は読めない
これらを意識すれば、 EDA から論文発表まで通用する可視化が作れる。 「美しい図」より「伝わる図」を目指すこと。
📖 ケーススタディ: 東京一極集中を 1 枚で伝える
仮想プロジェクト: 「日本の人口の東京集中度を一般紙の社会面で伝える図 1 枚を作る」というタスク。
Step 1. 目的を確定 : 「読者に『東京の異常な集中』を 5 秒で理解させる」 → メッセージは「東京は突出した存在」。
Step 2. 図種を選択 : 比較 + ランキング → 降順横棒グラフ 。 47 県すべて並べることで「東京がいかに違うか」を視覚的に伝える。
Step 3. 強調処理 : 東京の棒だけ赤 、 他の県は灰 。 「灰色の中の赤」原則。
Step 4. 注釈追加 : 東京の棒の隣に「14.1 百万人 (全国の 11.3%)」と数値を直接書く。
Step 5. キャプション : 「東京都の人口は最も少ない鳥取県 (54 万人) の 26 倍。 上位 5 都府県だけで全国の 37.7% を占める。 (出典: SSDSE-B-2026)」
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口)
北海道 5,092,000
東京都 14,086,000
沖縄県 1,468,000
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import pandas as pd
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
df_sorted = df . sort_values ( 'A1101' , ascending = True )
colors = [ '#E64A19' if name == '東京都' else '#BDBDBD' for name in df_sorted [ 'Prefecture' ]]
plt . figure ( figsize = ( 8 , 12 ))
plt . barh ( df_sorted [ 'Prefecture' ], df_sorted [ 'A1101' ] / 1000000 , color = colors )
plt . xlabel ( '総人口 (百万人)' )
plt . title ( '東京一極集中 — 47 都道府県人口ランキング' )
plt . figtext ( 0.5 , - 0.02 , '東京 14.1 百万人 = 全国の 11.3%。 上位 5 都府県で 37.7%。 (出典: SSDSE-B-2026)' ,
ha = 'center' , fontsize = 10 , style = 'italic' )
plt . tight_layout ()
plt . savefig ( 'tokyo_shock.png' , dpi = 120 , bbox_inches = 'tight' )
print ( 'saved: tokyo_shock.png' )
結果 : 「東京は他とは違う」が 1 秒で伝わる図。 同じデータでも「カラフルな円グラフ」より「灰色 + 赤の横棒」のほうが圧倒的に強い印象を残す。
🎓 上級者向け: matplotlib のオブジェクト指向 API
matplotlib には 2 つの書き方がある:
pyplot 命令型 (MATLAB 風) : plt.plot(), plt.title() など。 簡単だが複雑な図に向かない。
オブジェクト指向 (OO) : fig, ax = plt.subplots() として ax.plot(), ax.set_title()。 細部制御に最適、 上級者の標準。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A4101(出生数)
北海道 5,092,000 24,430
東京都 14,086,000 86,348
沖縄県 1,468,000 12,549
…(全 47 行)
📋 コピー 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 import pandas as pd
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
fig , ( ax1 , ax2 ) = plt . subplots ( 1 , 2 , figsize = ( 14 , 5 ))
# 左パネル: ヒストグラム
ax1 . hist ( df [ 'A1101' ] / 1000000 , bins = 7 , color = '#43A047' , edgecolor = 'white' )
ax1 . set_xlabel ( '人口 (百万人)' )
ax1 . set_ylabel ( '都道府県数' )
ax1 . set_title ( '(a) 人口分布' )
ax1 . spines [ 'top' ] . set_visible ( False )
ax1 . spines [ 'right' ] . set_visible ( False )
# 右パネル: 散布図
ax2 . scatter ( df [ 'A1101' ] / 1000000 , df [ 'A4101' ] / 1000 , s = 60 , alpha = 0.6 , color = '#E64A19' )
ax2 . set_xlabel ( '人口 (百万人)' )
ax2 . set_ylabel ( '出生数 (千人)' )
ax2 . set_title ( '(b) 人口 vs 出生数' )
ax2 . spines [ 'top' ] . set_visible ( False )
ax2 . spines [ 'right' ] . set_visible ( False )
ax2 . grid ( alpha = 0.3 )
fig . suptitle ( 'SSDSE-B-2026 概観' , fontsize = 14 , fontweight = 'bold' )
plt . tight_layout ()
plt . savefig ( 'oo_api.png' , dpi = 120 )
print ( 'saved: oo_api.png' )
OO API は複数パネル (subplots) や軸ごとのカスタマイズ (spines, ticks) に有利。 spines を非表示にするとdata-ink ratio が向上 し、 Tufte の原則に近づく。
🛠 SSDSE-B-2026 ミニプロジェクト 3 つ
プロジェクト 1: 47 都道府県の総合プロファイル ダッシュボード
目標 : Streamlit + plotly で「県を選ぶと 5 指標のレーダーチャート + 全国比較棒グラフ + 地方ブロック内順位」が表示されるダッシュボード。
必要ライブラリ : pandas, plotly.express, streamlit
工夫点 : ①ドロップダウンで県選択 ②plotly.express.line_polar でレーダー ③ st.metric で偏差値表示 ④ 共通カラーパレット (viridis) で 統一感
プロジェクト 2: 人口×経済の散布図アニメーション
目標 : Hans Rosling 風の動く散布図。 横軸=人口、 縦軸=合計特殊出生率、 バブルサイズ=総人口、 色=地方ブロック、 時間軸を年で進める。
必要ライブラリ : plotly.express の animation_frame 引数 1 つで実現可能。
工夫点 : ①対数軸で東京の外れを抑える ②再生速度をスライダーで調整 ③県名ホバー表示
プロジェクト 3: 都道府県別人口密度のコロプレス地図
目標 : folium + 国土数値情報の県境界 GeoJSON で人口密度のヒートマップ。
工夫点 : ①対数スケールで色分け (東京が突出するため) ②色は viridis ③ホバーで県名と密度表示 ④ HTML 出力でブラウザ共有可
📌 データ可視化 まとめ (本ページの核心)
可視化は探索と伝達の二刀流 — EDA では速さ重視、 発表では明瞭さ重視
目的から図種を選ぶ — 比較・分布・関係・構成・時系列・地理
data-ink ratio を最大化 — 装飾を削り、 データだけを残す
3D を避ける — 視覚判断精度ランキングの底辺
カラーブラインド対応 — viridis / cividis を標準パレットに
軸切断を避ける (棒) — 0 始まり厳守
ストーリー化 — 1 枚 1 メッセージ、 注釈で強調
第三者検証 — 「他人が読めるか」を必ず確認
これらを守れば、 SSDSE-B-2026 のような公的統計から「東京一極集中」「地方の高齢化」「経済規模の集中」などの社会の構造的事実 を強く伝える図が作れる。 統計学のスキルだけでなく、 「人にどう見せるか」のデザイン力もデータサイエンティストの必須能力。
🔍 「相関分析」ページとの関係
本サイトの 相関分析ページ でも SSDSE-B-2026 を使った散布図・ヒートマップを扱っている。 両ページの関係を整理する:
観点 相関分析ページ 本ページ (データ可視化)
主目的 関係性の数値化 (r 値、 p 値) 分布・関係・比較の視覚化全般
図種 散布図 + 回帰線 + 相関ヒートマップ 棒・ヒスト・散布・箱・線・地図 等
数学 Pearson/Spearman/Kendall 相関係数 Sturges/Scott/FD のビン数公式
前提知識 確率・統計の基礎 測定尺度・グラフ種類の基礎
関係性を「数値で」確認したいなら相関分析、 「視覚で」確認したいなら本ページの散布図セクション。 両方を使い分けるのが王道。
📖 可視化用語ミニ辞典
用語 意味
data-ink ratio グラフのインクのうちデータを表す割合 (Tufte, 1983)。 1 に近いほど良い。
chartjunk グラフの「ゴミ」。 装飾的だがデータを表さないインク。 3D・影・グラデーション等。
lie factor グラフ上の効果 ÷ 実データの効果。 1 が誠実、 2 以上は印象操作。
small multiples 同じ図形式で多群を並列表示。 facet とも。 Tufte が強く推奨。
aesthetic mapping データ変数を視覚属性 (x/y/色/形/サイズ) にマッピングすること。 Grammar of Graphics の中核。
geom (geometric object) グラフを構成する幾何要素 (点、 線、 棒、 帯)。 ggplot2 の geom_*()。
stat (statistical transformation) データに適用する統計変換 (集計、 密度推定、 回帰)。 ggplot2 の stat_*()。
facet グラフを変数値で小区分する。 ggplot2 の facet_wrap(), facet_grid()。
coordinate system 座標系。 直交 (cartesian)・極 (polar)・地理 (map) 等。 ggplot2 の coord_*()。
perceptual uniform 色空間で明度差と知覚差が一致する性質。 viridis/cividis はこれを満たす。
diverging palette 中央値を境に正負へ発散するカラーパレット。 RdBu, coolwarm。
sequential palette 低→高の単方向カラーパレット。 viridis, Blues。
overplotting 点が重なり過ぎて見えない現象。 alpha・hexbin・サンプリングで対処。
jitter 同じ x 値の点に小さなランダムノイズを加えて重なりを回避。
annotation layer グラフに注釈 (矢印、 テキスト、 ハイライト) を追加するレイヤー。
🎓 データ可視化を学ぶ学習パス
本ページの内容をどう学習に組み込むかの推奨ロードマップ:
Week 1: 基礎 — 図種選択 (棒・ヒスト・散布) + matplotlib 基礎 + SSDSE-B-2026 を 5 図描く
Week 2: 統計可視化 — seaborn (pairplot, boxplot, violinplot, heatmap) + Sturges/Scott のビン数
Week 3: デザイン原則 — Tufte 6 原則 + data-ink ratio + chartjunk + カラーブラインド対応
Week 4: ストーリーテリング — Knaflic の 5 ステップ + 注釈 + 1 枚 1 メッセージ
Week 5: インタラクティブ — plotly express + altair + bokeh の比較
Week 6: 地理可視化 — folium + コロプレス + GeoJSON
Week 7: ダッシュボード — Streamlit + plotly でミニダッシュボード構築
Week 8: 発表 — SSDSE-B-2026 を題材にプレゼン用図 1 枚を完成、 第三者査読
8 週間で「探索 → 発表」までの全工程をカバーできる。 各週に Tufte の本 1 章 + Knaflic の本 1 章を読むと理論と実践が並行で身につく。
📋 matplotlib / seaborn チートシート
用途 matplotlib seaborn
棒グラフ plt.bar()sns.barplot()
横棒 plt.barh()sns.barplot(orient='h')
ヒストグラム plt.hist()sns.histplot()
散布図 plt.scatter()sns.scatterplot(), sns.regplot()
箱ひげ plt.boxplot()sns.boxplot()
バイオリン plt.violinplot()sns.violinplot()
折れ線 plt.plot()sns.lineplot()
ヒートマップ plt.imshow(), plt.pcolormesh()sns.heatmap()
ペアプロット (なし) sns.pairplot()
小区分 plt.subplots()sns.FacetGrid()
サイズ指定 plt.figure(figsize=(w,h))height=, aspect=
配色 cmap='viridis'palette='viridis'
保存 plt.savefig('fig.png', dpi=300)(matplotlib と共通)
共通のコツ : plt.tight_layout() でレイアウト調整、 plt.style.use('seaborn-v0_8-whitegrid') で見栄え向上、 日本語は japanize-matplotlib パッケージで一括設定。
📐 数式または定義
ヒストグラム作成時のビン数 k の決定式 (Sturges, 1926):
$$k = \lceil \log_2 n + 1 \rceil$$
ここで $n$ はサンプル数。 標本サイズ $n=47$ なら $k = \lceil \log_2 47 + 1 \rceil = \lceil 5.55 + 1 \rceil = 7$ となる。
より正規分布に近いデータには Scott の公式 (1979) を使う:
$$h = \frac{3.49 \cdot \sigma}{n^{1/3}}, \quad k = \lceil (\max - \min) / h \rceil$$
ここで $h$ はビン幅、 $\sigma$ は標本標準偏差。
外れ値を含むデータには Freedman-Diaconis の公式 (IQR ベース):
$$h = \frac{2 \cdot \text{IQR}(x)}{n^{1/3}}$$
Tufte (1983) はデータインク比 (data-ink ratio) と嘘の係数 (lie factor) を定義した:
$$\text{data-ink ratio} = \frac{\text{データを表すインク量}}{\text{グラフ全体のインク量}}$$
$$\text{lie factor} = \frac{\text{グラフ上で示された効果の大きさ}}{\text{データ中の実際の効果の大きさ}}$$
data-ink ratio は 1 に近いほど良く、 lie factor は 0.95-1.05 の範囲が誠実。
🔬 記号・要素の読み解き
🔬 数式を言葉で読み解く
Sturges の公式 $k=\lceil\log_2 n+1\rceil$ を分解する:
記号 意味と背景
$k$ ヒストグラムのビン (区間) の数 。 値が小さすぎると分布の形を見落とし、 大きすぎるとノイズが目立つ。
$n$ 標本サイズ 。 多いほどビンを細かくしても各ビンに十分なサンプルが入る。
$\log_2$ 底 2 の対数 。 サンプルを 2 つに分け続けて何回でばらつくかを表す情報量的な発想。
$\lceil \cdot \rceil$ 切り上げ 。 ビン数は整数なので天井関数で丸める。
+1 分布の端を捉えるために 1 つ余分にビンを追加する補正項。
Scott の式は「データのばらつき $\sigma$ が大きいほど幅を広く、 サンプルが多い ($n^{1/3}$) ほど幅を狭く」という考え方。 Freedman-Diaconis は $\sigma$ の代わりに IQR (四分位範囲) を使うので外れ値に頑健。
lie factor が 2 ということは「データ上 2 倍の差なのに、 グラフでは 4 倍の差として表現されている」ということで、 軸切断や 3D 効果の濫用で発生する典型的な可視化詐欺。
🧮 数値例・実値計算
悪いグラフ vs 良いグラフ(よくある失敗例):
悪い例 問題 改善
3D 円グラフ 奥行きで面積が歪む 2D 棒グラフ
y 軸が 0 から始まらない 差を誇張 必ず 0 起点 or 注記
多すぎる色 意味不明 2〜5 色に絞る
凡例が遠い 視線移動が多い 凡例をデータの隣に
赤緑のみ 色覚多様性無視 青オレンジ + 形状
🧮 実値で計算してみる (SSDSE-B-2026, 47 都道府県)
SSDSE-B-2026 の総人口 (A1101) 47 都道府県を Sturges の公式でビン数を決めてみる。
n = 47 (都道府県数)
log_2(47) = log(47) / log(2) = 3.850 / 0.693 = 5.554
k = ceil(5.554 + 1) = ceil(6.554) = 7
→ Sturges に従うとビン数 k = 7
Scott の公式 (人口の標準偏差を 280 万、 範囲を 1380 万と仮定):
h = 3.49 * 2800000 / 47^(1/3)
= 3.49 * 2800000 / 3.609
= 2,707,648 (約 271 万人幅)
k = ceil(13800000 / 2707648) = ceil(5.10) = 6
→ Scott では k = 6 (Sturges より 1 つ少ない)
SSDSE-B-2026 の人口上位 5 県 (推計):
順位 都道府県 総人口 (千人) 全国シェア
1 東京都 14,086 11.3%
2 神奈川県 9,229 7.4%
3 大阪府 8,763 7.0%
4 愛知県 7,477 6.0%
5 埼玉県 7,331 5.9%
この 5 都府県だけで日本人口の 37.7% を占める。 数値表からも分かるが、 棒グラフにするとこの「上位集中」が一瞬で伝わる。
🧮 数式に値を入れて手で計算する: グラフのデータインク比
合成データで Tufte のデータインク比を計算 (情報伝達インク / 総インク)。
Step 1: グラフ要素の面積 [pixel²]
要素 面積 情報伝達?
棒の色塗り 5000 ○ 枠線 1000 × 3D 影 2000 × 軸 500 ○ グリッド 1500 ×
Step 2: データインク比
情報伝達インク = 5000 + 500 = 5,500
総インク = 5000+1000+2000+500+1500 = 10,000
データインク比 = 5500/10000 = 0.55
🐍 Python で再現
📋 コピー import numpy as np
area = np . array ([ 5000 , 1000 , 2000 , 500 , 1500 ])
info = np . array ([ 1 , 0 , 0 , 1 , 0 ])
ratio = ( area * info ) . sum () / area . sum ()
print ( f "情報インク: { ( area * info ) . sum () } " )
print ( f "総インク: { area . sum () } " )
print ( f "比率: { ratio } " )
📤 実行結果
情報インク: 5500
総インク: 10000
比率: 0.55
💬 手計算 (Step 2) 0.55 と Python 出力が完全一致。
🐍 Python 実装例
最小コードで動かしてみる例:
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A1303(65歳以上人口) A4200(死亡数)
北海道 5,092,000 1,681,000 75,120
東京都 14,086,000 3,205,000 137,241
沖縄県 1,468,000 350,000 15,110
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 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' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
df [ '高齢化率' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢人口/総人口
df [ '死亡率' ] = df [ 'A4200' ] / df [ 'A1101' ] * 1000 # 死亡数/総人口(‰)
# 散布図に回帰直線 + 信頼帯
sns . regplot ( data = df , x = '高齢化率' , y = '死亡率' )
plt . title ( '高齢化率 vs 死亡率(47都道府県)' )
plt . xlabel ( '高齢化率 (%)' )
plt . ylabel ( '死亡率 (‰)' )
plt . tight_layout ()
plt . show ()
🐍 さらに進んだ Python 実装 (発展編 4 本)
⑤ ペアプロット: 47 都道府県 × 5 指標を 1 枚に
🎯 このコードでやること : SSDSE-B-2026 の主要 5 指標で seaborn の pairplot を描き、 25 マスで全関係を一望する。 対角はヒストグラム、 非対角は散布図。
📥 入力データ : A1101 (総人口) / A1301 (年少人口) / A1303 (高齢人口) / A4101 (出生数) / A9101 (婚姻件数) の 47×5 表
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 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' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
cols = [ 'A1101' , 'A1301' , 'A1303' , 'A4101' , 'A9101' ]
labels = [ '総人口' , '年少人口' , '高齢人口' , '出生数' , '婚姻件数' ]
sub = df [ cols ] . rename ( columns = dict ( zip ( cols , labels ))) / 1000000
g = sns . pairplot ( sub , diag_kind = 'hist' , plot_kws = { 'alpha' : 0.6 , 's' : 40 })
g . fig . suptitle ( 'SSDSE-B-2026 主要 5 指標のペアプロット' , y = 1.01 )
plt . tight_layout ()
plt . savefig ( 'pairplot.png' , dpi = 120 )
print ( 'saved: pairplot.png' )
📤 実行すると次の出力が得られる :
saved: pairplot.png
(対角 5 マス: 各指標のヒストグラム = すべて右歪)
(非対角 20 マス: 散布図 = すべて強い線形関係)
(東京は各散布図で右上端の外れ値として目立つ)
💬 結果の読み方 : 5 指標がすべて互いに強相関 (人口規模が交絡)。 ペアプロットは多変量探索の第一歩として極めて有効。 ただし変数 6 つを超えると視認性が落ちる。
⑥ 並列箱ひげ: 8 地方ブロック別の人口分布比較
🎯 このコードでやること : 47 都道府県を 8 地方ブロック (北海道・東北・関東・中部・近畿・中国・四国・九州沖縄) に分け、 並列箱ひげで人口分布を比較する。
📥 入力データ : SSDSE-B-2026 + 都道府県→地方ブロック辞書 (直書き)
📋 コピー 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 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' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
region_map = {
'北海道' : '北海道' ,
'青森県' : '東北' , '岩手県' : '東北' , '宮城県' : '東北' , '秋田県' : '東北' , '山形県' : '東北' , '福島県' : '東北' ,
'茨城県' : '関東' , '栃木県' : '関東' , '群馬県' : '関東' , '埼玉県' : '関東' , '千葉県' : '関東' , '東京都' : '関東' , '神奈川県' : '関東' ,
'新潟県' : '中部' , '富山県' : '中部' , '石川県' : '中部' , '福井県' : '中部' , '山梨県' : '中部' , '長野県' : '中部' , '岐阜県' : '中部' , '静岡県' : '中部' , '愛知県' : '中部' ,
'三重県' : '近畿' , '滋賀県' : '近畿' , '京都府' : '近畿' , '大阪府' : '近畿' , '兵庫県' : '近畿' , '奈良県' : '近畿' , '和歌山県' : '近畿' ,
'鳥取県' : '中国' , '島根県' : '中国' , '岡山県' : '中国' , '広島県' : '中国' , '山口県' : '中国' ,
'徳島県' : '四国' , '香川県' : '四国' , '愛媛県' : '四国' , '高知県' : '四国' ,
'福岡県' : '九州沖縄' , '佐賀県' : '九州沖縄' , '長崎県' : '九州沖縄' , '熊本県' : '九州沖縄' , '大分県' : '九州沖縄' , '宮崎県' : '九州沖縄' , '鹿児島県' : '九州沖縄' , '沖縄県' : '九州沖縄'
}
df [ '地方' ] = df [ 'Prefecture' ] . map ( region_map )
df [ '人口(百万)' ] = df [ 'A1101' ] / 1000000
order = [ '北海道' , '東北' , '関東' , '中部' , '近畿' , '中国' , '四国' , '九州沖縄' ]
plt . figure ( figsize = ( 10 , 6 ))
sns . boxplot ( data = df , x = '地方' , y = '人口(百万)' , order = order , palette = 'viridis' )
plt . title ( '地方ブロック別 都道府県人口分布' )
plt . tight_layout ()
plt . savefig ( 'region_box.png' , dpi = 120 )
print ( 'saved: region_box.png' )
📤 実行すると次の出力が得られる :
saved: region_box.png
(関東: 中央値が突出、 東京が外れ値として上に)
(近畿: 中央値次点、 大阪・兵庫が大)
(中国・四国: 中央値最低、 ばらつき小)
💬 結果の読み方 : 関東 (特に東京) と近畿 (大阪) の中央値が突出。 中国・四国は人口少県が集中。 「都市圏 vs 地方圏」の格差が箱ひげの位置と幅で見える。
⑦ 折れ線で時系列を可視化 (架空年次データ)
🎯 このコードでやること : SSDSE-B-2026 から 4 大都府県を抜粋し、 仮想的に 2015-2025 の人口推移 (実値ベースの推計値) を折れ線グラフで描く。
📥 入力データ : SSDSE-B-2026 の現在値 + 年率推定 (例: 東京 0.2% 増, 大阪 0.1% 減 等の公表数値)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
years = np . arange ( 2015 , 2026 )
# 公表ベースの年率変化 (例: 総務省人口推計より)
rates = { '東京都' : 0.002 , '大阪府' : - 0.001 , '神奈川県' : 0.001 , '愛知県' : 0.0 }
plt . figure ( figsize = ( 10 , 6 ))
for pref , r in rates . items ():
base = df . loc [ df [ 'Prefecture' ] == pref , 'A1101' ] . values [ 0 ]
series = [ base * ( 1 + r ) ** ( y - 2025 ) for y in years ]
plt . plot ( years , np . array ( series ) / 1000000 , marker = 'o' , label = pref )
plt . xlabel ( '年' )
plt . ylabel ( '人口 (百万人)' )
plt . title ( '4 大都府県の人口推移 (2015-2025, 推計)' )
plt . legend ()
plt . grid ( alpha = 0.3 )
plt . tight_layout ()
plt . savefig ( 'pop_timeseries.png' , dpi = 120 )
print ( 'saved: pop_timeseries.png' )
📤 実行すると次の出力が得られる :
saved: pop_timeseries.png
(東京: 緩やかな増加トレンド)
(大阪: 緩やかな減少トレンド)
(神奈川: 微増、 愛知: 横ばい)
💬 結果の読み方 : 折れ線は変化のトレンド を見るのに最適。 東京一極集中の継続、 大阪の緩減等が一目瞭然。 ただし「年率を仮定した推計」なので実データを使う場合は人口推計を別途取得すること。
⑧ コロプレス地図 (folium で都道府県別人口可視化)
🎯 このコードでやること : folium で日本地図を作成し、 都道府県の境界 (GeoJSON) を読み、 人口に応じて色塗りした地理可視化を行う。 出力は HTML マップ。
📥 入力データ : SSDSE-B-2026 (人口) + 都道府県境界 GeoJSON (国土数値情報など公開ファイル)
🗾
地図データ(GeoJSON)はこの教材に同梱していません。 このページの地図のコードは
data/raw/japan_prefectures.geojson(または
data/raw/japan_pref.geojson)を読みますが、教材には入れていないため、ブラウザの「▶ 実行」では動きません。
座標や境界をこちらで作ることはしません (地理データを捏造すると、地図が実在しない形を示してしまうためです)。
自分で動かすときは、公開されている都道府県境界データを取得して同じ場所に置いてください。例:
dataofjapan/land の japan.geojson (
data/raw/japan_prefectures.geojson という名前で保存すれば、コードはそのまま動きます)。
地図が無くても、同じ「地域差」は散布図・棒ひげ図・ランキング表で読み取れます。このページの他のコードはそのまま実行できます。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import pandas as pd
import folium
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , header = 1 ) . query ( '`SSDSE-B-2026` == 2023' )
m = folium . Map ( location = [ 36.5 , 138 ], zoom_start = 5 )
folium . Choropleth (
geo_data = 'data/raw/japan_prefectures.geojson' ,
data = df ,
columns = [ 'Prefecture' , 'A1101' ],
key_on = 'feature.properties.name' ,
fill_color = 'YlOrRd' ,
legend_name = '総人口 (人)'
) . add_to ( m )
m . save ( 'japan_pop_map.html' )
print ( 'saved: japan_pop_map.html' )
📤 実行すると次の出力が得られる :
saved: japan_pop_map.html
(東京・神奈川・大阪・愛知が濃い赤)
(鳥取・島根・高知が薄い黄)
(ブラウザで開くとズーム・パンが可能なインタラクティブマップ)
💬 結果の読み方 : 地理的な分布が一目瞭然。 「太平洋ベルト地帯」と呼ばれる人口密集地域が視覚的に浮かび上がる。 ただし「面積大の北海道が赤くても人口は中位」のような注意も必要 (人口密度の可視化と使い分け)。
🐍 Python 実装
① 横棒グラフ: 47 都道府県の人口ランキング
🎯 このコードでやること : SSDSE-B-2026 を pandas で読み、 総人口 (A1101) を降順ソートして matplotlib で横棒グラフ化する。 上位集中が一目で分かる。
📥 入力データ (SSDSE-B-2026 抜粋) :
SSDSE-B-2026 都道府県 A1101 (総人口, 千人)
2023 R01000 北海道 5092
2023 R13000 東京都 14086
2023 R27000 大阪府 8763
...
2023 R47000 沖縄県 1468
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 import pandas as pd
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
df_sorted = df . sort_values ( 'A1101' , ascending = True )
plt . figure ( figsize = ( 8 , 12 ))
plt . barh ( df_sorted [ 'Prefecture' ], df_sorted [ 'A1101' ] / 1000 , color = '#1976D2' )
plt . xlabel ( '総人口 (百万人)' )
plt . title ( '都道府県別総人口 (SSDSE-B-2026)' )
plt . tight_layout ()
plt . savefig ( 'pop_bar.png' , dpi = 120 )
print ( 'saved: pop_bar.png' )
print ( df_sorted [[ 'Prefecture' , 'A1101' ]] . tail ( 5 ))
📤 実行すると次の出力が得られる :
saved: pop_bar.png
Prefecture A1101
120 埼玉県 7331000
264 愛知県 7477000
312 大阪府 8763000
156 神奈川県 9229000
144 東京都 14086000
💬 結果の読み方 : 東京都の棒だけ突出し、 鳥取・島根・高知などは画像上で小さな線にしか見えない。 「上位集中」がインクの密度で直観的に伝わる。
② ヒストグラム: 都道府県人口の分布形状
🎯 このコードでやること : Sturges 公式でビン数 7 を自動算出し、 人口分布のヒストグラムを描く。 右に長い裾 (右歪) が見える。
📥 入力データ : ①と同じ df の A1101 列 (47 値)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
pop = df [ 'A1101' ] / 1000000 # 百万人単位
n = len ( pop )
k = int ( np . ceil ( np . log2 ( n ) + 1 )) # Sturges
print ( f 'n= { n } , Sturges k= { k } ' )
plt . figure ( figsize = ( 9 , 5 ))
plt . hist ( pop , bins = k , color = '#43A047' , edgecolor = 'white' )
plt . xlabel ( '総人口 (百万人)' )
plt . ylabel ( '都道府県数' )
plt . title ( f '都道府県別人口分布 (n= { n } , ビン数= { k } )' )
plt . tight_layout ()
plt . savefig ( 'pop_hist.png' , dpi = 120 )
print ( 'saved: pop_hist.png' )
📤 実行すると次の出力が得られる :
n=47, Sturges k=7
saved: pop_hist.png
(左端ビン [0, 2] に 30 県以上、 右端ビン [12, 14] に 1 県 (東京) という強い右歪分布)
💬 結果の読み方 : 平均でも中央値でもなく、 分布の形 (右歪) が一目で分かる。 東京が外れ値であること、 大多数の県は 1-3 百万人帯に集中していることがビン高で伝わる。
③ 散布図: 人口と出生数の関係
🎯 このコードでやること : 横軸 = 総人口、 縦軸 = 出生数で散布図を描き、 47 都道府県をプロットする。 ほぼ直線関係 (r>0.99) が浮かび上がる。
📥 入力データ : SSDSE-B-2026 から A1101 (総人口) と A4101 (出生数)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import pandas as pd
import matplotlib.pyplot as plt
# header=1 で読むと年度の列名は '年度'(英字コードの 'SSDSE-B-2026' ではない)
df = ( pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
. query ( '`SSDSE-B-2026` == 2023' )
. reset_index ( drop = True )) # x[i] で位置指定するので添字を振り直す
x = df [ 'A1101' ] / 1000000 # 人口 (百万人)
y = df [ 'A4101' ] / 1000 # 出生数 (千人)
plt . figure ( figsize = ( 8 , 6 ))
plt . scatter ( x , y , s = 60 , alpha = 0.7 , color = '#E64A19' )
for i , name in enumerate ( df [ 'Prefecture' ]):
if x [ i ] > 5 : # 人口 500 万超の県だけラベル表示
plt . annotate ( name , ( x [ i ], y [ i ]), fontsize = 9 )
plt . xlabel ( '総人口 (百万人)' )
plt . ylabel ( '出生数 (千人)' )
plt . title ( '人口と出生数の関係 (SSDSE-B-2026)' )
plt . grid ( alpha = 0.3 )
plt . tight_layout ()
plt . savefig ( 'pop_gdp_scatter.png' , dpi = 120 )
print ( 'saved: pop_gdp_scatter.png' )
📤 実行すると次の出力が得られる :
saved: pop_gdp_scatter.png
(右上に「東京都」ラベル、 ほぼ直線上に点が並ぶ。 大阪・神奈川・愛知が次のクラスタ)
💬 結果の読み方 : 散布図は関係性 を可視化する代表手段。 直線的に並んでいれば線形相関があり、 r>0.99 が予想できる。 東京は人口あたり出生数がやや低めの外れ値であることも目視可能。
④ ヒートマップ: 5 指標の相関行列
🎯 このコードでやること : SSDSE-B-2026 から複数指標を選び、 ピアソン相関行列を計算して seaborn でヒートマップ化する。 強い相関ペアが色で一目瞭然。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A9101(婚姻件数)
北海道 5,092,000 514,000 1,681,000 24,430 17,281
東京都 14,086,000 1,513,000 3,205,000 86,348 71,774
沖縄県 1,468,000 236,000 350,000 12,549 6,316
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 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' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
cols = [ 'A1101' , 'A1301' , 'A1303' , 'A4101' , 'A9101' ]
labels = [ '総人口' , '年少人口' , '高齢人口' , '出生数' , '婚姻件数' ]
sub = df [ cols ] . rename ( columns = dict ( zip ( cols , labels )))
corr = sub . corr ()
print ( corr . round ( 3 ))
plt . figure ( figsize = ( 7 , 6 ))
sns . heatmap ( corr , annot = True , fmt = '.2f' , cmap = 'RdBu_r' , vmin =- 1 , vmax = 1 ,
square = True , cbar_kws = { 'shrink' : 0.8 })
plt . title ( 'SSDSE-B-2026 指標間の相関' )
plt . tight_layout ()
plt . savefig ( 'corr_heatmap.png' , dpi = 120 )
print ( 'saved: corr_heatmap.png' )
📤 実行すると次の出力が得られる :
総人口 年少人口 高齢人口 出生数 婚姻件数
総人口 1.000 0.997 0.991 0.995 0.989
年少人口 0.997 1.000 0.988 0.998 0.984
高齢人口 0.991 0.988 1.000 0.980 0.963
出生数 0.995 0.998 0.980 1.000 0.991
婚姻件数 0.989 0.984 0.963 0.991 1.000
saved: corr_heatmap.png
💬 結果の読み方 : ほぼ全ペアが r>0.96 で真っ赤に塗りつぶされる。 これは「人口で標準化していない絶対量同士は互いに強相関」という共通の交絡 (人口規模) が見えている証拠。 1 人あたり指標に換算すると相関は劇的に弱まる。
🎮 触って理解する — 同じデータでも「見せ方」で印象が変わる
グラフは「データの写真」ではなく「データの翻訳」である。 図種の選択・軸の始点・装飾の量という翻訳の仕方を変えるだけで、 同じ実測値がまったく違う印象を与える 。 このラボでは SSDSE-B-2026 の実測値 2 セット — 中国 5 県の総人口 (A1101, 2023 年度: 鳥取 537 / 島根 650 / 岡山 1,847 / 広島 2,738 / 山口 1,298 千人) と 広島県の出生数の推移 (A4101, 2012 年度 24,846 人 → 2023 年度 16,682 人, 約 33% 減) — を、 棒・折れ線・円に切り替え、 さらに「Y 軸ゼロ起点」と「3D 風装飾」を ON/OFF して、 誠実な可視化と誤解を招く可視化の分岐点を体感する。
使い方 : ① データと図種を選ぶ → ② 「Y軸ゼロ起点」を OFF にして棒グラフの印象変化を見る → ③ 「3D風装飾」を ON にしてチャートジャンクを体感 → ④ 下の判定パネルで「嘘の係数 (lie factor)」を確認。 ゼロ起点 OFF のとき、 グラフ上を上下にドラッグ (スマホは指でなぞる) と Y 軸の下限を自由に操作でき、 誇張の度合いがリアルタイムで変わる。
データ:
中国5県の総人口 (2023)
広島県の出生数推移 (2012–23)
図種:
📊 棒
📈 折れ線
🥧 円
Y軸ゼロ起点
3D風装飾
出典: SSDSE-B-2026 (総人口 A1101・出生数 A4101, いずれも実測値をそのまま埋め込み)
🧠 なぜ一瞬で騙されるのか — 前注意的処理と視覚変数
人間の視覚は、 色・長さ・傾き・大きさといった特徴を約 200 ミリ秒以内・無意識のうちに並列処理 する (前注意的処理, preattentive processing)。 グラフが「一瞬で伝わる」のはこの仕組みのおかげだが、 裏を返せば騙されるときも一瞬 だということ。 意識的な検証 (軸の目盛りを読む) より先に、 「長い棒 = 大きい」「急な傾き = 激変」という印象が脳に刻まれてしまう。
Cleveland & McGill (1984) の実験は、 視覚属性 ごとの読み取り精度に明確な序列があることを示した: 共通軸上の位置 > 長さ > 傾き・角度 > 面積 > 色の濃淡 。 棒グラフが強いのは最上位の「位置・長さ」を使うから。 円グラフが弱いのは中位の「角度」を使うからで、 上のラボで岡山 (26.1%) と山口 (18.4%) のスライスを見比べると、 7.7 ポイントの差が角度からは掴みにくいことが分かる。 3D 装飾はこの序列をさらに壊し、 「面積 + 遠近感」という最も不正確なチャンネルへ読み取りを追いやる。
⚠️ ラボで体感できる 3 つの落とし穴
軸切断 (truncated axis) : Tufte の嘘の係数は $\text{lie factor} = \dfrac{\text{グラフ上の効果の大きさ}}{\text{データ上の効果の大きさ}}$ で定義され、 1 から離れるほど不誠実。 棒グラフは「長さ = 量」の約束で読まれるため、 下限を切り上げた瞬間にこの約束が破られる。 ラボの判定パネルは、 ドラッグ操作に応じて lie factor を実測値から逐次計算して表示する。 一方折れ線は「位置 (傾き)」で読む図 なので、 変化の検出が目的なら非ゼロ起点も許容されることが多い — 「棒は厳格、 線は文脈次第」と覚える。
チャートジャンク (3D 風装飾) : 3D 化してもデータは 1 bit も増えないのに、 天面のどこを読むかで値が変わって見え、 data-ink ratio は下がる。 特に 3D 円グラフは手前のスライスが奥行きの分だけ面積過大になり、 lie factor が構造的に 1 を超える。
図種のミスマッチ : 名義尺度 (県) を折れ線で結ぶと存在しない「推移」を暗示し、 時系列 (年度) を円グラフにすると意味のない「構成比」を捏造する。 円が正当化されるのは「全体に占める割合」に意味がある場合だけ — 中国 5 県の人口なら「中国地方計 7,070 千人に占めるシェア」という読みに限り成立する。
📝 チャート選択クイズ — 目的から図種を即答できるか
可視化設計の第一歩は「目的 → 図種」の即答力。 比較→棒、 推移→折れ線、 構成比→円・帯、 分布→ヒストグラム、 関係→散布図 の対応を、 SSDSE-B-2026 の実データを題材にした 5 問で確認しよう。
スコア: 0 / 5
↺ リセット
🚀 発展 — このラボの先へ
ここで扱った「静的な見せ方の選択」の次の段階が、 ユーザー操作でビューを変えるインタラクティブ可視化 である。 ブラシ選択・ズーム・ツールチップの操作原理は姉妹ページ インタラクティブ可視化 で同じく手を動かして学べる。 個別の図種の作法は 棒グラフ ・折れ線グラフ ・円グラフ ・ヒストグラム ・散布図 の各ページへ、 そして「騙すグラフ」の体系的なカタログは 誤解を招くグラフ にまとまっている。 ラボで体感した「同じデータ・違う印象」の感覚を持ってこれらを読むと、 単なる知識が設計判断の基準 に変わるはずだ。
⚠️ よくある落とし穴
❌ チャートジャンク
装飾過多で情報が見えなくなる。 Tufte の警告通り、 余計な要素を削る。
❌ 軸の操作
y 軸を 0 から始めないと差を誇張できる。 報道・広告で頻発する 嘘グラフ 。
❌ 情報過多
1 枚に 10 系列以上は読めない。 ファセット分割(小倍数)を使う。
❌ 3D の濫用
見栄え重視で 3D 円グラフ等を使うと、 比較の精度が落ちる。
❌ 色覚多様性無視
赤緑だけで分けると 5% の人に読めない。 形状や濃淡を併用。
⚠️ 落とし穴
3D 円グラフ・3D 棒グラフを使う : 奥行きで面積が歪み、 lie factor が 1.5-3 に達する。 円グラフを使うなら 2D、 比較が主目的なら棒グラフが鉄則。 Tufte は「3D 効果は意味なきインク (chartjunk) の代表」と断じている。
軸を 0 から始めない (軸切断) : 棒グラフで y 軸を 90-100 にすれば、 5% 差が 5 倍差のように見える。 「印象操作」と呼ばれる典型的詐欺。 棒・面積系は必ず 0 始まり、 折れ線は文脈次第で許容される。
色覚多様性を無視する : 赤と緑を二値分類で使うと、 8% の男性 (P/D 型色覚) には区別できない。 viridis / cividis / カラーブラインド対応パレットを選び、 色だけでなく形・パターンも併用する。
オーバープロット (重なりすぎ) : n=10000 の散布図は黒い塊になる。 alpha=0.1 で半透明、 hexbin / 2D ヒスト / KDE 等密度可視化に切り替える。
chartjunk と data-ink ratio : 影、 グラデーション、 不要なグリッド、 大きな枠線などはデータを表していないインクで、 data-ink ratio を下げる。 「削れば削るほど良くなる」が Tufte の原則。
📚 図種別 20 種類カタログ
📚 図種別 20 種類カタログ
図種 適用場面 注意点
棒グラフ カテゴリ間の量比較 y 軸 0 始まり厳守
横棒グラフ カテゴリ名が長い場合 降順ソートで可読性向上
積み上げ棒 合計 + 内訳 3 種類以上は内訳判読困難
グループ棒 2 変数×カテゴリ 凡例を明確に
円グラフ 構成比 (5 分類まで) 3D 禁止、 比較なら棒
ドーナツ図 円グラフ + 中央に合計 円グラフより数値表示しやすい
ヒストグラム 量的単変量の分布 ビン数で印象が変わる
箱ひげ図 5 数要約 + 外れ値 分布の双峰性は見えない
バイオリンプロット 箱ひげ + 密度推定 読み方が高度
散布図 2 量的変数の関係 オーバープロットに注意
バブルチャート 散布図 + 第 3 変数 面積判断は誤差大
折れ線グラフ 時系列・順序変化 5 系列以上は混雑
面グラフ 時系列の累積・合計 複数系列は積み上げで
ヒートマップ 行列値の濃淡 配色重要 (viridis 推奨)
ペアプロット 多変量の全関係一覧 変数 6 つまでが見やすい
ツリーマップ 階層構造の構成比 面積判断は曖昧
サンキー図 フローの流量 3 段以上は読み難い
コロプレス地図 地域別量 面積大の地域が目立ち過ぎる
レーダーチャート 複数指標の総合比較 軸順序で印象が変わる
ガントチャート プロジェクト工程 依存関係を別軸で
🚀 発展的可視化技法
基本図種に加えて知っておくと役立つ高度な技法:
small multiples (ファセット) : 同じ図形式で複数群を並列。 8 地方ブロック別人口分布を 8 枚並べる等。 Tufte が強く推奨。
parallel coordinates plot : 多変量を縦の平行軸で表現。 各個体は折れ線として描かれる。 47 都道府県×7 指標を 1 画面に。
radar / spider chart : 複数指標の総合比較。 ただし軸順序で印象が変わる弱点あり。 5-8 軸まで。
chord diagram : 集団間の関係 (流量) を環状に。 県間人口移動などに。
sunburst chart : 階層構造を環状に。 産業中分類 → 小分類などの階層に。
treemap : 階層構造を入れ子矩形で。 大カテゴリ + 内訳の構成比。
animated chart : 時系列を動画で。 Hans Rosling の Gapminder が有名。 plotly.express で動的に。
3D scatter : 3 変量。 ただし回転しないと判読難しい (インタラクティブ前提)。
contour plot : 等高線。 KDE で 2 変量分布を表現。
hexbin plot : 大規模散布図のオーバープロット対策。 六角形セルで密度を色濃度に。
📝 練習問題 (実データで自分の手を動かす)
Q1. ヒストグラムのビン数を変えて印象の違いを確認する
課題 : SSDSE-B-2026 の総人口 (A1101) について、 ビン数を k=3, 7, 15, 47 と 4 通り変えてヒストグラムを描き、 並べて比較せよ。 どのビン数が「実態を最もよく表す」か、 自分の言葉で論じよ。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口)
北海道 5,092,000
東京都 14,086,000
沖縄県 1,468,000
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import pandas as pd
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
pop = df [ 'A1101' ] / 1000000
fig , axes = plt . subplots ( 2 , 2 , figsize = ( 12 , 8 ))
for ax , k in zip ( axes . flat , [ 3 , 7 , 15 , 47 ]):
ax . hist ( pop , bins = k , color = '#43A047' , edgecolor = 'white' )
ax . set_title ( f 'k= { k } ' )
ax . set_xlabel ( '人口 (百万人)' )
ax . set_ylabel ( '都道府県数' )
plt . tight_layout ()
plt . savefig ( 'hist_bins.png' , dpi = 120 )
print ( 'saved: hist_bins.png' )
📤 期待される観察 : k=3 では大雑把すぎて分布の形が分からない、 k=47 では各ビン 1 県となりノイズだらけ、 k=7 (Sturges) や k=15 (Scott) が妥当。 Sturges 公式の経験則の意味が腑に落ちる。
Q2. 散布図の外れ値処理
課題 : 人口 vs 出生数の散布図を描き、 ①全 47 都道府県、 ②東京を除外、 ③東京・大阪・神奈川・愛知の 4 大都府県を除外、 の 3 パターンで回帰直線を引け。 傾きと R² がどう変わるか論じよ。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A4101(出生数)
北海道 5,092,000 24,430
東京都 14,086,000 86,348
沖縄県 1,468,000 12,549
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
x = df [ 'A1101' ] / 1000000
y = df [ 'A4101' ] / 1000000
for label , mask in [( '全 47 県' , df . index . notna ()),
( '東京除外' , df [ 'Prefecture' ] != '東京都' ),
( '4 大都市除外' , ~ df [ 'Prefecture' ] . isin ([ '東京都' , '大阪府' , '神奈川県' , '愛知県' ]))]:
xx , yy = x [ mask ], y [ mask ]
slope , intercept , r , p , _ = linregress ( xx , yy )
print ( f ' { label } : slope= { slope : .3f } , R²= { r ** 2 : .3f } , p= { p : .2e } ' )
📤 期待される観察 : 全 47 県では R²>0.94 だが、 4 大都市除外で 0.7 程度に低下することがある。 外れ値の有無で「強相関」の見え方が大きく変わる。
Q3. 色覚配慮の確認
課題 : 相関ヒートマップを (a) jet パレット (b) viridis パレット (c) cividis パレットの 3 通りで描き、 グレースケールに変換しても識別可能か確認せよ (PIL でモノクロ化)。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口) A1301(15歳未満人口) A1303(65歳以上人口) A4101(出生数) A9101(婚姻件数)
北海道 5,092,000 514,000 1,681,000 24,430 17,281
東京都 14,086,000 1,513,000 3,205,000 86,348 71,774
沖縄県 1,468,000 236,000 350,000 12,549 6,316
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14 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' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
corr = df [[ 'A1101' , 'A1301' , 'A1303' , 'A4101' , 'A9101' ]] . corr ()
fig , axes = plt . subplots ( 1 , 3 , figsize = ( 18 , 5 ))
for ax , cmap in zip ( axes , [ 'jet' , 'viridis' , 'cividis' ]):
sns . heatmap ( corr , annot = True , fmt = '.2f' , cmap = cmap , ax = ax , cbar = True )
ax . set_title ( f 'cmap= { cmap } ' )
plt . tight_layout ()
plt . savefig ( 'cmap_compare.png' , dpi = 120 )
print ( 'saved: cmap_compare.png' )
📤 期待される観察 : jet は明度が非単調なのでグレースケール変換で偽境界が出る。 viridis/cividis は明度単調で色覚配慮あり。 cividis は P/D 型色覚への配慮が最も強い。
Q4. 軸切断による誤読の演出
課題 : 上位 5 都府県の人口を (a) y 軸 0 始まり (b) y 軸を 6 から始める の 2 通りで棒グラフ化し、 同じデータでも印象がどう変わるか比較せよ。
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行)
都道府県 A1101(総人口)
北海道 5,092,000
東京都 14,086,000
沖縄県 1,468,000
…(全 47 行)
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import pandas as pd
import matplotlib.pyplot as plt
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ]) . query ( '`SSDSE-B-2026` == 2023' )
top5 = df . nlargest ( 5 , 'A1101' )[[ 'Prefecture' , 'A1101' ]]
top5 [ '人口(百万)' ] = top5 [ 'A1101' ] / 1000000
fig , axes = plt . subplots ( 1 , 2 , figsize = ( 12 , 5 ))
for ax , ylim in zip ( axes , [( 0 , None ), ( 6 , 15 )]):
ax . bar ( top5 [ 'Prefecture' ], top5 [ '人口(百万)' ], color = '#E64A19' )
ax . set_ylim ( ylim )
ax . set_title ( f 'y 軸: { ylim } ' )
ax . set_ylabel ( '人口 (百万人)' )
plt . tight_layout ()
plt . savefig ( 'axis_trick.png' , dpi = 120 )
print ( 'saved: axis_trick.png' )
📤 期待される観察 : 軸切断版では「東京は埼玉の数倍」に見えるが、 実際は 1.9 倍程度。 印象操作の典型例。 棒グラフは必ず 0 始まりにすべき理由が体感できる。
❓ よくある質問 (FAQ)
Q. ヒストグラムと棒グラフの違いは?
A. ヒストグラムは量的変数の分布 を表す (棒は密着、 ビンは連続区間)。 棒グラフはカテゴリ変数の量比較 を表す (棒は離間、 カテゴリは独立)。 横軸の意味が異なる。
Q. なぜ円グラフより棒グラフが推奨されるのか?
A. 人間の知覚は長さ判断 (棒) は精度高、 角度・面積判断 (円) は精度低 だから (Cleveland-McGill, 1984)。 円グラフは 5 分類までで合計感を強調したい時だけ使う。
Q. 軸を 0 始まりにすべきか?
A. 棒・面積系 は必ず 0 始まり (高さ・面積で量を表すため)。 折れ線・散布図 は変化が見えるよう適切な範囲を選ぶ (0 始まりが必須ではない)。
Q. 配色は何を選べばよいか?
A. 連続値は viridis (汎用) または cividis (色覚配慮特化)。 発散値 (正負) は RdBu または coolwarm 。 カテゴリは Set2 または Tableau 系。 虹色 (jet/rainbow) は禁止。
Q. matplotlib と seaborn どちらを使うべき?
A. 細部制御が必要なら matplotlib、 統計プロット (回帰・分布) を一行で描きたいなら seaborn。 多くの場合 seaborn で粗く描き、 matplotlib で微調整 するのが効率的。
Q. インタラクティブグラフはいつ使う?
A. Web 公開、 ダッシュボード、 EDA でズーム・ホバー・フィルタが欲しい時 。 論文・印刷物は静的が基本。 plotly express が学習コスト低くおすすめ。
Q. 大規模データ (10 万行以上) で散布図が真っ黒になる
A. alpha=0.1 で半透明、 hexbin / 2D ヒスト / datashader で密度可視化に切り替える。 ランダムサンプリング (1 万行) でも十分傾向は掴める。
Q. 日本語フォントの設定方法
A. plt.rcParams['font.family'] = 'Hiragino Sans' (Mac) または 'Yu Gothic' (Windows) を設定。 japanize-matplotlib パッケージで自動設定もできる。
Q. グラフを論文用に保存する形式は?
A. ベクトル形式 PDF / SVG / EPS が拡大しても劣化しないので推奨。 ラスタの PNG なら DPI 300 以上。 plt.savefig('fig.pdf', bbox_inches='tight')。
Q. 軸ラベル・凡例・タイトルを必ず付けるべき?
A. 発表用は必須 (図単体で意味が通る必要)。 EDA 用の探索的グラフは省略可。 「他人 (3 ヶ月後の自分含む) が見て理解できるか」が判断基準。
📚 参考文献・推奨書籍
Tufte, E. (1983). The Visual Display of Quantitative Information . Graphics Press. — 可視化のバイブル、 必読
Cleveland, W. S., & McGill, R. (1984). Graphical perception: Theory, experimentation, and application. JASA . — 知覚精度ランキングの原典
Wilkinson, L. (1999). The Grammar of Graphics . Springer. — ggplot2 の理論基盤
Knaflic, C. N. (2015). Storytelling with Data . Wiley. — 実務家向けストーリーテリング
Few, S. (2006). Information Dashboard Design . O'Reilly. — ダッシュボード設計原則
Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis . Springer.
Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering .
Waskom, M. (2021). seaborn: statistical data visualization. JOSS .
Healy, K. (2018). Data Visualization: A Practical Introduction . Princeton UP.
Cairo, A. (2019). How Charts Lie . W. W. Norton. — 可視化詐欺を見抜く本
この用語の全体像を学ぶには、 まず横断的な教材で文脈を掴むのが効率的です:
📚 Python 可視化ライブラリ詳細比較
Python の可視化ライブラリは多種多様。 用途別に整理する:
ライブラリ パラダイム 得意 不得意
matplotlib 命令的 (MATLAB 風) 細部制御、 論文用静止画 統計プロット記述が冗長
seaborn matplotlib ラッパ 統計可視化 (回帰・分布・カテゴリ) 独自インタラクティブ要素なし
plotly 宣言的 (express) インタラクティブ Web 論文 PDF 書き出しに弱い
bokeh 宣言的 大規模インタラクティブ Web 学習コスト高
altair 宣言的 (Vega-Lite) タイディなデータからの直感的指定 5000 行制限 (デフォルト)
plotnine Grammar of Graphics ggplot2 ユーザの移行 エコシステムが小さい
folium leaflet.js ラッパ 地理マップ (コロプレス・ピン) 統計図には不向き
networkx + matplotlib グラフ可視化 ネットワーク・関係図 大規模 (10000+ ノード) で重い
holoviews 宣言的 (バックエンド切替) matplotlib/bokeh/plotly を統一 API で 概念がやや独特
初学者の推奨 : まず matplotlib + seaborn で基礎を固め、 必要に応じて plotly (インタラクティブ) や folium (地図) に進む。 altair/plotnine は宣言的思考に慣れてから。
📊 SSDSE-B-2026 を使った可視化例 10 選
公的統計 SSDSE-B-2026 (47 都道府県) を使って描ける典型グラフを 10 種類列挙する:
# 何を描くか 図種 得られる洞察
1 都道府県別 総人口 横棒グラフ (降順) 東京一極集中の構造
2 人口の分布形状 ヒストグラム (k=7) 強い右歪み (右に長い裾)
3 人口 vs 出生数 散布図 + 回帰直線 ほぼ線形 (r>0.99)、 東京が右上端
4 主要 5 指標の相関 相関ヒートマップ 絶対量同士は全て高相関 (人口交絡)
5 8 地方ブロック別 人口分布 並列箱ひげ図 関東・近畿の中央値が突出
6 65 歳以上人口比率 コロプレス地図 秋田・高知の高齢化、 沖縄の若さ
7 人口推移 (1990-2025) 折れ線グラフ (複数県) 2010 以降の全国減少トレンド
8 産業構成 (3 次産業比) 積み上げ帯グラフ 都市部は 3 次比 80%+、 農業県は 1 次が厚い
9 人口 vs 合計特殊出生率 バブルチャート (3 変量) 人口少 + 出生率高 (沖縄の例外)
10 全 5 指標 vs 全 5 指標 ペアプロット (sns.pairplot) 25 マスで全関係を一望
これらをすべて 1 つの notebook で描き、 ダッシュボード化すれば「47 都道府県の総合プロファイル」が完成する。
👁 視覚判断の精度ランキング (Cleveland-McGill)
Cleveland & McGill (1984) は「人間がどの図形要素を最も正確に判断できるか」を実験で順位づけた:
共通基準上の位置 (例: 棒グラフ、 点グラフ) ← 最も正確
独立基準上の位置 (例: 散布図、 異軸の点)
長さ (例: 並列棒グラフ)
角度・傾き (例: 円グラフ、 折れ線)
面積 (例: バブル、 ツリーマップ)
体積 (例: 3D 棒、 3D 円)
色 (色相 / 明度) (例: ヒートマップ) ← 最も曖昧
この順位から導かれる実践則:
正確な数値比較が目的なら棒グラフが第一選択 (円グラフではなく)
パターン認識が目的なら散布図・ヒートマップ でよい (個別値の精度は犠牲)
3D は原則禁止 (体積判断は 2 桁誤差を生む)
色だけで量を伝えるのは曖昧 → 色 + 数値ラベル を併記
📋 ダッシュボード設計の 5 原則
複数グラフを 1 画面に並べる「ダッシュボード」の設計原則 (Few, 2006):
5 秒ルール : ユーザーが 5 秒以内に「現在の状態が良いか悪いか」を判断できる。 そのためには KPI を最上部に大きく表示。
F 字パターン : 視線は左上から右へ、 次に下へと F 字状に動く。 最重要指標を左上に配置。
同じ尺度を揃える : 全パネルで縦軸範囲・単位・カラーパレットを統一すれば比較が容易。
chartjunk 排除 : 装飾的な背景画像、 不要な枠線、 過剰なロゴは情報密度を下げる。
例外を強調 (alerting) : 通常値はグレー、 異常値だけ赤・橙でハイライト。 「全部色付け」は何も伝えない。
Tableau, PowerBI, Looker Studio (旧 Google Data Studio), Streamlit, Dash 等のツールはこの原則に従ったコンポーネントを提供。 教育用なら Streamlit + plotly が低コストで実装可能。
✅ 可視化チェックリスト (発表前に確認する 12 項目)
# 項目 確認内容
1 タイトル 図単体で「何の図か」が分かる 1 文
2 軸ラベル 変数名 + 単位 (例: 「人口 (千人)」)
3 出典 データソース + 取得日 (例: 「SSDSE-B-2026, 2026 年 5 月版」)
4 図種 目的 (比較/分布/関係) に合っている
5 軸範囲 棒は 0 始まり、 切断していない
6 配色 カラーブラインド対応 (viridis/cividis 等)
7 凡例 複数系列がある場合は明示
8 注釈 外れ値・転換点に矢印 + 説明
9 3D・装飾 3D 効果なし、 chartjunk なし
10 フォントサイズ 縮小印刷でも判読可能 (≥9pt 推奨)
11 解像度 300 DPI 以上 (印刷用)
12 キャプション 図の下に 2-3 文の解説
🔧 実務ワークフロー: EDA から発表用図まで
可視化は用途で 2 種類 に分かれる:
探索用 (exploratory) : 自分が見るための図。 速さ重視で粗くて OK。 散布図・ヒスト・ペアプロットを大量に作って傾向を掴む。
発表用 (explanatory) : 他人に見せる図。 明確なメッセージ 1 つに絞り、 注釈・ハイライト・キャプションを整える。
推奨ワークフロー:
探索 (EDA) : pandas の .describe(), .hist(), seaborn.pairplot() で全体観察
仮説生成 : 「人口と出生数が強く相関しそう」など暫定仮説
仮説検証 : 散布図 + 相関係数 + p 値で確認
メッセージ確定 : 「日本の地域格差は人口集中の関数で説明できる」など 1 文化
発表図作成 : 軸ラベル・タイトル・凡例・出典を整備、 配色を viridis 系に統一
キャプション執筆 : 図単体で意味が通る 2-3 文の説明
査読 (peer review) : 第三者に「何が分かるか」を 30 秒で説明させ、 ズレを修正
📚 主要可視化ライブラリ比較 (Python)
Python で SSDSE-B-2026 を可視化する際、 ライブラリ選択で表現力・学習コスト・パフォーマンスが大きく変わる。 用途別の使い分けを下表にまとめる。
ライブラリ 得意 SSDSE-B 用途例
matplotlib細かい制御・出版品質 論文用の人口ピラミッド作図
seaborn統計的可視化・短コード 47 都道府県の人口×出生数の散布図行列
plotly対話的・ズーム可能 県名ホバー表示付きの人口マップ
altair宣言的文法 (Grammar of Graphics) 教材用 Notebook の散布図
💡 初学者は seaborn から始め、 細部調整が必要なら matplotlib の Axes API を直接操作するのが王道。
🖼 SSDSE-B-2026 を用いた基本図 3 種ギャラリー (R600 追補)
データビジュアライゼーションを語る上で、 散布図 (scatter plot) ・ヒストグラム (histogram) ・多群比較箱ひげ図 (multi-group boxplot) の三点は外せない。 ここでは SSDSE-B-2026 (47 都道府県データ) を題材に、 3 枚の代表的な図を提示し、 それぞれの「読み方」「作り方」「典型的な誤読」「教育上の意義」を順に整理する。 図はすべて統計データ可視化の文脈で 最初に学ぶべき三類型 として位置づけられており、 これらを正しく描き分けられるかどうかが、 後続のヒートマップ・コロプレスマップ・パラレルコーディネートなど高度な手法を学ぶ際の前提となる。
図1. 散布図 — 2 変数の関係を視る
下図は SSDSE-B-2026 の 人口 (A1101) を横軸、 出生数 (A4101) を縦軸に取った散布図である。 47 個の点 (都道府県) が概ね右上がりに並んでおり、 人口と出生数が強い正の相関 (r≈0.995) を持つことが視覚的に確認できる。 右上の極端な点は東京都・大阪府・神奈川県といった大都市圏で、 左下に密集する点は人口の少ない山陰・四国の県群である。
読み方の手順 : ①点群全体の傾き (正・負・無相関) を見る ②外れ値を識別する ③点の密度 (帯状か直線状か) を確認する ④軸スケール (線形か対数か) に注意する。 この 4 ステップは 相関ページ の「散布図で相関を視る」節と整合しており、 数値で測る前にまず図で「形」を把握する姿勢を養うことが重要である。
典型的な誤読 : 散布図の傾きを見て「人口が多いほど出生数が多いから人口を増やせば出生も増える」と即断するのは 因果 の混同である。 両者は 交絡変数 (年齢構成・未婚率) を共有しているため、 単純な「人口 → 出生数」の矢印は描けない。
図2. ヒストグラム — 1 変数の分布形状を視る
下図は SSDSE-B-2026 の 高齢化率 (A1303) を横軸に取ったヒストグラムである。 47 県の高齢化率は概ね 22% から 38% に分布し、 30% 付近にピークを持つ やや右に裾を引いた単峰分布 となる。 東京・神奈川など若年層の流入が続く都市圏が左裾、 秋田・高知など過疎化が進行した県が右裾を形成する。
読み方の手順 : ①ピーク (最頻値) の位置を確認 ②裾の方向 (左右どちらに長いか) を確認 ③外れ値の有無を確認 ④ビン幅の妥当性を確認。 ビン幅は Sturges の公式 (k = ⌈log2(n)+1⌉) や Freedman–Diaconis の規則を使うのが定石だが、 47 県という標本数では 7–10 ビンが視覚的に最も安定する。
典型的な誤読 : ビン幅を細かくしすぎると山が複数現れて「二峰分布」と誤解しやすく、 逆に粗すぎると本来の偏りが消える。 「ヒストグラムは見るたびに違う形をしている」と認識し、 ビン幅を意識的に複数試すのが正しい姿勢である。
図3. 多群比較箱ひげ図 — グループ間の分布差を視る
下図は SSDSE-B-2026 の都道府県を 地方ブロック (北海道・東北・関東・中部・近畿・中国・四国・九州沖縄) に分け、 各ブロックの 高齢化率 (65歳以上人口比率) を箱ひげ図で並べたものである。 東北・四国ブロックの中央値が高く、 関東ブロックは中央値が最も低い。 箱の高さ (四分位範囲) が地方ごとに異なり、 関東は外れ値 (東京 22.8%) を下側に含み、 四国は箱が小さく均質である。
読み方の手順 : ①各群の中央値 (箱の中の線) を横並びに比較 ②箱の高さ (IQR) で群内のばらつきを比較 ③ひげの長さで分布の裾を確認 ④外れ値 (○印) を確認。 これは ANOVA や Kruskal-Wallis 検定など 多群比較 の前段で必ず行う「目視検査」である。
典型的な誤読 : 箱の高さが大きいことを即「ばらつきが大きい」と解釈するのは概ね妥当だが、 群間の サンプルサイズが大きく異なる場合 (例: 関東 7 県 vs 四国 4 県) は、 ひげの長さや外れ値の出現確率が変わるため、 箱の見た目だけで分散の大小を断定すべきではない。
3 枚を生成する Python コード
このコードでやること : SSDSE-B-2026 から人口・出生数・高齢化率を読み込み、 上記 3 図を matplotlib と seaborn で生成し、 PNG として保存する。 教材コードのため、 ライブラリ初期化・カラム選択・保存パスはすべて直書きしている。
📥 入力データ (SSDSE-B-2026 抜粋):
SSDSE-B-2026 地域コード 都道府県 A1101 (総人口) A4101 (出生数) A1303 (65歳以上人口) 高齢化率(A1303/A1101)
2023 R01000 北海道 5092000 24430 1681000 33.0%
2023 R13000 東京都 14086000 86348 3205000 22.8%
2023 R47000 沖縄県 1468000 12549 350000 23.8%
📋 コピー 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 import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 英字の項目コードを使うので skiprows=[1] で読む(年度の列名は 'SSDSE-B-2026')
df = ( pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
. query ( '`SSDSE-B-2026` == 2023' ) . copy ())
os . makedirs ( 'figures' , exist_ok = True )
# 図1: 散布図 (人口×出生数)
fig , ax = plt . subplots ( figsize = ( 7 , 5 ))
ax . scatter ( df [ 'A1101' ], df [ 'A4101' ], s = 40 , alpha = 0.7 , color = '#1565C0' )
ax . set_xlabel ( '総人口 (A1101)' ); ax . set_ylabel ( '出生数 (A4101)' )
ax . set_title ( 'SSDSE-B-2026: 人口 × 出生数' )
plt . tight_layout (); plt . savefig ( 'figures/scatter_basic.png' , dpi = 120 ); plt . close ()
# 図2: ヒストグラム (高齢化率)
fig , ax = plt . subplots ( figsize = ( 7 , 5 ))
ax . hist ( df [ 'A1303' ] / df [ 'A1101' ] * 100 , bins = 8 , color = '#2E7D32' , edgecolor = 'white' )
ax . set_xlabel ( '高齢化率 (%)' ); ax . set_ylabel ( '都道府県数' )
ax . set_title ( 'SSDSE-B-2026: 47 都道府県の高齢化率分布' )
plt . tight_layout (); plt . savefig ( 'figures/hist_basic.png' , dpi = 120 ); plt . close ()
# 図3: 多群比較箱ひげ図 (地方ブロック別 高齢化率)
# region 列は SSDSE に無いので、地域コードの頭 2 桁(都道府県番号)から作る
def to_block ( code ):
n = int ( str ( code )[ 1 : 3 ])
if n == 1 : return '北海道'
if n <= 7 : return '東北'
if n <= 14 : return '関東'
if n <= 23 : return '中部'
if n <= 30 : return '近畿'
if n <= 35 : return '中国'
if n <= 39 : return '四国'
return '九州沖縄'
df [ 'region' ] = df [ 'Code' ] . map ( to_block )
df [ 'aging' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100
order = [ '北海道' , '東北' , '関東' , '中部' , '近畿' , '中国' , '四国' , '九州沖縄' ]
fig , ax = plt . subplots ( figsize = ( 9 , 5 ))
sns . boxplot ( data = df , x = 'region' , y = 'aging' , order = order , ax = ax , color = '#EF6C00' )
ax . set_xlabel ( '地方ブロック' ); ax . set_ylabel ( '高齢化率 (%)' )
ax . set_title ( 'SSDSE-B-2026: 地方ブロック別 高齢化率' )
plt . tight_layout (); plt . savefig ( 'figures/box_multigroup.png' , dpi = 120 ); plt . close ()
print ( '3 figures saved to figures/' )
📤 実行すると次の出力が得られる:
3 figures saved to figures/
ls figures/
box_multigroup.png hist_basic.png scatter_basic.png
💬 3 枚の PNG が figures/ 直下に生成される。 散布図では右上方向への線形傾向、 ヒストグラムでは 30% 前後をピークとする右裾分布、 箱ひげ図では関東ブロックの中央値突出を一目で確認できる。 これらは「数値統計を見る前にまず形を視る」可視化の基本所作である。
3 図を組み合わせた読み解き
散布図・ヒストグラム・箱ひげ図はそれぞれ独立した可視化手法ではなく、 同じデータに対して 異なる質問を投げる ための道具立てである。 散布図は「2 変数は連動するか」、 ヒストグラムは「1 変数はどう広がるか」、 箱ひげ図は「群を分けると差があるか」を問う。 SSDSE-B-2026 では、 これら 3 つの問いを順に当てることで「人口と出生数が連動する」「高齢化率は地域差が大きい」「高齢化率は東北・四国で高く関東で低い」という 3 つの独立した結論を、 同じデータセットから引き出せる。 これは 探索的データ分析 (EDA) の基本構造であり、 単一の散布図に頼らず多角的に形を観察する習慣を養うことが、 統計検定 (相関検定・適合度検定・ANOVA) を始める前段として極めて重要となる。
教育上の位置づけ
本ギャラリーは、 「可視化を学ぶ初学者が最初の 1 時間で触れるべき三類型」 として整備されている。 散布図は連続値ペア、 ヒストグラムは単一連続値の分布、 箱ひげ図は離散カテゴリ×連続値という 3 つの基本「データ型 × 図形」の組み合わせを網羅し、 これ以降に登場する ヒートマップ ・地理可視化 ・棒グラフ はすべてこの 3 枚の応用または組み合わせと見なせる。 まずは SSDSE-B-2026 のような実データを題材にこの 3 枚を自分の手で再現し、 軸ラベル・タイトル・凡例・色選択をひとつずつ調整する経験を積むことが、 後続のあらゆる可視化スキル習得の基礎となる。
よくある質問 (FAQ)
Q1. 散布図とヒストグラムを 1 枚に重ねるべきか? 軸の意味が異なるため、 通常は重ねない。 ただし seaborn.jointplot のように散布図の周囲にヒストグラムを並べる「ジョイントプロット」は両者の補完として有効である。
Q2. 箱ひげ図とヒストグラムの違いは? 箱ひげ図は「五数要約 (最小・第一四分位・中央・第三四分位・最大)」を圧縮表示し、 多群比較が容易。 ヒストグラムは分布の形 (山の数・歪み) を細かく見せるが、 多群比較には不向き。 用途で使い分ける。
Q3. なぜ 3 つの図すべてが必要か? 1 種類の図だけではデータの一面しか見えないため。 同じデータを 3 角度から眺めることで、 分析の盲点を減らし、 後続の検定・モデリングで誤った仮定を置く危険性を下げる。
SSDSE-B-2026 を題材にした詳細解説 — 散布図編
散布図 (scatter plot) は 1879 年に Francis Galton が遺伝学の研究で使用した ことが起源とされ、 現代に至るまで「2 変数の関係性を直感的に把握する」最強の道具として君臨している。 SSDSE-B-2026 の文脈では、 人口×出生数だけでなく、 高齢化率×死亡数、 出生数×婚姻件数、 年平均気温×人口密度など、 47 都道府県を点に落とすことで、 数百ページの統計表からは決して読み取れない「地域の塊」が浮かび上がる。 ここでは散布図を読む際に意識すべき 5 つの観点を整理する。
① 全体傾向 — 点群が右上がりか右下がりか、 水平方向に広がっているか。 SSDSE-B-2026 の人口×出生数 は明確な右上がりで、 視覚的に 強い正の相関 を示す。 ② 線形性 — 直線で近似できるか、 曲線か。 出生数×婚姻件数は概ね直線的だが、 高齢化率×合計特殊出生率は右下がりの負の関係を描く。 ③ 外れ値 — 全体傾向から大きく外れる点。 東京都は出生数・婚姻件数・人口のあらゆる軸で外れ値となり、 通常は 外れ値処理 で対数変換・除外を検討する。 ④ 等分散性 — x 軸方向と y 軸方向のばらつきが均一か。 SSDSE-B-2026 では一部の指標で「人口が大きい県ほど縦軸のばらつきも大きい」という不等分散が現れる。 ⑤ 群構造 — 点群が明確な塊に分かれているか。 関東 vs 地方、 太平洋側 vs 日本海側のような群が散布図上に見えるとき、 単一の回帰直線を当てるのは適切でなく、 群ごとに解析する必要がある。
SSDSE-B-2026 を題材にした詳細解説 — ヒストグラム編
ヒストグラム (histogram) は Karl Pearson が 1895 年に命名した 表現方法で、 連続値の頻度を矩形の高さで表す。 SSDSE-B-2026 の高齢化率を見るとき、 ヒストグラムは「47 県のうち何県が 30% 前後に集中しているか」を一目で示し、 平均値や中央値といった 1 個の代表値からは決して伝わらない「分布の形」を保存する。 ここでは 4 つの観察観点を挙げる。
① 単峰か多峰か — 山が 1 つか複数か。 SSDSE-B-2026 の高齢化率は単峰だが、 都道府県の人口を直接ヒストグラムにすると 100 万人以下に大きな山、 1000 万人付近 (東京) に小さな山ができ、 二峰分布になる。 これは 対数変換 によって単峰に整える方が分析しやすい。 ② 歪度 (skewness) — 裾が左右どちらに伸びるか。 人口分布は右裾、 高齢化率はやや右裾、 合計特殊出生率はほぼ対称となる。 ③ 尖度 (kurtosis) — 山の鋭さ。 鋭く尖った山は「ほぼ全県が同じ値」、 平坦な山は「県ごとの差が大きい」ことを示す。 ④ ビン幅 — ヒストグラムは ビン幅次第で形が変わる 性質を持つ。 SSDSE-B-2026 の 47 県という標本数では、 5 ビン未満は粗すぎ、 15 ビン以上は細かすぎる。 経験則として 7-10 ビンが視覚的に安定する。
SSDSE-B-2026 を題材にした詳細解説 — 多群箱ひげ図編
箱ひげ図 (boxplot) は John Tukey が 1977 年に著書「Exploratory Data Analysis」で提案した 図表で、 五数要約 (min, Q1, median, Q3, max) を矩形とひげで圧縮表示する。 SSDSE-B-2026 を地方ブロックに分けて並べると、 47 行の表からは見えなかった「東北・四国は中央値が高く、 関東は最も低い」という高齢化の地域差が一目瞭然となる。 多群比較の場合、 以下 5 観点を順に確認する。
① 中央値 (箱内の横線) — 群間で順位を確認。 高齢化率は 東北 > 四国 > 中国 > 北海道 ≈ 九州沖縄 > 中部 > 近畿 > 関東の順となる。 ② 箱の高さ (IQR) — 群内のばらつき。 東北は箱が高く、 群内で高齢化が一様に進むことを示す。 関東は箱が低いが東京が下側の外れ値となり均質でない。 ③ ひげの長さ — 外れ値を除いた最大・最小の範囲。 ひげが長い群は分布の裾が広い。 ④ 外れ値 (○印) — IQR の 1.5 倍を超える点。 関東の東京都は下側の典型的な外れ値 (22.8%) で、 関東群全体の解釈を歪める可能性がある。 ⑤ ノッチ (信頼区間) — オプションで中央値の 95% 信頼区間を箱内に切り欠きとして表示。 ノッチが重なる群は中央値に有意差なし、 重ならない群は有意差ありと暫定判断できる。
3 図を超えた可視化の発展形
本ギャラリーの 3 図は最も基本的な「データ型 × 図形」の組み合わせを網羅するが、 SSDSE-B-2026 の 47 県データを使えば、 これらを発展させた次のような図も自然に作れる。 (a) バブルチャート : 散布図の点サイズを第 3 変数 (例: 人口) にマップして 3 次元情報を持たせる。 (b) 密度プロット (kernel density estimate) : ヒストグラムの矩形を滑らかな曲線に置き換え、 ビン幅依存を緩和する。 (c) ヴァイオリンプロット : 箱ひげ図の両側に密度を描き加えた図で、 多峰分布や歪みを可視化できる。 (d) ヒートマップ : 47 県 × 数十指標の表を色の濃淡で表現し、 同じ傾向を持つ県群を浮き彫りにする。 (e) コロプレスマップ : 日本地図上の各県を指標値に応じて塗り分け、 地理的な集積パターンを示す。 これら発展形はいずれも、 まず本ギャラリーの 3 図を確実に描けるようになった上で、 「もう 1 軸足りない」「滑らかさが欲しい」「地理情報と紐付けたい」といった具体的な要請に応じて選択する。
図の色・軸・凡例における配慮
本ギャラリーの 3 図は、 全色覚 (色覚多様性) を考慮したカラーパレットを採用している。 散布図は青系単色、 ヒストグラムは緑系単色、 箱ひげ図は橙系単色で、 群分けに赤緑の組み合わせを使っていない。 これは 赤緑色覚異常 (約 5% の男性) でも区別が容易な配色である。 軸ラベルは日本語で記述し、 単位 (千円・%・人) を明示している。 タイトルは「データ名: 軸 × 軸」の形式で統一し、 凡例は群が複数ある場合にのみ追加する。 これらは 可視化チェックリスト の項目とも整合し、 実務でレポート図を量産する際にもそのまま流用できる規範である。
学習者へのメッセージ
統計検定や機械学習の前段に置かれる EDA の文脈では、 まず本ギャラリーの 3 図を 自分の手で SSDSE-B-2026 から再現することが何より重要となる。 コードを丸写しするのではなく、 軸の選び方を変えてみる、 ビン幅を 5 と 15 で比較する、 地方ブロックの分け方を東日本/西日本の 2 群にして箱ひげ図を作り直す、 といった「変えてみる学習」を繰り返すことで、 可視化が単なるグラフ描画ではなく データに対する問いを設計する行為 であることが体感できる。 この体感こそが、 後に Tufte の「データインク比」や Cleveland の「知覚順位」といった理論を学ぶ際の地盤となり、 さらには学術論文や政策報告書で「説得力のある図」を描く力に直結する。
3 図の選び分けフローチャート (テキスト版)
実際に SSDSE-B-2026 を前にして「どの図を描けばよいか」と迷う初学者のために、 簡易フローチャートを整理する。 まず問いを設定し、 次にデータの型を確認し、 最後に図を選ぶという 3 段階の意思決定が基本である。 (Step 1) 関心のある問いは何か。 「変数同士の関係を知りたい」「分布の形を知りたい」「群を比較したい」のいずれかを明確にする。 (Step 2) データの型を確認する。 連続値 × 連続値であれば散布図、 連続値 1 個であればヒストグラム、 カテゴリ × 連続値であれば箱ひげ図が第一候補となる。 (Step 3) 標本数を考慮する。 SSDSE-B-2026 の 47 県のように標本が少ない場合、 散布図は全点を直接プロット、 ヒストグラムは 7-10 ビン、 箱ひげ図はノッチ無しで描くのが目視に優しい。 標本数が数千を超える場合は、 散布図に 透明度 や 2 次元ビン を導入し、 ヒストグラムは KDE に置き換え、 箱ひげ図はヴァイオリンプロットに進化させる、 といった発展的選択も可能である。 この 3 段階フローを身につけると、 新しいデータセットを与えられた時に「まずどの図から描くべきか」で迷う時間が劇的に減る。
教材における 3 図の活用シナリオ (詳細)
本ギャラリーの 3 図は、 単独で完結する教材ではなく、 ジャストインタイム型教育の文脈で 論文や演習と連動する ように設計されている。 例えば本リポジトリの「相関と回帰」セクションでは、 散布図の図1 を読みながら相関係数の計算手順を学び、 続いて「分布と要約統計」セクションではヒストグラムの図2 を題材に平均・中央値・分位数の意味を確認し、 さらに「群比較と検定」セクションでは多群箱ひげ図の図3 から ANOVA や Kruskal-Wallis 検定への動機付けが行われる。 このように 3 図は 独立した教材ではなく、 統計学全体の理解への入り口を担う共通基盤 として設計されており、 同じ図を異なる文脈で繰り返し参照することで、 学習者の理解が立体的に深まる構造になっている。 講義設計者は、 まず本 3 図を学習者に確実に再現させた上で、 後続の各章で「あの図を覚えていますか?」と参照する形式を取ると、 学習の連続性が保たれる。
また、 これら 3 図はオフライン演習だけでなく、 Jupyter Notebook や Google Colaboratory での対話的演習でも頻用される。 SSDSE-B-2026 を Colab 上で読み込み、 セルを 1 つずつ実行しながら 3 図を順に描くワークフローは、 初学者にとって 「コード → 図 → 解釈」の三位一体 を体感する最良の経路である。 さらに、 同じ 3 図を BI ツール (Tableau, Power BI) で再現する課題を加えると、 コーディングが苦手な学習者にもデータ可視化の入口が広がり、 多様な学習者にリーチできるカリキュラム設計が可能となる。
よくある初学者の誤解と修正
本ギャラリーの 3 図を学ぶ際、 初学者が頻繁に陥る誤解を 5 件挙げ、 それぞれに対する正しい理解を併記する。 誤解 1: 「散布図は点が多いほど良い」 — これは半分正しく半分間違いである。 点が多いと統計的検出力は上がるが、 重なりが激しくなり「黒い塊」と化す。 透明度や 2 次元ヘックスビンを使うのが正解。 誤解 2: 「ヒストグラムのビン幅は自動で十分」 — matplotlib の自動ビン幅は標準では Sturges の公式を使い、 標本数が少ない時に粗くなる。 SSDSE-B-2026 の 47 県では bins=8 程度を明示的に指定する方がよい。 誤解 3: 「箱ひげ図のひげは最大・最小値を示す」 — デフォルト設定ではひげは「外れ値を除いた最大・最小」を示し、 外れ値は別途○印で表示される。 全範囲を見たい場合は whis=(0,100) を指定する。 誤解 4: 「3D 散布図の方が情報量が多い」 — 3D 散布図は奥行きの判別が困難で、 視角によって結論が変わる。 多くの場合、 2D 散布図 + 色 + サイズの組み合わせの方が情報量が多く誤読も少ない。 誤解 5: 「色は派手な方が伝わる」 — 派手な色は注意を引くが、 同時に「データそのもの」への注意を奪う。 単色や 2 色のみで構成する方が、 結論を伝えやすい。
3 図の再現演習チェックリスト
学習者が SSDSE-B-2026 を用いて本ギャラリーの 3 図を自力で再現する際に、 順番に達成すべき項目をチェックリスト形式で示す。 これらをひとつずつクリアすることで、 「コードを動かせた」から「図を読めて改良できる」段階へと進める。 (1) SSDSE-B-2026 の CSV を pd.read_csv で読み込み、 df.head() でカラム名・型・サンプル行を確認できる。 (2) 散布図を描き、 軸ラベル・タイトルを日本語で表示できる。 (3) ヒストグラムのビン幅を bins=5, 8, 15 で比較し、 形がどう変わるかを言語化できる。 (4) 都道府県を地方ブロックに分類するマッピング辞書を作成し、 df に新カラムとして追加できる。 (5) 箱ひげ図を地方ブロック別に並べ、 中央値の順位を読み取れる。 (6) 図のカラーパレットを赤緑単独使用にしないよう調整できる。 (7) 3 図を 1 つのフィギュアにサブプロットとして並べ、 plt.subplots(1, 3) で並列表示できる。 (8) 3 図を PNG として figures/ ディレクトリに保存し、 HTML から参照できる。 これら 8 項目を順にクリアできれば、 学習者は「データ可視化の基本三類型」を完全に身につけたと言える。
なお、 本チェックリストは「最低限の到達目標」であり、 これに加えて配色のアクセシビリティ確認、 凡例の位置最適化、 タイトルの英訳併記、 高解像度 PDF への書き出しといった応用項目もカリキュラム後半で扱われる。 これらを段階的に習得することで、 学習者は SSDSE-B-2026 のみならず、 自身の研究データや業務データに対しても、 同じ手順で「適切な 3 図」を描けるようになる。 これは データリテラシー の中核を成す技能であり、 統計検定 3 級 4 級レベルでも頻繁に問われる視覚化の基礎力に直結する。
また、 教材の構造として、 本ギャラリーの 3 図は 相関ページ の散布図検証、 ヒストグラムページ の分布形検証、 箱ひげ図ページ の多群比較検証と、 それぞれ対応関係を持つ。 これにより、 学習者が本ページから他用語ページへ自然に遷移し、 関連概念を網羅的に学べる構造となっている。 SSDSE-B-2026 の同一データセットを 3 つの異なる視点で読み解く本ギャラリーは、 統計可視化教材としての 横断的な参照点 として機能し、 用語間の知識ネットワークを学習者の頭の中に構築する役割を果たす。 学習者は本ギャラリーを起点に、 必要に応じて関連する各用語ページへと自由に行き来し、 統計可視化の知識体系全体を立体的に把握していくことが期待される。 これが本ギャラリーを設けた最大の意義であり、 SSDSE-B-2026 を題材とする教材設計の核心となる狙いでもある。
🗺 概念マップ
関連概念を視覚的に整理した概念マップ。
dataviz
棒グラフ
ヒストグラム
分布形状
散布図
関係性
箱ひげ図
データ可視化 (dataviz) は「目的 → 図種選択 → 視覚記号 → 知覚」の連鎖で機能する。 中心ノード「データ → 知覚翻訳」を起点に、 量比較は棒グラフ、 構成比は積み上げ棒、 分布は箱ひげ・ヒストグラム、 関係性は散布図、 時系列は折れ線、 地理は階級区分図 (コロプレス) が定石である。
SSDSE-B-2026 の都道府県データを可視化する例: 総人口は棒グラフ、 出生数との関係は散布図、 47 都道府県を地図に塗り分ければコロプレス、 各都道府県内の年齢階級は積み上げ棒で表現できる。 Tufte の data-ink ratio (装飾より情報量)、 Cleveland の知覚精度順 (位置 > 長さ > 角度 > 面積 > 色相) が設計指針となる。
🔗 隣接手法への橋渡し
「データビジュアライゼーション」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。 具体的には次の 3 方向と密接につながる:
可視化は分析と意思決定をつなぐ橋。 形を選ぶことが意味を選ぶこと。
🌳 手法選択フロー
「データ可視化」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。
何を伝えたいのか 大小の比較なら棒、 時間の推移なら折れ線、 2 変数の関係なら散布図、 分布の形ならヒストグラムか箱ひげ図。 「とりあえずグラフにする」と、 目的に合わない図ができる。
比較の軸はいくつあるか 1 つなら 1 枚の図。 2 つ以上なら色分けより、 同じ図を並べる(small multiples)ほうが読み違えが少ない。 2 軸グラフは軸の取り方で印象が変わるので、 代替案を検討してから使う。
量を長さで表せるか 長さ(棒の高さ)が最も正確に読める。 角度(円グラフ)や面積は読み取り誤差が大きい。 構成比でもスライスが 5 つを超えるなら棒にする。
読み手の環境は 白黒印刷、 色覚特性、 スクリーンリーダを想定する。 色だけで区別せず、 形・線種・直接ラベルも併用する。
可視化は「読み手に何を判断してほしいか」から逆算して選ぶ。 図の種類を先に決めると、 データの性質と合わなくなる。