3. データ可視化¶
第 3 回では Python のライブラリ Matplotlib を用いたデータ可視化について学びます。
3.1 機械学習とデータ可視化¶
機械学習を学ぶうえで、データ可視化は非常に重要な技術です。可視化は、データの理解からモデル評価、結果の説明まで、あらゆる工程で重要な役割を果たします。
3.1.1 データ理解のための可視化¶
機械学習のモデルを構築する前に、まずデータを理解することが重要です。数千、数万行にも及ぶデータを数値の羅列として眺めても、そこから意味のある情報を読み取ることは困難です。しかし、適切なグラフで可視化することで、以下のような重要な情報を瞬時に把握できます。
- データの分布:ヒストグラムや箱ひげ図で、データがどのように分布しているかを確認することができる
- 外れ値の検出:散布図で、異常な値や外れ値を視覚的に確認することができる
- 特徴量間の関係:相関図やペアプロットで、変数間の相関関係を把握することができる
- クラスの偏り:円グラフや棒グラフで、分類問題におけるクラスの不均衡を確認することができる
これらの情報は、モデル選択や前処理の方針を決める重要な判断材料となります。
3.1.2 モデル評価のための可視化¶
機械学習モデルを訓練した後、その性能を評価する際にも可視化は不可欠です。数値的なスコアだけでは見えにくい傾向を、グラフを通して直感的に理解することができます。
- 学習曲線:訓練誤差と検証誤差の推移を可視化し、過学習や未学習の兆候を確認することができる
- 混同行列:分類モデルの予測結果をヒートマップで表現し、どのクラスで誤りが多いかを把握することができる
- ROC 曲線:しきい値を変化させた際のモデル性能を比較し、識別能力を評価することができる
- 特徴量の重要度:どの特徴量が予測に強く寄与しているかを棒グラフなどで可視化することができる
これらの可視化により、単なる精度の数値だけでは見えない、モデルの強みや弱点を分析することが可能になります。
3.1.3 結果の伝達のための可視化¶
機械学習の成果を他者に説明する際、可視化は強力な伝達の手段となります。専門知識を持たない人にも、グラフを通じて分析結果や予測の根拠を直感的に伝えることができます。
機械学習プロジェクトにおける可視化の役割
機械学習のワークフローは、「データ収集 → データ理解・探索 → 前処理 → モデル構築 → 評価 → デプロイ」という流れで進みますが、可視化はすべての段階で活用されます。優れた機械学習エンジニアやデータサイエンティストは、必ず優れた可視化スキルを持っています。
データ可視化は、複雑なデータを直感的に理解し、適切な意思決定を行うための基礎となります。本章では、そのための強力なツールである Matplotlib と Seaborn の使い方を学んでいきます。
3.1.4 Python によるデータ可視化¶
Python には、データ可視化を行うためのツールがさまざま提供されています。特に、オープンソースのライブラリである Matplotlib や Seaborn は、柔軟で詳細なカスタマイズが可能なグラフ作成を強力にサポートしてくれます。これらのライブラリを使用することで、簡単な散布図から複雑なヒートマップや 3D プロットまで、多種多様な可視化を容易に実現できます。
Matplotlib¶
Matplotlib は、Python で最も広く使われている定番の可視化ライブラリです。細かいカスタマイズが自由自在にできる反面、最初は少し面倒に感じるところもあるかもしれませんが、Python によるデータ可視化を学ぶうえで欠かせません。
公式サイト:https://matplotlib.org/
ライブラリのインストールについて
通常、Python のライブラリは pip コマンドでインストールする必要がありますが、Matplotlib のような使用頻度の高い重要なライブラリは、Google Colab にはじめからインストールされています。Google Colab 以外の環境を使用している方は、必要に応じて各自でインストールしてください(例: pip install matplotlib seaborn)。
3.2 Matplotlib の基本¶
3.2.1 Matplotlib のインポート¶
Matplotlib による可視化は、pyplot というサブモジュールを通して行われます。インポートは以下のようにして行います。ソースコードの冒頭で一度だけ書くようにしましょう。
以下で紹介するコードは、matplotlib.pyplot モジュールがインポートされ、plt という省略表記で利用できる状態であることを前提としています。
3.3 基本的なグラフの描画¶
3.3.1 折れ線グラフ¶
データをプロットして折れ線グラフを表示するには、以下のように pyplot.plot() 関数と pyplot.show() 関数を用います。
# x の値(横軸)
x = [0, 1, 2, 3, 4]
# y の値(縦軸)
y = [0, 1, 4, 9, 16]
# データをプロット
plt.plot(x, y)
# グラフの表示
plt.show()
以下のように 1 行に収めることもできます。
plt.show() の省略について
本来の Python では、plt.plot() 関数のあとに plt.show() 関数を用いてグラフを表示する必要があります。しかし、Google Colab は plot() を見つけると、「グラフを出力したいんだ」と解釈し、裏で自動的に show() 相当のことをしてくれるため、記述を省略することができます。
3.3.2 棒グラフ¶
棒グラフを表示するには、pyplot.bar() 関数を用います。
横向きの棒グラフを表示する場合は、pyplot.barh() 関数を用います。
3.3.3 散布図¶
散布図を表示するには、pyplot.scatter() 関数を用います。
3.3.4 円グラフ¶
円グラフを表示するには、pyplot.pie() 関数を用います。各要素にラベルをつける場合は、以下のように labels オプションを指定します。
デフォルトでは上の図のように、時計の 3 時の位置から反時計回りに円グラフが描かれます。これを、時計の 12 時の位置から時計回りに描きたい場合は、以下のように startangle オプションを 90 に、counterclock オプションを False に指定します。
3.3.5 ヒストグラム¶
ヒストグラムを表示するには、pyplot.hist() 関数を用います。ヒストグラムではデータの他に、区間(ビン)の数(bins)やビンの色(color, edgecolor)を指定することができます。
import numpy as np
import matplotlib.pyplot as plt
# 標準正規分布のデータを 300 個生成
data = np.random.randn(300)
# ヒストグラムを描画
plt.hist(
data,
bins=20,
color="skyblue",
edgecolor="black"
)
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
3.3.6 グラフの基本要素¶
グラフの基本要素として、次のものがあります。
- 「タイトル 」(
title) - 「横軸ラベル」(
xlabel) - 「縦軸ラベル」(
ylabel) - 「グリッド線」(
grid) - 「凡例」(
legend)
それぞれ以下のようにして使うことができます。
plt.plot(
[1, 2, 3], [1, 4, 9],
label="Sugoi Sen" # 凡例のラベル
)
plt.title("Kakkoii Graph") # グラフタイトル
plt.xlabel("Yoko Label") # 横軸ラベル
plt.ylabel("Tate Label") # 縦軸ラベル
plt.grid(True) # グリッド線の表示
plt.legend() # 凡例の表示
3.3.7 日本語フォントの利用¶
Matplotlib でグラフのタイトルや軸ラベルに日本語を使うと、そのままでは文字化けしてしまうことがあります。この問題を解決するためには、japanize-matplotlib というライブラリを使います。
まず、以下のコマンドでライブラリをインストールします(Google Colab の場合は、セルの先頭に ! を付けて実行します)。
次に、プログラムの冒頭でこのライブラリをインポートします:
これで、Matplotlib のグラフで日本語が正しく表示されるようになります。以下は使用例です。
import matplotlib.pyplot as plt
import japanize_matplotlib
# 日本語を含むグラフの作成
plt.plot([1, 2, 3], [1, 4, 9], label="すごい線")
plt.title("かっこいいグラフ")
plt.xlabel("横ラベル")
plt.ylabel("縦ラベル")
plt.grid(True)
plt.legend()
plt.show()
japanize-matplotlib の便利な点
japanize-matplotlib は、インポートするだけで自動的に日本語フォントを設定してくれるため、複雑な設定を記述する必要がありません。Google Colab や Jupyter Notebook など、さまざまな環境で使用できます。
3.4 NumPy の関数¶
データ可視化の練習をするうえで知っておくと便利な NumPy の関数をいくつか紹介します。必要に応じて NumPy 公式 のドキュメントを参照するようにしてください。
3.4.1 データ生成系¶
np.linspace(start, stop, num): 指定範囲内で等間隔な値の配列を生成np.arange(start, stop, step): 指定範囲内でステップ幅を持つ配列を生成np.random.rand(): 一様分布の乱数を生成np.random.randn(): 標準正規分布の乱数を生成np.random.normal(): 正規分布の乱数を生成np.random.seed(): 乱数のシード値を設定(再現性のある乱数を生成したい場合)np.zeros(): 0 で満たされた配列を作成np.ones(): 1 で満たされた配列を作成
3.4.2 数学・統計系¶
np.sin(),np.cos(),np.exp():さまざまな数学関数np.mean(),np.median(),np.std():基本統計量の計算np.min(),np.max():最小値・最大値の取得np.pi:円周率 π
3.5 演習問題¶
演習 3-1: GDP データの可視化¶
演習 3-1
日本を含む3ヶ国以上のGDPを調べ、棒グラフ(単位:10億ドル)で可視化してください。
解答例
import matplotlib.pyplot as plt
import japanize_matplotlib
# 国名とGDPデータ(2024年推定、単位:10億ドル)
countries = ["アメリカ", "中国", "日本", "ドイツ", "インド"]
gdp = [29185, 18748, 4026, 4659, 3909]
# 棒グラフの作成
plt.bar(countries, gdp, color='skyblue', edgecolor='black')
# グラフの装飾
plt.title("各国のGDP比較(2024年)")
plt.xlabel("国名")
plt.ylabel("GDP(10億ドル)")
plt.grid(axis='y', alpha=0.3)
# グラフの表示
plt.show()
ポイント:
- 日本語を使う場合は
import japanize_matplotlibを忘れずに colorやedgecolorでグラフを見やすく装飾しましょうgrid()を使うことで値の比較がしやすくなります
演習 3-2: 気温データの可視化¶
演習 3-2
np.random.rand() 関数を用いて24個のランダムな数値を生成し、それを仮想的な24時間分の気温データ(単位:℃)として、折れ線グラフで可視化してください。ただし、現実的な気温の範囲を考慮してください。
解答例
import numpy as np
import matplotlib.pyplot as plt
# 24時間分の時刻データ
hours = np.arange(24)
# ランダムな値を生成し、現実的な気温範囲(10℃~30℃)にスケーリング
# np.random.rand(24) は 0~1 の範囲なので、20 を掛けて 10 を足す
temperature = np.random.rand(24) * 20 + 10
# 折れ線グラフの作成
plt.plot(hours, temperature, marker='o', linestyle='-', color='orangered')
# グラフの装飾
plt.title("24時間の気温変化(仮想データ)")
plt.xlabel("時刻(時)")
plt.ylabel("気温(℃)")
plt.grid(True, alpha=0.3)
plt.xticks(np.arange(0, 24, 2)) # X軸を2時間ごとに表示
# グラフの表示
plt.show()
ポイント:
np.random.rand()は0~1の範囲の乱数を生成するため、適切にスケーリングが必要ですmarker='o'で各データポイントを強調できますxticks()を使うことで、X軸の表示間隔を調整できます
演習 3-3: 自由落下のシミュレーション¶
演習 3-3
ボールの自由落下のシミュレーションを行い、時間に対する高さのグラフを散布図で可視化してください。
ヒント: リストに要素を追加するには append() メソッドを使うことができます。
解答例(NumPy 配列を使う方法)
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
# 物理定数
g = 9.8 # 重力加速度 (m/s^2)
h0 = 100 # 初期高さ (m)
# 時間配列(0秒から5秒まで、20個のデータポイント)
t = np.linspace(0, 5, 20)
# 自由落下の式: h = h0 - (1/2) * g * t^2
height = h0 - 0.5 * g * t**2
# 散布図の作成
plt.scatter(t, height, s=50, color='blue', alpha=0.7, edgecolors='black')
# グラフの装飾
plt.title("ボールの自由落下シミュレーション")
plt.xlabel("時間(秒)")
plt.ylabel("高さ(m)")
plt.grid(True, alpha=0.3)
# グラフの表示
plt.show()
解答例(for 文を使う方法)
import matplotlib.pyplot as plt
import japanize_matplotlib
# 物理定数
g = 9.8 # 重力加速度 (m/s^2)
h0 = 100 # 初期高さ (m)
# 時間と高さのリストを初期化
time_list = []
height_list = []
# 0.0秒から0.25秒刻みで5秒まで計算
t = 0.0
while t <= 5.0:
# 自由落下の式: h = h0 - (1/2) * g * t^2
h = h0 - 0.5 * g * t**2
# リストにデータを追加
time_list.append(t)
height_list.append(h)
# 次の時刻へ
t += 0.25
# 散布図の作成
plt.scatter(time_list, height_list, s=50, color='blue', alpha=0.7, edgecolors='black')
# グラフの装飾
plt.title("ボールの自由落下シミュレーション")
plt.xlabel("時間(秒)")
plt.ylabel("高さ(m)")
plt.grid(True, alpha=0.3)
# グラフの表示
plt.show()
ポイント:
- NumPy配列を使う方法: 一度に全データを計算できるため、コードが簡潔で高速です
- for文(while文)を使う方法: 1つずつ計算するため、処理の流れが理解しやすいです
- 自由落下の公式 \(h = h_0 - \frac{1}{2}gt^2\) を使用します
- 散布図には
plt.scatter()を使用し、sでマーカーサイズを指定できます - for文版では、リストに
append()でデータを追加していきます
3.6 Matplotlib で高度なグラフを扱う準備¶
ここまでは、matplotlib.pyplot をpltとしてインポートし、plt.plot()のようにしてグラフの描画を行いました。シンプルなグラフの描画であればこれでも十分ですが、複数のグラフ描画や細かい制御を行いたい場合は、fig, axスタイルがよく用いられます。
3.6.1 fig, ax スタイルによるグラフ描画¶
公式サイトのドキュメントを含む多くのサンプルコードでは、以下のような fig, ax を用いた記述が使われています。
import matplotlib.pyplot as plt
# グラフ描画の準備
fig, ax = plt.subplots()
# グラフの描画
ax.plot([1, 2, 3], [1, 4, 9], label="Sen")
ax.set_title("Title")
ax.set_xlabel("X label")
ax.set_ylabel("Y Label")
ax.legend()
ax.grid(True)
plt.show()
前回の方法との違いをまとめると、以下のようになります。
| 要素 / 機能 | plt スタイル | fig, ax スタイル |
|---|---|---|
| 描画の準備 | - | fig, ax = plt.subplots() |
| タイトル | plt.title("Title") |
ax.set_title("Title") |
| X 軸ラベル | plt.xlabel("X label") |
ax.set_xlabel("X label") |
| Y 軸ラベル | plt.ylabel("Y label") |
ax.set_ylabel("Y label") |
| 凡例 | plt.legend() |
ax.legend() |
| グリッド線 | plt.grid(True) |
ax.grid(True) |
| グラフ表示 | plt.show() |
plt.show() |
描画の準備のコードが追加されたことと、グラフ要素を表示する関数名に一部変化はありますが、基本的には plt が ax になったくらいで、大きな変化はありません。pyplot.subplots() は複数のグラフ描画や柔軟なレイアウトを実現するためにするもので、上の例のように引数を省略すると単一のグラフが描かれることになります。
3.6.2 グラフのカスタマイズ¶
これまでに「タイトル」や「軸ラベル」「凡例」など、簡単なグラフ要素を紹介してきましたが、Matplotlib ではその他にもさまざまな要素を設定することができます。以下は、公式サイト で提供されている、グラフ要素一覧を確認できるチートシートです。
さらに包括的なチートシートは、以下のリンクから確認することができます。このような情報を適宜参照しながら、洗練されたグラフを描くことを心がけるようにしてください。
Matplotlib cheatsheets and handouts:https://matplotlib.org/cheatsheets/
3.7 Matplotlib による高度なグラフ描画¶
これまでに折れ線グラフや棒グラフなど、基本的なグラフの描き方を紹介しました。ここでは、より高度なグラフについても紹介していきます。
3.7.1 グラフ描画関数の一覧¶
Matplotlib によるグラフ描画関数のうち、特に重要なものの一覧を以下に記します。公式の Plot types や Examples にも同等の情報が掲載されていますので、必要に応じて参照するようにしてください。
| グラフの種類 | plt スタイル | fig, ax スタイル |
|---|---|---|
| 折れ線グラフ | plt.plot() |
ax.plot() |
| 棒グラフ | plt.bar() |
ax.bar() |
| 散布図 | plt.scatter() |
ax.scatter() |
| 円グラフ | plt.pie() |
ax.pie() |
| ヒストグラム | plt.hist() |
ax.hist() |
| 箱ひげ図 | plt.boxplot() |
ax.boxplot() |
| エラーバー付きグラフ | plt.errorbar() |
ax.errorbar() |
| バイオリンプロット | plt.violinplot() |
ax.violinplot() |
| ヒートマップ | plt.imshow() |
ax.imshow() |
3.7.2 箱ひげ図¶
箱ひげ図を描くには、pyplot.boxplot() 関数を用います。以下は、標準正規分布に従う分布データを 2 つ生成し、箱ひげ図を描画するコード例です。
import matplotlib.pyplot as plt
import numpy as np
# 標準正規分布に従う分布データを生成
data = [
np.random.randn(100),
np.random.randn(100)
]
# 箱ひげ図の描画
fig, ax = plt.subplots()
ax.boxplot(data)
plt.show()
3.7.3 エラーバー付きグラフ¶
エラーバー付きグラフを描くには、pyplot.errorbar() 関数を用います。以下は、エラーバー付きグラフの描画例です。
import matplotlib.pyplot as plt
# データの準備
x = [1, 2, 3]
y = [2, 4, 3]
yerr = [0.2, 0.5, 0.3]
# エラーバー付きグラフの描画
fig, ax = plt.subplots()
ax.errorbar(x, y, yerr, fmt="-o")
plt.show()
3.7.4 バイオリンプロット¶
バイオリンプロットを描くには、pyplot.violinplot() 関数を用います。以下は、numpy.random.normal(平均値, 標準偏差, サンプル数) 関数を用いて 3 つの分布データを生成し、それを描画するコード例です。
import matplotlib.pyplot as plt
import numpy as np
# 平均値が異なる 3 つの分布データを生成
data = [
np.random.normal(80, 10, 100),
np.random.normal(100, 10, 100),
np.random.normal(120, 10, 100)
]
# バイオリンプロットの描画
fig, ax = plt.subplots()
ax.violinplot(data)
plt.show()
3.7.5 ヒートマップ¶
ヒートマップを描くには、pyplot.imshow() 関数を用います。ax.imshow() と書くだけでも描くことができますが、以下のように colorbar() 関数を使用してカラーバーを同時に描画することを推奨します。
import matplotlib.pyplot as plt
import numpy as np
# 5x5 の 2 次元データを作成
matrix = np.random.rand(5, 5)
# ヒートマップの描画
fig, ax = plt.subplots()
cax = ax.imshow(matrix)
# カラーバーの描画
fig.colorbar(cax)
plt.show()
デフォルトのカラーマップ(配色テーマ)は viridisと呼ばれるものになっていますが、imshow() の引数で cmap を指定することで(例:ax.imshow(data, cmap="gray"))、さまざまな色合いに変更することができます。以下は代表的なカラーマップの例です。
viridis:デフォルト。視認性が高く、色覚異常を持つ人々にも見やすい。plasma:色鮮やかで、印象的かつ色覚異常を持つ人々にも見やすい。inferno:高コントラストで暗い背景に合う。cividis:色覚多様性に完全対応。gray:最も基本的なグレースケール。
3.7.6 複数グラフの描画¶
pyplot.subplot() 関数を使うと、簡単に複数のグラフを描画することができます。第 1 引数で行の数、第 2 引数で列の数を指定することができ、1×2 のグラフを描きたい場合は subplot(1, 2) のようにします。以下は、1×2 の折れ線グラフを描画する例です。subplot() の引数で、figsize=(12, 5)とすることでグラフ全体の幅と高さを 12 インチ ×5 インチに指定し、sharey=True とすることで Y 軸を 2 つのグラフで共有する設定としています。
import matplotlib.pyplot as plt
import numpy as np
# データの生成
x = np.arange(100)
y1 = np.random.normal(100, 10, 100)
y2 = np.random.normal(80, 15, 100)
y3 = np.random.normal(60, 12, 100)
y4 = np.random.normal(45, 10, 100)
# 1x2 のプロット + Y 軸共有
fig, axs = plt.subplots(
1, 2,
figsize=(12, 5),
sharey=True
)
# 左の折れ線グラフ
axs[0].plot(x, y1, label="Series A")
axs[0].plot(x, y2, label="Series B")
axs[0].set_title("Dataset 1")
axs[0].set_xlabel("Index 1")
axs[0].set_ylabel("Value")
axs[0].legend()
# 右の折れ線グラフ
axs[1].plot(x, y3, label="Series C")
axs[1].plot(x, y4, label="Series D")
axs[1].set_title("Dataset 2")
axs[1].set_xlabel("Index 2")
axs[1].legend()
# レイアウト調整 & 表示
plt.tight_layout()
plt.show()
以下は、2×2 のグラフを描画する例です。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, axs = plt.subplots(2, 2, figsize=(8, 6))
axs[0, 0].plot(x, np.sin(x))
axs[0, 0].set_title("sin(x)")
axs[0, 1].plot(x, np.cos(x))
axs[0, 1].set_title("cos(x)")
axs[1, 0].plot(x, np.tan(x))
axs[1, 0].set_title("tan(x)")
axs[1, 1].plot(x, np.exp(-x))
axs[1, 1].set_title("exp(-x)")
plt.tight_layout()
plt.show()
不自然な形のグラフ
tan(x) のグラフが少しおかしな形になってしまっています。値が急激に変化しても不自然にならないよう、ax.set_ylim(bottom, top)を使って見た目を整えてみましょう。
3.8 Seaborn によるグラフ描画¶
Seaborn は、Matplotlib をベースとした Python のデータ可視化ライブラリです。Seaborn を使うことで、見やすく美しいグラフをさらに簡単に作ることができます。以下では簡単な使用例のみを紹介しますので、必要に応じて公式のドキュメントを参考にするようにしてください。
Seaborn 公式サイト: https://seaborn.pydata.org/
3.8.1 Seaborn のインポート¶
Seaborn のインポートは以下のようにして行います。
Seaborn 利用時の注意
Seaborn は Matplotlib 上に構築されているため、グラフの表示やグラフ要素の細かいカスタマイズを行うためには matplotlib.pyplotも併せてインポートする必要があります。
3.8.2 サンプルデータセット¶
Seaborn には、データ分析や可視化の練習に便利なサンプルデータセットが用意されています。以下は、有名なサンプルデータセットの一覧です(データソース全体)。
| データセット名 | 概要 |
|---|---|
tips |
レストランのチップに関する情報 |
iris |
アヤメの品種と花の長さ・幅のデータ |
titanic |
タイタニック号の乗客情報 |
flights |
年・月ごとの航空旅客数 |
diamonds |
ダイヤモンドの価格・カット・カラーなどの特徴 |
penguins |
ペンギンの種類・体重・くちばしのサイズなどのデータ |
planets |
発見された惑星に関する情報(質量・年・方法など) |
その他、利用可能なデータセットの一覧は、以下のようにして取得することができます。
ここでは、penguins データセットを例に、データ可視化の基本的な流れを確認していきましょう。
サンプルデータセットの読み込み¶
サンプルデータセットを読み込むには、seaborn.load_dataset() 関数を用います。引数にデータセット名の文字列を渡すことで、各種データフレームを受け取ることができます。データフレームについては別の回で改めて説明しますが、ここでは表形式のデータ型というくらいの認識を持っていてください。seaborn.load_dataset() 関数で penguins データセットを読み込み、DataFrame.head() 関数で最初の 5 行のデータを確認するコードは以下のようになります(最後の 5 行を確認したい場合は DataFrame.tail() 関数を用います)。
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset("penguins")
# 最初の 5 行を見る
print(df.head())
実行結果は以下のようになり、どのような形でデータが用意されているかを確認することができます。
species island bill_length_mm ... flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 ... 181.0 3750.0 Male
1 Adelie Torgersen 39.5 ... 186.0 3800.0 Female
2 Adelie Torgersen 40.3 ... 195.0 3250.0 Female
3 Adelie Torgersen NaN ... NaN NaN NaN
4 Adelie Torgersen 36.7 ... 193.0 3450.0 Female
しかし、途中のカラム(列)が省略されており、すべての構造を確認することができません。このような場合は、DataFrame.columns 属性や DataFrame.info() 関数を用いることで、カラム一覧やデータ構造を確認することができます。また、公式のデータソース一覧 (GitHub) から、より詳細な情報を確認することもできます。Kaggle のノートブック「penguin dataset : The new Iris」もわかりやすいのでおすすめです。
3.8.3 散布図 (Matplotlib)¶
Seaborn を使う前に、まずは Matplotlib を使ってデータセットの簡単な散布図を描いてみましょう。以下は、penguins データセットから 2 つの特徴量を取り出して散布図を描画する例です。
import seaborn as sns
import matplotlib.pyplot as plt
# penguins データセットの読み込み
df = sns.load_dataset("penguins")
# Matplotlib で散布図を描画
plt.scatter(df['bill_length_mm'], df['body_mass_g'])
plt.xlabel('Bill Length [mm]')
plt.ylabel('Body Mass [g]')
plt.show()
このように、Matplotlib の plt.scatter() を使っても散布図は描けますが、色分けや凡例の追加などは手動で行う必要があり、やや手間がかかります。次に紹介する Seaborn を使うと、これらをより簡単に実現できます。
3.8.3 散布図 (Seaborn)¶
Seaborn で散布図を描くには、seaborn.scatterplot() 関数を用います。以下は、penguins データセットに対する使用例です。
import seaborn as sns
import matplotlib.pyplot as plt
# penguins データセットの読み込み
df = sns.load_dataset("penguins")
# デフォルトのテーマに設定
sns.set_theme()
# 散布図のプロット
sns.scatterplot(data=df,
x="bill_length_mm",
y="body_mass_g",
hue="species",
style="sex"
)
# レイアウトの自動調整
plt.tight_layout()
# グラフの表示
plt.show()
このように Seaborn を使うことで、複雑なデータを簡単に可視化することができ、そこから多くの情報を直感的に得ることが可能となります。その他にもさまざまな表現が可能ですが、使用方法の詳細は公式のドキュメントを参照するようにしてください。
3.9 演習問題¶
演習 3-4: Tips データセットの可視化¶
演習 3-4
tips データセットを使い、チップ金額の分布をヒストグラムで可視化してください。
解答例
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib
# tipsデータセットの読み込み
tips = sns.load_dataset("tips")
# ヒストグラムの作成
plt.hist(tips['tip'], bins=20, color='skyblue', edgecolor='black', alpha=0.7)
# グラフの装飾
plt.title("チップ金額の分布")
plt.xlabel("チップ金額 ($)")
plt.ylabel("頻度")
plt.grid(axis='y', alpha=0.3)
# グラフの表示
plt.show()
ポイント:
plt.hist()関数を使ってヒストグラムを描画しますbinsパラメータで区間(ビン)の数を指定できます(値を変えて試してみましょう)edgecolorで各バーの境界線の色を指定すると、視認性が向上します- データフレームから特定のカラムを取り出すには
tips['tip']のように記述します - ヒストグラムはデータの分布を視覚的に理解するのに適したグラフです
課題 3: データ可視化の実践¶
課題 3
Seaborn のサンプルデータセットから一つ選択し、二つ以上のグラフを用いてデータを可視化してください。また、グラフから読み取ることができる情報や傾向について考察してください。
要件:
- 使用するデータセット:Seaborn のサンプルデータセットから自由に選択
- グラフの数:2 つ以上
- グラフの種類:異なる種類のグラフを使用すること(例: 散布図とヒストグラム)
- 考察:各グラフから読み取れる情報や、データの傾向について説明すること
提出物:
- ファイル形式:
.ipynb(Google Colab で[ファイル]->[ダウンロード]->[.ipynb をダウンロード]) - ファイル名:
[学籍番号]_[氏名]_3.ipynb - 記載内容:
- コードセル:データの読み込み、グラフの作成
- テキストセル:コードの説明、グラフの考察、工夫した点など
提出期限: 2025年10月22日(水)23:59
提出先:manaba
ヒント:
- データセットの内容を理解するために、まず
df.head()やdf.info()でデータ構造を確認しましょう - グラフには適切なタイトルや軸ラベルを付けることで、わかりやすくなります
- 複数のグラフを組み合わせることで、データの異なる側面を明らかにできます
- 考察では「なぜそのような傾向が見られるのか」を考えてみましょう

















