データサイエンティストに向けたコーディング環境Jupyter Notebookの勧め

データサイエンティスト記事第二弾ww

# データサイエンティストのためのデータ解析環境

データサイエンティストとかいう人たちはプレゼンしたり、データを見ながらディスカッションしたりする機会が多いんだと思います。 <- 適当な憶測
そのため、vim/emacsや旧来のIDEとは異なるコーディング環境が必要な気がします。

要求仕様としては下記4点かなと思います。

|要求仕様|vim/emacs|Rstudio/Spyder|Spotfire/Tableu|Jupyter Notebook|
|:--|:--|:--|:--|:--|
|コーディングができる|◎|○|×|○|
|インタラクティブにデータの可視化ができる|×|○|◎|○|
|再現性の確保しやすさ|△|△|×|○|
|セクシー|一般人から見ると×|○|◎|◎|

データサイエンスとかけ離れた恣意的な表ですが、Jupyter Notebookを使えて損はないのは本当です。
RStudio (pythonはSpyder)もよいですが、 ~~セクシーさ~~ 再現性確保の観点で見るとマークダウンでコメントが残せるJupyter Notebookの方が分があります。
データサイエンティストでなくてもコーディングの過程が保存できるのでおすすめです。

# Jupyter Notebookとは?

- Pythonには元からインタラクティブシェルがついていますが、それで物足りない人たちがIPython(Interactive Python)というインタラクティブシェルを作っていました。
- [IPythonの使い方](http://qiita.com/5t111111/items/7852e13ace6de288042f)より特徴を抜粋

>    - セル指向のコーディング: セルという単位でまとめて実行できます
>    - 予約語や変数、モジュール名などのタブ補完
>    - オブジェクトの調査: オブジェクト名に?をつけると詳細情報が表示されます
>    - 各種マジックコマンド: `%%timeit` での実行速度チェックなど
>    - シェルコマンド: `!ls`など!から始める行はシェルコマンドとして実行できます
>    - 入力や出力の再利用: InとOutという変数内にセルの入出力が保存されます

- IPythonプロジェクトの中で、IPythonをwebから入出力できる IPython Notebookというのが登場しました。
    - pandasのテーブル、matplotlibのグラフ、mathjaxの数式などがwebの機能を用いて表示できます
    - マークダウンでのコメントの表示: 記述力が一気に向上しました
    - .ipynb形式での解析過程の保存と共有が可能です
        - githubにあげると、[nbviewer](http://nbviewer.jupyter.org/)からipython notebookの形式で閲覧可能です
- IPython Notebookを見ていた他言語ユーザが、他言語でも動くようにIPython Notebookをフックし始めました。
    - baseとしてはkernelと呼ばれるzeromqベースでの通信です
    - このkernelが各言語で作られ始めました
        - Julia, Ruby, Rなど
    - IPython Notebookって名前おかしくね?という状況に...
- IPythonプロジェクトからスピンアウトして、Jupyterという独立プロジェクトになりました。
    - IPython Notebook 4.0 => Jupyter Notebook (JuPyteR: Julia + Python + R)
    - なので、Jupyter NotebookとIPython Notebookは同じものです
    - IPythonのなかで開発されていたqtconsoleというコンソール版もJupyterに移りました

結果的に、

- 各種言語で、
- コーディングがしやすく、
- マークダウンによる強力なコメントの表現力と、
- webによるインタラクティブなデータ可視化環境を有し、
- コードが埋め込まれていることで追試が容易な、

**解析過程の再現性と保存性と共有性を有するアプリケーション**となりました。
一種の電子実験ノートです。(ウィットネスとかはないですが)

# 環境構築
なんとanacondaを入れると全部入っています。
anacondaの環境構築は[こちら](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#comment-74ebe876f9599a466212)にあります。

適当なフォルダで端末を立ち上げて下記のコマンドを叩いてください。
`jupyter notebook`
ブラウザが立ち上がって`http://localhost:8888`にJupyterのページが表示されればOKです。


# Jupyterの初期設定

[旧記事](http://qiita.com/y__sama/items/5fb14f2dc7d294fa9980)統合

***
設定しなくてもとりあえずは動きます。
気にしない方は読み飛ばしてください。
***

## alias
`jupyter notebook`って結構長いので、`note`とかalias作ってもいいです。

## config周りについて
jupyter 4.0でconfig周りが結構変わったようなので前から使っている人は確認したほうがよいです。
https://jupyter.readthedocs.org/en/latest/migrating.html

## configファイルの作成とパスワードの設定
[参考URL](http://jupyter-notebook.readthedocs.org/en/latest/config.html)

```bash
jupyter notebook --generate-config
#>>> Writing default config to: ~/.jupyter/jupyter_notebook_config.py
python -c "from notebook.auth import passwd;print(passwd())" 
#>>> Enter password:
#>>> Verify password:
#>>> 'sha1:........'
```
`sha1:...`ではじまるハッシュパスワードをコピーしておいてください。

```
vi ~/.jupyter/jupyter_notebook_config.py
```

#### 主に変更する箇所

下記パラメータを探して必要に応じてコメントを外して値を記載します。

|パラメータ|初期値|コメント|
|:--|:--|:--|
|c.NotebookApp.ip|'localhost'|他のクライアントマシンからもアクセスしたい場合は変更する。'*'でフルオープン。|
|c.NotebookApp.notebook_dir|null|Jupyterのカレントディレクトリを指定。どこかに指定して置くと良い。|
|c.NotebookApp.open_browser|True|立ち上げ時にbrowserを開くか。Xが入ってないサーバとかはFalseにしておく。|
|c.NotebookApp.port|8888|他で8888を使っている場合は別のポートを指定。|
|c.NotebookApp.password|null|先ほどコピーしたハッシュ文字列を入れるとパスワード認証がかけられる。|

他にもsslの設定なんかもあるので、webに公開する必要があるときは、ドキュメントを確認してください。

## IPython立ち上げ時に読み込むライブラリ

`~/.ipython/profile_default/startup`に最初に読み込むライブラリを記載しておくと、kernel起動時に一緒に読んでくれます。
セルマジックもipy形式なら記述可能なので、`%matplotlin inline`も記載しておくとよいです。
[seabornの好みの書き方](http://nkmk.github.io/blog/python-seaborn-matplotlib/)とかあれば一緒に書いとくと、その後が楽です。
あまり書きすぎるとkernelの立ち上がりが遅くなるのでイライラします。(pandasとか割と重いです)

例:

```00_init.ipy
%matplotlib inline
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
```

## extension
Jupyter Notebooknにはextensionもあります。
下記の記事にまとまっているので割愛します。
[extensionを追加してもっと快適なJupyter環境を構築する](http://qiita.com/sasaki77/items/30a19d2be7d94116b237)
[jupyter notebook extensions python-markdown(markdown + jinja2)]
(http://qiita.com/ksomemo/items/ba0f24daae2276ffd9b2)

## RISE

Jupyter Notebookでプレゼンができるようになるクールな拡張機能があります。

```
git clone https://github.com/damianavila/RISE
cd RISE
python setup.py install
```

ノートページの右上にスライドショーボタンが追加されます
ノートページのCell ToolbarボタンでSlideshowを選択すると、どこまでを一枚のスライドにするかなどが指定できます。

## Jupyter Content Management Extensions
(3/21追記)
IBMが超便利な拡張機能を作ってくれたのを忘れていました。
これを入れるとjupyterからnotebookファイル内の全文検索ができます。
[IBMの紹介blog](http://blog.ibmjstart.net/2015/08/20/jupyter-notebooks-content-management-contributions/)
pipで公開されているので簡単にインストールできます。

```bash
pip install jupyter_cms
jupyter cms install --user -s 
jupyter cms activate
jupyter notebook
```

`jupyter cms activate`してからnotebookを立ち上げると、treeの画面にsearchボタンが追加されます。
配下のcodeの検索やコメントの検索もできるので再利用性が高まります。
検索もかなり[柔軟に](http://whoosh.readthedocs.org/en/latest/querylang.html)できます。
（プレビューまであるともっと嬉しいですが...）

その他、jupyter notebookでダッシュボードを作れる拡張機能なども用意されています。
[JupyterDay NYCのスライド](http://ibm-et.github.io/jupyterdaynyc2015/)
[github](https://github.com/jupyter-incubator)

(3/21追記ここまで)

# Jupyter Notebookの使い方

良記事があります。
[Jupyter事始め](http://qiita.com/taka4sato/items/2c3397ff34c440044978#jupyter%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)

(2016･4･13追記)
環境の切り替えは[jupyter_environment_kernels](https://github.com/Cadair/jupyter_environment_kernels)というのを入れるとはかどります。
[こちら](http://qiita.com/yoppe/items/38005f415a5b8b884c7d)の素晴らしい記事で知りました。