Python:seabornで可視化

Explanatory Data Analysis（略してEDA）：探索的データ解析
正直、Pythonには便利なライブラリがたくさんあるため、つい軽視してましたが、
#### やはり分布は大事
最近そう思うことが多々ありました。

そこでPythonのヴィジュアライゼーションライブラリのseabornを自分用に簡単に纏めてみます。
データセットはTitanic。簡単なデータ前処理を行って早速、データの可視化を進めてまいりましょう。

参考↓↓

[Python: seaborn を使った可視化を試してみる]
(https://blog.amedama.jp/entry/seaborn-plot)
[Seabornの全メソッドを解説（その１：グラフ一覧）]
(https://own-search-and-study.xyz/2017/05/02/seaborn%E3%81%AE%E5%85%A8%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%A7%A3%E8%AA%AC%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%91%EF%BC%9A%E3%82%B0%E3%83%A9%E3%83%95%E4%B8%80%E8%A6%A7%EF%BC%89/)
[seabornの細かい見た目調整をあきらめない]
(https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae)

# import
```python
#matplotlibはpltで読み込むことが多く、seabornはsnsで読み込むことが多いです
import seaborn as sns
import matplotlib.pyplot as plt
#下記によりグラフ内文字の日本語が正常に表示されます。
import japanize_matplotlib
```



# Relational Plot
## Scatterplot(散布図)
sns.scatterplotで散布図を描画することが可能です。
オプションとしてhue=色分け、style=プロットの形変える size=プロットの大きさ変えることができます

```python
#下記で表示グラフのサイズ調整が出来ます
plt.figure(figsize=(20, 10))
sns.scatterplot(data=train_x, x="Age" ,y="Fare",hue="Sex",style="Sex",size="Pclass")
```
![スクリーンショット 2020-01-29 8.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/aacd489d-5849-8898-bff0-7b3ee9505a42.png)



年齢と運賃にはあまり相関はなさそう。
↓試しに相関を表示したらやはり全くない↓

```python
res = train_x["Age"].corr(train_x["Fare"])
print(res)
0.09668842218036484
```

## lineplot(折れ線グラフ)

```python
#下記でサイズの調整が可能。
plt.figure(figsize=(30,5))
sns.lineplot(data=line_plot_test[line_plot_test["month"]=="February"],x="year",y="passengers")
```
![スクリーンショット 2020-01-29 8.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/a98a5e43-81bf-15bc-5bca-07cad0f3252f.png)

```python
#replotを使うことで、複数の折れ線グラフを表示することができます
sns.relplot(data=line_plot_test,kind="line",x="year",y="passengers",col="month",col_wrap=5)
```
![スクリーンショット 2020-01-31 18.30.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/8383ff8b-e6eb-6c5b-cc5a-9dd42d144410.png)

# Categorical Plot
## Scatterplot(ストリップチャート)

```python
sns.stripplot(data=titanic,x="pclass",y="age",hue="sex",dodge=True)
```
![スクリーンショット 2020-02-01 17.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/f7af17cf-e68f-b646-5958-c7d67ed4c951.png)

↓dodge = Falseを選択するとcol毎に分枯れていたグラフが統一される↓

```python
sns.stripplot(data=titanic,x="pclass",y="age",hue="sex",dodge=False)
```
![スクリーンショット 2020-02-01 17.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/02bf93ea-cbf8-4978-77e9-2b18ac54f163.png)


↓catplotでオプションcolを指定すると複数のグラフに分けることができる↓

```python

sns.catplot(data=titanic,kind="strip",x="pclass",y="age",hue="sex",col="survived",dodge=True)
```

![スクリーンショット 2020-02-01 17.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/d57feaf1-8dc3-a85e-fc28-ee7ad7e9faa7.png)

## Swarmplot(スワムチャート)

ストリップチャートは要素が重なっていたけど、重なりを除外したものがこちら。 swarmplot() 関数を使うことで描画できる。

```python
sns.swarmplot(data=titanic,x="pclass",y="age")
```

![スクリーンショット 2020-02-02 13.22.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/d699ffc3-3ae8-c501-e769-9d142a5a4fbd.png)

## Boxplot(箱ひげ図)

```python
sns.boxplot(data=titanic,x="pclass",y="age")
```
![スクリーンショット 2020-02-02 13.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/79476fdb-e0ba-f621-4898-76782fc8eb11.png)’’

```python
#stripchartと同様、catplotを利用するが(kind="box")を指定する
sns.catplot(data=titanic,kind="box",x="pclass",y="age",hue="survived",col="sex")
```
![スクリーンショット 2020-02-03 6.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/f50c9067-7977-c82f-4fec-8e974943aa72.png)

## violinplot(バイオリン図)

```python
#"inner"を指定すると内部を編集できる
sns.violinplot(data=titanic,x="pclass",y="age",inner="stick")
```
![スクリーンショット 2020-02-03 7.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/5bd8978a-49ee-afab-1f66-4e32fcf2d41b.png)

```python
#グラフを重ね合わせることも可能
ax=sns.violinplot(data=titanic,x="pclass",y="age",inner="stick")
sns.stripplot(data=titanic,x="pclass",y="age",color="k",ax=ax)
```
![スクリーンショット 2020-02-03 7.06.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/228bcc5b-6c16-aea8-759c-72f670ddba0e.png)

```python
#hueを指定することでグラフの色を分けて表示することも可能
sns.violinplot(data=titanic,x="pclass",y="age",hue="survived",split=True)
```
![スクリーンショット 2020-02-03 7.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/d4ec56d9-9884-2cde-9a2c-dc40fca234f5.png)

```python
#複数表示する時は、同様にcatplotを利用
sns.catplot(data=titanic,x="pclass",y="age",kind="violin",hue="survived",col="sex",split=True)
```
![スクリーンショット 2020-02-03 7.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/e7df0624-15e5-5583-9cf9-4ef01555f0b3.png)

## boxen plot(箱ひげ図改良グラフ)
```python

sns.boxenplot(data=titanic,x="pclass",y="age",hue="survived")
```

![スクリーンショット 2020-02-04 8.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/b3f0925c-f989-bb41-734c-3ea1f573a5dc.png)

```python
#こちらもcatplotで複数グラフの表示が可能。kind="boxen"
sns.catplot(data=titanic,x="pclass",y="age",kind="boxen",col="sex")
```
## Point Plot
```python
#平均値と信頼区間だけの表示に絞られたシンプルなグラフ。
sns.pointplot(data=titanic,x="pclass",y="age",hue="sex")
```
![スクリーンショット 2020-02-05 20.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/6b17f947-3b10-e571-dbb9-2a65a62eea0c.png)

```python
#複数表示させる時はcatplotにして、kind=pointとする
sns.catplot(data=titanic,x="pclass",y="age",kind="point",hue="survived",col="sex",color="b")
```
![スクリーンショット 2020-02-05 20.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/9d56036c-e5e8-34de-2a70-b4228adb5a11.png)

## barplot(棒グラフ)
```python
sns.barplot(data=titanic,x="pclass",y="age",color="b",hue="sex")
```
ヒゲはブートストラップ信頼区間らしいのですが、いまいちよく分からないので調べます。
あと棒グラフの値は平均値を表しています。これもestimaterという引数で変更できそう。

![スクリーンショット 2020-02-06 18.55.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/c0d43d7d-92b6-b051-8d74-20a5785d782a.png)

```python
#複数グラフを描く時は、kind="bar"を指定する
sns.catplot(data=titanic,kind="bar",x="pclass",y="age",col="sex",hue="survived",color="b")
```
![スクリーンショット 2020-02-06 18.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/a1fbc543-73ce-30d4-d5a7-b34e6ed33823.png)

## countplot
```python
sns.countplot(data=titanic,x="pclass",hue="sex",color="b")
```
![スクリーンショット 2020-02-06 19.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/32108bc6-8a67-6ca9-4fa9-1550cd871cab.png)

```python
sns.countplot(data=titanic,y="pclass",hue="sex",color="b")
```
![スクリーンショット 2020-02-06 19.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/1345583e-6732-c68f-4b97-4083ab8a90c5.png)

```python
sns.catplot(data=titanic,kind="count",y="pclass",col="sex",hue="survived",color="b")
```
![スクリーンショット 2020-02-06 19.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/aaa70f38-5e47-cd85-aafa-398d7713bacc.png)

# Distribution Plot

## displot(ヒストグラム)
```python
iris = sns.load_dataset("iris")
iris.head()
#階級の数はbinsで指定できる
sns.distplot(iris.petal_length,bins=20)
#kdeオプションで確率密度関数を削除できる
sns.distplot(iris.petal_length,bins=20,kde=False)
#heightやaspectで大きさ調整
sns.distplot(iris.petal_length,,bins=10,height=5,aspect=2)
```
![スクリーンショット 2020-02-07 21.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/3657c4f5-9617-1fa5-53a4-76901aab2ac0.png)

## kdeplot
KDE (Kernel Density Estimation) はカーネル密度推定という。 分布から確率密度関数を推定するのに用いる。
確率密度関数についてはもっとよく勉強しますが、単純なヒストグラフを連続にしたイメージ?

```python

sns.kdeplot(iris.sepal_length)
```
![スクリーンショット 2020-02-07 21.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/c9dbace2-200f-e601-5d49-da35c4493c67.png)

```python
sns.kdeplot(iris.petal_length,iris.sepal_length,shade=True)
```
![スクリーンショット 2020-02-07 21.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/ac7af011-dc28-9cd7-2a61-648397e5b24a.png)

## rugplot
値の登場する位置に特化したグラフ。

```python
sns.rugplot(iris.petal_length)
```
![スクリーンショット 2020-02-08 15.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/88970fb0-683e-f7c6-755c-02cc802e21ba.png)

```python
#重ね合わせて使うと値の出現とその個数の関連性が見える?
ax = sns.distplot(iris.petal_length)
sns.rugplot(iris.petal_length,ax=ax)
```
![スクリーンショット 2020-02-08 15.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/1f9e9df8-0a24-e016-5289-30dc03d05ba6.png)

## joint plot
joint plot は二つのグラフの組み合わせ。 デフォルトでは散布図とヒストグラムが同時に見られる。

```python
sns.jointplot(data=iris,x="petal_length",y="petal_width")
```

![スクリーンショット 2020-02-09 10.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/c7dae481-4fda-d560-94df-4e7506ecbb76.png)

```python
#kind = "kde"を指定すると確率密度関数になります
sns.jointplot(data=iris,x="petal_length",y="petal_width",kind="kde")
```

![スクリーンショット 2020-02-09 10.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/05f244b7-a794-3a14-1877-8826eaa74122.png)

```python
#kind="hex"にすると特徴的なグラフになります
sns.jointplot(data=iris,x="petal_length",y="petal_width",kind="hex")
```
![スクリーンショット 2020-02-09 10.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/f99412e3-0c2a-168a-e088-0d0083d41104.png)

## parplot

```python
sns.pairplot(data=iris)
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/cdc85910-cc5c-5df1-8b96-9e8988358117.png)

表示する次元を絞る時はvarsオプションで指定

```python
sns.pairplot(data=iris,hue="species",vars=["petal_length","petal_width"])
```
![スクリーンショット 2020-02-11 0.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/40ba00c9-0d91-8d5a-b4bd-aa94dfbb6ae4.png)

kind="reg"を指定すると一次回帰直線も表示できる

```python
sns.pairplot(data=iris,kind="reg")
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/73ac3562-c3e8-fdc5-53f3-ff86ece9b208.png)

# Matrix Plot
## heat map

```python
#annot=Trueをつけることで実際の値を表示することも可能
sns.heatmap(data=iris.corr(),annot=True)
```
![スクリーンショット 2020-02-11 9.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172677/9f4f067e-338a-e43d-5eff-984f3b63d951.png)