【Python】seabornでのグラフの書き方まとめ

# はじめに
Kaggleの[Courses](https://www.kaggle.com/learn)にて、`seaborn`を使ったデータの可視化について学びました。[Data Visualization](https://www.kaggle.com/learn/data-visualization)
復習と後から確認できるように各グラフの使い方を一覧にまとめます。

# ライブラリのimport


```python
import pandas as pd
# pandas+Matplotlibでdatetime型のデータを扱う場合、以下を実行しないと警告が出る。
# 扱うデータにdatetimeが無いのであればいらない。
pd.plotting.register_matplotlib_converters()
# notebook上で出力行にグラフを表示するためのおまじない。
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
```

#  折れ線グラフ（Line Chart）
折線グラフは`lineplot()`にて定義します。引数`data`に表示対象のデータを指定します。
列指定することで、その列だけをプロットして表示可能です。


```python
# データを読み込みします。
# 使用するデータ：https://www.kaggle.com/varpit94/dogecoin-data
# 大きすぎるので最初の10行だけ。
coin_data = pd.read_csv("./DOGE-USD.csv", index_col="Date")[:10]

# グラフ描画時のサイズを指定します。
plt.figure(figsize=(10,6))

# 折線グラフを描画
# 今回の例では"Volume"列を対象に先頭10行だけを表示しています。
sns.lineplot(data=coin_data["Volume"])
```
   
![output_4_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/d63c6a08-ce94-b82e-5ff7-2508a5828a54.png)



```python
# 2列以上表示したい場合の例
plt.figure(figsize=(10,6))

sns.lineplot(data=coin_data["Open"])
sns.lineplot(data=coin_data["High"])
```
![output_5_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/2e36528f-e709-337a-3d4f-67b94dbe4b38.png)
  

# 棒グラフ（Bar Chart）
棒グラフは`barplot()`を使用します。
`x`にx軸となる列のデータを、`y`にy軸になる列のデータを指定します。


```python
# グラフ描画時のサイズを指定します。
plt.figure(figsize=(10,6))

sns.barplot(x=coin_data.index, y=coin_data.Volume)
```

![output_7_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/04539e45-1230-c920-87b9-25466340d48d.png)
    


# ヒートマップ（Heatmap）
ヒートマップの表示には`heatmap()`を使用します。
引数`data`に対象のデータを指定します。
引数`annot`に`True`を指定したとき、マップ上に数値を表示します。


```python
plt.figure(figsize=(10,6))

# ヒートマップ
sns.heatmap(data=coin_data, annot=True)
```

![output_9_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/404ac6e1-4203-49cc-ba30-aa876b8a7a4d.png)


# 散布図（Scatter Plot）
散布図は`scatterplot()`を使用します。
X軸には`x`、Y軸には`y`の各引数にデータを指定します。


```python
# データを変えます。
# 使用するデータ：https://www.kaggle.com/adityakadiwal/water-potability
water_data = pd.read_csv('./water_potability.csv')

plt.figure(figsize=(10, 6))
sns.scatterplot(x=water_data['ph'], y=water_data['Hardness'])
```

![output_11_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/3efb0ac6-a86f-1215-aab6-bc9c5aac1411.png)


回帰直線を表示したい場合、`regplot()`を使用します。


```python
plt.figure(figsize=(10, 6))
sns.regplot(x=water_data['ph'], y=water_data['Hardness'])
```

![output_13_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/3d67fc48-764a-9628-9897-3a0859987e28.png)


引数`hue`に別変数を指定することで、色によるプロットができます。


```python
sns.scatterplot(x=water_data['ph'], y=water_data['Hardness'], hue=water_data['Potability'])
```

![output_15_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/c4f8451e-6242-f343-dce1-4c3d7701d4bd.png)


回帰線を表示したい場合、`lmplot()`という関数も使用できます。
引数について、先の`scatterplot()`と異なり`data`に対象のデータを指定します。
また、`x`、`y`、`hue`には列名を指定します。


```python
sns.lmplot(x='ph', y='Hardness', hue='Potability', data=water_data)
```

![output_17_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/a9bd9236-c7dd-4009-7b91-e7b9dceb77c7.png)
    


また、`swarmplot()`を使用することで`カテゴリカル散布図`を図示できます。


```python
sns.swarmplot(x=water_data['Potability'],
              y=water_data['Hardness'])
```

![output_19_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/388b77bb-78e5-e286-7189-a7d6ce5c9b4d.png)


# ヒストグラム（Histogram）
ヒストグラムを表示する際は`distplot()`を使用します。
引数`a`に対象のデータを指定します。
`kde`はカーネル密度推定のプロットを表示させるかどうかの設定になります。


```python
sns.distplot(a=water_data['ph'], kde=False)
```

![output_21_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/9a7e175b-a261-7919-e4ee-f2e7f76ec6a0.png)




```python
# kde=Trueの場合
sns.distplot(a=water_data['ph'], kde=True)
```

![output_22_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/0ac1d016-124b-1f1a-b781-8a5e2b33b6eb.png)


# 密度プロット（Density plot）
カーネル密度推定プロット（KDE）を作成するには`kdeplot()`を使用します。
引数`data`に対象のデータを指定します。
`shade`はプロットした線の下部分を色塗りするかどうかの設定です。


```python
sns.kdeplot(data=water_data['ph'], shade=True)
```

![output_24_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/057e03c9-c508-6c3b-cd81-e1deb85f5fb8.png)

    


# 2次元のKDEプロット
2次元でのKDEプロットもできます。
引数`x`にX軸となるデータ、`y`にY軸となるデータを指定します。


```python
# 2次元でも書ける
sns.kdeplot(x=water_data['ph'], y=water_data["Hardness"])
```

![output_26_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83511/359cbff2-ab1a-1d8c-956f-4ab1e205c302.png)


# 各グラフの用途
データを可視化する際、見たい物によって使用するグラフが決まります。
引用元：[Choosing Plot Types and Custom Styles](https://www.kaggle.com/alexisbcook/choosing-plot-types-and-custom-styles)

- **傾向** - 変化の傾向を見たい時。
  - `sns.lineplot` - 折れ線グラフは一定期間の傾向を表示することに適している。
- **関係** - データ内の変数間の関係を理解するために使用できる、さまざまな種類のチャートがあります。
  - `sns.barplot` - 棒グラフは、異なるグループに対応する量を比較するのに便利です。
  - `sns.heatmap` - ヒートマップは、数値の表に色分けされたパターンを見つけるのに使用できます。
  - `sns.scatterplot` - 散布図は、2つの連続変数の関係を示します。色分けされていれば、3つ目のカテゴリー変数との関係も示すことができます。
  - `sns.regplot` - 回帰線を散布図に含めることで、2つの変数間の線形関係を簡単に見ることができます。
  - `sns.lmplot` - このコマンドは、散布図に色分けされた複数のグループが含まれている場合、重回帰線を描くのに便利です。
  - `sns.swarmplot` - カテゴリー散布図は、連続変数とカテゴリー変数の関係を表示します。
- **分布** - 分布を視覚化して、変数に見られる可能性のある値と、その可能性を示します。
  - `sns.distplot` - ヒストグラムは、1つの数値変数の分布を表示します。
  - `sns.kdeplot` - KDEプロット(または2D KDEプロット)は、1つの数値変数(または2つの数値変数)の推定された滑らかな分布を表示します。

# 参考
- [Data Visualization](https://www.kaggle.com/learn/data-visualization)
- [時系列データをMatplotlibで描画する](https://intothelambda.com/blog/plot-chronological-data-with-matplotlib/)