[機械学習のはじめ方] Part8: Matplotlib・Seabornによる可視化の基礎

はじめに:なぜデータを可視化するの? 🤔

機械学習の旅へようこそ!データ分析を進める上で、「可視化」は非常に重要なステップです。数字の羅列だけでは見えにくいデータの傾向やパターン、関係性を、グラフを使って直感的に理解できるようになります。

Pythonにはデータを可視化するための強力なライブラリがたくさんありますが、今回はその中でも特に基本的で広く使われている Matplotlib (マットプロットリブ)Seaborn (シーボーン) の基礎について学んでいきましょう! 🚀

Matplotlib:自由自在なグラフ描画の基礎 🎨

Matplotlibは、Pythonでグラフを描画するための最も基本的なライブラリの一つです。非常に柔軟性が高く、グラフの細かい部分までカスタマイズできるのが特徴です。まずは基本的な使い方を見ていきましょう。

Matplotlibの `pyplot` モジュール(通常 `plt` という名前でインポートします)を使うことで、様々な種類のグラフを簡単に作成できます。

折れ線グラフ

データの推移を表現するのに適しています。


import matplotlib.pyplot as plt

# データの準備
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 折れ線グラフの描画
plt.plot(x, y)
plt.show() # グラフを表示
          

散布図

2つの変数の関係性を視覚化するのに使います。


import matplotlib.pyplot as plt

# データの準備
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 散布図の描画
plt.scatter(x, y)
plt.show()
          

棒グラフ

カテゴリごとの量を比較するのに便利です。


import matplotlib.pyplot as plt

# データの準備
categories = ['A', 'B', 'C']
values = [10, 25, 15]

# 棒グラフの描画
plt.bar(categories, values)
plt.show()
          

ヒストグラム

データの分布(どの範囲にどれくらいのデータがあるか)を確認できます。


import matplotlib.pyplot as plt
import numpy as np

# データの準備 (正規分布に従う乱数)
data = np.random.randn(1000)

# ヒストグラムの描画
plt.hist(data, bins=30) # binsで区間の数を指定
plt.show()
          

Matplotlibでは、グラフをより分かりやすく、見栄え良くするために様々な要素をカスタマイズできます。


import matplotlib.pyplot as plt

# データの準備
x = [1, 2, 3, 4, 5]
y1 = [2, 3, 5, 7, 11]
y2 = [1, 4, 6, 8, 10]

# グラフの描画とカスタマイズ
plt.plot(x, y1, label='Prime Numbers', color='blue', linestyle='--', marker='o') # ラベル、色、線種、マーカー
plt.plot(x, y2, label='Even-ish Numbers', color='red', linewidth=2, marker='x') # 線幅

# タイトルと軸ラベル
plt.title('My First Plot with Customization')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 凡例の表示
plt.legend()

# グリッド線の表示
plt.grid(True)

# グラフの表示
plt.show()

# 画像として保存する場合
# plt.savefig('my_plot.png', bbox_inches='tight') # bbox_inches='tight' で余白を調整
      

`title()`, `xlabel()`, `ylabel()` でタイトルや軸ラベルを、 `legend()` で凡例を表示できます。 `plot()` 関数の中で `label`, `color`, `linestyle`, `linewidth`, `marker` などを指定して、線の見た目を細かく調整できます。

`plt.subplots()` を使うと、複数のグラフを一つの図の中に並べて表示できます。


import matplotlib.pyplot as plt
import numpy as np

# データの準備
x = np.linspace(0, 10, 100)
y_sin = np.sin(x)
y_cos = np.cos(x)

# 2x1 のグリッドを作成
fig, axes = plt.subplots(2, 1, figsize=(6, 6)) # figsizeで図全体のサイズを指定

# 上のグラフ (axes[0])
axes[0].plot(x, y_sin, color='green')
axes[0].set_title('Sine Wave')
axes[0].set_ylabel('sin(x)')
axes[0].grid(True)

# 下のグラフ (axes[1])
axes[1].plot(x, y_cos, color='purple')
axes[1].set_title('Cosine Wave')
axes[1].set_xlabel('x')
axes[1].set_ylabel('cos(x)')
axes[1].grid(True)

# レイアウトの調整
plt.tight_layout()

# 表示
plt.show()
      

`plt.subplots(行数, 列数)` でグラフを描画する領域 (Axes) を作成し、それぞれの Axes に対してプロットしていきます。

Seaborn:より美しく統計的なグラフを簡単に 🌟

Seabornは、Matplotlibをベースにして作られたライブラリで、統計的なデータの可視化に特化しています。Matplotlibよりも少ないコードで、より洗練された美しいグラフを描くことができるのが大きな魅力です。 特にPandasのDataFrameとの相性が抜群です。

  • 少ないコードで見栄えの良いグラフが描ける ✨
  • 統計的な情報(回帰直線、分布など)を簡単に加えられる 📊
  • Pandas DataFrameとの連携がスムーズ 🤝
  • 美しいデフォルトテーマとカラーパレット 🎨

Seabornでも様々なグラフを描画できます。ここではいくつかの例を見てみましょう。(Seabornは `sns` という名前でインポートするのが慣例です)


import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Seabornのサンプルデータセット (tips: レストランのチップに関するデータ) をロード
tips = sns.load_dataset("tips")

# Matplotlibのグラフをきれいに表示するための設定 (任意)
# sns.set(style="whitegrid")

# 散布図 (total_bill と tip の関係、性別で色分け)
plt.figure(figsize=(8, 6)) # Matplotlibの機能で図のサイズを調整
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex")
plt.title('Total Bill vs Tip by Sex')
plt.show()

# ヒストグラム (total_bill の分布、カーネル密度推定付き)
plt.figure(figsize=(8, 6))
sns.histplot(data=tips, x="total_bill", kde=True, bins=20) # kde=True でカーネル密度推定を表示
plt.title('Distribution of Total Bill')
plt.show()

# 箱ひげ図 (曜日ごとの total_bill の分布)
plt.figure(figsize=(8, 6))
sns.boxplot(data=tips, x="day", y="total_bill")
plt.title('Total Bill Distribution by Day')
plt.show()

# バイオリンプロット (曜日ごとの total_bill の分布、形状も表示)
plt.figure(figsize=(8, 6))
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker", split=True) # hueでさらに分割, split=Trueで左右に表示
plt.title('Total Bill Distribution by Day and Smoker')
plt.show()

# ヒートマップ (数値変数間の相関)
# Pandas 2.2以降では numeric_only=True がデフォルトで必須になる場合があります
numeric_tips = tips.select_dtypes(include=np.number) # 数値列のみを選択
correlation_matrix = numeric_tips.corr() # 相関係数を計算

plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f") # annot=Trueで数値を表示, cmapで色を指定, fmtで書式指定
plt.title('Correlation Matrix of Numeric Features')
plt.show()

# ペアプロット (数値変数間の関係性をまとめて表示)
# 時間がかかる場合があります
# sns.pairplot(tips, hue="sex") # hueで色分け
# plt.suptitle('Pair Plot of Tips Dataset', y=1.02) # 全体のタイトル (少し上に表示)
# plt.show()
      

Seabornの多くの関数では `data` 引数にDataFrameを、 `x` や `y` 引数に列名を文字列で指定するだけで、簡単にグラフを作成できます。 `hue` 引数を使うと、カテゴリ変数に応じて色分けすることも可能です。

Matplotlib と Seaborn の使い分け 🤔

どちらのライブラリも強力ですが、状況に応じて使い分けるのがおすすめです。

特徴 Matplotlib Seaborn
目的 汎用的なグラフ描画、細かいカスタマイズ 統計的なデータの可視化、洗練された見た目
使いやすさ 自由度が高いが、コード量は多くなりがち 少ないコードで美しいグラフを簡単に作成可能
見た目 デフォルトはシンプル、カスタマイズ前提 デフォルトで美しいテーマと配色
データ形式 NumPy配列やリストに適している Pandas DataFrameとの相性が非常に良い
統計的機能 基本的なグラフが中心 回帰線、分布、相関などを簡単に可視化できる機能が豊富
使い分けのヒント💡:
  • 手早く探索的にデータを可視化したい、統計的な傾向を見たい → Seaborn
  • グラフの細かい部分(軸の目盛り、注釈の位置など)を厳密に制御したい → Matplotlib
  • プレゼンテーション用の洗練されたグラフを作りたい → Seaborn (ベースはMatplotlibなので、必要に応じてMatplotlibで微調整も可能)
  • 特定の種類のグラフ(例: 3Dプロットなど)が必要 → Matplotlib (Seabornがカバーしていない範囲もある)

実際には、Seabornで基本的なグラフを作成し、細かい調整が必要な場合にMatplotlibの機能を使う、という組み合わせで利用することも多いです。

まとめ 🥳

今回は、Pythonのデータ可視化ライブラリであるMatplotlibとSeabornの基本的な使い方について学びました。

  • Matplotlibは、自由度の高いカスタマイズが可能なグラフ描画の基礎となるライブラリです。
  • Seabornは、Matplotlibをベースに、より少ないコードで統計的で美しいグラフを作成できるライブラリです。
  • 目的に応じてこれらのライブラリを使い分ける、あるいは組み合わせて使うことで、データ分析がより効率的かつ効果的になります。

データを可視化するスキルは、データの特徴を理解し、モデル構築や評価に役立つ重要なスキルです。ぜひ実際にコードを動かして、様々なグラフを作成してみてくださいね!💪

次のステップでは、データの前処理(欠損値処理や外れ値検出など)について学んでいきましょう!