「箱ひげ図」に「ひと味」加えて可視化する（boxen / swarm / violin)

## 概要
* [kaggleのtitanic](https://www.kaggle.com/c/titanic)のデータ可視化で思ったことのメモです。
  * 「乗船した港」毎に「乗客の年齢」分布をうまく可視化したい。
  * そういったときに、箱ひげ（seabornで言えばboxplot）を使うのがよくある手段
  * 一方で、**他の** 可視化手段を使うと「ひと味」加える事ができるので、まとめてみました。
* 今回は、[seaborn](https://seaborn.pydata.org/)の[箱ひげ図(boxplot)](https://seaborn.pydata.org/generated/seaborn.boxplot.html)の代替として下記あたりを検討してみたいと思います。
  * [boxenplot](https://seaborn.pydata.org/generated/seaborn.boxenplot.html)
  * [swarmplot](https://seaborn.pydata.org/generated/seaborn.swarmplot.html)
  * [violinplot](https://seaborn.pydata.org/generated/seaborn.violinplot.html)
* 誰かの役に立つと嬉しいですが、あくまでも作業メモ＆私見です。

## モチベーション
### 箱ひげ
* タイタニックで、乗船港毎の乗客の年齢はこんな感じ。（まずは、箱ひげ）
* 一応、下記程度は読み取れます。
 * どの港から乗ったとしても、年齢の中央値は25～30歳くらい
 * 中央値や第１、３分位値にも大きく差はない。（Queenstownがちょっと若め？）
 * Southamptonから乗った乗客に、外れ値（高齢の方のデータ）が目立つ![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/6c03f3ea-bd76-a621-d64d-ecd52849062e.png)

###Swarmplotにしてみると
* これをSwarmplotにしてみると、四分位値は見づらくなる代わりに、「ひと味」加わり良い感じ。
  * 系列毎のデータの**個数を意識**できるようになる。（実は、**Queenstownは少数**）
  * 箱やひげの意味を**知らない人**にも読みやすい
  * データの**密な部分、疎な部分**を読み取りやすい　　　![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a56c0cee-8ac2-8617-c574-9d5d3b07f237.png)

## 箱ひげに「ひと味」加える
### 関数やオプションを変えてみる
* 関数をかえる
  * [boxenplot](https://seaborn.pydata.org/generated/seaborn.boxenplot.html)、[swarmplot](https://seaborn.pydata.org/generated/seaborn.swarmplot.html)、[violinplot](https://seaborn.pydata.org/generated/seaborn.violinplot.html)
* オプションをかえる
  * hue、splitの指定

等々やると、「ひと味」加える事ができます
### まとめてみると（チートシート）
* boxenplotには、splitオプションが**ない**
* swarmplotとviolinplotでは、**splitオプション**の意味が、ちょっと違うので注意

|オプション|boxenplot|swarmplot|violinplot|
|:---:|:---:|:---:|:---:|
|指定無し|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/55216f28-1680-f2f0-cfa4-322b5381d583.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a56c0cee-8ac2-8617-c574-9d5d3b07f237.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/cf2a82c0-a937-b721-e120-9a4a76f3fc0c.png)|
|hue="Sex"|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/0b59ebc4-958e-0018-a650-541df888f519.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/788dfe64-eda4-e5e2-5b8c-99095c88ad9e.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/37693ca3-e5ca-125d-75aa-1265fda24769.png)|
|hue="Sex" <br> split=True |なし|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/480d00bc-9260-488e-f31a-5d7dbb3e8a3a.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/62609c74-4d78-992a-9bdb-86907b803442.png)|

## 「どれ」を「いつ」使うべきか？
* 「この用途では、これ！」と言い切るのは難しいのですが、、
* それぞれ比較してみると特性が見えてきます。

### 箱ひげ(boxplot) vs boxenplot
* アルファベット的にも2文字(en)しか変わらないのでそこまで差はありません
* **四分位**で見せたいか、もっと**細かい分位値**で見せたいか？ **外れ値** を意識させたいか？がポイント

|　|箱ひげ(boxplot)|boxenplot|
|:---:|:---|:---|
|表示|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/6c03f3ea-bd76-a621-d64d-ecd52849062e.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/55216f28-1680-f2f0-cfa4-322b5381d583.png)|
|特徴|**四分位**、最大、最小が分かる<br/>**外れ値の状況も見える**|より**細かい分位値**が見える<br/>外れ値として見えづらい|

### 箱ひげ(boxplot)  vs swarmplot
* 箱ひげに比べて、データの個々を意識し、**連続的**に捉えるswarmplot
* データの**個数、密度、差**も見えるようになるが、プロット**コストが高く**、大量データだと厳しい。

|　|箱ひげ(boxplot)|swarmplot|
|:---:|:---|:---|
|表示|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/6c03f3ea-bd76-a621-d64d-ecd52849062e.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a56c0cee-8ac2-8617-c574-9d5d3b07f237.png)|
|特徴|**区間(分位値)**として捉える<br>プロット**コストが低い**|**個々を意識**し連続的にデータを捉える<br>データ**個数や系列毎の差**も理解可<br>しかし、プロット**コストが高い**|

### swarmplot vs violinplot
* swarmplotのように、**連続的に**データを扱い、プロット**コストも抑えられる**のがviolinplot
* その代わり、データの個数や系列毎の差は**意識できなくなる。**

|　|swarmplot|violinplot|
|:---:|:---|:---|
|表示|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a56c0cee-8ac2-8617-c574-9d5d3b07f237.png)|![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/cf2a82c0-a937-b721-e120-9a4a76f3fc0c.png)|
|特徴|**個々を意識**し連続的にデータを捉える<br>データ**個数や系列毎の差**も理解可<br>しかし、プロット**コストが高い**|個々を意識せず、データの**個数が見えない**が、<br>全体傾向を連続的に理解可能<br>プロット**コストも抑える**事ができる。|

## まとめ
* 一長一短あり、用途に応じて選択すべきですが、まとめると下記といったところでしょうか。

|区間 vs 連続|「ひと味」の加え方|選ぶべき可視化手法は？|
|:---:|:---:|:---:|
|データを**区間<br>(分位)**で扱い、|**外れ値**も意識させたければ、| **[箱ひげ(boxplot)](https://seaborn.pydata.org/generated/seaborn.boxplot.html)** ![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/6c03f3ea-bd76-a621-d64d-ecd52849062e.png)|
||四分位より**細かい**表示では、|**[boxenplot](https://seaborn.pydata.org/generated/seaborn.boxenplot.html)**![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/55216f28-1680-f2f0-cfa4-322b5381d583.png)|
|データを**連続的に**扱い、|その**個数や密度**を見せたければ、|**[swarmplot](https://seaborn.pydata.org/generated/seaborn.swarmplot.html)**![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/a56c0cee-8ac2-8617-c574-9d5d3b07f237.png)|
||プロットコストを抑えて<br>**全体傾向**を見せたければ、|**[violinplot](https://seaborn.pydata.org/generated/seaborn.violinplot.html)**![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/cf2a82c0-a937-b721-e120-9a4a76f3fc0c.png)|