Rubyでシュッとグラフを書く with Jupyter notebook

# Jupyter notebookとは？

一言で言うと、ブラウザで動く超便利なREPLです。
もともとJupyter notebookはPython用のプロジェクトだったのですが[^1][^2]、近頃はRubyも使えるようになっています。
本記事では、Jupyter notebook上でRubyを使い、グラフを書く方法を解説します。

# 環境構築

下記はMacを想定しています。
まずJupyterを導入して、次にIRubyを導入します。

それ以外の環境の方はこちら：
- [Bash on Windows (Creators Update以降)](https://github.com/sciruby-jp/ruby-datascience-examples#bash-on-windows-creators-update以降-もしくは-ubuntu-linux-1604-での試用方法)
- [Ubuntu Linux 16.04](https://github.com/sciruby-jp/ruby-datascience-examples#bash-on-windows-creators-update以降-もしくは-ubuntu-linux-1604-での試用方法)
- [Docker](Dockerが使える環境であれば https://github.com/sciruby-jp/iruby-notebook#docker-での試用方法)

## Jupyterの導入

`pip` を使う方法と `Anaconda` を使う方法があります。ここでは `pip` を使います。

```shell-session
$ brew install python3
$ sudo -H pip3 install jupyter
$ jupyter notebook
```

これでJupyterが立ち上がり、ブラウザで`http://localhost:8888`が開きます。

## IRubyの導入

このままだとPythonしか使えないので、Jupyter上でRubyが使えるようにします。
一旦ターミナルで`Ctrl-c`してjupyterを終了してください。

IRuby kernelをインストールし、設定します：

```shell-session
$ brew install zeromq --HEAD
$ brew install czmq --HEAD
$ gem install cztop iruby
$ iruby register --force
$ jupyter notebook
```

これで、先程と同様に`http://localhost:8888`がブラウザで開きます。
`New ▼`から**Ruby**が選べるようになりました :clap:

# グラフを書く

さっそくJupyterを使ってみましょう。
以下の内容は[nbviewer](http://nbviewer.jupyter.org/gist/genya0407/02d4562ed3c20236d0692c6637211a66)に上げてるので、そちらも参考にしてください。

## rbplotly

`rbplotly`というgemを導入します。Jupyter上でグラフを書くgemです。

```shell-session
$ gem install rbplotly
```

`New ▼` からRubyのNotebookを開いて以下の内容をセルに入力し、実行（`Shift+Enter` or `Command+Enter`）します。

```ruby
require 'rbplotly'

trace1 = { x: [1,2,3,4,5,6], y: [100,200,300,400,500,600] }
trace2 = { x: [1,2,3,4,5,6], y: [600,500,400,300,200,100] }
traces = [trace1, trace2]
pl = Plotly::Plot.new(data: traces)
pl.show
```

これで、グラフが表示されます。[^3]

![newplot(18).png](https://qiita-image-store.s3.amazonaws.com/0/19349/2fccbebe-a8b4-4304-44b3-ff4c7bdb67e1.png)


これはただの折れ線グラフですが、棒グラフや円グラフ、ヒストグラム、ヒートマップなども書けます。[^4]

## daru + daru-plotly

次に、csvからデータを読み込み、それをグラフにしてみましょう。

### gemの導入

`daru`と`daru-plotly`を導入します。

```shell-session
$ gem install daru daru-plotly
```

そして、notebook上部の`Kernel > Restart & Run All`を実行しましょう。これで、新しくインストールしたgemがnotebookで使えるようになります。

### csvを読み込む

ここでは、例として[会津若松市の年齢別人口](http://www.data4citizen.jp/app/developer/app/GOvqzzYEoS/html/index.html)のcsvを使います。

notebookに新しくセルを作成し、以下のように入力&実行します。
新しいセルを作成するには、一度`Esc`でセルからフォーカスを外した後`b`を入力すれば良いです。

```ruby
require 'daru'

df = Daru::DataFrame.from_csv('./O_TUKIBETSU_NENREI.csv')
```

![スクリーンショット 2017-10-31 11.41.02.png](https://qiita-image-store.s3.amazonaws.com/0/19349/3e19fa55-243a-3e69-0460-5743b17fef79.png)

このように、csvファイルの内容が表示されたと思います。

### グラフを描く

このデータフレームから、横軸が`age`、縦軸が`total_count`のグラフを作成しましょう。
新しいセルを作成し、以下のように入力して実行します：

```ruby
require 'daru/plotly'
include Daru::Plotly::Methods # plotメソッドが使えるようになる

plot(df, x: 'age', y: 'total_count').show
```

![newplot(19).png](https://qiita-image-store.s3.amazonaws.com/0/19349/3b8d442f-c298-6b62-b299-0a48cc7a106a.png)

このように、`x`と`y`に`df`の列名を指定することで、それらをグラフに起こすことができます。

次に、男女別の人口を見てみましょう。新しいセルを作って、以下のように入力して実行します：

```ruby
plot(df, x: 'age', y: ['total_count', 'male', 'female']).show
```

このように、`y`には列名の`Array`を指定することもできます。

![newplot(20).png](https://qiita-image-store.s3.amazonaws.com/0/19349/452de453-20c2-caa0-d922-a5b2e90ba3dc.png)

# notebookを公開する

作成したnotebookは簡単に公開できます。

## githubやgistで公開する

githubはJupyter notebookに対応しています。
レポジトリを作ってpushすることもできますが、多くの場合はgistで事足りると思います。

notebookは `Ctrl+s` で保存することができます。保存したnotebookをgistにアップロードすれば、ブラウザ上で閲覧することができます。

```shell-session
$ gem install gist
$ gist hoge.ipynb
https://gist.github.com/84cd6fe6a1bb57cc88a0fb3b3a88fb3b
```

ただし、githubやgistで公開されているnotebookを閲覧する場合、JavaScriptが実行されないためグラフが全く表示されません :point_down: 

![スクリーンショット 2017-10-31 12.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/19349/2567f7c7-d21e-52a8-61df-7626ee3c766a.png)


そのため、後述のnbviewerを利用します。

## nbviewer

[nbviewer](http://nbviewer.jupyter.org/)というのは、インターネット上で公開されてるnotebookをいい感じに表示してくれるやつです。
ここにnotebookのgistのURLを入力すると、ちゃんとグラフを表示してくれます :point_down: 

![スクリーンショット 2017-10-31 12.05.34.png](https://qiita-image-store.s3.amazonaws.com/0/19349/1a57eac2-2671-c62e-7ba2-6e601772dabf.png)

[githubからnbviewerにジャンプしてくれるchrome拡張](https://chrome.google.com/webstore/detail/open-in-nbviewer/ihlhlehlibooakiicbiakgojckpnlali)もあり、これと組み合わせて使うと便利です。

# Futher more

- daruの使い方：[SciRuby/daru](https://github.com/SciRuby/daru)
- rbplotlyの使い方：[ash1day/rbplotly](https://github.com/ash1day/rbplotly)
- daru-plotlyの使い方：[genya0407/daru-plotly](https://github.com/genya0407/daru-plotly)

# 参考

- [Mac で IRuby Notebook 環境を構築する方法 2017年版](http://qiita.com/kozo2/items/8e0cf0d1f5672ac2f745)
- [Installing Jupyter Notebook](http://jupyter.readthedocs.io/en/latest/install.html)

[^1]: 正確には、Jupyter notebookの前身であるIPython notebookがPython用のプロジェクトだった。
[^2]: Jupyter notebook自身は様々な言語で使うことができる。[HaskellのKernel](https://github.com/gibiansky/IHaskell)とかもある
[^3]: `JavaScript Error`みたいなのが出た人は、notebook上部から`Kernel > Restart & Run All`を選択して実行してください。
[^4]: [ash1day/rbplotly](https://github.com/ash1day/rbplotly#examples)に例があります。