# seabornとは

seabornはpythonでグラフを書くためのライブラリです。pythonでグラフを書くといえばmatplotlibですが、そちらはどうも硬派すぎて私には合わなかったです。

seabornはpandasと連携ができるためグラフを最小限のコードで書くことができ、お手軽にデータを可視化できます。

今回seabornを使ってみて、あまりにもお手軽簡単で感動したので使い方まとめてみました。

# 導入

まずはライブラリのインポート、データセットはkaggleにあるmedical insurance costをお借りしました。とりあえずまずはデータセットの中身を見てみます。

import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("./insurance.csv")
df.head()

画像1

columnは7つで、それぞれ年齢、性別、bmi、子供の数、喫煙者かどうか、住んでいる地域、および医療保険料金です。とある人物の特徴が与えられて、その人物の医療保険料金を見積もるためのデータセットです。このデータセットで色々とグラフを描いていきます。

# 散布図

まずは散布図を描いてみます。単純に書くだけ、特にmatplotlibのAxesオブジェクトを作る必要はありませんが、今回は複数のグラフをまとめたかったので、Axesオブジェクトにグラフを書き込んでいくような感じしました。

fig,ax = plt.subplots(1,2,figsize=(24,12))
sns.scatterplot(data=df,x="bmi",y="charges",ax=ax.flat[0])
sns.scatterplot(data=df,x="bmi",y="charges",hue="smoker",ax=ax.flat[1])

画像2

seabornの一番のいいところがpandasのdataframeとの連携で、dataにdataframeを指定、xにx軸に指定したいcolumn名そしてyにy軸に指定したいcolumn名を指定するだけで簡単にいい感じなグラフを書けます。

scatterplot関数で散布図を書けます、以上のように引数を指定すれば単純な散布図を書けます。

またhueにグループcolumn名を指定すればグループに分けて散布図を描いてくれます。二極化してるっぽい相関が喫煙者かどうかできれいに分かれてくれましたね。

# ボックスプロット

fig,ax = plt.subplots(1,2,figsize=(12,24))
sns.boxplot(data=df,y="charges",x="sex",hue="smoker")

boxplot

ボックスプロットもこのように簡単に書けます。xとhueでグループ分けして簡単に書けます。

# CDFプロット

fig,ax = plt.subplots(1,1,figsize=(8,4))
sns.ecdfplot(data=df,x="bmi",hue="sex",ax=ax)

cdf

ecdfplot関数で累積度数分布も書けます。

# ヒストグラム

fig,ax = plt.subplots(1,1,figsize=(8,4))
sns.histplot(data=df,x="bmi",hue="sex",multiple="stack",ax=ax)

hist

histplot関数でヒストグラムが書けます。multiple引数で積み上げ方式を変えられます。

fig,ax = plt.subplots(1,2,figsize=(16,4))
sns.histplot(data=df,x="children",ax=ax.flat[0])
sns.histplot(data=df,x="children",discrete=True,ax=ax.flat[1])

hist2

discrete引数をtrueにすれば、このように数字をラベルのように扱えます。

# 複数プロットをまとめる

f, axs = plt.subplots(3,2,figsize=(16,12))
plot_list = [{"type":"box","x":"sex","y":"charges"},
            {"type":"scatter","x":"age","y":"charges"},
            {"type":"scatter","x":"bmi","y":"charges"},
            {"type":"box","x":"children","y":"charges"},
            {"type":"box","x":"smoker","y":"charges"},
            {"type":"box","x":"region","y":"charges"}]
for ax,plot in zip(axs.flat,plot_list):
    if plot["type"] == "box":
        sns.boxplot(data=df,x=plot["x"],y=plot["y"],ax=ax)
    if plot["type"] == "scatter":
        sns.scatterplot(data=df,x=plot["x"],y=plot["y"],ax=ax)

report

このように違う種類のグラフを一個の図にまとめることもできます。

# グループ別にグラフを分けて書く

g = sns.FacetGrid(df,col="sex",hue="smoker",height=6)
g.map(sns.scatterplot,"bmi","charges")

facet

seabornにはデータをグループに分けて、それぞれ別のグラフとして描画するFaceGridという関数もあるっぽいです。FacetGridですが、複数種類のグラフを組み合わせてきれいなレポートとかにする方法はよくわかりません。でもこれはこれで便利です。きれいなレポートは作れませんが、データを考察するのに使えるでしょう。