seabornでヒートマップを作ってみる


はじめに

データ分析の際に思いつく仮設やアイデアが枯れてしまい、何かないかと調べた際にヒートマップの存在を知りました。備忘録として書き残します。

使いどころ

とりあえず、何かしらの相関や傾向がないか探るのに使えます。
数値ではなく、色の強弱で表現されるため、直感的に傾向をつかみやすいです。

書き方

Pythonのビジュアライゼーションライブラリseabornを使うと、二次元データを可視化するヒートマップが簡単に作成できます。

ヒートマップを作るにはseabornimportして、seaborn.heatmap()関数を使います。

import seaborn as sns

# ヒートマップ作成
plt.figure()
sns.heatmap(ヒートマップにしたい変数)

plt.savefig('seaborn_heatmap_df_example.png')

使用例

データ分析コンペでおなじみのkaggleにある、Forest Cover Type Predictionのデータを例にヒートマップを作成してみます。まずは下準備。

参考

Forest Cover Type Prediction

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

# 最大表示列数の指定
pd.set_option('display.max_columns', 100)

df_test = pd.read_csv("./test.csv", encoding="utf8")
df_test3 = pd.read_csv("./test3.csv", encoding="utf8")
df_train = pd.read_csv("./train.csv", encoding="utf8")
df_sample = pd.read_csv("./sampleSubmission.csv", encoding="utf8")

# どんなデータか確認
print("df_sample")
display(df_sample.head(10))
display(df_sample.info())
print(df_sample["Cover_Type"].unique())
print("df_test")
display(df_test.head(3))
display(df_test.info())
print("df_test3")
display(df_test3.head(3))
display(df_test3.info())
print("df_train")
display(df_train.head(3))
display(df_train.info())


ここからヒートマップの作成です。
とりあえずカラムは指定せずに、すべて表示させます。

df_test = pd.merge(df_test, df_sample, on="Id")
show_covertype = df_test.set_index("Id")
display(show_covertype)

# ヒートマップ表示
plt.figure(figsize=(50,50))
sns.heatmap(show_covertype, vmin=0 ,cmap="Reds")
plt.savefig("./show_data_heatmap.png")

するとこんな感じにヒートマップを表示させることができました。

11列目以降のWilderness_Area1からは、0/1の表現になっているため、ヒートマップ上ではあまり目立っていません。

ちなみにcsvを取り込むとインデックスがないため、set_indexする必要がありますが、
上記を忘れるとこんなエラーが出ます。

TypeError: Image data of dtype object cannot be converted to float!

よく使うと思われる引数

annot

ヒートマップのマス上に値を表示させる。
大量にあるデータでヒートマップを作製すると、黒塗り状態となって見づらくなるので、使い分けは必要です。

square

ヒートマップのマスを正方形で表現してくれる。
デフォルトはFalseです。

vmin, vmax, center

最小値、最大値、中央値を設定できます。
設定せずとも、自動でいい感じにカラーバーの値を設定してくれますが、より明示的に指定したい場合に使います。

cmap

ヒートマップに表示される色を変えられる。
多分、凝り性ははまると思う。
私は'Reds'で表示させています。

感想

matplotのように、細かいオプションをリストで用意する必要があるかと身構えていましたが、思ったよりも簡単でした。ヒートマップを表示させる機会はあまり多くないかもしれませんが、データを俯瞰してみたい時には悪くないと思いました。Forest Cover Typeの場合はそれぞれのカラムで出てくる値の範囲がバラバラなため、もう少し工夫が必要だと感じました。