Google BigQueryのデータをExploratoryを使って分析してみる

# Google BigQueryのデータをExploratoryを使って分析してみる


![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/dbe938e4-7570-5cdf-d3ba-8201aac69551.png)

ペタバイト規模のデータでもSQLで高速にクエリできる[Google BigQuery](https://bigquery.cloud.google.com/?hl=ja)は、エンタープライズ、スタートアップなどを含め多くの企業でアナリティクスデータウェアハウスとしての確固たる地位を築いています。今日は[Exploratory](https://ja.exploratory.io/) Desktopを使って、Google BigQueryにアクセスし、データを取得し、簡単に分析しはじめる方法について見てみましょう。


#  始める前に

これまでにGoogle BigQueryをお使いでない場合、まず事前準備としてGoogle Cloud Platformでプロジェクトを作成し、Google BigQueryでデータセットを作成する必要があります。

###### 事前にお使いのGoogleアカウントに請求用のクレジットカード情報を入力しておく必要があります。

## Google BigQueryのプロジェクトを作成する

[Google Cloud Platform Console](https://console.cloud.google.com/)にアクセスし、新規にプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/66b61946-a06c-2d06-e7d4-c73740dd1a6c.png)

プロジェクト名を入力し、Createボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/557ba882-aa7c-3cbe-92a7-c858484de461.png)

## Google BigQueryでデータセットを作成する

次に[Google BigQuery Web UI](https://bigquery.cloud.google.com/)にアクセスし、データセットを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/aba61085-e888-c059-7467-4c936de7ba5a.png)


データセット名を入力してOKをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/b0225a45-1675-7189-1e64-d5a1a3f859ed.png)


## Google Cloud Storageのバケットを作成する (オプショナル)

Google BigQuery側で実行したクエリの結果が比較的大きい際に、Google Colud Storage経由でダウンロードのスピードを速くすることができます。このオプションを使うには、事前にGoogle Cloud Storageにバケット(Bucket)を作成しておきます。

[Google Cloud Storage Browser](https://console.cloud.google.com/storage/browser)にアクセスし、`Create Bucket`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/c10ec182-4566-1ed7-cfbf-0bd8fd997514.png)


Bucketの名前を入力して、`Create`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/ded38c10-567a-306f-3901-d24d4bda625a.png)

# ExploratoryでGoogleBigQueryの設定

プロジェクトのヘッダーメニューから、`Google BigQuery`を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/ad62abe2-1cdb-e19a-26b9-3f9fc2d7ba74.png)


すると、Googleのアカウントを選択する画面がブラウザで起動しますので、BigQueryにアクセスするのに使うアカウントを選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/891c312e-92bb-e7d4-2bfe-573270b6d2f0.png)


次に、ExploratoryがGoogle BigQueryにアクセスするのに必要な権限の認証用の画面がブラウザで表示されるので、`ALLOW`ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/3a466a01-43c6-5995-92f0-cd73b124680f.png)


すると、Exploratory DesktopのGoogle BigQueryの詳細設定ダイアログが開きます。先ほど、作ったプロジェクトとデータセットと、(作ってある場合は)バケットを選択し、OKボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/7d7dcd4d-e42d-9b38-49e7-2c47d3706681.png)


# GoogleBig Queryからデータを取ってくる

Exploratory Desktopで新規にプロジェクトを作成し、(または既存のプロジェクトをオープンし)、データフレームのラベルの隣の、プラス(+)ボタンをクリックします。そして、`データベースデータ`を選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/86a0caa2-e1df-d3dc-cd8b-29ab2f076a12.png)


データソースの選択ダイアログで、Google BigQueryを選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/4ad43098-782b-fa96-9b0c-5de66d18e22f.png)


すると、データインポートダイアログが開くので、ここでSQLを書いて、`データの取得`　ボタンをクリックすると、データをプレビューできます。

今回はデモのため、Google BigQuery側ですでに用意されている[サンプル](https://cloud.google.com/bigquery/sample-tables)、アメリカで生まれた新生児の情報を格納している[natality](https://bigquery.cloud.google.com/table/bigquery-public-data:samples.natality)テーブルを使ってみましょう。生まれた子供の体重、生まれてくるまでの妊娠期間、州、母親の人種、母親の年齢、タバコを吸うかどうかなどのデータを取得するために、以下のクエリーを実行すると、11.05GBのデータに対して処理が走り、クエリーの結果の約640万行のうち、200行分だけプレビューしていることがわかります。ちなみに検索条件を2003年以降にしているのは、タバコを吸うかどうかは2003年からしかデータがないからです。また死産のケースは取り除いてます。

```sql
SELECT
  weight_pounds, 
  state, 
  year, month, day 
  child_race, plurality, 
  mother_race, mother_age, 
  cigarette_use, cigarettes_per_day,
  alcohol_use, drinks_per_week, 
  father_race,
  father_age,
  is_male,
  gestation_weeks
FROM
  [bigquery-public-data.samples.natality]
WHERE state is NOT NULL
AND gestation_weeks is NOT NULL
AND year >= 2003
AND born_dead = 0
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/9aca74f5-574e-c248-aef9-e889df63c704.png)


またお使いのPCのメモリのサイズによってはエラーが出る場合があるので、データサイズを絞ってExploratoryに取り込んでみましょう。例えば、100万行にサンプリングその場合は上のSQLの最後に`AND RAND() > 1000000 / 6141662` を追加すると6,141,662行から約100万行を[サンプリング](https://stackoverflow.com/questions/23375456/random-sampling-in-google-bigquery)することができます。 ここで、6141662は元のクエリーで返ってくる行数、1000000がサンプル後の大体の件数です。
SQL分にこのサンプリング用の条件を追加して、

```sql
SELECT
  weight_pounds, 
  state, 
  year, month, day 
  child_race, plurality, 
  mother_race, mother_age, 
  cigarette_use, cigarettes_per_day,
  alcohol_use, drinks_per_week, 
  father_race,
  father_age,
  is_male,
  gestation_weeks
FROM
  [bigquery-public-data.samples.natality]
WHERE state is NOT NULL
AND gestation_weeks is NOT NULL
AND year >= 2003
AND born_dead = 0
AND RAND() > 1000000 / 6141662
```


![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/c1d05b00-0f2c-fa1d-2613-f007bb330053.png)



`データの取得ボタン`を押して、データ件数が絞り込まれたのを確認し、
`インポート`ボタンをクリックすると、サンプリング後のクエリーの実行結果の全件をExploratoryに取り込むことができます。このクエリの結果を取り込む際には、データを圧縮してインポートできる`Import via Google Cloud Storage`オプションの方が速いので、`Import via Google Cloud Storage`ボタンをクリックします。

すると、サマリビューでExploratoryに約100万行のデータがインポートされたことがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/5c4622cb-f229-e4a0-ae36-9a4899114afd.png)

# データの可視化

まずは、産まれてきた新生児の体重の中央値をアメリカの地図の上に表示してみましょう。すると、北部の方が南部よりも色が濃い(体重の中央値が大きい)傾向があるのがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/7b9d87c4-0459-33c6-8046-d33c52947064.png)


# アナリティクス：何が早産に影響をおよぼすのか？

さて、インポートしたデータを見ると、妊娠何週目で産まれたきたかというのを記録している`gestation_weeks`というカラムがあるので、ヒストグラムにして分布をみてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/71bbbf7f-4ff7-c0d3-3c5d-a13a00cc4edc.png)


すると、割合は少ないですがかなり低い数字の週のところまで分布しているのが、分かります。一般に、妊娠37週前に産まれてくると[早産](http://www.jsog.or.jp/public/knowledge/souzan.html)となるため、`gestation_weeks`を元に、37週目前ならTRUE (早産)、後ならFALSE(早産でない)というカラムを作っておいて、色に割り当てています。

では早産になるかどうかに、どの変数(カラム)が影響を持っているのでしょうか？これを知るために変数重要度アナリティクスを使って分析してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/863c2431-221d-daff-66fa-d84ad3e8a8fc.png)


すると、双子かそれ以上(plurarity)、母親の年齢(mother_age)、父親の年齢(father_age)といった変数が早産であるかどうかということにおよぼす影響度が他に比べて高いことがわかります。すっかり、アルコールやタバコの利用が影響高いのかと思っていただけに意外です。

では、この結果を確認するために、一番影響度の大きい`plurarity` を使って`gestation_week`の箱ひげ図をみてみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/4d0a19c8-433f-4780-de81-e094a80253f1.png)


すると、確かに双子、三つ子となるにつれて分布が早い週にシフトしていることが確認できました。

なお、変数重要度のアナリティクスに関しての詳細は、こちらに、うちのCEO、西田が作った簡単な[ビデオ](https://www.youtube.com/watch?v=TBtdUcntCpI&t=2s)があるのでご覧ください。

# まとめ

今日はGoogle BigQueryのデータをSQLを書いてExploratoryの中にインポートして、さくっと可視化とアルゴリズムを使った分析をおこなってみました。最初は、どうやってBigQueryのデータをExploratoryに取り込むのかをみなさんに知っていただこうと思って、How-to的なものを書く予定でしたが、変数重要度アナリティクスを使うことで、思わぬインサイトが得られてしまいました！；）

まだExploratory Desktopをお持ちでない場合は、[こちら](https://exploratory.io/?utm_campaign=bigquery&utm_medium=blog&utm_source=qiita)から30日間無料でお試しいただけます。

# 注意: データインポートのサイズの制限
2017/11/18 現在、Exploratory Desktopの不具合のために、クラウドストレージ経由で巨大なサイズのデータをインポートすると、以下のエラーでインポートできないことがあります。修正は次のパッチに含まれますが、それまでの間はSQLクエリのwhere句を追加することで、インポートするデータのサイズを絞ってお試しください。

```r
Error in read_tokens_(data, tokenizer, col_specs, col_names, locale_, : ignoring SIGPIPE signal
```

目安としては、bigquery-public-data.samples.natalityでは100万行でお試しいただけます。