単元 10:Python で可視化する
- matplotlib で棒・折線・散布図の代表的なグラフを描ける
- ラベル・タイトル・凡例を付けて読みやすくできる
- seaborn を使い分けの観点で理解する
- 日本語が文字化けしない環境を整える(
japanize-matplotlib)
「眺める」から「伝える」への橋渡し
Section titled “「眺める」から「伝える」への橋渡し”ここまでで、データを 読み込み、整形し、集計する までができるようになりました。残るステップは 「結果を視覚に変換する」 — 可視化です。
可視化には 2 つの役割があります:
- 自分のため:データの分布・外れ値・傾向を眼で把握する(探索的可視化)
- 他人のため:分析結果を読み手に伝える(伝達的可視化)
本単元では Python の標準的な可視化ライブラリ matplotlib と、その拡張として人気の seaborn を扱います。
matplotlib の基本
Section titled “matplotlib の基本”matplotlib は Python の可視化の事実上の標準。importの規約:
import matplotlib.pyplot as plt「plt.〇〇 で図を描く」のがマナーです。最もシンプルな棒グラフ:
plt.bar(["東京", "大阪", "福岡"], [120, 80, 60])plt.show()plt.show() は Jupyter/Colab では省略可能(自動表示)です。
集計結果を棒グラフにする
Section titled “集計結果を棒グラフにする”実用的な流れは「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)日本語フォントの対応
Section titled “日本語フォントの対応”matplotlib のデフォルトでは日本語のラベルが豆腐(□)になります。Colab では japanize-matplotlib というライブラリを 1 行で導入できます:
!pip install japanize-matplotlibimport japanize_matplotlibimport した時点で日本語フォントが自動設定されるので、これ以降は普通にラベルやタイトルに日本語を書けます。
seaborn で「もっと美しく」
Section titled “seaborn で「もっと美しく」”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」と使い分けるのが現代的な流儀です。
グラフ種別の選び方の指針
Section titled “グラフ種別の選び方の指針”| グラフ | 向くデータ |
|---|---|
| 棒グラフ | カテゴリ別の数値(集計結果) |
| 折線グラフ | 時系列、順序のある連続変化 |
| 散布図 | 2 つの数値変数の関係 |
| 箱ひげ図 | 数値変数の分布(中央値・四分位・外れ値) |
| ヒストグラム | 数値変数の度数分布 |
最初に手を出すなら 「棒・折線・散布図」の 3 つ で十分カバーできます。
よく出る躓きどころ
Section titled “よく出る躓きどころ”- 日本語が文字化け(□) —
japanize-matplotlibをimportする(Colab) plt.legend()を呼び忘れる —label=を付けても、legend()を呼ばないと凡例が表示されない- scatter で色が大量に変わらない —
c=には数値の配列か明示的な色名のリストを渡す。文字列カテゴリを直接渡しても色分けされないので、map()で変換する - 「集計してから可視化」を忘れる —
df["収入"]をそのまま棒グラフにしようとせず、groupby→reset_index→ 可視化、の順
サンプルコード
Section titled “サンプルコード”- 題材データ:income.csv をダウンロード(名前・年齢・都市・性別・収入の 5 列)
income.csv を題材に、次を順に行いなさい。
groupbyで都市別の平均収入を集計し、matplotlibの棒グラフで可視化する(タイトル・軸ラベル付き)年齢と収入の散布図を描き、点を性別で色分けする- seaborn の
sns.scatterplot(data=df, x="年齢", y="収入", hue="性別")で同じことを行い、コード量を比べる - 同じ図に対して
plt.title("...")、plt.xlabel("...")、plt.ylabel("...")を付けて「人に見せられる」状態にする
3 番で「seaborn だと 1 行で同じことができる」のを体感すると、探索段階での選び方が明確になります。
発展課題(オプション)
Section titled “発展課題(オプション)”sns.boxplotで都市別の収入分布を箱ひげ図にし、外れ値を眺めるplt.subplots(1, 2)で 2 つのグラフを横並びに配置するmatplotlibのスタイル(plt.style.use("seaborn-v0_8"))を変えて、見た目を一括で調整する