データサイエンス環境をDocker＋Jupyterで構築して、Rでデータを可視化してみる

# はじめに
[UL Systems Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ulsystems) の7日目です。

みなさん、データサイエンスしてますか？

毎日のように、ビッグデータを活用した新しいサービスやビジネスが発表されています。そろそろデータサイエンスを勉強しようかなーと考えている方も多いのではないでしょうか。

この記事では、これから学習するエンジニアのために、人気のデータサイエンス環境である**「Jupyter」を「Docker」で起動して、「R言語」でデータを可視化するまでの方法**を紹介します。

今回使用するDockerイメージは、Jupyter公式の「datascience-notebook」です。このイメージでは、R言語に加えて「Python」と「Julia」もサポートしていますので、これらの言語によるデータサイエンス環境としても利用することができます。

それでは、はじめてみましょう。

### 環境
本記事では、Dockerのホスト環境としてVirtualbox上のCentos7を使用しています。
WindowsやMacとは一部コマンドが異なる場合もあるかもしれませんが、読者の環境に合わせて読み替えてください。


# Dockerのインストール
Docker自体がインストールされていない場合は、利用しているOSのDockerをインストールしてください。
Docker公式サイトは[こちら](https://docs.docker.com/install/)です。


# Dockerイメージを取得する
今回は、Jupyter公式のデータサイエンス用のDockerイメージ[「datascience-notebook」](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#jupyter-datascience-notebook)を使用します。
Dockerファイルは[こちら](https://github.com/jupyter/docker-stacks/tree/master/datascience-notebook)です。


利用するdockerイメージをpullしてください。

```
$ docker pull jupyter/datascience-notebook
```

# Jupyterを起動してブラウザでアクセスする
### Jupyter起動
さっそくJupyterのDockerコンテナを起動します。以下のコマンドを参考に実行してください。（名前は「notebook」です。）
ここで、永続化用のディレクトリ（`~/jupyter`）は、必要に応じて変更（または削除）してください。
また、追加でライブラリをインストールする場合<sup>※</sup>は `--user root ` `-e GRANT_SUDO=yes`を忘れずに指定してください。
（※：DBとの接続用ライブラリや他の言語エンジンのインストールなど。）

```
$ docker run  \
    -d \
    --user root \
    -e GRANT_SUDO=yes \
    -e TZ=Asia/Tokyo \
    -p 8888:8888 \
    --name notebook \
    -v ~/jupyter:/home/jovyan/work \
    jupyter/datascience-notebook \
    start-notebook.sh 
```

### token確認
Jupyterにアクセスするためのtokenを確認します。`docker logs`コマンドでnotebookコンテナの実行ログを参照しましょう。

```
$ docker logs notebook
Set username to: jovyan
(snip)
[C 10:34:58.460 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(67d1510d5673 or 127.0.0.1):8888/?token=9400eafd9f6f5a2f071134c6307ae8d9542a971799eef5e5
(snip)
```

### ブラウザアクセス
ではJupyterにアクセスしましょう。ブラウザのURLに「localhost:8888」を入力してください。
![01_jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/321204/fde3e5b3-7178-b38d-276a-affcda264de1.png)

画面下部の「Setup a Password」の「Token」に先ほど確認したtokenを入力し、「New Password」に任意のパスワードを入力して「Log in and set new password」ボタンをクリックしてください。
![02_jupyter_sett_pass.png](https://qiita-image-store.s3.amazonaws.com/0/321204/1022e51e-f5ef-de09-bc08-2195bf1f3b96.png)

ダッシュボード画面に遷移します。
<img alt="03_dashboard.png" src="https://qiita-image-store.s3.amazonaws.com/0/321204/8973509b-241a-012a-14c4-c353d38dd42f.png">


# Rでデータを可視化する
### ノートブック作成
ダッシュボード画面右側の「New」ボタンをクリックして、表示されたメニューの「R」をクリックしてください。
![04_new_notebook.png](https://qiita-image-store.s3.amazonaws.com/0/321204/4fd6422a-2eb1-8f4c-85f2-9524c703ff14.png)


ノートブック画面が開きます。
<img alt="05_notebook.png" src="https://qiita-image-store.s3.amazonaws.com/0/321204/7c9e3374-3b3c-a24b-1736-8772445302f3.png">


### ライブラリ（tidyverse）のロード
デフォルトのデータセットを使用するため、ライブラリ「tidyverse」をロードしましょう。
このライブラリには説明に使用するデータセットの他に、ヘルプページや関数も含まれています。Codeセルに`library(tidyverse)`と入力して、「Shift」＋「Enter」で実行してください。（画面上部の「Run」ボタンでもOKです。）
（Jupyter自体の詳しい操作方法は[オンラインマニュアル（英語）](https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Notebook%20Basics.html)などを参照してください。）
<img alt="06_library.png" src="https://qiita-image-store.s3.amazonaws.com/0/321204/dc98e18a-ea27-cff0-9f73-773bfd205f81.png">


実行結果のConflictsには、デフォルトのRのパッケージに含まれる関数と衝突した関数（`filter()`, `lag()`）が表示されます。衝突した関数を利用する場合は`package::function()`の形式でパッケージを明示してください。

### データセット（mpg）確認
今回使用するデータセット「mpg」の内容を表示します。これは、米国環境保護局がまとめた1999年と2008年の38種類の人気モデルの燃費データのデータセットです。
<img alt="07_mpg.png" src="https://qiita-image-store.s3.amazonaws.com/0/321204/fc0cf348-d201-c638-3da3-1a7bfe9b83d2.png">



データセットの詳細は、`?mpg`で確認できます。Rではこれと同様に「?」に続いて名前（データセットだけでなく、関数もOK）を実行することで詳細を表示することができます。（画面の下部に表示されます。）
![08_help_mpg.png](https://qiita-image-store.s3.amazonaws.com/0/321204/f2b7d822-a387-83aa-2636-b1a9b868c26e.png)


### データの可視化
それでは可視化していきましょう。今回は、散布図と箱ひげ図を作成します。

#### 散布図
x軸に排気量（displ）、y軸に燃費（hwy）を指定して散布図を描いてみましょう。
`ggplot()`で、入力として使用するデータセットを宣言し、`+ geom_point()`で散布図のレイヤーを追加します。（これらの関数の詳細は、`?ggplot`、`?geom_point`で確認できます。）

```
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy))
```

<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/321204/0eee1a2b-976e-6d5f-9cad-e34a16bab300.png" width=80%>
</div>


データ全体の傾向はわかりますが、もう少し詳細がわかるといいですね。
mpgには「class」という車種データもあります。このデータを使って、ポイントを車種で色分けしてみましょう。

```
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = class))
```
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/321204/96f3624a-76ee-2abe-5106-39c45bc093f2.png" width=80%>
</div>

混在していることがわかりました。
次は、車種（class）ごとのグラフを表示してみましょう。`facet_wrap()`を使用します。


```
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = class)) +
  facet_wrap(~ class, nrow = 2)
```
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/321204/369e5348-f4de-97fd-5bd2-b62e556add17.png" width=80%>
</div>

大排気量の「2seater」にUSAを感じます。

#### 箱ひげ図
次は箱ひげ図を描いてみましょう。
車種（class）ごとの箱ひげ図を描く場合は`geom_boxplot()`を指定します。

```
ggplot(data = mpg) +
  geom_boxplot(mapping = aes(x = class, y = hwy, color = class))
```
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/321204/8abf289f-996a-2479-636a-15ac682125d9.png" width=80%>
</div>

見やすくなるよう、中央値が近い順番に並び替えてみましょう。`reorder()`を使用します。

```
ggplot(data = mpg) +
  geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy, color = class))
```
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/321204/f1297eb0-6a69-ae0c-3896-5ebc905cf270.png" width=80%>
</div>

# まとめ
Docker＋Jupyterを使用してデータサイエンス環境を構築し、R言語でデータを可視化してみました。公式のDockerイメージを利用することで簡単に構築できることと、R言語で簡単に可視化できることががわかっていただけたのではないでしょうか。

今回はデータ自体の操作<sup>※</sup>は行いませんでしたが、R言語ではこれらも非常に簡単に実現できます。
（※：列の選択（select）や追加（mutate）、条件に合ったデータの取得（filter）など）

本記事が、みなさんのデータサイエンス学習のはじめの一歩になれれば幸いです。


#### 参考文献
もっとデータサイエンス学習を進めたい！というかたは、[「Rではじめるデータサイエンス」](https://www.oreilly.co.jp/books/9784873118147/)がおすすめです。（本記事の執筆にあたっても参考にさせてもらいました。）
私も読み進めているところですので、一緒にデータサイエンスしていきましょう！