3秒でわかる
seaborn で行列の数値を色の濃淡として描く関数。相関や件数の偏りを、数字を一つずつ読まずに一目で掴むために使います。
もう少し詳しく
どういうものか
sns.heatmap は、Python の可視化ライブラリ seaborn が持つ関数で、二次元の数値データを色の濃淡で塗り分けて描く。行と列の交点それぞれに値があり、その大小が色に対応する。相関行列、時間帯と曜日ごとの件数、欠損値の分布のように、縦横の組み合わせで値が決まるデータに向いている。
なぜ必要か
10 列のデータの相関行列は 100 個の数字になり、表のまま眺めても強い関係がどこにあるか分からない。色にすると、濃い区画として目に飛び込んでくる。数字を一つずつ比べる作業を、視覚の得意な処理へ置き換える点に意味がある。分析の初期段階で、どの変数に注目するかを決める用途で使われることが多い。
具体例
import seaborn as sns
import matplotlib.pyplot as plt
corr = df.corr(numeric_only=True)
sns.heatmap(
corr,
annot=True, # 各マスに数値も書く
fmt=".2f", # 小数第 2 位まで
cmap="coolwarm", # 負を青、正を赤で塗る
vmin=-1, vmax=1, # 色の基準を固定する
)
plt.tight_layout()
plt.show()vmin と vmax を指定すると、データが変わっても色の意味がずれない。
つまずきやすいところ
vmin と vmax を省くと、その時のデータの最小値と最大値に色が割り当てられる。相関が 0.1 から 0.3 の範囲しか無くても真っ赤な区画が現れ、強い関係があるように見えてしまう。複数の図を並べて比べるときは特に効いてくる。
配色の選び方も結論を左右する。相関のように正と負に意味がある値は、中央を白にする coolwarm のような両方向の配色を使う。件数のように 0 が下限のデータで両方向の配色を使うと、中間の値が強調されて誤読される。
日本語のラベルが豆腐状に化ける場合は、japanize-matplotlib を取り込むか、フォントを明示する。
似た用語との違い
散布図は二つの変数の関係を点で見る図で、対象は 2 列になる。ヒートマップは列同士の組み合わせを一枚で見渡す図になる。全体の当たりを付けるのがヒートマップ、気になった組み合わせを詳しく見るのが散布図、という順で使う。
覚え方
ヒートマップは数表に色を塗った地図にあたる。地図として読む以上、色の基準を毎回変えては比べられない。vmin と vmax を固定して初めて、二枚の図を並べて話ができる。