ノンエンジニアでもできる！無料でデータ分析クラウド環境を構築してみる

# ノンエンジニアでもできる！無料でデータ分析クラウド環境を構築してみる

**注意！** この記事はQiitaの画像投稿制限を突破するために無理やりscrapboxから移管させた記事です。鋭意修正中ですが、まだ一部、見辛い箇所があります。

[![Image](https://cloud.google.com/images/products/artwork/datalab-dashboard.png)](https://cloud.google.com/images/products/artwork/datalab-dashboard.png)[![Image](https://qiita-image-store.s3.amazonaws.com/0/68432/00c82536-3863-7580-99f8-786aae4d28b6.png)](https://qiita-image-store.s3.amazonaws.com/0/68432/00c82536-3863-7580-99f8-786aae4d28b6.png)<br>

## この記事について
- 誰でもすぐに分析環境を作れる・運用できるようになることを目的とした記事です。
- Google Cloud Platform, クラウドの無料機能をフル活用し、無理やり環境を作ります。
 - クレジットカードを登録せずに使える特殊VMに分析環境をデプロイし、利用していきます。
- この記事は個人の分析環境を扱います。チーム版は別途記述します🙇
- 非エンジニアの方でも(テンプレートを用いて)色々な分析が出来るように、整備していきます💪

##### 扱うソフトウェア
- [Google Cloud Datalab](https://cloud.google.com/datalab/?hl=ja)

##### まずはリスク & その対策の説明
- 意図しない課金の可能性：クレジットカードを登録しないことで防ぎます。
- 環境構築でPCを壊す可能性：クラウドサービスを使うことで防ぎます。

##### この記事でやること
- クラウド環境にサインイン
- 分析環境を作成
- [BigQuery](https://cloud.google.com/bigquery/what-is-bigquery?hl=ja)のデータを分析&可視化
- Google Analyticsのデータを分析&可視化


### Googleアカウントを作成
よしなに

### GCPコンソールを開く
[https://console.cloud.google.com/home/dashboard](https://console.cloud.google.com/home/dashboard)<br>
サインインして開ければOK<br>
[![Image](https://gyazo.com/df1e09332d5f344177650c2db5a6ca92/thumb/1000)](https://gyazo.com/df1e09332d5f344177650c2db5a6ca92)<br>


### GCPプロジェクトを作成する
[https://console.cloud.google.com/projectcreate](https://console.cloud.google.com/projectcreate)<br>
無料枠だと一人10つまで。プロジェクト名は適当なもので大丈夫です。<br>
例：my-google-datalab<br>

[![Image](https://gyazo.com/f98d624a686d2c802cc043e2f996a508/thumb/1000)](https://gyazo.com/f98d624a686d2c802cc043e2f996a508)<br>


### 課金されないことを確認する
[https://console.cloud.google.com/billing/linkedaccount](https://console.cloud.google.com/billing/linkedaccount)<br>
- `「お支払い | 課金 | このプロジェクトには請求先アカウントがありません」`と表示されることを確認する。
- 請求先アカウント設定でクレジットカードを登録すると、いくつかの機能が解放されるが、無料使用範囲を越えると請求が開始してしまうため、登録しないこと。

##### 蛇足
- GCPには、個人の課金状態について以下の4つがある。
  1. 請求先アカウントが無い状態 (無課金)
  2. 請求先アカウントがあり、3 or 6ヶ月の試用範囲状態  (無課金)
  3. 請求先アカウントがあり、完全にプロジェクトをマネージして、無課金に収まるように外部アクセス(SSH)すらも遮断した状態 (無課金)
  4. 請求先アカウントがあり、普通に使っている場合 (課金)

- GCEなどのマネージVM管理は2以降でないと使えない。
- 本来Google Cloud Datalabなどの分析環境はGCEが必要なため、GCEが使えなければ利用できない。
 - [2以降の無料枠の説明](https://cloud.google.com/free/?hl=ja)
 - BigQuery、CloudShell、CloudStorage、CloudFunctions、Firebaseは1で利用可能なため、こちらを利用していきます。

- Google CloudShellと呼ばれる1ユーザ1VMの「プロジェクト操作用VM」に、無理やりDockerでDatalabをデプロイして使うのが今回の趣旨になります。

[![Image](https://gyazo.com/b126da7378100c6fcf510dda7b96df7f/thumb/1000)](https://gyazo.com/b126da7378100c6fcf510dda7b96df7f)<br>


### CloudShellを開く
[https://console.cloud.google.com/cloudshell/editor](https://console.cloud.google.com/cloudshell/editor)<br>

##### 蛇足
- クラウドシェルマシン(VM)は一時的なものであり、約30分インタラクティブに使用しないとホームディレクトリ以外のVMのファイル状態がリセットされます。
- システム全体の変更はこれを超えて継続することはありません。
- ホームディレクトリは1ユーザ共通(プロジェクトを跨いでも同期)で、5GBまでのデータを格納できます。
- クラウドシェル サービスにはSLAは適用されません。（いつ落ちても文句は言えません）
- マシンタイプは[g1-small](https://cloud.google.com/compute/docs/machine-types?hl=ja)相当
 - 1 基の仮想 CPU と 1.70 GB のメモリを備えたマシンタイプ。
 - [Unixbench](http://blog.idcf.jp/entry/cloud/unixbench/)は1010スコア程度

- 初期状態だとOrion（ソースエディタ&ファイル管理）で隠しファイルが表示されません。
 - 気になる場合は歯車ボタン->GENERAL->FILES->Filtered Resourcesから「`, .*`」の記述を消すことで表示できます。

[![Image](https://gyazo.com/b092a82df614c0a77f2af6b586803602/thumb/1000)](https://gyazo.com/b092a82df614c0a77f2af6b586803602)<br>


### DockerでGoogleDatalabローカル版をCloudShellにインストールする
- [https://console.cloud.google.com/cloudshell/editor](https://console.cloud.google.com/cloudshell/editor) ページ下側の黒い部分に下記コードの「docker ...」から「... :local」までを一度にコピーして貼り付けてエンターを押す。100秒ほど待つ。

```
docker run -it -p "8081:8080" -v "${HOME}:/content" -e "DATALAB_DEBUG=true" gcr.io/cloud-datalab/datalab:local
```

##### 蛇足
- GCR(同じデータセンタ)からDatalabのコンテナイメージ(1GB程度)を引っ張ってくる。
- ダウンロードはそこそこ早い(20秒)
- 展開はそこそこ遅い(90秒)

[![Image](https://gyazo.com/7ab7f9646001cb5a41f1420dd4ee9c71/thumb/1000)](https://gyazo.com/7ab7f9646001cb5a41f1420dd4ee9c71)<br>


### Google Cloud Datalabでやっていく💪
- Google Cloud Datalabとは
 - 「ソースコードを書くとその場で実行して、結果を一枚のマークダウンにまとめて表示できる」というデータ分析開発者が使う環境（Jupyter）を、Googleが拡張したオープンソース分析環境のこと。

##### 蛇足
Jupyterには下記3つの大元プロジェクトがある。<br>
- Jupyter Notebook : 本家。Pythonのソースコードをその場で実行できるメモ帳ソフトウェア。
- Jupyter Lab：本家に代わる最新版。タブUI等が入った。
- Jupyter Hub：本家を複数人で使えるようにユーザ制御などが入ったもの。

Google Cloud DatalabはNotebookを拡張して、UIを解りやすくし、マジックコマンドを増やしたもの。<br>
- マジックコマンド：Python以外のソースコードを書けたり、コマンドを実行できたりするもの。
 - 本家マジックコマンド：[http://ipython.readthedocs.io/en/stable/interactive/magics.html](http://ipython.readthedocs.io/en/stable/interactive/magics.html)
 - Datalab拡張コマンド1：[http://googledatalab.github.io/pydatalab/datalab.magics.html](http://googledatalab.github.io/pydatalab/datalab.magics.html)
 - Datalab拡張コマンド2：[http://googledatalab.github.io/pydatalab/google.datalab%20Commands.html](http://googledatalab.github.io/pydatalab/google.datalab%20Commands.html)

[![Image](http://datalab.cloud.google.com/brand.png)](http://datalab.cloud.google.com/brand.png)<br>


### CloudShellからGoogleDatalabを開く
- 開き方
  1.  [https://console.cloud.google.com/cloudshell/editor](https://console.cloud.google.com/cloudshell/editor) ページ右上の「ウェブでプレビュー」ボタンから、ポートを8081に変更して開く
  2. [https://console.cloud.google.com/cloudshell/editor](https://console.cloud.google.com/cloudshell/editor) ページ下側の黒い部分に「`Open your browser to http://localhost:8081/ to connect to Datalab.`」というテキストが流れるので、localhost:8081 をクリックすると勝手にlocalhostを専用URLに解釈し直して別タブで開く
- 初回は開く際に10秒ほどかかります。

[![Image](https://gyazo.com/7b9855d231e0a22e0f3f481d0e04fece/thumb/1000)](https://gyazo.com/7b9855d231e0a22e0f3f481d0e04fece)<br>


### Notebookを開く

1. `docs`というフォルダが表示されているので、左クリックで開く
2. `Hello World.ipynb`というNotebookがあるので、左クリックすると、別タブで開く
[![Image](https://gyazo.com/b6c58c3c5dd65e5f47e054fd7a3e8bef/thumb/1000)](https://gyazo.com/b6c58c3c5dd65e5f47e054fd7a3e8bef)<br>


### 'Hello!' 環境構築 完了🎉
- 下記が記載されているテキストフォームを選択する。

```
# Code cell ready to be run...
print('Hello!')
```

1. この入力欄を選択しつつ、Shiftキーを押しながらエンターを押す。
2. 入力枠が次に移動する、そのまま待機
3. 1秒ほどで実行中のローディングバーが表示され、2秒ほどで`Hello!`がプリントされる。
4. これでPython実行環境の準備が完了

[![Image](https://gyazo.com/cfd47b3586eb357d3938f00a5cd408d4/thumb/1000)](https://gyazo.com/cfd47b3586eb357d3938f00a5cd408d4)<br>


### GCPプロジェクトとの疎通確認を行う (失敗でOK)
- ページ上部の「`<> Add Code`」を押し、入力欄を表示させ、下記内容を入力する。
- sqlマジックコマンド

```
%sql
SELECT 1;
```

1. 入力したらShiftキーを押しながらエンターを押す。
2. 1秒ほどで実行中のローディングバーが表示され、2秒ほどで結果が帰ってくる。
3. まだプロジェクトに接続していないため、プロジェクトが見つからないというエラーが出れば正常。
- (プロジェクト接続後にもう一度繋がるか試し直します。)
- コードをコピー&ペーストする際、`SELECT 1;`の前 (行頭) に空白が入っていると、正しく実行されないので注意が必要。

[![Image](https://gyazo.com/a8c8284e27d57fc4958782d14fcad178/thumb/1000)](https://gyazo.com/a8c8284e27d57fc4958782d14fcad178)<br>


### GCPプロジェクトと接続を行う
- プロジェクト一覧を表示する
- projectsマジックコマンド
- ```%projects list```

- 上記コマンドで作成済みのプロジェクトidが表示される。idをコピーペーストして接続する
- projectsマジックコマンド
- ```%projects set ${PROJECT_ID}```

##### 蛇足
- 本来Datalabローカル版はGCPプロジェクト接続のために、Datalab画面右上のメニューからのGoogleユーザサインインが必要。
- しかし、CloudShellは内部的にユーザ情報を保持しているためサインインが不要となる。

[![Image](https://gyazo.com/32113b1cca238a90858389207558caec/thumb/1000)](https://gyazo.com/32113b1cca238a90858389207558caec)<br>


### GCPプロジェクトとの疎通確認を行う
- sqlマジックコマンド

```
%sql 
SELECT 1;
```

- 結果が表示されればOK、BigQueryで`SELECT 1;`が実行されている。

[![Image](https://gyazo.com/39fe695c7e8202d1cdaefe5ac4e08384/thumb/1000)](https://gyazo.com/39fe695c7e8202d1cdaefe5ac4e08384)<br>


### Notebookの変更を保存して、別のNotebookを開く

1. `Ctrl-S`を実行し、ファイルの変更を保存する。
2. 画面左上の「Google Cloud Datalab」のボタンを押し、ファイル一覧へ戻る。
3. `datalab`ディレクトリ、`docs`ディレクトリを開き、`Hello World.ipynb`のファイルがあるページに行く
4. ここで、「+ Notebook」ボタンを押し、新規Notebookを新しいタブで開く


### Googleが公開しているオープンデータを表示してみる
- [Chrome User Experience Report](https://developers.google.com/web/tools/chrome-user-experience-report/) : Chromeから収集したデータを用いた、ユーザーエクスペリエンスレポート
- sqlマジックコマンド

```
%sql -d standard
 
WITH first_paint AS (
  SELECT
  origin,
  effective_connection_type.name AS connection,
  form_factor.name AS factor,
  first_paint.start AS first_paint_start,
  first_paint.end AS first_paint_end,
  first_paint.density AS first_paint_density
  FROM `chrome-ux-report.chrome_ux_report.201710` AS r
  CROSS JOIN UNNEST (r.first_paint.histogram.bin) as first_paint
),
max_density AS (
  SELECT origin, connection, factor, MAX(first_paint_density) AS first_paint_density  FROM first_paint
  GROUP BY origin, connection, factor
)
 
SELECT
  f.*,
  CAST(f.first_paint_density AS STRING) AS string_first_paint_density
FROM max_density AS m
LEFT JOIN first_paint AS f
ON m.origin = f.origin
AND m.connection = f.connection
AND m.factor = f.factor
AND m.first_paint_density = f.first_paint_density
WHERE m.origin LIKE "%co.jp"
ORDER BY m.first_paint_density DESC
```

- 内容は、`co.jp`サイトの接続方法・端末種類でグルーピングした後に、更にコンテンツのファーストペイントスピードでグルーピングし、その中で割合が多かったものを表示。
 - つまり、各サイトの大体のファーストペイントの速度を追っています。
- コード内容（クエリ）に大きな意味はありません。
[![Image](https://gyazo.com/8e290f392a34c3217da12630cc63898b/thumb/1000)](https://gyazo.com/8e290f392a34c3217da12630cc63898b)<br>


### Googleが公開しているオープンデータを可視化する
- データをDatalabに格納する専用マジックコマンドがあるので、それを用いて、BigQuery -> Google Chartsでデータを可視化
 - 単純なグラフでサイト毎のファーストペイント開始・終了を可視化する
 - データはchrome_ux_reportという名称で移動
 - クエリは前回と同じもの
 - bqマジックコマンド

```
%bq query --name chrome_ux_report
 
WITH first_paint AS (
  SELECT
  origin,
  effective_connection_type.name AS connection,
  form_factor.name AS factor,
  first_paint.start AS first_paint_start,
  first_paint.end AS first_paint_end,
  first_paint.density AS first_paint_density
  FROM `chrome-ux-report.chrome_ux_report.201710` AS r
  CROSS JOIN UNNEST (r.first_paint.histogram.bin) as first_paint
),
max_density AS (
  SELECT origin, connection, factor, MAX(first_paint_density) AS first_paint_density  FROM first_paint
  GROUP BY origin, connection, factor
)
 
SELECT
  f.*,
  CAST(f.first_paint_density AS STRING) AS string_first_paint_density
FROM max_density AS m
LEFT JOIN first_paint AS f
ON m.origin = f.origin
AND m.connection = f.connection
AND m.factor = f.factor
AND m.first_paint_density = f.first_paint_density
WHERE m.origin LIKE "%co.jp"
ORDER BY m.first_paint_density DESC
```

 - chartマジックコマンド
  - ```%chart stepped_area --data chrome_ux_report --fields origin,first_paint_end,first_paint_start```

- このオープンデータに登録されているco.jpサイトの大体のファーストペイントは、400ms頃に開始し、600ms頃に終わっていることが多いことが視覚化される
[![Image](https://gyazo.com/2a730cae932f11167111471c3495c33a/thumb/1000)](https://gyazo.com/2a730cae932f11167111471c3495c33a)<br>






## WIP

### この記事で更に言及したい・できそうなこと
- コードレスに分析が出来るように、コピペテンプレート(ipynb)を公開する
- データの追加方法
 - BigQueryデータ
 - Google Analyticsからのデータ
 - CSVファイル
 - Google Cloud Storage
 - 外部公開(http)プログラムとの連携
  - GAE
  - Cloud Functions
  - Firebase etc...
 - Dockerの再起動・終了方法
 - 環境のリセット方法
 - Notebookの共有方法
 - Git管理方法

#### データ分析手法をまとめたipynbの公開
- 決定木
- ランダムフォレスト
- ｋ近傍
- SVM
- ロジスティック回帰
- Linear SVC
- パーセプトロン
- Stochastic Gradient Decent
- ナイーブベイズ

#### Google Chartsや可視化手段をまとめたipynbの公開
- ヒストグラム
- ヒートマップ
- 散布
- 階層的クラスタリング
- 棒グラフ・線グラフ
- ネットワークグラフ
- 次元データ
- 箱ひげ図
- 行列

- %chart
- graphviz
- matplotlib
- seaborn
- plotly
- tensorboard

#### BigQueryオープンデータを用いたipynbの公開
- Chrome User Experience Report by Google Developers
- Stack Overflow BigData

#### Kaggleオープンデータを用いたipynbの公開
- RMS Titanic 死者生存者判定データ
 - kaggleの初学者向けデータ

#### 機械学習フレームワークを呼び出すipynbの公開
- google.datalab.ml Module