コンテンツにスキップ

第01回: 可視化の基本原則

資料のダウンロード

ファイル 内容
exercise.py ハンズオン演習スクリプト

ヒントの使い方

python exercise.py --hint 1            # 方向性ヒント
python exercise.py --hint 1 --level 2  # より具体的なヒント
python exercise.py --hint 1 --level 3  # コード例
python exercise.py --check             # 提出前の自己チェック

演習問題への取り組み方

  1. 下の講義ノートを読む(事前学習・2時間目安)
  2. exercise.py を実行してグラフを確認する
  3. 演習問題(5問)に取り組む
  4. python exercise.py --check で確認する
  5. exercise.py を提出する(締切は授業後1週間)

詰まったとき

# ヒントを見る
python exercise.py --hint N --level 1

# AIに質問する
python ../../ask.py "質問内容"

解決しない場合は Q&A ページの投稿フォームを使ってください。


講義ノート

授業目標

  1. データ可視化における「誤読を生む構造」を具体例から識別できる。
  2. Lie Factor・データ-インク比・チャートジャンクの定義を説明し、グラフの品質評価に適用できる。
  3. 色覚多様性を考慮したパレット選択の根拠を述べられる。

キーコンセプト

1. Lie Factor (嘘係数)

Edward Tufte が著書 The Visual Display of Quantitative Information (1983) で提唱した指標。

Lie Factor = グラフ上で表現された変化量の大きさ
             ─────────────────────────────────
             データ上の実際の変化量の大きさ

Lie Factor = 1.0 のとき、グラフはデータを正確に表現している。
Lie Factor > 1.0 のとき、差異を誇張している(例: Y軸を途中から始める)。
Lie Factor < 1.0 のとき、差異を過小評価している。

演習での確認箇所: plot_axis_truncation() 関数。Y軸を 5.0 から開始したとき、公園(7.0)と駅前(5.8)の棒の高さ比はグラフ上で 2.5 倍になるが、実際の値の比は 1.2 倍に過ぎない。これは Lie Factor ≈ 2.1 を意味する。

ルール: 棒グラフのY軸は原則として 0 から始める。ただし折れ線グラフでは変動の傾向を強調する目的でゼロ始まりでない場合もある(その場合は軸スケールを明示すること)。


2. データ-インク比 (Data-Ink Ratio)

同じく Tufte が提唱した概念。

データ-インク比 = データを表現するために使われたインク量
                 ─────────────────────────────────────
                 グラフ全体のインク量

この比率を最大化するとは、データ以外の要素(グリッド線・枠線・影・背景色など)を極力排除することを意味する。

plot_chart_junk() の悪い例では: - グレーの背景色 - 太い白グリッド線 - 影付きの凡例ボックス - 不要な fill_between

これらはすべてデータを読む妨げになる「インク」である。良い例では折れ線 1 本と最低限の軸だけで同じ情報を伝えている。

実装テクニック:

# 上・右の枠線を消す(Tufte スタイル)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)

# グリッド線は Y 方向のみ・薄いグレーで
ax.yaxis.grid(True, color="lightgray", linewidth=0.5)
ax.set_axisbelow(True)  # グリッド線をデータの背面に


3. チャートジャンク (Chart Junk)

グラフに含まれる装飾的要素のうち、情報量を増やさずに読みにくさだけを増大させるものを指す。代表例:

要素 問題点
3Dグラフ 奥行き・角度により高さ・面積の正確な読み取りが困難になる
影・グロー効果 面積の知覚を歪める
過剰なグリッド線 視線がデータではなくグリッドに引きつけられる
背景画像 コントラストを低下させる
過剰な凡例装飾 shadow=True, fancybox=True は情報量ゼロ

plot_3d_misuse() で示すように、3D棒グラフは見た目は派手だが、奥行きの棒が手前の棒より小さく見える視覚的バイアスが生じる。同じデータなら水平棒グラフで十分に、かつ正確に表現できる。


4. 色覚多様性 (Color Vision Deficiency) への配慮

日本人男性の約5%、女性の約0.2%が先天性色覚多様性を持つ(日本眼科学会, 2023年推計)。P型(赤弱)・D型(緑弱)では赤と緑の区別が困難になる。

避けるべき組み合わせ: - 赤 ↔ 緑(最も多いP/D型で判別不能) - 青 ↔ 紫

推奨パレット: Okabe-Ito (2008)

okabe_ito = [
    "#E69F00",  # オレンジ
    "#56B4E9",  # 空色
    "#009E73",  # 緑(青みがかった)
    "#F0E442",  # 黄
    "#0072B2",  # 青
    "#D55E00",  # 朱
    "#CC79A7",  # ピンク
]

このパレットは P型・D型・T型(青黄型)いずれでも判別しやすい配色として設計されている。matplotlib の "tab10" より色覚多様性への配慮が高い。


コードの重要箇所解説

prepare_summary() — データ集計

df.groupby("place_type")["happiness_score"].mean().reset_index()

groupby + mean() で場所種別ごとの平均を計算する。reset_index() を呼んで列名を保持した DataFrame に戻すことで、後続の bar() に渡しやすくなる。

plot_axis_truncation() — Y軸制御

ax_bad.set_ylim(5.0, 8.0)   # 悪い例
ax_good.set_ylim(0, 10)     # 良い例: スコアの定義域に合わせる

set_ylim() の第一引数が Y軸の下限。棒グラフでは 下限を 0 にすることが誤読防止の基本ルール。

plot_chart_junk() — 週次集計と折れ線グラフ

weekly_mean = df.groupby("week")["happiness_score"].mean()

week カラムは datetime 型のため、groupby("week") で週単位に正しく集計できる。結果は pd.Series で、index が週日付、値が平均スコアになる。


今週の課題

exercise.py 内の演習問題 1〜5 を完成させてください。

  • 演習1: Y軸の ylim を修正して 0始まりにする
  • 演習2: 色パレットを Okabe-Ito に差し替える
  • 演習3: spines の top・right を非表示にする
  • 演習4: Lie Factor の数値を計算してコメントに記入する
  • 演習5: grid() を yaxis のみの薄いグレー線に改善する

各演習では # YOUR CODE HERE 部分を実装し、前後の悪い例と比較して どこがどう改善されたかを1〜2行のコメントで説明してください。


参考文献・リンク

  1. Tufte, E. R. (1983). The Visual Display of Quantitative Information. Graphics Press.
    — Lie Factor、データ-インク比、チャートジャンクの原典。

  2. Okabe, M., & Ito, K. (2008). Color Universal Design (CUD): How to make figures and presentations that are friendly to colorblind people.
    https://jfly.uni-koeln.de/color/

  3. matplotlib 公式ドキュメント — Choosing Colormaps
    https://matplotlib.org/stable/users/explain/colors/colormaps.html

  4. Cairo, A. (2016). The Truthful Art: Data, Charts, and Maps for Communication. New Riders.
    — 可視化の倫理と「真実性」についての現代的な解説書。

  5. 日本眼科学会 (2023). 色覚異常について
    https://www.nichigan.or.jp/