論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
データビジュアライゼーション
Data Visualization
可視化
別称: DataViz

🔖 キーワード索引

データ可視化を理解するためのコアキーワードを一覧表示。 各チップをクリックすると本ページ内の該当セクションへジャンプする。

🎨 直感で掴む 📐 Sturges 公式 🔬 数式を言葉で読み解く 🧮 SSDSE-B-2026 で計算 🐍 Python 実装 (4 本) 🎮 触って理解する ⚠️ 落とし穴 5 件 🌐 関連手法 🔗 関連用語 📚 関連グループ教材 🗺 概念マップ 📍 文脈ボックス 💡 30 秒で分かる結論

💡 30秒で分かる結論

🍰 まずはやさしく

データを図にする魔法のような技術です。

データの傾向や例外をすぐに見つけるために使います。

スマホの利用時間をグラフにするようなことです。

この章では、正しい図の選び方を学びます。

💡 30 秒で分かる結論

📍 文脈 — どこで使う概念か

🍰 まずはやさしく

データの正体をあばくための道具です。

数字だけでは気づけない特徴を見つけるために使います。

部活の記録をまとめて、弱点を探すときに役立ちます。

この章では、分析の流れの中での役割を読みます。

データビジュアライゼーション(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 つの目的で図種を選ぶ:

「美しいグラフ」とは飾りが多いものではなく、 Tufte の "data-ink ratio" (インクのうち本当にデータを表す割合) が高い、 シンプルで誤読を生まない図のこと。 3D 円グラフのような「装飾だらけで読み取り辛い図」は典型的な反面教師。

🎨 色の選び方とアクセシビリティ

色は「データの型」に応じて適切なパレットを選ぶ:

カラーブラインド対応: 男性の約 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 原則が現代まで通用する:

  1. データインクを最大化する: グラフのインクのうち、 実際にデータを表す部分の割合 (data-ink ratio) を高める。 影・グラデーション・3D は無駄インク。
  2. chartjunk (グラフのゴミ) を消す: 装飾的なロゴ・派手な色・無意味な背景は読み取りを妨げる。
  3. 多変量を 1 枚に詰める (small multiples): 同じ図形式で多次元データを並べる。 facet/ファセット表示。
  4. 嘘の係数 (lie factor) を 1 に保つ: グラフ上の効果と実データの効果が同じスケールで対応する。
  5. data-density を高める: 単位面積あたりの情報量を最大化。
  6. 図と注釈・キャプションを統合する: グラフ単体で意味が完結するように。

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 世紀末から発展してきた知的伝統:

人物貢献
1786William Playfair折れ線・棒・円グラフを発明
1854John Snowロンドンコレラ流行の点地図 (空間疫学の父)
1858Florence Nightingaleクリミア戦争死因「鶏のとさか」図 (極座標棒)
1869Charles Joseph Minardナポレオン軍ロシア遠征の流量地図 (6 変数を 1 枚に)
1977John TukeyEDA 提唱、 箱ひげ図・茎葉表示を発明
1983Edward Tuftedata-ink ratio・lie factor・small multiples を体系化
1999Leland WilkinsonGrammar of Graphics 提唱 (ggplot2 の理論基盤)
2003Hadley WickhamR で ggplot2 を実装
2010sTableau, D3.js, plotlyインタラクティブ可視化が一般化
2020sObservable, Vega-Lite宣言的可視化 + ノートブック融合

Minard のナポレオン軍地図は「Edward Tufte が史上最高のグラフ」と評した作品で、 軍の進路・人数・温度・場所・方向・時間の 6 変数を 1 枚に統合した傑作。 200 年以上前のアイデアが現代のインフォグラフィックの原点となっている。

📐 定義

🍰 まずはやさしく

データを視覚的に表現するデザインのことです。

相手に正しく情報を伝えるために使います。

買い物した金額を、わかりやすく図にすることです。

この章では、伝わる図を作るためのルールを読みます。

データを視覚化する技術・デザイン

英語名 Data Visualization、 カテゴリ:可視化。

📐 良い可視化の 10 原則 まとめ

  1. 目的を確定してから図種を選ぶ — 比較・分布・関係・構成・時系列・地理
  2. 適切な図種を選ぶ — 棒は比較、 ヒストは分布、 散布図は関係
  3. 軸ラベル・タイトル・出典を必ず付ける — 図単体で意味が通る
  4. data-ink ratio を最大化 — 装飾を削り、 データだけを残す
  5. 軸を 0 始まりにする (棒) — 軸切断は印象操作
  6. 3D を避ける — lie factor が爆発する
  7. カラーブラインド対応 — viridis / cividis、 形やパターンも併用
  8. 注釈で重要点を強調 — 灰色の中の赤、 矢印 + 説明
  9. 1 枚 1 メッセージ — 複数結論を 1 枚に詰めない
  10. 第三者に見せて検証 — 自分には自明でも他人は読めない

これらを意識すれば、 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 つの書き方がある:

📥 入力例(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 出力でブラウザ共有可

📌 データ可視化 まとめ (本ページの核心)

  1. 可視化は探索と伝達の二刀流 — EDA では速さ重視、 発表では明瞭さ重視
  2. 目的から図種を選ぶ — 比較・分布・関係・構成・時系列・地理
  3. data-ink ratio を最大化 — 装飾を削り、 データだけを残す
  4. 3D を避ける — 視覚判断精度ランキングの底辺
  5. カラーブラインド対応 — viridis / cividis を標準パレットに
  6. 軸切断を避ける (棒) — 0 始まり厳守
  7. ストーリー化 — 1 枚 1 メッセージ、 注釈で強調
  8. 第三者検証 — 「他人が読めるか」を必ず確認

これらを守れば、 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グラフに注釈 (矢印、 テキスト、 ハイライト) を追加するレイヤー。

🎓 データ可視化を学ぶ学習パス

本ページの内容をどう学習に組み込むかの推奨ロードマップ:

  1. Week 1: 基礎 — 図種選択 (棒・ヒスト・散布) + matplotlib 基礎 + SSDSE-B-2026 を 5 図描く
  2. Week 2: 統計可視化 — seaborn (pairplot, boxplot, violinplot, heatmap) + Sturges/Scott のビン数
  3. Week 3: デザイン原則 — Tufte 6 原則 + data-ink ratio + chartjunk + カラーブラインド対応
  4. Week 4: ストーリーテリング — Knaflic の 5 ステップ + 注釈 + 1 枚 1 メッセージ
  5. Week 5: インタラクティブ — plotly express + altair + bokeh の比較
  6. Week 6: 地理可視化 — folium + コロプレス + GeoJSON
  7. Week 7: ダッシュボード — Streamlit + plotly でミニダッシュボード構築
  8. Week 8: 発表 — SSDSE-B-2026 を題材にプレゼン用図 1 枚を完成、 第三者査読

8 週間で「探索 → 発表」までの全工程をカバーできる。 各週に Tufte の本 1 章 + Knaflic の本 1 章を読むと理論と実践が並行で身につく。

📋 matplotlib / seaborn チートシート

用途matplotlibseaborn
棒グラフ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 の範囲が誠実。

🔬 記号・要素の読み解き

data-ink ratio
Tufte の概念:「情報を伝えるインク」/「総インク」を最大化
aesthetic mapping
変数を視覚属性(位置、 色、 大きさ)に割り当てる対応
Grammar of Graphics
Wilkinson の理論。 ggplot2 の基盤
Gestalt 原理
近接、 類似、 連続、 閉合などの知覚原理
色覚多様性
色覚バリエーションを考慮(赤緑色弱は人口の 5%)

🔬 数式を言葉で読み解く

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,08611.3%
2神奈川県9,2297.4%
3大阪府8,7637.0%
4愛知県7,4776.0%
5埼玉県7,3315.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 で再現

1
2
3
4
5
6
7
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.geojsondata/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 軸の下限を自由に操作でき、 誇張の度合いがリアルタイムで変わる。
データ:
図種:

出典: SSDSE-B-2026 (総人口 A1101・出生数 A4101, いずれも実測値をそのまま埋め込み)

🧠 なぜ一瞬で騙されるのか — 前注意的処理と視覚変数

人間の視覚は、 色・長さ・傾き・大きさといった特徴を約 200 ミリ秒以内・無意識のうちに並列処理する (前注意的処理, preattentive processing)。 グラフが「一瞬で伝わる」のはこの仕組みのおかげだが、 裏を返せば騙されるときも一瞬だということ。 意識的な検証 (軸の目盛りを読む) より先に、 「長い棒 = 大きい」「急な傾き = 激変」という印象が脳に刻まれてしまう。

Cleveland & McGill (1984) の実験は、 視覚属性ごとの読み取り精度に明確な序列があることを示した: 共通軸上の位置 > 長さ > 傾き・角度 > 面積 > 色の濃淡。 棒グラフが強いのは最上位の「位置・長さ」を使うから。 円グラフが弱いのは中位の「角度」を使うからで、 上のラボで岡山 (26.1%) と山口 (18.4%) のスライスを見比べると、 7.7 ポイントの差が角度からは掴みにくいことが分かる。 3D 装飾はこの序列をさらに壊し、 「面積 + 遠近感」という最も不正確なチャンネルへ読み取りを追いやる。

⚠️ ラボで体感できる 3 つの落とし穴

  1. 軸切断 (truncated axis): Tufte の嘘の係数は $\text{lie factor} = \dfrac{\text{グラフ上の効果の大きさ}}{\text{データ上の効果の大きさ}}$ で定義され、 1 から離れるほど不誠実。 棒グラフは「長さ = 量」の約束で読まれるため、 下限を切り上げた瞬間にこの約束が破られる。 ラボの判定パネルは、 ドラッグ操作に応じて lie factor を実測値から逐次計算して表示する。 一方折れ線は「位置 (傾き)」で読む図なので、 変化の検出が目的なら非ゼロ起点も許容されることが多い — 「棒は厳格、 線は文脈次第」と覚える。
  2. チャートジャンク (3D 風装飾): 3D 化してもデータは 1 bit も増えないのに、 天面のどこを読むかで値が変わって見え、 data-ink ratio は下がる。 特に 3D 円グラフは手前のスライスが奥行きの分だけ面積過大になり、 lie factor が構造的に 1 を超える。
  3. 図種のミスマッチ: 名義尺度 (県) を折れ線で結ぶと存在しない「推移」を暗示し、 時系列 (年度) を円グラフにすると意味のない「構成比」を捏造する。 円が正当化されるのは「全体に占める割合」に意味がある場合だけ — 中国 5 県の人口なら「中国地方計 7,070 千人に占めるシェア」という読みに限り成立する。

📝 チャート選択クイズ — 目的から図種を即答できるか

可視化設計の第一歩は「目的 → 図種」の即答力。 比較→棒、 推移→折れ線、 構成比→円・帯、 分布→ヒストグラム、 関係→散布図の対応を、 SSDSE-B-2026 の実データを題材にした 5 問で確認しよう。

スコア: 0 / 5

🚀 発展 — このラボの先へ

ここで扱った「静的な見せ方の選択」の次の段階が、 ユーザー操作でビューを変えるインタラクティブ可視化である。 ブラシ選択・ズーム・ツールチップの操作原理は姉妹ページ インタラクティブ可視化 で同じく手を動かして学べる。 個別の図種の作法は 棒グラフ折れ線グラフ円グラフヒストグラム散布図 の各ページへ、 そして「騙すグラフ」の体系的なカタログは 誤解を招くグラフ にまとまっている。 ラボで体感した「同じデータ・違う印象」の感覚を持ってこれらを読むと、 単なる知識が設計判断の基準に変わるはずだ。

⚠️ よくある落とし穴

❌ チャートジャンク
装飾過多で情報が見えなくなる。 Tufte の警告通り、 余計な要素を削る。
❌ 軸の操作
y 軸を 0 から始めないと差を誇張できる。 報道・広告で頻発する 嘘グラフ
❌ 情報過多
1 枚に 10 系列以上は読めない。 ファセット分割(小倍数)を使う。
❌ 3D の濫用
見栄え重視で 3D 円グラフ等を使うと、 比較の精度が落ちる。
❌ 色覚多様性無視
赤緑だけで分けると 5% の人に読めない。 形状や濃淡を併用。

⚠️ 落とし穴

  1. 3D 円グラフ・3D 棒グラフを使う: 奥行きで面積が歪み、 lie factor が 1.5-3 に達する。 円グラフを使うなら 2D、 比較が主目的なら棒グラフが鉄則。 Tufte は「3D 効果は意味なきインク (chartjunk) の代表」と断じている。
  2. 軸を 0 から始めない (軸切断): 棒グラフで y 軸を 90-100 にすれば、 5% 差が 5 倍差のように見える。 「印象操作」と呼ばれる典型的詐欺。 棒・面積系は必ず 0 始まり、 折れ線は文脈次第で許容される。
  3. 色覚多様性を無視する: 赤と緑を二値分類で使うと、 8% の男性 (P/D 型色覚) には区別できない。 viridis / cividis / カラーブラインド対応パレットを選び、 色だけでなく形・パターンも併用する。
  4. オーバープロット (重なりすぎ): n=10000 の散布図は黒い塊になる。 alpha=0.1 で半透明、 hexbin / 2D ヒスト / KDE 等密度可視化に切り替える。
  5. chartjunk と data-ink ratio: 影、 グラデーション、 不要なグリッド、 大きな枠線などはデータを表していないインクで、 data-ink ratio を下げる。 「削れば削るほど良くなる」が Tufte の原則。

🗺 概念マップ

関連概念を視覚的に整理した概念マップ。

dataviz 棒グラフ ヒストグラム 分布形状 散布図 関係性 箱ひげ図

データ可視化 (dataviz) は「目的 → 図種選択 → 視覚記号 → 知覚」の連鎖で機能する。 中心ノード「データ → 知覚翻訳」を起点に、 量比較は棒グラフ、 構成比は積み上げ棒、 分布は箱ひげ・ヒストグラム、 関係性は散布図、 時系列は折れ線、 地理は階級区分図 (コロプレス) が定石である。

SSDSE-B-2026 の都道府県データを可視化する例: 総人口は棒グラフ、 出生数との関係は散布図、 47 都道府県を地図に塗り分ければコロプレス、 各都道府県内の年齢階級は積み上げ棒で表現できる。 Tufte の data-ink ratio (装飾より情報量)、 Cleveland の知覚精度順 (位置 > 長さ > 角度 > 面積 > 色相) が設計指針となる。

🔗 隣接手法への橋渡し

「データビジュアライゼーション」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。 具体的には次の 3 方向と密接につながる:

可視化は分析と意思決定をつなぐ橋。 形を選ぶことが意味を選ぶこと。

🌳 手法選択フロー

「データ可視化」を実際に使うとき、 何をどう選ぶかを順に判断する。 上から順に答えていくと、 使うべき手法と評価の仕方が決まる。

  1. 何を伝えたいのか
    大小の比較なら棒、 時間の推移なら折れ線、 2 変数の関係なら散布図、 分布の形ならヒストグラムか箱ひげ図。 「とりあえずグラフにする」と、 目的に合わない図ができる。
  2. 比較の軸はいくつあるか
    1 つなら 1 枚の図。 2 つ以上なら色分けより、 同じ図を並べる(small multiples)ほうが読み違えが少ない。 2 軸グラフは軸の取り方で印象が変わるので、 代替案を検討してから使う。
  3. 量を長さで表せるか
    長さ(棒の高さ)が最も正確に読める。 角度(円グラフ)や面積は読み取り誤差が大きい。 構成比でもスライスが 5 つを超えるなら棒にする。
  4. 読み手の環境は
    白黒印刷、 色覚特性、 スクリーンリーダを想定する。 色だけで区別せず、 形・線種・直接ラベルも併用する。

可視化は「読み手に何を判断してほしいか」から逆算して選ぶ。 図の種類を先に決めると、 データの性質と合わなくなる。

🧭 深掘り — 「作る側」から「読む側」へ: 図を疑う技術

本ページの本文は主に「どう描くか」を扱ってきた。 ここでは視点を反転させ、 世に出回る図をデコード(読み解き)する側の目を鍛える。 グラフは中立な鏡ではなく、 作者の選択(軸範囲・スケール種・集計単位・チャンネル)を通した主張である。 だからこそ読み手は「この図は何を隠しているか?」を常に問う必要がある。

💡 直感 — 図は「エンコード → デコード」の往復である

可視化は 2 段階の翻訳だ。 まず作者が数値を視覚チャンネル(位置・長さ・角度・面積・色)へエンコードし、 次に読者がそれを脳内で数値へデコードする。 良い図はこの往復での情報の目減りが少ない。 ところが「軸をどこから始めるか」「2 本目の縦軸を足すか」「都道府県を面積で塗るか人口で塗るか」といった作者の一手は、 同じ数値のまま読者の結論を左右する。 つまり批判的な読み手は、 図の表面ではなくエンコードの設計判断を見に行く。 描く力と読む力は表裏一体で、 デコードの落とし穴を知る者ほど、 誤解を生まない図を描ける。

⚠️ 落とし穴(重要) — 二軸グラフ(dual-axis)が捏造する「疑似相関」と「見かけの逆転」

本文の「落とし穴」では軸切断・3D・オーバープロット・色覚を扱ったが、 報道で最も多用され、 かつ本ページで未扱いなのが二軸グラフ(左右に独立した 2 本の縦軸)だ。 左右の軸は単位もスケールも別々なので、 作者は 2 本の折れ線を好きな高さに独立して動かせる。 結果、 本来無関係な 2 系列を「ぴったり連動」させて疑似相関を演出でき、 とりわけ2 本が交差する年(見かけの逆転点)は軸の目盛りを変えるだけで任意の位置に移動する — 交点それ自体には何の意味もない。

実データで見る。 SSDSE-B-2026 の広島県、 出生数 A4101 と死亡数 A4200 の 2012→2023 年の実測値は次の通り(単位: 人)。

年度出生数 A4101死亡数 A4200自然増減(出生−死亡)
201224,84629,273−4,427
202316,68235,563−18,881

この 2 系列を二軸で重ねれば「出生が急落し死亡が急伸、 どこかの年で交差する少子多死の鋏(はさみ)」という劇的な絵が作れる。 だがその交差年は左右軸の範囲次第で 2015 年にも 2021 年にも動く。 出生と死亡は同じ「人」という単位なのだから、 二軸で分ける必要はそもそも無い。 正直な描き方は 2 つ:

  1. 1 本の共通軸に両方を並べる(同一単位なので左右に分けない)。 交差点があれば、 それは実際に「出生数=死亡数」となる本物の年だけになる。
  2. 差(自然増減)そのものを 1 系列で描く。 広島の自然減は −4,427 人(2012)→ −18,881 人(2023)で約 4.26 倍に拡大しており、 これが単位も軸も 1 つで語れる「隠しようのない事実」だ。

読み手のチェックリスト: 図に縦軸が 2 本あったら (1) 単位が本当に別か、 (2) 各軸のゼロ位置と範囲はどこか、 (3) 交点や「連動」の印象が軸設定の産物でないか、 を疑う。 なお下のラボは実測値を固定したまま右軸だけを動かせる — 数値は 1 つも変えていないのに逆転年が滑る様子を体感できる。

二軸モード: グラフを上下にドラッグ(スマホは指でスワイプ)すると右軸=死亡数の目盛りだけが動きます。 実測値は不変です。

🚀 発展 — 面積・地図・不確実性という「見えにくい歪み」

二軸以外にも、 デコード時に静かに効く歪みがある。 発展として 3 つ。

共通する教訓は、 読者がデコードしにくいチャンネルほど作者が(意図せずとも)歪めやすいということ。 位置・長さで語れる図を第一選択にし、 面積・色・二軸は「本当にそれでなければ描けないか」を自問してから使う。

🔗 関連ページ