本ページでは、Python のデータ可視化ライブラリ、Seaborn (シーボーン) を使ってヒートマップを出力する方法を紹介します。
Seaborn には、ヒートマップの可視化を行うメソッドとして seaborn.heatmap
と seaborn.clustermap
の 2 つが実装されています。seaborn.heatmap
は通常のヒートマップを出力しますが、seaborn.clustermap
は、クラスタ分析を行い、デンドログラムとともにヒートマップを出力します。
heatmap: ヒートマップの可視化
seaborn.heatmap メソッドは、色の濃淡や色相でデータの密度や値の分布を可視化します。
seaborn.heatmap の使い方
1 2 3 4 5 |
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, ax=None, xticklabels=True, yticklabels=True, mask=None, **kwargs) |
seaborn.heatmap の主要な引数
data | ndarray 形式に変換可能な 2 次元のデータセット指定。Pandas のデータフレームを指定した場合、列名とインデックスが使われます。 |
---|---|
vmin, vmax | カラーマップと値の範囲を関連付ける必要がある際に最小値、最大値を指定します。指定しない場合、データや他の引数から推測されます。発散的 (diverging) なデータセット (0 を起点として正負に広がるデータ) と推測された場合、これらの値は無視される場合があります。(デフォルト値: None) |
cmap | Matplotlib のカラーマップまたは、オブジェクトを指定。値の大小をどの色に変換する際に用います。指定のない場合、cubehelix カラーマップ (値が連続量の場合) もしくは、RdBu_r カラーマップ (発散的なデータの場合) が利用されます。参考: color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation (デフォルト値: None) |
center | colormap の 中心とする値。この値を指定すると、発散的なカラーマップを使うことを意味します。(デフォルト値: None) |
robust | True に設定し vmin と vmax が設定されていない場合、カラーマップが使う色とその値の範囲はロバストな推定を行い、極端に大きな値や小さい値の影響を受けないように計算されます。(デフォルト値: False) |
annot | True に設定すると、セルに値を出力します。行列などのデータセットを指定すると、任意の値を出力できます。(デフォルト値: None) |
fmt | annot=True に設定した場合、またはデータセットを指定した場合の出力フォーマットを文字列で指定します。(デフォルト値: ‘.2g’) |
annot_kws | annot=True に設定した場合、またはデータセットを指定した場合のオプションを Matplotlib のキーワードを設定します。参考:Text properties and layout — Matplotlib 2.0.2 documentation (デフォルト値: None) |
linewidths | 各セル間の線の太さを数値で指定。(デフォルト値: 0) |
linecolor | 各セル間の線の色。参考:matplotlib で指定可能な色の名前と一覧 (デフォルト値: ‘white’) |
cbar | True に設定すると、カラーバーを出力します。(デフォルト値: True) |
cbar_kws | カラーバーのオプションを Matplotlib のキーワードをで指定します。参考:colorbar — Matplotlib 2.0.2 documentation (デフォルト値: None) |
cbar_ax | カラーバーを出力する際の軸を Matplotlib の軸で指定します。(デフォルト値: None) |
square | True に設定すると、X 軸、Y 軸を正方形になるように調整し、軸を設定します。(デフォルト値: False) |
ax | 図を出力する際の軸を Matplotlib の軸で指定。(デフォルト値: None) |
xticklabels | True に設定すると、データフレームの列名を x 軸に出力します。False に設定すると、カラム名を出力しません。リストを指定すると、x 軸に任意のテキストを出力します。整数を指定すると、カラム名を出力しますが指定した数毎に出力します。(デフォルト値: True) |
yticklabels | True に設定すると、データフレームの列名を y 軸に出力します。False に設定すると、カラム名を出力しません。リストを指定すると、y 軸に任意のテキストを出力します。整数を指定すると、カラム名を出力しますが指定した数毎に出力します。(デフォルト値: True) |
mask | 値をマスクするセルを指定。True または False の 2 値で構成されるデータフレームまたは、行列で指定します。なお、欠損値は、自動的にマスクされます。(デフォルト値: None) |
kwargs | Matplotlib の ax.pcolormesh に渡すオプションをディクショナリ形式で指定。(デフォルト値: None) |
グラフの出力例
一様乱数を生成し、ヒートマップを出力
1 2 3 4 5 6 7 8 9 |
import numpy as np import seaborn as sns # 10x12 の一様乱数を生成 np.random.seed(0) uniform_data = np.random.rand(10, 12) # ヒートマップを出力 sns.heatmap(uniform_data) |
スケールの最小値を 0.3、最大値を 1.0 に設定
1 |
sns.heatmap(uniform_data, vmin=0.3, vmax=1.0) |
平均 0, 標準偏差 1 の正規乱数を 10×12 個生成
(発散的なデータセットとみなされ、0 が中心となるカラーマップが採用されています)
1 2 |
normal_data = np.random.randn(10, 12) sns.heatmap(normal_data) |
旅客機の運行実績のデータを用いてヒートマップを出力
1 2 3 4 5 6 7 8 |
# 航空機のデータを読み込み flights = sns.load_dataset("flights") # ピボットを生成 flights = flights.pivot("month", "year", "passengers") # X軸に年、Y軸に月、色の濃さで便数を表す sns.heatmap(flights) |
乗客数をテキストで出力
1 |
sns.heatmap(flights, annot=True, fmt="d") |
乗客数をテキストで小数点以下 1 桁まで出力
1 |
sns.heatmap(uniform_data, annot=True, fmt="1.1f") |
各セルの間に太さ 0.5 で線を描画
1 |
sns.heatmap(flights, linewidths=.5) |
カラーマップを Reds (赤系の色のグラデーション) に指定して描画
1 |
sns.heatmap(flights, cmap="Reds") |
カラースケールの値の中心が 250 になるように調整して描画
1 |
sns.heatmap(flights, center=250) |
Y 軸のラベルを表示しない
1 |
sns.heatmap(flights, yticklabels=False) |
X 軸のラベルを 3 つ (3 年) おきに出力
1 |
sns.heatmap(flights, xticklabels=3) |
カラーバーを出力しない
1 |
sns.heatmap(flights, cbar=False) |
March 1952 の値を隠す(マスクする)
1 2 3 |
mask = np.tile(0,(12,12)) mask[2,3] =1 sns.heatmap(flights, mask=mask) |
CSV ファイルを読み込み、Pandas のデータフレームに加工、ヒートマップを出力
1 2 3 4 |
import pandas as pd dataset3 = pd.read_csv("http://pythondatascience.plavox.info/wp-content/uploads/2016/05/sample_dataset.csv") dataset3 = dataset3.pivot("Sex", "Occupation", "Salary") sns.heatmap(dataset3, cmap="jet") |
形が正方形になるように調整する
1 |
sns.heatmap(dataset3, cmap="jet", square=True) |
clustermap: 階層的クラスタリングの結果とヒートマップを同時に可視化
seaborn.clustermap メソッドは、階層的クラスタリングを行い、デンドログラム (樹形図) とともに、近い属性を持つカテゴリを近くになるよう色の濃淡や色相でデータの密度や値の分布を可視化します。
seaborn.clustermap の使い方
1 2 3 4 5 |
seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, mask=None, **kwargs) |
seaborn.clustermap の主要な引数
data | クラスタリングに用いるデータセットを指定、NA を含むことはできません。 |
---|---|
pivot_kws | データが整理されたデータフレームの場合、キーワードを用いて、ピボットによるデータフレームを作ることができます。値はディクショナリ形式で指定します。(デフォルト値: None) |
method | クラスタを計算する際に用いる方法。詳細は、 scipy.cluster.hierarchy.linkage を参照。(デフォルト値: ‘average’) |
metric | クラスタリングに用いる距離行列を指定。詳細は、scipy.spatial.distance.pdist を参照。(デフォルト値: ‘euclidean’) |
z_score | Z スコア ( z = (x – mean ) / std ) を計算するかどうかを、0 (行), または 1 (列) で指定。これは、平均 0, 分散 1 になるように変換します。(デフォルト値: None) |
standard_scale | 標準化 (各列または各行の値と最小値の差を取り、それを最大値で割ること) を行うかどうかを、0 (行), または 1 (列) で指定。(デフォルト値: None) |
figsize | 作成する図の大きさを指定。整数 2 つのタプルで指定。(デフォルト値: None) |
cbar_kws | seaborn.heatmap の cbar_kws に渡すオプションを設定。 (カラーバーにラベルを追加する際などに利用) (デフォルト値: None) |
row_cluster, col_cluster | True に設定すると、行方向 (row) または、列方向 (col) でクラスタリングを行います。(デフォルト値: True) |
row_linkage, col_linkage | 予め計算された距離行列を Numpy の行列で指定する場合に利用。詳細は、 scipy.cluster.hierarchy.linkage を参照。(デフォルト値: None) |
row_colors , col_colors | 行または列のラベルの色をリストや Pandas のデータフレーム、系列で指定。例えば、グループ内のサンプルがどのようにクラスタリングされたかを確認する際に有用です。(デフォルト値: None) |
mask | 値をマスクするセルを指定。True または False の 2 値で構成されるデータフレームまたは、行列で指定します。なお、欠損値は、自動的にマスクされます。(デフォルト値: None) |
kwargs | Seaborn の sns.heatmap に渡すオプションをディクショナリ形式で指定。(デフォルト値: None) |
グラフの出力例
データを読み込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
>>> # Pandas のライブラリをロード >>> import pandas as pd >>> # 社員リストを読み込み >>> employees_list = pd.read_csv("http://pythondatascience.plavox.info/wp-content/uploads/2017/05/employee_list.csv") >>> employees_list Employee_Id Name Gender Date_Joined Department Position \ 0 1001 Okamoto M 2013/04/01 R&D Director 1 1002 Ikuta F 2012/12/01 Marketing Senior Exective 2 1003 Watanabe M 2016/09/01 Sales Assoc Manager 3 1004 Masuda M 2016/01/01 Sales Manager 4 1005 Hirayama F 2016/01/01 Sales Assoc Manager 5 1006 Hirata F 2013/11/01 Sales Director (... 省略 ...) >>> # 社員リストを集計し、部門別、役職別の社員数を算出 >>> employees = employees_list.groupby(["Department", "Position"]).size().rename('Count').reset_index() >>> employees Department Position Count 0 Engineering Assoc Manager 2 1 Engineering Director 4 2 Engineering Manager 3 3 Engineering Staff 5 4 HR Senior Exective 1 5 HR Staff 2 >>> # 集計表(ピボットテーブル)を作成 >>> employees_pivot = employees.pivot("Department", "Position", "Count").fillna(0) >>> employees_pivot Position Assoc Manager Director Manager Senior Exective Staff Department Engineering 2.0 4.0 3.0 0.0 5.0 HR 0.0 0.0 0.0 1.0 2.0 Legal 0.0 1.0 0.0 2.0 2.0 Marketing 1.0 1.0 0.0 2.0 2.0 R&D 0.0 1.0 2.0 0.0 4.0 Sales 3.0 2.0 1.0 2.0 7.0 |
クラスタマップを作成
1 2 3 4 |
%matplotlib inline import seaborn as sns sns.clustermap(employees_pivot) |
列方向でのクラスタリングは行わない (行方向のみクラスタリングを実施)
1 |
sns.clustermap(employees_pivot, col_cluster=False) |
カラーマップを Blues に設定し、セル間に太さ0.5で線を引く
1 |
sns.clustermap(employees_pivot, cmap="Blues", linewidths=.5) |
出力する図のサイズを 7×5 (単位: インチ) に設定
1 |
sns.clustermap(employees_pivot, figsize=(7, 5)) |
標準化(スケールを 0.0-1.0 の間に調整)を実施
1 |
sns.clustermap(employees_pivot, standard_scale=1) |
行方向で平均 0, 分散 1 の分布になるよう変換
1 |
sns.clustermap(employees_pivot, z_score=0) |
クラスタを計算する際のの条件として、単連結法 (method=”single”), 距離をコサイン距離によって算出
1 |
sns.clustermap(employees_pivot, method="single", metric="cosine") |
行方向での見出しとしての色を Set2 に設定
1 |
sns.clustermap(employees_pivot, row_colors=sns.color_palette("Set2")) |
参考・サンプルコード一部出典:
seaborn.heatmap — seaborn 0.7.1 documentation
seaborn.clustermap — seaborn 0.7.1 documentation