私のデータ解析環境構築 for Mac (Docker + anaconda + Jupyter  + R)

## はじめに
Jupyter notebookはデータ解析をする上で素晴らしい環境だと思います。
ただ、RをJupyter notebook上で動かす環境を構築する際、Dockerを使う日本語資料が見当たらなかったので、備忘録も兼ねて書き留めておきます。
ここでは表題の通りDockerを使って、仮想化と再現性を担保しつつ、R上でjupyterを使う環境を簡単に構築することを目指します。(なるべくDockerとかanacondaとか知らない人でも構築できるようにしているつもりです。)

なお、この記事はMacの方を対象としています。
windowsの方は以下のリンクへどうぞ。
[私のデータ解析環境構築 for Windows (Docker + anaconda + Jupyter  + R)](https://qiita.com/sgr0416st/items/c9d30e7b697e1c85e5de)

### こんな人におすすめ
- R言語でデータ解析したいけどpythonも使いたい
- 環境は仮想化しておきたい
- 綺麗なインターフェースを使いたい
- 解析結果の再現性を担保したい
- 簡単に環境構築したい

### 環境構築

１. **dockerをインストールする** 
Docker Hub にログインまたはアカウント作成後(無料)、
[Docker Store(Mac)](https://hub.docker.com/editions/community/docker-ce-desktop-mac)からdmgをダウンロードしてください。(get Dockerボタンを押す) 
それを解凍して、Docker.app を起動し、ログインしておいてください。
ターミナルを開いて

```
docker info
```
を実行できればインストール成功です。


以降のステップでは、Dockerについてわからない方でもできるように&ワンクリックでJupyterを立ち上げられるように、便宜上スクリプトファイルを用意して環境構築をします。
(Dockerが使える方は、Dockerコマンドを直打ちしてもらってもかまいません。)

２. **"R_analysis.sh"という名前のファイルを作る（拡張子に注意）**
ファイル名はなんでもいいですが、今回はR_analysis.shとして進めます。

３. **そのファイルをテキストエディタ等で開き、以下のコードを貼り付ける**
project_dir=〇〇の行のところは適宜書き換えてください。
(ノートを保存する場所を指定しています。
デフォルトでは/workspace/programing/R/r_analysisにディレクトリを作成し、
jupyter上で実行した解析はそこで保存されます。)

```bash:terminal
#!/bin/bash
# 自分の好きなディレクトリに変えてください
project_dir=/workspace/programing/R/r_analysis

# 指定したディレクトリが無かったら作り、移動する作業
cd ~
arr=(`echo $project_dir | tr -s '/' ' '`)
for item in ${arr[@]}; do
    if [ -e $item ]; then
        cd $item
    else
        mkdir $item
        cd $item
    fi
done

# jupyter/r-notebook イメージをdockerhubから取得
com=$(docker images jupyter/r-notebook)
if [ -z '$(echo $com | grep -e "jupyter/r-notebook")' ]; then
    docker pull jupyter/r-notebook
fi

# イメージからコンテナを生成
ID=$(docker run -d --rm -p 8888:8888 --name r_analysis -v "$PWD":/home/jovyan jupyter/r-notebook)
echo "sleep"
# サーバがすぐ立ち上がらないので少し待機
sleep 2
str=`docker exec $ID jupyter notebook list`
str=`echo ${str#*:}`
str=`echo ${str%::*}`
open $str
```

※上記のスクリプトファイルは、
①プロジェクトのワークスペースとなるディレクトリを作成
②ローカルにjupyter/r-notebookイメージがなければ、Docker Hubからとってくる(ログイン必須)
③dockerコマンドを使って、jupyter/r-notebookイメージからr_analysisという名前で
　コンテナを生成してローカルにJupyterのサーバをたてる
④ブラウザを立ち上げてJupyterのURLにアクセス
を順番に行っています。
dockerをご存知の方は、スクリプトファイルを使わずに直接コマンドを叩いてもらっても構いません。  
4. **シャットダウン用のファイルも作っておく**
先ほどと同じ要領で"R_analysis_shutdown.sh"という名前のファイルを作り、
以下をコピペしておいてください。

```bash:terminal
#!/bin/bash

text=`docker ps -a -f 'name=r_analysis' --format "{{.ID}}"`
docker stop $text
```

５. **"R_analysis.sh"ファイルを右クリックして「情報を見る」から、「このアプリケーションで開く」をターミナルに設定**  
６. **デスクトップとかに作成した2つのファイルを置いて、ダブルクリックで実行**
（最初は docker image をダウンロードするため、jupyterが開くまで時間がかかります）  
Jupyterが無事開けば完了です！
お疲れ様でした。  
※注意：閉じる時は必ず**セーブ**（左上の保存ボタンまたは ctr+S）をしたあと、
**quitボタン**でサーバをシャットダウンしてから閉じるボタンで消してください。
もし忘れてしまった場合は、**Dockerコマンドを叩いてコンテナを停止**させるか、
**R_analysis_shutdown.sh**を実行してください。

### hello R
ではこの環境で hello R してみましょう。  
まず、先ほどのスクリプトファイルを実行した状態であればjupyterが開いていると思います。
（閉じてしまった方はもう一度R_analysis.shを実行して立ち上げましょう。立ち上がらない場合は、すでにサーバが立ち上がっているのかもしれないので、R_analysis_shutdown.shを実行してからもう一度トライしてみましょう） 

次に、Jupyterの画面左上の　newボタンを押して、Rを選択しましょう.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/3dd64f64-8e91-b149-a4b6-a88acba7cf5a.png)

最後に、セルに

```
print("Hello, R")
```

と打ち込んで実行してみましょう。
下のイメージのようになれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/5f42e83e-20ff-6eea-c039-c670f2ce114d.png)


参考までに、Jupyterの主要なボタンも紹介しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/7a4b1b94-da13-45a6-8019-ab7fc9a1013a.png)



#### どうでもいい話
コレって結局何？というお話です。  
1. **docker**
仮想化環境です。簡単に説明すると、コンテナという単位でアプリケーションの実行環境を分離する環境を構築するツールです。これを使うメリットとして、

- OS等に依存せずに（どこでも誰でも）同じように動かせる環境が作れる
- 環境が壊れたらその仮想化環境を削除すれば良いだけ（本体に影響を及ぼさない）

などのメリットがあります。  
2. **anaconda (miniconda)**
もともとは、pythonの科学計算に特化したパッケージマネージャ兼仮想化ツールです。
今回はjupyterとR関係のモジュールを簡単かつ素早くインストールする目的で使いました。  
3. **jupyter**
プログラムや説明の文章、実行結果などをまとめて管理できる、データ分析用のツールです。
ブラウザで動作するため、いろいろなOSから利用できる、解析の再現性が高い、インタラクティブな解析が可能等のメリットがあります。  
4. **R**
言わずもがな。
統計解析が得意な言語です。

### まとめ
今回はJupyterでRを使う環境を構築しました。
環境について理解を深めるにはDockerの知識もある程度必要だと思うので、
気になった方は学習してみてください。