前回の記事「Pythonでデータ可視化を実現するSeabornライブラリ」。
Part 1では、分布図やカテゴリ図を描くためにSeabornライブラリをどのように使うかを見てきました。
今回はその続きで、Seabornが提供する他の機能で様々な種類のプロットを描く方法を見ていきます。
まず、行列プロットから話を始めます。
マトリクスプロット
マトリックスプロットは、行と列の形でデータを表示するタイプのプロットである。
ヒートマップはマトリックスプロットの代表的な例である。
ヒートマップ
ヒートマップは通常、数値列間の相関をマトリックス形式でプロットするために使用されます。
ここで重要なのは、行列プロットを描くには、列だけでなく行にも意味のある情報が必要だということです。
前回に引き続き、Titanicデータセットの最初の5行をプロットし、行と列の両方のヘッダーに意味のある情報があるかどうかを見てみよう。
次のスクリプトを実行せよ。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('titanic')
dataset.head()
出力では、次のような結果が見られるだろう。
出力から、列のヘッダには生存している乗客、年齢、運賃などの有用な情報が含まれていることがわかります。
しかし、行ヘッダには、0, 1, 2 などのインデックスしかありません。
行列プロットを作成するためには、列と行の両方のヘッダに有用な情報が必要です。
これを実現する一つの方法は、データセットに対して corr()
メソッドを呼び出すことです。
corr()` 関数はデータセットのすべての数値列の間の相関を返す。
次のスクリプトを実行してみてください。
dataset.corr()
出力では、以下のように、列と行の両方に意味のあるヘッダー情報があることがわかる。
これらの相関値を使ってヒートマップを作成するには、heatmap()
関数を呼び出して相関データフレームを渡す必要があります。
次のスクリプトを見てください。
corr = dataset.corr()
sns.heatmap(corr)
出力はこのようになります。
出力から、ヒートマップが本質的に行うことは、行と列の値のすべての組み合わせに対してボックスをプロットすることであることがわかります。
ボックスの色はグラデーションに依存する。
例えば、上の画像では、2つの特徴の間に高い相関がある場合、対応するセルやボックスは白くなり、逆に相関がない場合、対応するセルは黒いままである。
また、annot
パラメータにTrue
を渡すことで、ヒートマップ上に相関値をプロットすることができます。
以下のスクリプトを実行し、その動作を確認してください。
corr = dataset.corr()
sns.heatmap(corr, annot=True)
出力
また、cmap
パラメータに引数を渡すことで、ヒートマップの色を変更することができます。
とりあえず、以下のスクリプトを見てみてください。
corr = dataset.corr()
sns.heatmap(corr, cmap='winter')
出力はこのようになります。
単純に全カラム間の相関を利用するだけでなく、pivot_table
関数を使って、インデックス、カラム、およびインデックスとカラムに対応する見たい値を指定することもできます。
ここでは、年、月、その月に旅行した乗客数に関する情報を含む “flights” データセットを使用して、pivot_table
関数の動作を確認します。
次のスクリプトを実行すると、データセットがインポートされ、最初の5行が表示されます。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('flights')
dataset.head()
出力してください。
さて、ピボットテーブル関数を使って、ある年のある月に移動した乗客の数を表示するヒートマップを作成することができます。
そのためには、index
パラメータの値として month
を渡します。
index 属性は行に対応します。
次に、column
パラメータの値として year
を渡す必要があります。
そして最後に values
パラメータに、passengers
カラムを渡します。
以下のスクリプトを実行します。
data = dataset.pivot_table(index='month', columns='year', values='passengers')
sns.heatmap(data)
出力はこのようになります。
この出力から明らかなように、初期のころはフライトを利用した乗客の数は少なかったのです。
年数が経つにつれて、乗客の数は増えています。
現在、箱やセルが重なっている場合があり、セルの境界があまり明確でないことがわかります。
セルの境界を明確にするためには、linecolor
と linewidths
パラメータを使用することができます。
次のスクリプトを見てください。
data = dataset.pivot_table(index='month', columns='year', values='passengers' )
sns.heatmap(data, linecolor='blue', linewidth=1)
上のスクリプトでは、linecolor
パラメーターに “blue” を渡し、linewidth
パラメーターには 1 を指定しています。
出力では、各セルの周りに青い境界線が表示されます。
境界を太くしたい場合は、linewidth
パラメータの値を大きくすることができます。
クラスターマップ
ヒートマップに加えて、もう一つよく使われる行列プロットにクラスターマップがあります。
クラスター図は、基本的に階層的クラスタリングを使用して、行列の行と列をクラスタリングします。
特定の年の特定の月に旅行した乗客の数について、クラスター・マップをプロットしてみましょう。
以下のスクリプトを実行してください。
data = dataset.pivot_table(index='month', columns='year', values='passengers')
sns.clustermap(data)
クラスタマップを描くには、clustermap
関数を使う。
ヒートマップ関数と同様に、渡されるデータセットには行と列の両方に意味のあるヘッダが必要である。
上のスクリプトの出力は以下のようなものである。
出力では、特定の月に移動した乗客の数に基づいて、月と年が一緒にクラスタ化されているのがわかります。
これで、マトリックスプロットについての議論を終えます。
次の章では、Seaborn ライブラリのグリッド機能について説明します。
Seaborn Grids
Seabornのグリッドは、プロットで使用される機能に応じてサブプロットを操作することができます。
ペアグリッド
この記事シリーズのパート1では、ペアプロットを使って、データセットの数値列のすべての可能な組み合わせについて散布図を描く方法を見ました。
ペアグリッドに移る前に、ここでペアプロットを復習しておきましょう。
ペアグリッドのセクションで使うデータセットは、seaborn
ライブラリをダウンロードしたときにデフォルトでダウンロードされる “iris” データセットです。
以下のスクリプトを実行し、irisデータセットをロードしてください。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('iris')
dataset.head()
irisデータセットの最初の5行は以下のようなものである。
では、虹彩データセットにペアプロットを描いてみよう。
次のスクリプトを実行しなさい。
sns.pairplot(dataset)
出力されたスナップショットは次のようなものである。
次に、ペアグリッドを描画し、ペアプロットとペアグリッドの違いを見てみましょう。
ペアグリッドを作成するには、以下のように PairGrid
関数にデータセットを渡すだけです。
sns.PairGrid(dataset)
出力
出力では、空のグリッドを見ることができます。
これは、ペアグリッド関数が本質的に行っていることです。
これは、データセット内のすべての特徴に対して空のグリッドを返します。
次に、ペアグリッド関数が返すオブジェクトに対して map
関数を呼び出し、グリッド上に描画したいプロットの種類を渡します。
それでは、ペアグリッドを使って散布図を描いてみましょう。
grids = sns.PairGrid(dataset)
grids.map(plt.scatter)
出力はこのようになります。
虹彩」データセットの数値列のすべての組み合わせについて散布図を見ることができます。
また、同じペアグリッドに異なる種類のグラフをプロットすることもできます。
例えば、対角線上に「分布」プロット、対角線の上半分に「kdeplot」、対角線の下半分に「散布」プロットをそれぞれ描きたい場合、 map_diagonal
, map_upper
, map_lower
関数を使用することが可能です。
描画されるプロットの種類は、これらの関数のパラメータとして渡されます。
次のスクリプトを見てください。
grids = sns.PairGrid(dataset)
grids.map_diag(sns.distplot)
grids.map_upper(sns.kdeplot)
grids.map_lower(plt.scatter)
上のスクリプトの出力は次のようなものです。
上の画像からペアグリッド関数の真の力を見ることができます。
対角線上に分布プロット、上半分にカーネル密度プロット、下半分に散布図のプロットがあります。
ファセット・グリッド
ファセット・グリッドは、2つ以上の数値特徴に対して、2つ以上のカテゴリー特徴をプロットするために使われる。
乗客の年齢に対する性別 vs 生死 の分布プロットを行うファセットグリッドをプロットしてみましょう。
この節では、再びタイタニック号のデータセットを使用します。
以下のスクリプトを実行し、Titanicデータセットをロードする。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('titanic')
ファセットグリッドを描画するには、FacetGrid()
という関数を使う。
この関数の最初のパラメータはデータセットで、2番目のパラメータ col
は列にプロットするフィーチャーを指定し、row
は行にプロットするフィーチャーを指定します。
FacetGrid()関数はオブジェクトを返します。
ペアグリッドと同様に、map` 関数で描画するプロットの種類を指定することができます。
以下のスクリプトを実行してください。
grid = sns.FacetGrid(data=dataset, col='alive', row='sex')
grid.map(sns.distplot, 'age')
上のスクリプトでは、ファセットグリッドに年齢の分布図をプロットしています。
出力はこのようになります。
出力から、4つのプロットを見ることができます。
乗客の性別と生存率の組み合わせごとに1つです。
FacetGrid()`関数で指定されたように、列は生存率に関する情報を含み、行は性別に関する情報を含みます。
最初の行と最初の列は,性別が男性で生存しなかった乗客の年齢分布である.1行目と2列目には、性別が男性で生存している乗客の年齢分布が示されている。
同様に、2行目と1列目には、性別が女性で生存していない乗客の年齢分布が、2行目と2列目には、性別が女性で生存している乗客の年齢分布が、それぞれ示されています。
1つの素性に対する分布図に加えて、2つの素性を含む散布図をファセットグリッド上にプロットすることができる。
例えば、次のスクリプトは、生き残った乗客とそうでない乗客の両方の性別について、年齢と運賃の散布図をプロットしています。
grid = sns.FacetGrid(data= dataset, col= 'alive', row = 'sex')
grid.map(plt.scatter, 'age', 'fare')
上のスクリプトの出力は次のようになる。
回帰プロット
回帰プロットは、その名の通り、2つ以上の変数間の回帰分析を行うために使用されます。
このセクションでは、2つの変数間の線形関係をプロットする線形モデルプロットと、データに応じて最適な回帰直線を学習します。
このセクションで使用するデータセットは、seaborn
ライブラリと一緒にデフォルトでダウンロードされる “diamonds “データセットである。
以下のスクリプトを実行して、データセットをロードする。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
dataset = sns.load_dataset('diamonds')
dataset.head()
データセットは次のようなものである。
このデータセットには、カラットの重さ、色、透明度、価格など、ダイヤモンドのさまざまな特徴が含まれています。
ダイヤモンドのカラットと価格の間に直線関係をプロットしてみよう。
理想的には、ダイヤモンドが重ければ重いほど、価格は高くなるはずです。
これが実際に正しいかどうか、diamonds データセットで利用可能な情報に基づいて見てみましょう。
線形モデルをプロットするために、 lmplot()
関数を使用します。
最初のパラメータはX軸にプロットしたい特徴量、2番目の変数はY軸にプロットしたい特徴量です。
最後のパラメーターはデータセットである。
次のスクリプトを実行する。
sns.lmplot(x='carat', y='price', data=dataset)
出力はこのようになる。
また、カテゴリ特徴に基づいた複数の線形モデルをプロットすることができます。
特徴量の名前は hue
パラメータに値として渡されます。
例えば、ダイヤモンドのカットに基づき、カラットと価格の関係についての複数の線形モデルをプロットしたい場合、次のように lmplot
関数を使用します。
sns.lmplot(x='carat', y='price', data=dataset, hue='cut')
出力はこのようになります。
出力から、カラットとダイヤモンドの価格の間の線形関係は、予想通り理想的なカットのダイヤモンドで最も急であり、線形モデルはフェアカットのダイヤモンドで最も浅いことがわかります。
カット特徴のデータを異なる色相でプロットすることに加えて、各カットについて1つのプロットをすることもできます。
これを行うには、cols
属性に列名を渡す必要があります。
次のスクリプトを見てください。
sns.lmplot(x='carat', y='price', data=dataset, col='cut')
出力では、以下のようにdiamondsデータセットのcutカラムの各値に対して別々のカラムが表示されます。
また、aspect
と size
パラメータを使用すると、プロットのサイズと縦横比を変更することができます。
以下のスクリプトを見てください。
sns.lmplot(x='carat', y = 'price', data= dataset, col = 'cut', aspect = 0.5, size = 8 )
aspect` パラメータは、幅と高さのアスペクト比を定義します。
アスペクト比が0.5であれば、出力に示すように、幅が高さの半分になります。
プロットの大きさが変わったことがわかると思いますが、フォントサイズはまだとても小さいです。
次の節では、Seabornのプロットのフォントとスタイルを制御する方法を見ます。
プロットスタイリング
Seabornライブラリには、さまざまなスタイル設定オプションが用意されています。
このセクションでは、そのいくつかを見ていきます。
セットスタイル
set_style()関数はグリッドのスタイルを設定するために使用されます。
set_style 関数のパラメータとして、 darkgrid
, whitegrid
, dark
, white
, ticks
を渡すことができます。
ここでは、再び “titanic dataset “を使用します。
以下のスクリプトを実行すると、darkgrid
のスタイルが表示されます。
sns.set_style('darkgrid')
sns.distplot(dataset['fare'])
出力はこのようになる。
出力では、暗い背景でグリッドが表示されていることがわかる。
それでは、whitegrid
がどのように見えるか見てみましょう。
以下のスクリプトを実行してください。
sns.set_style('whitegrid')
sns.distplot(dataset['fare'])
出力はこのようになる。
これで、背景にグリッドが表示されていることがわかりますが、濃いグレーの背景は見えません。
他のオプションも試してみて、どのスタイルが自分に合うか確認することをお勧めします。
図形の大きさを変更
Seaborn は裏で Matplotlib の関数を使っているので、Matplotlib の pyplot
パッケージを使って、以下のように図の大きさを変更することができます。
plt.figure(figsize=(8,4))
sns.distplot(dataset['fare'])
上のスクリプトでは、プロットの幅と高さをそれぞれ8インチと4インチに設定しています。
上のスクリプトの出力は次のようなものです。
コンテキストを設定する
ノートブックとは別に、ポスターのためのプロットを作成する必要があるかもしれません。
そのためには、以下のように set_context()
関数を使用し、唯一の属性として poster
を渡します。
sns.set_context('poster')
sns.distplot(dataset['fare'])
出力では、以下のようなポスターの仕様を持つプロットが表示されるはずです。
例えば、通常のプロットに比べてフォントが大きくなっているのがわかると思います。
結論
Seabornライブラリは、データ可視化のための高度なPythonライブラリです。
この記事は、Pythonでデータ可視化を行うSeabornの連載の第2回です。
この記事では、Seabornで回帰プロットと行列プロットを作成する方法を見ました。
また、プロットスタイルを変更する方法と、グリッド関数を使ってサブプロットを操作する方法を見ました。
次回は、PythonのPandasライブラリの組み込み機能をデータ可視化に利用する方法について見ていきます。