Pythonで幾つかある可視化ツールを試してみた〜入門として〜

<img width="2" alt="スクリーンショット 2016-12-15 16.22.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/abed1e02-ce0d-2401-c0de-6f062ed2e0de.png">
本記事は[WACUL Advent Calendar 2016](http://qiita.com/advent-calendar/2016/wacul)の12/15の記事になります。


Pythonで解析した内容を可視化するにあたって様々な可視化ツールがありまして、入門として色々触ってみました。



入門的な内容なので、Pythonでデータ分析を始めたい人はもちろん、そもそもこれからPythonを始めたい方や、新人プログラマなど参考になれば幸いです。



#本記事の対象者
・Pythonの初心者、これからPythonを始めたい方
・Pythonの可視化ツールっていろいろあるけど、結局どれを使っていいのかわからない人
・Pythonでデータサイエンスに入門したい方
など

なお、以下のサイトをベースにして作りました。以下にもっといろいろな方法でPythonの可視化ツールを比べているので、興味のある方は是非参考にしてください。
[https://dansaber.wordpress.com/2016/10/02/a-dramatic-tour-through-pythons-data-visualization-landscape-including-ggplot-and-altair/](https://dansaber.wordpress.com/2016/10/02/a-dramatic-tour-through-pythons-data-visualization-landscape-including-ggplot-and-altair/)



#序章と環境作り

##簡単な用語説明
以下の用語はPythonを知らない人は当然知らないことなので、さっと解説をします。（用語を抑えるのが習得する近道だと思います。）

####Python3
2008年に公開されたバージョンで、その前のpython2の機能で使えなくなった機能があるために、2か3であるかは区別されることが多いです。python2は2020年ごろサポートが終了するために、これから始める方はPython3を使いましょう。


####pip
pythonのパッケージ管理ツールです。pythonは簡単にデータ分析を実行できるツールが多いですが、これらのツールをを用いてパッケージをインストールします。


####Jupyter notebook
今一番流行っている（？）、エディターです。従来のエディターは書いたものをまとめて実行するタイプがのものが多かったのでしたが、こちらのエディターは、その都度実行して結果を確認することができます。かっこよく言えば、インタラクティブに実行できるエディターなのです。

インストール方法は

```
$ pip install jupyter
```

インストール後にコマンドラインから

```
$ jupyter notebook
```

で起動できます。



####Anaconda
pipで必要なパッケージをインストールするのですが、いちいちインストールするのが面倒なので、統計解析で必要なものをまとめたものがAnacondaです。よくわからないけど、とりあえずインストールしていただければ、データ分析のコンペに出るような、すごい方々と同様の武器が手に入ったと言えます（笑）




今回の記事では以下のツールを使って、
可視化してみました。
・matplotlib
・seaborn
・ggplot
・Altair

以下に、簡単な概要とインストールのコマンドを書きますが、詳しいpythonの環境作りなどは以下のサイトを参考にしてください。

[http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c)


##matplotlibとは
matplotlibとは[http://yubais.net/doc/matplotlib/](http://yubais.net/doc/matplotlib/)によると

```
Python でグラフ描くツールの定番です。 Gnuplot と比較すると
・データ解析からグラフ描写までを全て1個のpythonスクリプトで行える
・やたら色々なグラフが描写できる (参照: [http://matplotlib.org/gallery.html](http://matplotlib.org/gallery.html))
・Pythonの高度な数値計算ツール NumPy と連携できる
などの利点があります。
```
※NumPyとはざっくり言うと、行列を高速で計算できるツールです。

matplotlib は、Pythonで一番スタンダードな可視化ツールでありますが、以下で紹介するツールと比べて、コードが冗長になりやすくなります。

pipでのインストールは

```
$ pip install matplotlib
```

上記の参考URL以外にも詳しい使い方は
[http://bicycle1885.hatenablog.com/entry/2014/02/14/023734](http://bicycle1885.hatenablog.com/entry/2014/02/14/023734)
（というか個人的にmatplotlibについて一番わかりやすかった記事）

##seabornとは


matplotlibをベースにしていて、美しいグラフを簡単に書くことができます。


インストールはpipで、

```
$ pip install seaborn
```


##ggplotとは

ggplotはRで一般的に使われている、ggplot2をPython用に移植したものです。

Rは、一般的な分析に対しても、少ないコード量でかけることが利点で、グラフに関してもggplotで綺麗なグラフを簡単に書くことができます。

インストールは

```
$ pip install ggplot
```


##Altairとは
最近出てきた可視化ツールで、多分この中で、一番簡単に描画することができると思います。


[vega-lite](https://vega.github.io/vega-lite/docs/)というツールと合わせてJSON形式や辞書型として値を表現することもできます。
インストールはAltairと合わせて

Anacondaが入っている場合は（こちらが推奨されています）、

```
$ conda install vega --channel conda-forge

```


一般的な方法は、

```
$ pip install altair
$ pip install --upgrade notebook
$ jupyter nbextension install --sys-prefix --py vega
```


#簡単なグラフを描画してみた

まずは今回のグラフ描画に必要なパッケージをインポート（呼び出すということ）します。


```
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager
import seaborn as sns

#Altair
from altair import *

#ggplot
from ggplot import *

#%matplotlib inlineでこのnotebook内に画像を埋め込む
%matplotlib inline

```
Jupyter notebookを使っていれば、上記を入力して[shift]+[enter]で実行し、以後宣言しなくて使えるようになります。


サンプルデータとしてAltairのチュートリアルにあったcarsというデータを使います。

```
cars = load_dataset('cars')
```


このデータは各車の、詳細な情報（原産国(Origin)、燃費(Miles_per_Gallon)、排気量(Displacement)、馬力(Horsepower)など）を表しています。



※ちなみに1 Miles per Gallon (MPGと表現する) = 0.42518[km/L]のようです。

こちらのデータを使って幾つかのツールを使いました。








#matplotlib


縦軸に燃費(Miles_per_Gallon)、横軸に馬力(Horsepower)のグラフを書いていきます。

```
#matplotlib

plt.plot(cars['Horsepower'], cars['Miles_per_Gallon'],"o")
plt.xlabel("Horsepower")
plt.ylabel("Miles_per_Gallon")

```

<img width="400" alt="スクリーンショット 2016-12-15 17.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/469f00be-b4e8-7ce0-2284-7bd764cde9de.png">



馬力が高い車は燃費が悪いことがグラフから見ることができます。



#seaborn

```
sns.jointplot(cars["Horsepower"], cars["Miles_per_Gallon"])
```

<img width="400" alt="スクリーンショット 2016-12-15 17.09.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/30ea67a2-c16a-b6cd-2da9-2f9074639dfd.png">


各軸の分布も表してくれます。






#ggplot

```
ggplot(cars, aes(x='Horsepower',y='Miles_per_Gallon' ))+ geom_point(size=20.0) 
```

<img width="400" alt="スクリーンショット 2016-12-15 17.32.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/8f8abc26-a93d-f406-9059-78b9c20765a6.png">




#Altair

```
Chart(cars).mark_point().encode(x='Horsepower',y='Miles_per_Gallon')
```

<img width="400" alt="スクリーンショット 2016-12-15 0.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/38582b43-386e-8154-2ede-3a917e4be23f.png">



#もう少し難しいグラフは
前回のグラフだとほとんど差はありませんでしたが、原産国別にグラフを書いてみます。


##matplotlib




```
names = set(cars['Origin'])

x,y = cars['Horsepower'],  cars['Miles_per_Gallon']

for name in names:
    cond = cars['Origin'] == name
    plt.plot(x[cond], y[cond], linestyle='none', marker='o', label=name)
    
plt.xlabel("Horsepower")
plt.ylabel("Miles_per_Gallon")
plt.legend(numpoints=1)
plt.show()
```
[http://stackoverflow.com/questions/9740806/pylab-map-labels-to-colors](#http://stackoverflow.com/questions/9740806/pylab-map-labels-to-colors)

<img width="400" alt="スクリーンショット 2016-12-15 0.31.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/2480244c-8417-e799-4a86-25d5d802e5b9.png">



大したことやっていないのに長い（笑）
namesという配列に['Japan', 'USA', 'Europe']という文字列が入っていて、それらをforで一つ一つわたして、可視化しているイメージ。以下のを見ていただければわかりますが、こういう図を描きたかったらmatplotlibで書いちゃダメだと思います。（笑）



##seaborn


```
# seaborn
g = sns.FacetGrid(cars, hue='Origin', size=5)
g.map(plt.scatter, 'Horsepower', 'Miles_per_Gallon').add_legend()
```

<img width="400" alt="スクリーンショット 2016-12-15 0.33.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/fe7d8b6c-f722-047d-3422-e58c1fa07fad.png">


アメリカ産の車は馬力があって燃費が悪い、一方で、日本産のは馬力はないが、燃費がいいということがわかります。


##ggplot


```
#ggplot
ggplot(cars, aes(x='Horsepower', 
                 y='Miles_per_Gallon',
                 color='Origin')) + \
                 geom_point(size=40.0)
```


![Payload Too Large]()

画像のアップできる上限を超えてしまった。（初投稿なのですみません）各自やってみてください（笑）


##Altair

```
#Altair
Chart(cars).mark_point().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin'
)
```
<img width="400" alt="スクリーンショット 2016-12-15 0.33.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/125299/6ea7a5a4-6150-e8d2-635a-56c3caf7c712.png">


また、Jupyter上で

```
Chart(cars).mark_point().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin'
).to_dict()
```

で辞書型で表現できます。




#結論として


まだまだ、紹介したいことはありましたが、初めての投稿なので、何も考えず画像アップしまくっていたら上限2MBを超えてしまった.....。きりがいいので紹介はこの辺にして。（Qiita、一度投稿すれば上限100MBになるらしい！！）

その他、各種ツールに興味のある人は、チュートリアルや、Qiitaの記事など参考にしてください。

結局のところ、いろいろ比べてみて,

・Pythonで難しい分析などガンガンやりたいのであれば、matplotlibの進化系と言えるseabornを！（無駄におしゃれでハイテク!!）


・以前、Rでggplot2を使っていた方で、新しい概念覚えるのが面倒な方は、Python用のggplotを！


・とにかく簡単に可視化したい面倒くさがり屋の人や、最新のツールに興味がある人はAltairを！

てな感じですかね。



#最後に

以上、Pythonの可視化ツールについて紹介しました。どのツールも散布図だけではなく、その他ヒストグラムなど様々なグラフも自由自在に書くことがでます。

Pythonはコーディングがしやすいにもかかわらず、ライブラリーの豊富さからデータ分析、深層学習などを始めとするデータサイエンス界隈で強烈な印象を残しております。

しかし可視化ツールにについて私自身、最もスタンダードなmatplotlibという存在と、それを補助する形のseabornがごちゃまぜになっていて、可視化するにあたり、Rなどと比べて、ややめんどくさい印象がありました。本記事でそれぞれのツールの利便性や立ち位置やわかったと思います。