EC2+DockerでJupyter Notebookを動かす part2

前回はEC2インスタンスを作成し、Dockerをインストールしました。
今回はJupyter NotebookをDocker上で動かし、
EC2インスタンスのネットワーク設定をいじることで
外部からJupyter Notebookへアクセスできるようにします。

Jupyter NotebookのDockerイメージ取得・起動

まずはJupyter NotebookのDockerイメージを取得します。

docker pull jupyter/datascience-notebook

Jupyter Notebookのイメージ取得ができたことを確認します。

docker images jupyter/datascience-notebook

REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jupyter/datascience-notebook   latest              91f5bc10a994        36 hours ago        6.828 GB

イメージの取得ができたら、あとはDockerイメージを起動します。

docker run -it --name notebook -p 80:8888 jupyter/datascience-notebook

上記コマンドを実行するとJupyter Notebookにアクセスするための
トークンが標準出力されますので、それを使ってアクセスします。
その後は”Ctrl-p -> Ctrl-q”でイメージ内からログアウトし、
ターミナル等を閉じても稼働し続けるようにします。

EC2インスタンスのNW設定

次にEC2インスタンスのネットワーク設定を下記の手順で行います。

  1. サイドメニューの「セキュリティグループ」を押下
  2. Jupyter Notebookが稼働しているEC2インスタンスの
    セキュリティグループを選択
  3. 下ウィンドウの「インバウンド」タブを選択
  4. 編集ボタンを押下
  5. 「インバウンドルールの編集」画面で「ルールの追加」を押下
  6. 以下の入力内容でルールを追加
    • タイプ|HTTP
    • プロトコル|TCP
    • ポート範囲|80
    • 送信元|カスタム、0.0.0.0/0
  7. 「保存」ボタンを押下

security group

add rule

以上の設定をすると、EC2インスタンスのグローバルIPを指定すれば
任意のIPからJupyter Notebookにアクセスできます。

Jupyter Notebook Toppage

これで家からはもちろん、出先や会社からでも
手軽にデータ分析ができますね!

Jupyter Notebookを使ってみた

データサイエンス界隈でよく聞くJupyter Notebookを使ってみました。

インストール

主にpipを使う方法とanacondaを使う方法があります。
anacondaを使う方が楽だと思いますので、今回はそちらをご紹介します。

anacondaのダウンロードページにアクセスし、インストーラをDLします。
anacondaダウンロードページ

ダウンロードしたexeファイルを実行し、インストールします。
特に設定等は必要ないはずです。
私はデフォのインストールパスに日本語が入っていた関係で
上手く動作しなかったため、インストール先のみカスタムしました。

Installer

インストールが終わったらAnaconda Navigatorを起ち上げます。

Navigator

Jupyter Notebookを押下します。
するとポート8888でJupyter Notebookが起動します。

Top

せっかくなので実際に使ってみました。
今回はKaggleで有名なタイタニックのデータを読み込ませ、
Pandasやmatplotlibを使ってみます。

CSVなどのデータは右上の”Upload”から上げられます。

コードを書く際は”Upload”の右にある”New”を押下し、
“Python [conda root]”を押下します。

New

すると新しくページが開き、コードを記述するためのセルが現れます。

Empty

今回はセルに下記のコードを記述し、実行してみます。

## csvファイルの読み込み
df = pd.read_csv('train.csv', header=0)

## 年齢が60歳より上の乗客の情報を出力
print(df[df['Age'] > 60][['Sex', 'Pclass', 'Age', 'Survived']])

## 階級ごとの男性の数を出す
for i in range(1,4):
    print(i, len(df[ (df['Sex'] == 'male') & (df['Pclass'] == i) ]))

## グラフの表示
df["Age"].hist()
plt.show()

実際に記述して実行した画面がこちらです。

Result

この通り、ローカルでスクリプトを書いて試行錯誤するよりも、
Jupyter Notebookを使って作業した方が実行結果を見やすく、
サクサクとコーディングできそうです。
Numpy、Pandas、Scikit-learnなどデータ分析に必要なプラグインが
諸々そろっている点も良いですね。

また計算結果をMarkdown形式などに変換し、
手軽にレポートとしてまとめられます。

今度はJupyter NotebookをAWS上に構築し、
どこからでも気軽にデータ分析できる環境を作りたいと思います。