Python | データ処理:ヒートマップ

Python
スポンサーリンク

概要(ヒートマップは「2次元の表を色で読み解く」最短ルート)

ヒートマップは、2次元の数値テーブルを色の濃淡で表現するグラフです。相関(どの列同士が関係強い?)、クロス集計(店舗×月の売上)、時系列のパターン(曜日×時間のピーク)などを、一枚で直感的に掴めます。初心者は「データを2次元に整形する(ピボット)→数値に統一→seaborn.heatmapで描画」の型を押さえると、迷わず作れます。


基本の作り方(seaborn.heatmapで最短)

最小例(DataFrameをそのまま色にする)

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

data = pd.DataFrame({
    "A": [1, 3, 2],
    "B": [4, 2, 5],
    "C": [6, 1, 3]
}, index=["row1", "row2", "row3"])

plt.figure(figsize=(5, 3))
sns.heatmap(data, cmap="viridis")
plt.title("Basic heatmap")
plt.tight_layout(); plt.show()
Python

行名・列名がそのまま軸ラベルになります。まずは「数値の2次元表」を渡せば描ける、が基本です。

値を表示して読み取りやすくする(annot)

sns.heatmap(data, cmap="viridis", annot=True, fmt=".1f")
Python

各セルに数値を印字します。fmtで小数点以下の桁数を整えます。

相関行列をヒートマップで可視化

import numpy as np

df = pd.DataFrame({
    "sales": [100,120,90,140,160],
    "ads":   [20,30,15,40,45],
    "temp":  [25,28,32,30,35]
})
corr = df.corr()  # 数値列の相関係数
sns.heatmap(corr, cmap="coolwarm", vmin=-1, vmax=1, center=0, annot=True)
Python

正負の値を扱う相関は、ゼロを中心にした両側カラー(diverging)を使うと直感的です。


データ整形(ピボットで「二次元の表」を作る)

行・列を指定して集計表を作る(pivot_table)

df = pd.DataFrame({
    "store": ["A","A","B","B","A","B"],
    "month": ["Jan","Feb","Jan","Feb","Mar","Mar"],
    "sales": [100,120,90,110,130,115]
})

pivot = df.pivot_table(index="store", columns="month", values="sales", aggfunc="sum", fill_value=0)
sns.heatmap(pivot, cmap="YlGnBu", annot=True)
Python

ヒートマップは「行×列=値」へ整形してからが本番です。欠損はfill_valueやfillnaで埋めておきます。

時間の2軸に展開(曜日×時間のピークを見る)

log = pd.DataFrame({
    "dt": pd.date_range("2025-01-01", periods=200, freq="H"),
    "count": [1,2,5,3,4]*40
})
log["weekday"] = log["dt"].dt.day_name()
log["hour"] = log["dt"].dt.hour

grid = log.pivot_table(index="weekday", columns="hour", values="count", aggfunc="sum", fill_value=0)
sns.heatmap(grid, cmap="magma")
Python

曜日×時間にすると、混雑の「時間帯パターン」が一目で分かります。


表現の深掘り(色・スケール・凡例・強調)

色(cmap)とスケール(vmin/vmax/center)を意図通りに

sns.heatmap(data, cmap="viridis", vmin=0, vmax=10)         # 0〜10に固定
sns.heatmap(corr, cmap="coolwarm", center=0, vmin=-1, vmax=1)  # 正負で中心を0に
Python

範囲を固定すると、比較や再現性が安定します。相関のような正負データはcenterでゼロ中心に。

カラーバーやセル罫線で読みやすく

sns.heatmap(pivot, cmap="YlGnBu", cbar=True, linewidths=0.5, linecolor="white", annot=True)
Python

cbarは色の値の目安、linewidthsはセル区切りの視認性が上がります。

大きな表はラベル回転・正方形・サイズ調整

ax = sns.heatmap(pivot, square=True)
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha="right")
plt.figure(figsize=(8,6))
Python

ラベルが重なるなら回転、squareで正方形に、figsizeを広げて詰まりを解消します。

マスクで斜め半分を隠す(相関の下三角だけを表示)

import numpy as np
mask = np.triu(np.ones_like(corr, dtype=bool))
sns.heatmap(corr, mask=mask, cmap="coolwarm", center=0)
Python

相関行列は上下対称です。片側を隠して見やすくします。


実践例(標準化して公平比較、カテゴリのダミー化、欠損対策)

列ごとに標準化して「相対比較」へ

from sklearn.preprocessing import StandardScaler

scaled = pd.DataFrame(StandardScaler().fit_transform(pivot), index=pivot.index, columns=pivot.columns)
sns.heatmap(scaled, cmap="RdBu_r", center=0)
Python

列の桁が違うと濃淡に引っ張られます。標準化(平均0・標準偏差1)で「どの行が相対的に高いか」を公平に比較できます。

カテゴリはダミー変換して“数値の表”へ

df = pd.DataFrame({"cat": ["A","B","A","C"], "flag": [1,0,1,0]})
dummy = pd.get_dummies(df["cat"])                 # A/B/Cを0/1列へ
sns.heatmap(dummy, cmap="Greens", cbar=False)
Python

文字列のままでは色付けできません。ダミー化で「存在/非存在」を色で見せられます。

欠損は事前に埋める・範囲から除外する

pivot = pivot.fillna(0)   # ルールに合わせて埋める
# もしくは、描画時にmaskで欠損を非表示
mask = pivot.isna()
sns.heatmap(pivot, mask=mask, cmap="YlOrBr")
Python

NaNが混じると色が飛びます。埋めるか隠すかを先に決めておきます。


つまずき対策(尺度の偏り・外れ値・サイズ・並び順)

尺度の偏りには標準化・正規化で対処

値の桁が大きい列があると色が支配的になります。標準化(StandardScaler)や0–1正規化で「相対的な強弱」を見やすくします。

外れ値が色階調を壊すときは範囲固定

vmin/vmaxでレンジを固定し、極端値は注釈や別図で誠実に示します。場合によってはwinsorizeやクリップで過度な影響を抑えます。

行列が大きいと読めない

ラベル回転・省略(短縮名)・squareとfigsize調整で視認性を確保します。必要ならサブセットで分割し、テーマごとに図を分けます。

並び順を意味で整える

行・列の順序で印象が変わります。合計値で並べ替える、カテゴリを期待順へ並べ替える(CategoricalDtype)など、見る人が読みやすい順に整えます。


まとめ(「二次元の表へ整形→数値へ統一→色とスケールを設計」)

ヒートマップは、二次元の数値表を色で読み解くための強力な道具です。まずpivotで「行×列=値」を作り、欠損や型を整え、seaborn.heatmapで描画。相関はゼロ中心の色、量の比較は範囲固定、桁違いは標準化。ラベル回転やマスクで視認性を上げ、並び順を意味で整える。この型に従えば、初心者でも“伝わるヒートマップ”を安定して作れます。

タイトルとURLをコピーしました