seabornを勉強する

Pythonでグラフを作成するツールには、[matplotlib](https://matplotlib.org)、[seaborn](https://seaborn.pydata.org)、[plotnine](https://plotnine.readthedocs.io/en/v0.12.4/#)などがあります。
今回は、seabornを勉強します。
勉強は[seabornのチュートリアル](https://seaborn.pydata.org/tutorial.html)を読みながら進めていきました。
実行環境にはGoogle Colaboratoryを用いました。

# seabornのインポート
```Python
import seaborn as sns
```

# データセットの読み込み
[seaborn.load_dataset](https://seaborn.pydata.org/generated/seaborn.load_dataset.html)を用いてデータセットを読み込みます。
```Python
tips = sns.load_dataset("tips")
```
データセットを確認してみます。
```Python
tips.head()
```
![スクリーンショット 2023-12-22 20.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/6cb004c7-8abe-7242-216f-b5ffb9fa8d9d.png)

# データの可視化
## seaborn.relplot
[seaborn.relplot](https://seaborn.pydata.org/generated/seaborn.relplot.html)を用いて、2つの変数間の関係を可視化します。
tipsデータセットのtotal_billとtipの関係を可視化します。
```Python
sns.relplot(data=tips, x="total_bill", y="tip")
```
![Unknown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/d8c3d11c-5cfe-5e89-b199-01bff9becfa9.png)

### テーマの適用
[seaborn.set_theme](https://seaborn.pydata.org/generated/seaborn.set_theme.html)を用いてテーマを適用します。
以下のコードでは、デフォルトのテーマを適用します。
```Python
sns.set_theme()
sns.relplot(data=tips, x="total_bill", y="tip")
```
![Unknown-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/cf2ed9d5-c489-c48c-1b03-806d650e7a4e.png)

以下のコードでは、tickを適用します。
```Python
sns.set_theme(style="ticks")
sns.relplot(data=tips, x="total_bill", y="tip")
```
![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/bc950be0-8f27-9c2c-f989-4477980cf49a.png)

### 曜日ごとで色分け
hue="day"を加え、曜日ごとで色分けします。
```Python
sns.relplot(data=tips, x="total_bill", y="tip", hue="day")
```
![Unknown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/32991595-9ccf-6a5c-640d-89db14e77ece.png)

### 時間でグラフを分ける
col="time"を加え、時間でグラフを分けます。
```Python
sns.relplot(data=tips, x="total_bill", y="tip", hue="day", col="time")
```
![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/0c68beff-37fb-0d55-d479-3cfa8da26654.png)

Lunchは木曜日と金曜日が多く、Dinnerは土曜日と日曜日が多いことがわかります。

### 人数でプロットの大きさを分ける
size="size"を加え、人数でプロットの大きさを分けます。
```Python
sns.relplot(data=tips, x="total_bill", y="tip", hue="day", col="time", size="size")
```
![Unknown-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/4670c7db-4a20-2b68-4fc7-366053155740.png)

## seaborn.lmplot
[seaborn.lmplot](https://seaborn.pydata.org/generated/seaborn.lmplot.html)を用いて、回帰モデルを可視化します。
```Python
sns.lmplot(data=tips, x="total_bill", y="tip", hue="day", col="time")
```
![Unknown-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/492530f5-76ae-2758-eedb-7b540ae90938.png)

散布図に回帰直線がつきました。

## seaborn.displot
[seaborn.displot](https://seaborn.pydata.org/generated/seaborn.displot.html)を用いて、ヒストグラムを作成します。
```Python
sns.displot(data=tips, x="tip", col="time")
```
![Unknown-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/6c4faf69-82ab-98b6-69cc-ff1b12711baf.png)

### カーネル密度推定の結果をつける
kde=Trueを加え、カーネル密度推定の結果をつけます。
```Python
sns.displot(data=tips, x="tip", col="time", kde=True)
```
![Unknown-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/349d2c41-4ef0-0398-c7d5-b1856ba51036.png)

LunchとDinnerの分布が異なることがわかります。

### ECDFを可視化
kde=Trueを削除し、kind="ecdf"を加え、ECDFを可視化します。
ECDFとは、累積分布関数を推定したものです。
```Python
sns.displot(data=tips, x="tip", col="time", kind="ecdf")
```
![Unknown-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/4fe077ad-2b41-c09c-ff6a-8e851a97572b.png)

カーネル密度推定の結果がついたヒストグラムよりわかりづらいですが、LunchとDinnerの分布が異なることがわかります。

## seaborn.catplot
[seaborn.catplot](https://seaborn.pydata.org/generated/seaborn.catplot.html)を用いて、変数の分布を棒グラフで可視化します。
```Python
sns.catplot(data=tips, kind="bar", x="time", y="tip")
```
![Unknown-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/d39caaca-126e-d8c5-e98c-7c47581c65d6.png)

tipは、LunchよりDinnerのほうが多い傾向があります。
total_billも見てみます。
```Python
sns.catplot(data=tips, kind="bar", x="time", y="total_bill")
```
![Unknown-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/6a6c7a44-dac3-d519-03d3-a6e823e2fcf1.png)

total_billも、LunchよりDinnerのほうが多い傾向があります。

### バイオリンプロット
kind="violin"に変更し、バイオリンプロットを作成します。
```Python
sns.catplot(data=tips, kind="violin", x="time", y="total_bill")
```
![Unknown-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/2136bed2-3fdd-2d3d-a716-f14e03afe085.png)

## seaborn.jointplot
[seaborn.jointplot](https://seaborn.pydata.org/generated/seaborn.jointplot.html)を用いて、散布図とヒストグラムを可視化します。
```Python
sns.jointplot(data=tips, x="total_bill", y="tip")
```
![Unknown-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/1d5b4aea-9e6d-739c-2005-75a327d69415.png)

seabornを用いて、1つのデータセットから様々なグラフを作成できることがわかりました。
勉強を続けて、自由自在にグラフを作成できるようになりたいです。

# 参考文献
https://seaborn.pydata.org/index.html
https://note.nkmk.me/python-matplotlib-seaborn-basic/
https://qiita.com/s-yonekura/items/dc16ef05aec78322367e