Skip to content
トピック
Seaborn
Seaborn ヒートマップ:Pythonでヒートマップを作成する完全ガイド

Seaborn ヒートマップ:Pythonでヒートマップを作成する完全ガイド

Updated on

数十の変数を持つデータセットがあるとします。どの特徴が相関しているか、パターンがどこに隠れているか、または機械学習モデルがなぜ誤動作し続けるのかを理解する必要があります。数字の行と列を見つめても、ほとんど何も分かりません。これがまさに seaborn ヒートマップ が解決する問題です。密な値の行列を、脳が数秒で解析できる色分けされたグリッドに変換します。

ヒートマップはデータサイエンスで最も広く使用される可視化タイプの1つであり、Pythonのseabornライブラリはそれらを作成することを非常に簡単にします。相関行列の構築、混同行列の分析、時系列パターンの可視化のいずれであっても、sns.heatmap()は数行のコードで公開可能なチャートを提供します。

このガイドでは、基本的な構文、カスタマイズオプション、クラスター化されたヒートマップなどの高度な技術、完全なパラメータ参照表まで、すべてを説明します。すべてのコード例はコピー&ペーストですぐに使用できます。

📚

基本的なSeabornヒートマップの構文

コア関数は sns.heatmap() です。これは2次元データセット(通常はpandas DataFrameまたはNumPy配列)を受け取り、色付きグリッドとしてレンダリングします。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
# Create sample data
data = np.random.rand(5, 7)
ax = sns.heatmap(data)
plt.title("Basic Seaborn Heatmap")
plt.show()

これが最も単純なヒートマップです。各セルの色はその数値を表し、seabornは右側に自動的にカラーバーを追加します。しかし、実際の使用では、ほとんどの場合、より多くの設定が必要になります。次にそれについて説明します。

相関行列ヒートマップの作成

seabornヒートマップの最も一般的な使用例は、相関行列 の可視化です。これは、データセット内の各変数のペアがどれだけ強く関連しているかを示します。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
 
# Load a built-in dataset
df = sns.load_dataset("mpg").select_dtypes(include="number")
 
# Compute the correlation matrix
corr = df.corr()
 
# Plot the heatmap
plt.figure(figsize=(10, 8))
sns.heatmap(
    corr,
    annot=True,
    fmt=".2f",
    cmap="coolwarm",
    center=0,
    square=True,
    linewidths=0.5
)
plt.title("Correlation Matrix - MPG Dataset")
plt.tight_layout()
plt.show()

ここで起こっている重要なこと:

  • annot=True は各セル内に相関係数を印刷します。
  • fmt=".2f" はこれらの数値を小数点以下2桁にフォーマットします。
  • cmap="coolwarm" は発散カラーパレットを使用し、負の相関は青、正の相関は赤になります。
  • center=0 はゼロ相関が中立の中点色にマッピングされることを保証します。
  • square=True は各セルを完全な正方形にして、よりクリーンなビジュアルを実現します。

カスタマイズオプション

カラーパレット(cmapパラメータ)

cmap パラメータは配色を制御します。適切なパレットの選択は、データタイプによって異なります。

パレットタイプ例の名前最適な用途
順次型"YlOrRd""Blues""viridis"低から高までのデータ(カウント、マグニチュード)
発散型"coolwarm""RdBu_r""seismic"意味のある中心点を持つデータ(相関、残差)
質的"Set2""Paired"カテゴリカルデータ(ヒートマップでは一般的ではない)
知覚的に均一"viridis""magma""inferno"アクセシビリティと正確な知覚の確保
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
data = np.random.rand(6, 6)
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
 
cmaps = ["viridis", "coolwarm", "YlOrRd"]
for ax, cmap in zip(axes, cmaps):
    sns.heatmap(data, cmap=cmap, ax=ax, annot=True, fmt=".2f")
    ax.set_title(f'cmap="{cmap}"')
 
plt.tight_layout()
plt.show()

アノテーション(annotとfmtパラメータ)

アノテーションは各セル内に数値を表示します。そのフォーマットを制御できます:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
data = np.random.randint(0, 1000, size=(4, 5))
 
plt.figure(figsize=(8, 5))
sns.heatmap(
    data,
    annot=True,
    fmt="d",            # integer format
    cmap="Blues",
    annot_kws={"size": 14, "weight": "bold"}  # customize font
)
plt.title("Heatmap with Integer Annotations")
plt.show()

一般的な fmt の値:".2f" は小数点以下2桁、"d" は整数、".1%" はパーセンテージ、".1e" は科学的記数法。

図のサイズとアスペクト比

Seabornヒートマップはmatplotlibの図からサイズを継承します。sns.heatmap() を呼び出す前に設定します:

plt.figure(figsize=(12, 8))  # width=12, height=8 inches
sns.heatmap(data, cmap="viridis")
plt.show()

正方形のセルの場合、sns.heatmap()square=True を渡します。これにより、図のアスペクト比が上書きされ、各セルが等しいサイズになります。

上三角または下三角のマスキング

相関行列は対称です。両方の半分を表示することは冗長です。NumPyの triu または tril を使用して半分をマスクします:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
df = sns.load_dataset("mpg").select_dtypes(include="number")
corr = df.corr()
 
# Create a mask for the upper triangle
mask = np.triu(np.ones_like(corr, dtype=bool))
 
plt.figure(figsize=(10, 8))
sns.heatmap(
    corr,
    mask=mask,
    annot=True,
    fmt=".2f",
    cmap="coolwarm",
    center=0,
    square=True,
    linewidths=0.5
)
plt.title("Lower Triangle Correlation Heatmap")
plt.tight_layout()
plt.show()

mask パラメータは、データと同じ形状のブール配列を受け入れます。mask=True のセルは非表示になります。

ヒートマップパラメータ参照表

パラメータ説明デフォルト
data2次元データセット(DataFrame、ndarray)必須
vmin / vmaxカラーマップスケーリングの最小値/最大値データから自動
cmapカラーマップ名またはオブジェクトNone(seabornのデフォルト)
centerカラーマップを中心にする値None
annotセルに数値を表示False
fmtアノテーションのフォーマット文字列".2g"
annot_kwsアノテーションテキストのキーワード引数の辞書{}
linewidthsセルを分離する線の幅0
linecolorセル境界線の色"white"
cbarカラーバーを表示True
cbar_kwsカラーバーのキーワード引数の辞書{}
squareセルを正方形に強制False
maskブール配列;Trueのセルは表示されないNone
xticklabelsx軸目盛りのラベル自動
yticklabelsy軸目盛りのラベル自動
ax描画するMatplotlib Axesオブジェクト現在のAxes

高度な例

sns.clustermapを使用したクラスタリングヒートマップ

類似した行と列をグループ化したい場合、sns.clustermap() は階層的クラスタリングを適用し、軸を自動的に並べ替えます:

import seaborn as sns
import matplotlib.pyplot as plt
 
df = sns.load_dataset("mpg").select_dtypes(include="number").dropna()
corr = df.corr()
 
g = sns.clustermap(
    corr,
    annot=True,
    fmt=".2f",
    cmap="vlag",
    center=0,
    linewidths=0.5,
    figsize=(8, 8),
    dendrogram_ratio=0.15
)
g.ax_heatmap.set_title("Clustered Correlation Heatmap", pad=60)
plt.show()

左側と上部のデンドログラムは、クラスタリング階層を示します。最も密接に相関している変数は互いに隣接して配置され、パターンを見つけやすくなります。

カスタムカラー範囲(vmin、vmax)

デフォルトでは、seabornはデータの最小値と最大値に色をスケーリングします。これを上書きして、複数のヒートマップを同じスケールで比較したり、特定の範囲を強調表示したりできます:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
np.random.seed(42)
data = np.random.uniform(-1, 1, size=(8, 8))
 
plt.figure(figsize=(8, 6))
sns.heatmap(
    data,
    vmin=-1,
    vmax=1,
    center=0,
    cmap="RdBu_r",
    annot=True,
    fmt=".2f"
)
plt.title("Heatmap with Fixed Color Range (-1 to 1)")
plt.show()

相関行列または理論的範囲がわかっている正規化データをプロットする場合、vmin=-1vmax=1 を設定すると特に便利です。

混同行列ヒートマップ

もう1つの実用的なアプリケーションは、分類モデルからの混同行列の可視化です:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
 
# Train a quick model
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42
)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
 
# Build and plot the confusion matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(
    cm,
    annot=True,
    fmt="d",
    cmap="Blues",
    xticklabels=iris.target_names,
    yticklabels=iris.target_names
)
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix - Iris Classification")
plt.tight_layout()
plt.show()

対角線は正しい予測を示します。非対角セルは、モデルが1つのクラスを別のクラスと混同する場所を明らかにします。

時系列ヒートマップ

ヒートマップは、時間次元全体でパターンを見つけるのにも適しています。曜日と時間ごとのアクティビティを示す例を次に示します:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
 
np.random.seed(0)
hours = list(range(24))
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
data = pd.DataFrame(
    np.random.poisson(lam=20, size=(7, 24)),
    index=days,
    columns=hours
)
 
plt.figure(figsize=(14, 5))
sns.heatmap(data, cmap="YlOrRd", linewidths=0.3, annot=False)
plt.xlabel("Hour of Day")
plt.ylabel("Day of Week")
plt.title("Activity Heatmap by Day and Hour")
plt.tight_layout()
plt.show()

Seabornヒートマップ vs Matplotlib imshow

matplotlib.pyplot.imshow() でもヒートマップのような可視化を作成できます。2つの比較は次のとおりです:

機能sns.heatmap()plt.imshow()
組み込みカラーバーはい、自動手動(plt.colorbar()
セルアノテーションannot=True手動テキスト配置
DataFrameを受け入れるはい、自動ラベル付きいいえ、配列が必要
目盛りラベル処理DataFrameインデックス/列から自動手動セットアップ
マスキングサポート組み込み mask パラメータnp.ma で手動
クラスタリングsns.clustermap() 経由組み込みではない
セル間隔linewidths パラメータ直接サポートされていない
学習曲線一般的なユースケースでは低いより低レベル、より手動
カスタマイズの上限高い(matplotlibを継承)非常に高い(完全な制御)

**結論:**最小限のコードできれいでラベル付けされたヒートマップが必要な場合は、sns.heatmap() を使用してください。ピクセルレベルの制御が必要な場合、または表形式データではなく画像データを扱っている場合は、imshow() にフォールバックしてください。

インタラクティブな代替手段:PyGWalker

静的ヒートマップはレポートや論文には強力ですが、探索的データ分析中は、コードを書き直さずにデータを操作(フィルタリング、ピボット、ドリルダウン、チャートタイプの切り替え)したいことがよくあります。

PyGWalker (opens in a new tab)(Graphic WalkerのPythonバインディング)は、任意のpandas DataFrameをJupyter Notebook内のTableauのようなインタラクティブUIに直接変換します。可視化コードをまったく書かずに、フィールドをドラッグアンドドロップしてヒートマップ、散布図、棒グラフなどを作成できます。

pip install pygwalker
import pandas as pd
import pygwalker as pyg
 
df = pd.read_csv("your_data.csv")
walker = pyg.walk(df)

インタラクティブインターフェイスが起動すると、次のことができます:

  • カテゴリカル変数を行にドラッグし、別の変数を列にドラッグし、メジャーを色にドラッグしてヒートマップを作成します。
  • 他のチャートタイプ(棒グラフ、折れ線グラフ、散布図)に即座に切り替えます。
  • 追加のコードを書かずにフィルタリングと集計を行います。

これは、最終的なseabornヒートマップに含める変数をまだ探索している場合に特に便利です。探索段階ではPyGWalkerを使用し、共有用に sns.heatmap() で最終的な静的可視化をロックします。

よくある質問

seabornヒートマップのサイズを変更するにはどうすればよいですか?

sns.heatmap() を呼び出す前に、plt.figure(figsize=(width, height)) を使用して図のサイズを設定します。たとえば、plt.figure(figsize=(12, 8)) は12×8インチの図を作成します。サブプロットを使用している場合は、ax パラメータを渡すこともできます。

seabornヒートマップに値を注釈するにはどうすればよいですか?

sns.heatmap()annot=True を渡します。fmt パラメータで数値フォーマットを制御します(例:fmt=".2f" は小数点以下2桁)。annot_kws を使用してフォントプロパティをカスタマイズします。例:annot_kws={"size": 12, "weight": "bold"}

sns.heatmapとsns.clustermapの違いは何ですか?

sns.heatmap() は元の行と列の順序でデータを表示します。sns.clustermap() は階層的クラスタリングを適用して行と列を並べ替え、類似した値をグループ化し、デンドログラムを追加してクラスタリング構造を示します。

相関ヒートマップの半分をマスクするにはどうすればよいですか?

NumPyを使用してブールマスクを作成します。上三角の場合:mask = np.triu(np.ones_like(corr, dtype=bool))。次に、sns.heatmap()mask=mask を渡します。下三角の場合は、代わりに np.tril() を使用します。

seabornヒートマップを画像ファイルとして保存できますか?

はい。ヒートマップを作成した後、plt.show() の前に plt.savefig("heatmap.png", dpi=300, bbox_inches="tight") を呼び出します。Seabornヒートマップは、PNG、SVG、PDF、EPSを含むすべてのmatplotlib出力フォーマットをサポートしています。

結論

seabornヒートマップは、データサイエンティストの可視化ツールキットで最も汎用性の高いツールの1つです。相関分析から混同行列、時系列パターン検出まで、sns.heatmap() はこれらすべてをクリーンな構文と公開品質の出力で処理します。

基本から始めます。データを渡してカラーマップを選択します。次に、分析の要求に応じて、アノテーション、マスキング、カスタム範囲、クラスタリングをレイヤー化します。最終的な可視化をロックする前の探索段階では、PyGWalker (opens in a new tab) のようなツールを使用すると、インタラクティブなドラッグアンドドロップチャートでワークフローを高速化できます。

このガイドのコード例はすべてコピー&ペーストですぐに使用できます。ユースケースに最も近いものを選択し、データを入れ替えると、1分以内に明確で有益なヒートマップが得られます。

📚