[python] seaborn を使ってサクッとデータの視覚化

# はじめに
データサイエンスにおいて、データの可視化は非常に重要です。価値あるデータが揃っていても、それを正しく、**わかりやすく可視化**できなければ意味がありません。
可視化で使用するツールはたくさんありますが、今回は、`searborn`ライブラリの`pairplot`を利用した例を示します。 `pairplot`を使用すると、単一変数の分布と2つの変数間の関係を同時に確認することができます。 

## データの準備
[Gapminder](https://www.gapminder.org/)の国別社会経済データを利用します。
csv_fileとして、GitHubに置いてます。=> [gapminder.csv](https://github.com/saira1920/data_set)

*Jupyter Notebook*を開いて、pandasデータフレームとしてデータを読み込みます。

```python:@JupyterNotebook
import numpy as np
import pandas as pd

# csvデータの読み出し
df = pd.read_csv('gapminder.csv')
# column名を編集
df.columns = ['country', 'continent', 'year', 'life_exp', 'pop', 'gdp_per_cap']

# 上位5行を表示
df.head()
```
<img width="500" alt="Screen Shot 2019-03-13 at 1.12.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/330669/b498c82d-a567-bbfb-87bf-9ffcf8ad7cfd.png">
### データの説明
データの各行は1年間の1つの国の各種観測値を表しています。
2つのカテゴリ列（countryとcontinent）と、4つの数値列があります。

■ column名
1. *country* : 国名
2. *continent* : 大陸  (Asia, Europe,,,)
3. *year* : 1952年から2007年  (5年ステップ）
4. *life_exp* : 出生児平均寿命
5. *pop* : 人口
6. *gdp_per_cap* : 国民1人あたりの$ベースGDP


## pairplot の作成
デフォルトの pairplot は数値列のみを使用するので、今回の場合だと、year, life_exp, pop, gdp_per_cap が使用されます。

```python:@JupyterNotebook
# matplotlib と seaborn をインポート
import matplotlib
import seaborn as sns

# 出力されるグラフのフォントサイズをカスタマイズ
matplotlib.rcParams['font.size'] = 5
sns.set_context('talk', font_scale=0.9);

# pairplot図を出力
sns.pairplot(df, diag_kind='hist');
```
![download.png](https://qiita-image-store.s3.amazonaws.com/0/330669/919f1445-5a56-27d4-5183-b1b4c04c37f5.png)
たった1行のコードで、上のグラフが得られます。
pairplot では、対角線上に単一変数の分布のヒストグラムを、それら以外の図は2つの変数間の関係を示した散布図を表示します。たとえば、2行目の一番左のプロットは、life_exp（平均寿命）とyear（年）の散布図を示しています。

このグラフからも、すでに考察することができます。
上から2行目の一番右のプロットから、平均余命と1人当たりのgdpは、正の相関関係にあることがわかります（高所得国の人々は長生きする傾向があると推察できる）。
また、同じ行の一番左のプロットから、世界中の平均寿命は年々伸びていることもわかります。


## データ編集

上記の pairplot図では、popとgdpのグラフが大きく左に偏っています。
このような場合は、軸を対数表示にすることで、直感的なグラフにすることができます。

```python:@JupyterNotebook
df['log_pop'] = np.log10(df['pop'])
df['log_gdp_per_cap'] = np.log10(df['gdp_per_cap'])

# 元の'pop'と'gdp_per_cap'列を削除
df = df.drop(columns = ['pop', 'gdp_per_cap'])
```

さらにグラフを色分けすることで、さらに深い考察へ向かいます。今回は各大陸ごとに色分けしてみると良さそうです。seaborn では、簡単に実行できます。

```python:@JupyerNotebook
sns.pairplot(df, hue='continent', diag_kind='hist');
```
![download-1.png](https://qiita-image-store.s3.amazonaws.com/0/330669/76ebecf5-11d5-e69a-88ce-46513bd65271.png)
非常にわかりやすいグラフになってきました。
このグラフからは、オセアニアとヨーロッパの平均寿命が最も長く、アジアの人口が最も多いのがわかります。また、popとgdpを対数表示にしたことで、より比較が容易なグラフとなっています。

さらに手を加えていきます。
ヒストグラム図において、大陸ごとのデータが重なっていてわかりにくいので、密度プロット(KDE)を利用します。また、より視覚性を上げるために、点の透明度、サイズ、およびエッジカラー等のパラメータを追加します。

```python:JupyterNotebook
matplotlib.rcParams['font.size'] = 5
sns.set_context('talk', font_scale=1.2);

sns.pairplot(df, hue = 'continent', diag_kind = 'kde',
             plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
             height = 4);
```

![download-2.png](https://qiita-image-store.s3.amazonaws.com/0/330669/42e6ef0f-76c2-7906-218d-aabdd6de1b84.png)
対角線上の密度プロット(KDE)に変更することで、大陸間の分布比較がしやすくなりました。

最後に、2000年以降の年のみのデータをプロットしてみます。また、大陸ごとに色分けしますが、年はプロットしません。 プロットされる列を指定するためには、varsリストをパラメータとして渡します。

```python:@JupyterNotebook
sns.pairplot(df[df['year'] >= 2000], 
             vars = ['life_exp', 'log_pop', 'log_gdp_per_cap'],
             hue = 'continent', diag_kind = 'kde',
             plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
             height = 4);
```
![download-3.png](https://qiita-image-store.s3.amazonaws.com/0/330669/490916c5-e552-1645-7c14-319ff77dfec8.png)
非常にわかりやすくなりました。もしここからモデリングを進める場合、これらのプロットからどのモデルを使用すれば良いかが容易に判断できます。 たとえば、log_gdp_per_capはlife_expと正の相関があることがわかっているので、この関係を定量化するための線形モデルを作成していくことで考察を進めていくことができそうです。 


# まとめ

データ分析プロジェクトでは、多くの場合、価値の大部分は派手な機械学習ではなく、データの直接的な視覚化にあります。`seaborn`ライブラリの `pairplot`は、**データセット内の分布と関係をすばやく調べるための強力なツール**であることがわかりました。