ノンエンジニアでもできる!無料でデータ分析クラウド環境を構築してみる
注意! この記事はQiitaの画像投稿制限を突破するために無理やりscrapboxから移管させた記事です。鋭意修正中ですが、まだ一部、見辛い箇所があります。
この記事について
- 誰でもすぐに分析環境を作れる・運用できるようになることを目的とした記事です。
- Google Cloud Platform, クラウドの無料機能をフル活用し、無理やり環境を作ります。
- クレジットカードを登録せずに使える特殊VMに分析環境をデプロイし、利用していきます。
- この記事は個人の分析環境を扱います。チーム版は別途記述します🙇
- 非エンジニアの方でも(テンプレートを用いて)色々な分析が出来るように、整備していきます💪
扱うソフトウェア
まずはリスク & その対策の説明
- 意図しない課金の可能性:クレジットカードを登録しないことで防ぎます。
- 環境構築でPCを壊す可能性:クラウドサービスを使うことで防ぎます。
この記事でやること
- クラウド環境にサインイン
- 分析環境を作成
- BigQueryのデータを分析&可視化
- Google Analyticsのデータを分析&可視化
Googleアカウントを作成
よしなに
GCPコンソールを開く
https://console.cloud.google.com/home/dashboard
サインインして開ければOK
GCPプロジェクトを作成する
https://console.cloud.google.com/projectcreate
無料枠だと一人10つまで。プロジェクト名は適当なもので大丈夫です。
例:my-google-datalab
課金されないことを確認する
https://console.cloud.google.com/billing/linkedaccount
-
「お支払い | 課金 | このプロジェクトには請求先アカウントがありません」
と表示されることを確認する。 - 請求先アカウント設定でクレジットカードを登録すると、いくつかの機能が解放されるが、無料使用範囲を越えると請求が開始してしまうため、登録しないこと。
蛇足
-
GCPには、個人の課金状態について以下の4つがある。
- 請求先アカウントが無い状態 (無課金)
- 請求先アカウントがあり、3 or 6ヶ月の試用範囲状態 (無課金)
- 請求先アカウントがあり、完全にプロジェクトをマネージして、無課金に収まるように外部アクセス(SSH)すらも遮断した状態 (無課金)
- 請求先アカウントがあり、普通に使っている場合 (課金)
-
GCEなどのマネージVM管理は2以降でないと使えない。
-
本来Google Cloud Datalabなどの分析環境はGCEが必要なため、GCEが使えなければ利用できない。
-
BigQuery、CloudShell、CloudStorage、CloudFunctions、Firebaseは1で利用可能なため、こちらを利用していきます。
-
Google CloudShellと呼ばれる1ユーザ1VMの「プロジェクト操作用VM」に、無理やりDockerでDatalabをデプロイして使うのが今回の趣旨になります。
CloudShellを開く
https://console.cloud.google.com/cloudshell/editor
蛇足
-
クラウドシェルマシン(VM)は一時的なものであり、約30分インタラクティブに使用しないとホームディレクトリ以外のVMのファイル状態がリセットされます。
-
システム全体の変更はこれを超えて継続することはありません。
-
ホームディレクトリは1ユーザ共通(プロジェクトを跨いでも同期)で、5GBまでのデータを格納できます。
-
クラウドシェル サービスにはSLAは適用されません。(いつ落ちても文句は言えません)
-
マシンタイプはg1-small相当
-
1 基の仮想 CPU と 1.70 GB のメモリを備えたマシンタイプ。
-
Unixbenchは1010スコア程度
-
初期状態だとOrion(ソースエディタ&ファイル管理)で隠しファイルが表示されません。
-
気になる場合は歯車ボタン->GENERAL->FILES->Filtered Resourcesから「
, .*
」の記述を消すことで表示できます。
DockerでGoogleDatalabローカル版をCloudShellにインストールする
- 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秒)
Google Cloud Datalabでやっていく💪
- Google Cloud Datalabとは
- 「ソースコードを書くとその場で実行して、結果を一枚のマークダウンにまとめて表示できる」というデータ分析開発者が使う環境(Jupyter)を、Googleが拡張したオープンソース分析環境のこと。
蛇足
Jupyterには下記3つの大元プロジェクトがある。
- Jupyter Notebook : 本家。Pythonのソースコードをその場で実行できるメモ帳ソフトウェア。
- Jupyter Lab:本家に代わる最新版。タブUI等が入った。
- Jupyter Hub:本家を複数人で使えるようにユーザ制御などが入ったもの。
Google Cloud DatalabはNotebookを拡張して、UIを解りやすくし、マジックコマンドを増やしたもの。
- マジックコマンド:Python以外のソースコードを書けたり、コマンドを実行できたりするもの。
- 本家マジックコマンド:http://ipython.readthedocs.io/en/stable/interactive/magics.html
- Datalab拡張コマンド1:http://googledatalab.github.io/pydatalab/datalab.magics.html
- Datalab拡張コマンド2:http://googledatalab.github.io/pydatalab/google.datalab%20Commands.html
CloudShellからGoogleDatalabを開く
- 開き方
- https://console.cloud.google.com/cloudshell/editor ページ右上の「ウェブでプレビュー」ボタンから、ポートを8081に変更して開く
-
https://console.cloud.google.com/cloudshell/editor ページ下側の黒い部分に「
Open your browser to http://localhost:8081/ to connect to Datalab.
」というテキストが流れるので、localhost:8081 をクリックすると勝手にlocalhostを専用URLに解釈し直して別タブで開く
- 初回は開く際に10秒ほどかかります。
Notebookを開く
'Hello!' 環境構築 完了🎉
- 下記が記載されているテキストフォームを選択する。
# Code cell ready to be run...
print('Hello!')
- この入力欄を選択しつつ、Shiftキーを押しながらエンターを押す。
- 入力枠が次に移動する、そのまま待機
- 1秒ほどで実行中のローディングバーが表示され、2秒ほどで
Hello!
がプリントされる。 - これでPython実行環境の準備が完了
GCPプロジェクトとの疎通確認を行う (失敗でOK)
- ページ上部の「
<> Add Code
」を押し、入力欄を表示させ、下記内容を入力する。 - sqlマジックコマンド
%sql
SELECT 1;
- 入力したらShiftキーを押しながらエンターを押す。
- 1秒ほどで実行中のローディングバーが表示され、2秒ほどで結果が帰ってくる。
- まだプロジェクトに接続していないため、プロジェクトが見つからないというエラーが出れば正常。
- (プロジェクト接続後にもう一度繋がるか試し直します。)
- コードをコピー&ペーストする際、
SELECT 1;
の前 (行頭) に空白が入っていると、正しく実行されないので注意が必要。
GCPプロジェクトと接続を行う
-
プロジェクト一覧を表示する
-
projectsマジックコマンド
-
%projects list
-
上記コマンドで作成済みのプロジェクトidが表示される。idをコピーペーストして接続する
-
projectsマジックコマンド
-
%projects set ${PROJECT_ID}
蛇足
- 本来Datalabローカル版はGCPプロジェクト接続のために、Datalab画面右上のメニューからのGoogleユーザサインインが必要。
- しかし、CloudShellは内部的にユーザ情報を保持しているためサインインが不要となる。
GCPプロジェクトとの疎通確認を行う
- sqlマジックコマンド
%sql
SELECT 1;
- 結果が表示されればOK、BigQueryで
SELECT 1;
が実行されている。
Notebookの変更を保存して、別のNotebookを開く
-
Ctrl-S
を実行し、ファイルの変更を保存する。 - 画面左上の「Google Cloud Datalab」のボタンを押し、ファイル一覧へ戻る。
-
datalab
ディレクトリ、docs
ディレクトリを開き、Hello World.ipynb
のファイルがあるページに行く - ここで、「+ Notebook」ボタンを押し、新規Notebookを新しいタブで開く
Googleが公開しているオープンデータを表示してみる
- 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
サイトの接続方法・端末種類でグルーピングした後に、更にコンテンツのファーストペイントスピードでグルーピングし、その中で割合が多かったものを表示。 - つまり、各サイトの大体のファーストペイントの速度を追っています。
- コード内容(クエリ)に大きな意味はありません。
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頃に終わっていることが多いことが視覚化される
WIP
この記事で更に言及したい・できそうなこと
- コードレスに分析が出来るように、コピペテンプレート(ipynb)を公開する
- データの追加方法
- BigQueryデータ
- Google Analyticsからのデータ
- CSVファイル
- Google Cloud Storage
- 外部公開(http)プログラムとの連携
- GAE
- Cloud Functions
- Firebase etc...
- Dockerの再起動・終了方法
- 環境のリセット方法
- Notebookの共有方法
- Git管理方法
データ分析手法をまとめたipynbの公開
- 決定木
- ランダムフォレスト
- k近傍
- 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