コンテンツにスキップ

単元 10:Python で可視化する

  • matplotlib で棒・折線・散布図の代表的なグラフを描ける
  • ラベル・タイトル・凡例を付けて読みやすくできる
  • seaborn を使い分けの観点で理解する
  • 日本語が文字化けしない環境を整える(japanize-matplotlib

「眺める」から「伝える」への橋渡し

Section titled “「眺める」から「伝える」への橋渡し”

ここまでで、データを 読み込み、整形し、集計する までができるようになりました。残るステップは 「結果を視覚に変換する」 — 可視化です。

可視化には 2 つの役割があります:

  1. 自分のため:データの分布・外れ値・傾向を眼で把握する(探索的可視化)
  2. 他人のため:分析結果を読み手に伝える(伝達的可視化)

本単元では Python の標準的な可視化ライブラリ matplotlib と、その拡張として人気の seaborn を扱います。

matplotlib は Python の可視化の事実上の標準。importの規約:

import matplotlib.pyplot as plt

plt.〇〇 で図を描く」のがマナーです。最もシンプルな棒グラフ:

plt.bar(["東京", "大阪", "福岡"], [120, 80, 60])
plt.show()

plt.show() は Jupyter/Colab では省略可能(自動表示)です。

実用的な流れは「groupby で集計してから可視化に渡す」です:

agg = df.groupby("都市")["収入"].mean().reset_index()
plt.bar(agg["都市"], agg["収入"])
plt.xlabel("都市")
plt.ylabel("平均収入(万円)")
plt.title("都市別の平均収入")
plt.show()

ラベルとタイトルを付けるだけで、グラフが「人に見せられる」レベルになります。

都市別の平均収入を表す棒グラフ

時系列や順序のあるデータには折線グラフが向きます:

plt.plot(years, sales)
plt.xlabel("")
plt.ylabel("売上")
plt.title("年次売上推移")
plt.show()

複数系列を重ねるには plt.plot を複数回呼ぶか、label を付けて凡例を出します:

plt.plot(years, sales_a, label="製品A")
plt.plot(years, sales_b, label="製品B")
plt.legend()
plt.show()

plt.legend() を呼ばないと凡例は表示されない点に注意。

2 つの数値変数の 関係 を見るときは散布図が定番です:

plt.scatter(df["年齢"], df["収入"])
plt.xlabel("年齢")
plt.ylabel("収入")
plt.title("年齢と収入の関係")
plt.show()

年齢と収入の関係を表す散布図

点に色を付けて第 3 の変数を表現することもできます:

colors = df["性別"].map({"男性": "blue", "女性": "red"})
plt.scatter(df["年齢"], df["収入"], c=colors)

matplotlib のデフォルトでは日本語のラベルが豆腐(□)になります。Colab では japanize-matplotlib というライブラリを 1 行で導入できます:

!pip install japanize-matplotlib
import japanize_matplotlib

import した時点で日本語フォントが自動設定されるので、これ以降は普通にラベルやタイトルに日本語を書けます。

matplotlib は柔軟ですが、コードが長くなりがちです。seaborn は matplotlib の上に作られた高レベル API で、「DataFrame を直接渡すと適切に描く」 ことを目指しています:

import seaborn as sns
sns.barplot(data=df, x="都市", y="収入")
sns.scatterplot(data=df, x="年齢", y="収入", hue="性別")
sns.boxplot(data=df, x="都市", y="収入")

data=df, x="...", y="..." のパターンが一貫しているのが特徴。色分けは hue 引数で簡単に指定できます。

「探索段階は seaborn、発表用に細かく整えるときは matplotlib」と使い分けるのが現代的な流儀です。

グラフ向くデータ
棒グラフカテゴリ別の数値(集計結果)
折線グラフ時系列、順序のある連続変化
散布図2 つの数値変数の関係
箱ひげ図数値変数の分布(中央値・四分位・外れ値)
ヒストグラム数値変数の度数分布

最初に手を出すなら 「棒・折線・散布図」の 3 つ で十分カバーできます。

  • 日本語が文字化け(□)japanize-matplotlibimport する(Colab)
  • plt.legend() を呼び忘れるlabel= を付けても、legend() を呼ばないと凡例が表示されない
  • scatter で色が大量に変わらないc= には数値の配列か明示的な色名のリストを渡す。文字列カテゴリを直接渡しても色分けされないので、map() で変換する
  • 「集計してから可視化」を忘れるdf["収入"] をそのまま棒グラフにしようとせず、groupbyreset_index → 可視化、の順

income.csv を題材に、次を順に行いなさい。

  1. groupby で都市別の平均収入を集計し、matplotlib の棒グラフで可視化する(タイトル・軸ラベル付き)
  2. 年齢収入 の散布図を描き、点を性別で色分けする
  3. seaborn の sns.scatterplot(data=df, x="年齢", y="収入", hue="性別") で同じことを行い、コード量を比べる
  4. 同じ図に対して plt.title("...")plt.xlabel("...")plt.ylabel("...") を付けて「人に見せられる」状態にする

3 番で「seaborn だと 1 行で同じことができる」のを体感すると、探索段階での選び方が明確になります。

  • sns.boxplot で都市別の収入分布を箱ひげ図にし、外れ値を眺める
  • plt.subplots(1, 2) で 2 つのグラフを横並びに配置する
  • matplotlib のスタイル(plt.style.use("seaborn-v0_8"))を変えて、見た目を一括で調整する