Python seaborn 使い方 後編

python

PythonのライブラリSeabornの使い方【後編】

2020年4月24日

こんにちは。産婦人科医で人工知能の研究に従事しているTommy(Twitter:@obgyntommy)です。

 

本記事はPythonのライブラリであるseabornについて学習するための記事になります。【前編】【後編】に分けて解説しますが、今回はそのうち【後編】となります。

 

前編を読んでいない方は、まず以下の記事で学習して下さい。

 

関連記事
Python seaborn 使い方 前編
PythonのライブラリSeabornの使い方【前編】

続きを見る

 

 本記事の学習到達目標

  • 様々なグラフの表示方法を修得する
  • グラフを複数表示する方法を修得する

 

では早速、学習していきましょう。

 

※ "seabornとは" についてはPythonのライブラリseabornの使い方【前編】で解説したので省略させて頂きます。

seabornのインストール方法と本記事で使用するデータ一覧については、【前編】でも解説しましたが、再度掲載させて頂きます。

seabornのインストール方法

Python seaborn 使い方

インストールは pip で行いましょう。

 

ライブラリをインストールする際には、pippip3 のどちらかを使うことになりますが、どちらでもOKです。

 

普段使っている方で、インストールして下さい。

In[]

 

本記事で使用するデータ一覧

Python seaborn 使い方

本記事では乱数ではなく、データ解析入門で使われる実データを使います

 

実際に、仕事をしている中で実データを解析していくイメージで学習を進めていきましょう。

 

注意ポイント

seabornではDataFrame型をよく使います。numpyでも使えるグラフもありますが、DataFrameで統一すると良いでしょう。

DataFrameはCSVやデータベースをなどの表データです。

 

iris

irisデータはアヤメ3種類それぞれのがく片(sepal)、花弁(petal)の幅と長さのデータセットです。

 

sepal length花弁長さ
sepal width花弁幅
petal lengthがく片長さ
petal widthがく片幅

Python seaborn 使い方 irisについて

データの取得の仕方は簡単、sns.load_dataset(“iris”) で欲しいデータが手に入ります。

 

データのtype(型)はpandasのDataFrameです。

In[]

Out[]

Python seaborn 使い方

タイタニック

このデータはグラフ表示で使用します。

 

タイタニックのデータはどういった人が生存できたかを予測する問題です。

survived0:死亡 1:生存
pclassチケットクラス 1:上級 2:中級 3:初級
sex性別
age年齢
sibsp同乗の兄弟配偶者の数
parch同乗の親子供の数
fare料金
embarked出港地(C=Cherbourg、Q=Queenstown、S=Southampton)
classチケットクラス
who男性 / 女性
adult_male成人男性かどうか
deck乗船していたデッキ
embark_town出港地
alive生存したかどうか
alone一人であったかどうか

In[]

 

Out[]

Python seaborn 使い方

様々なグラフの表示方法

Python seaborn 使い方

グラフの表示では、irisとtitanicのデータを使用していきます。

 

グラフは簡単にデータの特徴を伝えることができますが、間違ったグラフを選ぶとわかりにくい場合もあります。

 

適切なグラフを選択できるよう練習していきましょう。

countplot(棒グラフ)

countplotはカテゴリ変数の数を見るときに使用します。

 

よく使いそうなパラメータは6つ。

 

x / yカウントする列名。x指定で縦方向。y指定で横方向。
hueカウントした軸をさらにカテゴリで分ける列名
data対象データ
orderグラフの並び順をlistで指定
hue_orderhueで指定したカテゴリの並び順をlistで指定

 

titanicの生存者の数を確認

まず、生存者数をカウントした棒グラフを描画します。

 

xに survived の列を表示させ、data に titanic を使用します。

In[]

 

Out[]

Python seaborn 使い方  titanicの生存者の数【棒グラフ】

titanicの生存者の数【棒グラフ】

 

alive 列の1(生存者)、0(死亡者)の数が比較できました。

 

これでわかりやすくなったでしょうか。皆さんはどう感じられましたか?

 

1(生存者)342人
0(死亡者)546人

なんだか、表の方がわかりやすいようにも思えます。

 

titanicの生存者の数をclass(チケットクラス)に分けて確認

 

次はclass(チケットクラス)に分けて確認してみましょう。

 

In[]

 

classごとのカウント数にすることで、それぞれの死亡者、生存者数の比較ができます。

Out[]

Python seaborn 使い方 

titanicの生存者の数を死亡者、生存者で分ける

 

生存率を確認したい時には、下記の表でも良いかもしれません。

 

乗客数生存者数生存率
First21613663%
Second1848747%
Third49111924%

 

表現方法を変えて、次のbarplotでも見ていきます。

 

barplot(棒グラフ)

barplotでは、データの平均値とエラーバーをグラフにします。

 

よく使いそうなパラメータは8つあります。

 

xX軸で使用するデータの列名
yY軸で使用するデータの列名
hue軸をさらにカテゴリで分ける列名
data対象データ
orderグラフの並び順をlistで指定
hue_orderhueで指定したカテゴリの並び順をlistで指定
ciconfidence intervals(信頼区間)の幅
n_boot信頼区間算出のブートストラップ

 

他のパラメータはグラフの見た目などに関係してくる項目となります。

 

class(チケットクラス)ごとの生存率を確認する

class(チケットクラス)ごとの生存率を見てみます。

 

  • $x$ 軸にclass(チケットクラス)
  • $y $ 軸にsurvived(0:死亡,1:生存)

この様に定義します。

In[]

 

Out[]

Python seaborn 使い方 classごとの生存率を棒グラフで比較する

classごとの生存率を棒グラフで比較する

 

coutplot のところでも確認しましたが、classごとで生存率が大きく違います。

 

barplot はデータの平均値を表示するグラフですがが、なぜ、$y$ (縦軸)=survived(0:死亡,1:生存)で、生存率になるのでしょうか?

 

例えば4人分のデータで 0(死亡), 1(生存), 0(死亡), 0(死亡)があったときに、この平均を算出すると(0+1+0+0)/4=0.25となるので、この値が生存率になりますよね。

 

class(チケットクラス)ごとの生存率をsex(性別)で分ける

class(チケットクラス)とsex(性別)の生存率を見ていきましょう。

 

hue=sex とします。

 

In[]

 

Out[]

Python seaborn 使い方 classのsex別の生存率

classのsex別の生存率

 

このグラフでは生存率の高い人の条件が class=Firstsex=female であることが一目でわかります。

 

当時、特に女性を優先して助けたのがわかりますね。

 

表にするより圧倒的にこのグラフの方がわかりやすいでしょう。

 

ヒストグラム

ヒストグラムはどのデータを区間ごとに分け、多い少ないを把握することができるグラフです。

 

その分布が正規分布かどうかなどを確認します。

 

seabornではdistplotを使用します。

 

よく使いそうなパラメータは5つあります。

 

a対象データ。Series型
binsビン数。区間の数
histヒストグラムの表示非表示
kdeカーネル密度推定の表示非表示
rugラグプロットの表示非表示

 

kde, hist, bin, rugplot の違いについては以下の図で把握しましょう。

Python seaborn 使い方 distplotを使用したヒストグラム

distplotを使用したヒストグラム

 

distplot では DataFrame の1行、1列分にあたる Series 型をデータとして与えます。

 

Python seaborn 使い方

DataFrameの1行、1列分にあたるSeries型をデータとして与える

 

1列のデータの取得は、DataFrame(‘列名’)で取得ができます。

 

irisデータの sepal_width 列を取得してみましょう。

 

合わせて、型も確認しています。

 

SeriesとDataFrameの型の違い

DataFrame()、Series(行 or 列)として捉えましょう。

 

In[]

 

sepal_widthの分布

irisデータの sepal_width の分布を確認しましょう。

 

distplotに iris[‘sepal_width’] を与えます。

 

その際に、a=iris[‘sepal_width’] としても良いですし、a=を省略しても良いです。

 

In[]

 

Out[]

Python seaborn 使い方 irisデータのsepal_widthの分布

irisデータのsepal_widthの分布

 

3を中心に2〜4.5までの範囲で値が広がっています。

 

このグラフで簡単に、どこのデータが多いかなどのデータの分布が確認することができます。

 

sepal_widthをspecies(品種)ごとの分布に分けてグラフ化する

品種ごとに分けてグラフにしてみましょう。

 

品種ごとにデータを分ける場合は、iris[条件][対象列名] とします。

 

例えば、speciesが  setosa のデータを取得する場合、iris[‘species’]==’setosa’ を条件に入れます。

In[]

 

では、3品種のデータをヒストグラムにしてみましょう。

 

3つのデータをグラフにする場合は、そのまま3回実行します。

 

In[]

 

Out[]

Python seaborn 使い方 3品種のデータをヒストグラムにした分布

3種のデータをヒストグラムにした分布

 

上図を見てみると、3つの品種ごとに山の中心ずれていることがわかります。

 

このグラフでも、sepal_width は品種を判断するのに使えそうなデータであることがわかります。

 

散布図

散布図は、二つのデータが相関関係にあるかどうかを確認します。

 

irisのデータを使って、各値の相関関係を見ましょう。

 

散布図はいくつか方法があるので順番に紹介していきます。

 

seaborn.scatterplot

scatterplotはシンプルな散布図です。

 

パラメータが多いですが、よく使いそうなのは下記の6つです。

data対象のデータ。DataFrame型
xx軸のデータにする列名
yy軸のデータにする列名
hueグルーピングする列名
styleマーカーを変えてプロットするグループの列名
sizeマーカーサイズを変えてプロットするグループの列名

sepalのwidthとlengthの関係を見てみましょう。

 

In[]

 

Out[]

Python seaborn 使い方  sepalのwidthとlengthの散布図の関係

sepalのwidthとlengthの散布図の関係

 

sepalのwidthとlengthには相関がありそうですね。

 

また、種別ごとにプロットされる位置が違うので、データとしての違いが出ているのがわかります。

 

jointplot

joinplotというメソッドでも散布図が描画でき、$X$ 、$Y$ 軸のデータにヒストグラムを描画します。

 

よく使いそうなパラメータは4つあります。

data対象のデータ。DataFrame型
xx軸のデータにする列名
yy軸のデータにする列名
kindグラフの表示方法
5つ
scatter : 散布図
reg: 散布図と回帰直線
resid: 回帰直線からの残差
kde: カーネル密度推定の等高線
hex: 六角形のヒートマップ

 

これはグループ分けするhueパラメータがありませんので、種別は1つずつ表示します。

 

そのため、dataにはiris[iris[‘species’]==’setosa’]と条件をつけてデータを与えます。

 

In[]

 

Python seaborn 使い方 

kindのパラメータを変更すると色々なグラフになります。

 

Python seaborn 使い方 

ヒートマップ

ヒートマップはマトリックス図の値を色で値の高低を表現します。

 

各データの相関係数を確認する場合などに使います。

 

今回はirisデータの相関係数をヒートマップで表現します。

 

相関係数はpandas.DataFrameの corr メソッドで算出できます。

 

In[]

 

Out[]

Python seaborn 使い方 

irisデータの相関係数

 

ヒートマップの描画は、seabornではheatmapメソッドを使います。

 

よく使いそうなパラメータは8つあります。

 

data対象データ
vmin色の下限値
vmax色の上限値
centerカラーマップを中央に配置する値
cmap色の種類。matplotlibのcolormap
annotマトリックス図に値の表示
fmtannot=true時の表示するデータのフォーマット

 

色の上下限を-1.0〜1.0にして相関係数のヒートマップを描画します。

 

In[]

 

Out[]

Python seaborn 使い方 irisの相関係数のヒートマップ

irisの相関係数のヒートマップ

 

ボックスプロット

ボックスプロット(箱ひげ図)はカテゴリごとのデータのばらつきや、中心値のずれ具合などを確認することができます。

 

seabornでは、boxplotメソッドを使用します。

 

使いそうなパラメータは6つです。

 

xX軸で使用するデータの列名
yY軸で使用するデータの列名
hue軸をさらにカテゴリで分ける列名
data対象データ
orderグラフの並び順をlistで指定
hue_orderhueで指定したカテゴリの並び順をlistで指定

species ごとの sepal_width の値を見てみます。

In[]

 

Out[]

Python seaborn 使い方 irisデータの箱ヒゲ図

irisデータの箱ヒゲ図

 

ヒストグラムでは少しわかりにくかったですが、sepal_width が species ごとに差があることがわかります。

 

バイオリンプロット

バイオリンプロットはボックスプロットをカーネル密度分布で表現したようなものです。

 

seabornでは、violinplotメソッドを使用します。

 

使いそうなパラメータは6つあります。

 

xX軸で使用するデータの列名
yY軸で使用するデータの列名
hue軸をさらにカテゴリで分ける列名
splithueを2つのレベルで指定した場合、バイオリンを半分で分ける
data対象データ
orderグラフの並び順をlistで指定
hue_orderhueで指定したカテゴリの並び順をlistで指定

 

ボックスプロットと同様に、species ごとの sepal_width の値を見てみます。

 

In[]

 

Out[]

Python seaborn 使い方 irisデータの相関係数をバイオリンプロットで表示

irisデータの相関係数をバイオリンプロットで表示

 

折れ線

seabornの折線グラフは、matplotlibのplotのようなものがないので、近いpointplotを使ってみます。

 

irisもtitanicも折線グラフには向かないデータなので、実際のウイルスの感染者数を抜粋したデータを使います。

 

データは下記で作ります。データ作っているだけなので、コピペで実行してください。

 

In[]

 

patientというDataFrameができます。

 

それぞれ、列名のnegative(陽性)、serious(重症)は患者数を表しています。

 

Python seaborn 使い方 列名のnegative(陽性)、serious(重症)は患者数

列のnegative(陽性)、serious(重症)は患者数

 

あとは、このデータを pointplot で negative 、serious の数を折れ線グラフにします。

 

pointplotのパラメータで使いそうなのは7つ。

 

今回のデータにグループ分けしたいデータはないので、hueは使いません。

 

xX軸で使用するデータの列名
yY軸で使用するデータの列名
hueデータをグループ分けする列名
data対象データ
orderグラフの並び順をlistで指定
hue_orderhueで指定したカテゴリの並び順をlistで指定
colorグラフの色

 

In[]

 

Out[]

Python seaborn 使い方

egative、seriousの数を折れ線グラフ

 

pointplot  は $X$ 軸のカテゴリごとに $Y$ 軸の値をばらつきとともにみるグラフなので、素直に、matplotlibのplotメソッドを使ってもOKです。

 

In[]

 

Out[]

Python seaborn 使い方 irisデータの相関係数をmatplotlibのplotメソッドで表示

irisデータの相関係数をmatplotlibのplotメソッドで表示

 

グラフを複数表示する方法

Python seaborn 使い方

pariplot

散布図の紹介では、sepal_widthsepal_length の関係のみを確認しましたが、一気に全部見ることができれば便利です。

 

seabornには、グラフを一気に複数表示してくれるメソッドがあります。

 

今回は、pairplotを使ってみます。

 

data対象データ
hueグルーピングする列名
hue_orderlisthueで指定したカテゴリの並び順をlistで指定
vars対象のデータの列名をlistで指定
kindプロット種類。scatter or reg

 

irisデータを全て渡して、speciesでグルーピングします。

 

In[]

 

Out[]

Python seaborn 使い方 散布図を複数表示する

散布図を複数表示する

 

どうでしょう。一気にお互いの変数の相関関係と種別ごとのデータの分布の差がわかります。

 

しかも、使い方も簡単です。

Axes

matplotlibのAxesを使うことで、seabornでも複数のグラフを表示できます。

 

まず、plt.subplotsでグラフ表示するaxesを複数作ります。

 

In[]

 

下記のようなイメージになります。

 

axesの中には列数、行数で指定した配列分axes(グラフ)が入っています。

Python seaborn 使い方 figureの列数、行数、幅、高さの関係

figureの列数、行数、幅、高さの関係

 

では、titanicで使った棒グラフを並べて表示してみましょう。

 

グラフの引数にax=axes[列No, 行No]を指定するだけです。

 

In[]

 

Out[]

Python seaborn 使い方 seabornで複数のグラフを表示

seabornで複数のグラフを表示

 

今回は以上となります。お疲れ様でした。

 

また、seabornについての課題を用意していますので、学習し終わった方は挑戦してみて下さい。

関連記事
Python seaborn 練習問題
【Python】seabornの練習問題【Kaggleに挑戦】

続きを見る

 

 

 

人気記事 【入門から上級レベルまで】人工知能・機械学習の独学におすすめの本25選

人気記事 無料あり:機械学習エンジニアの僕がおすすめするAI(機械学習)特化型プログラミングスクール3社


-python
-,

Copyright© Tommy blog  , 2024 All Rights Reserved.