<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BigQuery &#8211; uxmeetsdata.com</title>
	<atom:link href="https://uxmeetsdata.com/category/tools/bigquery/feed/" rel="self" type="application/rss+xml" />
	<link>https://uxmeetsdata.com</link>
	<description>UXとデータによる価値創発メディア</description>
	<lastBuildDate>Mon, 03 Jun 2024 07:01:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<item>
		<title>BigQuery ML 試し打ち #04</title>
		<link>https://uxmeetsdata.com/bigquery-ml-trial-04/</link>
				<pubDate>Sun, 11 Aug 2019 11:00:26 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=12598</guid>
				<description><![CDATA[クラスターごとに特徴量を集計。 BigQuery MLと総合ECサイトの会員の購買履歴データを用いた会員のクラ...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-ml-trial-04/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png" alt="" class="wp-image-10864" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>クラスターごとに特徴量を集計。</strong></h2>



<p>BigQuery MLと総合ECサイトの会員の購買履歴データを用いた会員のクラスタリングを試みていますが、前回「<a href="https://uxmeetsdata.com/bigquery-ml-trial-03/">BigQuery ML 試し打ち #03</a>」でモデルの作成まで完了したので、今回は<strong>モデルの可視化</strong>と<strong>予測結果の出力</strong>を行います。</p>



<p>可視化するには、クラスターと特徴量のクロス集計表にする必要があります。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。このクエリ結果をデータセット「DE」に「sum_clusters_bqml」という名前で保存します。</p>



<script src="https://gist.github.com/crosshack/621a19d54708d0f6082094ccdc7f5857.js"></script>



<h2><strong>モデルを可視化する。</strong></h2>



<p>「sum_clusters_bqml」テーブルをTableauで可視化します。クラスターIDを［行］、各説明変数を［列］シェルフにそれぞれ設定すると、以下のようなビューが表示されます。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/08/xmd_bq_ml_4a-1024x617.png" alt="" class="wp-image-12605" width="480" height="289" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/08/xmd_bq_ml_4a-1024x617.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/08/xmd_bq_ml_4a-300x181.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/08/xmd_bq_ml_4a-768x463.png 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>クラスターごとの特徴を見ると、クラスターID:6は女性のみ、平均年齢は30歳程度、主に「エレクトロニクス・コンピューター」を購入しているセグメント、クラスターID:9は男性80%、平均年齢は40歳程度、主に「本・聞く本」「映画・音楽・ゲーム」「エレクトロニクス・コンピューター」を購入しているセグメント、などがわかります。また、年齢についてもクラスターごとにばらつきがあり、クラスターID:2は年齢層がやや高め、クラスターID:10は年齢層がやや低めなどの特徴があります。これらは「<a href="https://uxmeetsdata.com/clustering-howto-04/">クラスター分析入門</a>」で見られた特徴とは異なることがわかります。</p>



<h2><strong>どのクラスターかを予測する。</strong></h2>



<p>続いて、作成したモデルを使って、特定の特徴をもつ会員がどのクラスターに分類されるかの予測を行い、結果を出力します。それにはBigQuery MLで用意されている<strong>ML.PREDICT</strong>という関数を使用し、以下の構文で記述します。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>出力したい変数</em>
<strong>FROM</strong> <strong>ML.PREDICT</strong>(
  MODEL <em>モデル名</em>
  , (
    <strong>SELECT</strong> *
    <strong>FROM</strong> <em>機械学習用データテーブル</em>
    <strong>WHERE</strong> <em>予測対象の会員の条件</em>
  )
)</pre>



<p>ではまず、男性で「本・聞く本」「映画・音楽・ゲーム」「エレクトロニクス・コンピューター」の購買経験がある会員がどのクラスターに分類されるかを予測します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/59969c9e18da8c5356b1e81686ba9d2c.js"></script>



<p>この結果から、すべての会員がクラスターID:9として予測されることがわかります。これはさきほど可視化したモデルと完全に一致します。</p>



<p>続けて、女性で「エレクトロニクス・コンピューター」の購買経験がある会員がどのクラスターに分類されるかを予測します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/badfa38bc8faf4dbca4f49ae951bcf73.js"></script>



<p>この結果から、約90%の会員がクラスターID:6として予測されることがわかります。これはさきほど可視化したモデルとほぼ一致しますが、残りの約10%の会員がクラスターID:2として予測されています。それらの会員の特徴を見ると、比較的年齢の高い会員が多いように見受けられます。これはモデルの可視化結果で見た、クラスターID:2の年齢層がやや高めという評価と一致します。</p>



<p>そこで、年齢を20代から40代に限定した場合に、会員がどのクラスターに分類されるかを予測します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/a3825e5dd408600cba3a9c0270cd91cc.js"></script>



<p>この結果から、すべての会員がクラスターID:6として予測されることがわかります。これはさきほど可視化したモデルと完全に一致します。</p>



<p>BigQuery MLと総合ECサイトの会員の購買履歴データを用いた会員のクラスタリングを試みをしましたが、BigQuery上で完結して簡単に実現できることがわかりました。現時点で扱えるモデルは線形回帰・ロジスティック回帰・k 平均法クラスタリングのみですが、今後は協調フィルタリングやTensorFlowを用いたディープニューラルネットワークなど扱えるモデルも増えていくことが予定されているので、期待して待ちたいと思います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQuery ML 試し打ち #03</title>
		<link>https://uxmeetsdata.com/bigquery-ml-trial-03/</link>
				<pubDate>Sat, 10 Aug 2019 11:00:16 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=12532</guid>
				<description><![CDATA[SQLによるクラスタリング。 BigQuery MLは、Googleが提供するデータウェアハウス（Data W...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-ml-trial-03/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png" alt="" class="wp-image-10864" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>SQLによるクラスタリング。</strong></h2>



<p><strong>BigQuery ML</strong>は、Googleが提供する<strong>データウェアハウス（Data Warehouse：DWH）</strong>である<strong>Google BigQuery</strong>上にて<strong>機械学習（Machine Learning：ML）</strong>を可能とするクラウドサービスです。最大の特徴は、モデルの作成から評価や予測までをBigQueryと同様の<strong>標準SQLによるクエリ形式</strong>で行う点です。これにより、データの準備を含めた機械学習のすべてのプロセスをBigQuery上でSQLのみで完結することが可能となり、作業効率やセキュリティの面で大きなメリットが得られます。</p>



<p>前回の「<a href="https://uxmeetsdata.com/bigquery-ml-trial-01/">BigQuery ML 試し打ち</a>」ではロジスティック回帰モデルを用いて、総合ECサイトの会員の継続予測を行いました。今回は先日ベータ版がリリースされた<strong>k平均法クラスタリング</strong>のモデルの試し打ちがてら、例によって「<a href="https://uxmeetsdata.com/data-ethnography-howto-01/">データエスノグラフィ入門</a>」と連動し、総合ECサイトの会員のクラスタリングを行なってみようと思います。</p>



<p>なお、同じテーマを「<a href="https://uxmeetsdata.com/clustering-howto-01/">クラスター分析入門</a>」で扱っており、<strong>クラスター分析（Cluster Analysis）</strong>あるいは<strong>クラスタリング（Clustering）</strong>とは何か、<strong>階層型</strong>と<strong>非階層型</strong>の違いは何かなどの詳細はそちらに詳しいので、ここでは省略します。また分析ツールについては、そこでは<strong>Google Cloud Datalab</strong>を用いましたが、ここでは<strong>BigQuely ML</strong>を用いるため、どちらも試しながら両方の違いを検証するのもよいでしょう。</p>



<h2><strong>機械学習用のデータと環境を準備。</strong></h2>



<p>それではBigQuery MLを用いたクラスタリングを始めましょう。分析を進める前に、まずは分析の背景と目的を整理します。</p>



<p>あなたは、とある総合ECサイトの責任者です。ECサイトでは、<strong>F2転換率</strong>が重要であると言われています。この”F”は<strong>購買頻度（Frequency）</strong>のことで、F2転換率とは初回購買から二回目購買への<strong>転換率（Conversion Rate）</strong>を意味します。一般的に、新規会員の獲得よりも、既存会員のリピート購買促進のほうがコスト効率が高いため、F2転換率は重要な指標となります。とはいえF2転換した会員が、その後も継続的に購買してくれる、いわゆる優良会員になるとは限りません。</p>



<p>そこで今回の分析目的を「<strong>優良化する会員の行動特性を、購買履歴データから把握する</strong>」とします。なおそこには、まだ<strong>優良化していな会員を意図的に優良化するためのヒント</strong>があることは言うまでもありません。</p>



<p>分析対象データは、とある総合ECサイトの会員の購買履歴データとし、概要は以下のとおりです。</p>



<ul><li>種類：総合ECサイトの会員の購買履歴</li><li>期間：2005年1月〜2013年12月（9年間）</li><li>会員数：639,777人</li><li>購買数：7,599,650件（平均11.9件/人）</li></ul>



<p>データソースは以下の３つを使用します。なお、こちらはすでにBigQueryに投入済みとします。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td>データソース</td>
<td>変数</td>
<td>ダウンロード</td>
</tr>
<tr>
<td style="background-color: #eee;">会員マスタ<br>mst_members</td>
<td>会員ID, 年齢, 性別, 居住地など</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/mst_members.csv">［↓］105MB﻿</td>
</tr>
<tr>
<td style="background-color: #eee;">商品マスタ<br>mst_products</td>
<td>商品ID, 商品カテゴリなど</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/mst_products.csv">［↓］53MB</td>
</tr>
<tr>
<td style="background-color: #eee;">購買履歴<br>trx_orders</td>
<td>会員ID, 商品ID, 注文日, 価格</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/trx_orders.csv">［↓］698MB</td>
</tr>
</tbody>
</table>



<p>行動特性の分析を進める中で、<strong>購買商品カテゴリ数</strong>と優良化との間に相関があることがわかりました。（※「<a href="https://uxmeetsdata.com/data-ethnography-howto-04/">データエスノグラフィ入門 #04</a>」を参照）これは、<strong>新たな商品カテゴリを提案することが優良化につながる</strong>可能性を示唆しています。ただし、闇雲に提案するよりも、<strong>類似する会員セグメントの併売傾向</strong>と照らし合わせ、未購買商品カテゴリを提案するほうが効果が高いと考えられます。そこでクラスター分析によりそれを明らかにします。</p>



<p>まずはクラスタリングに用いる説明変数を定義します。説明変数を定義することを<strong>変数選択</strong>や<strong>特徴選択</strong>といいますが、非常に難しい問題なので、ここでは深く触れず、ひとまず「性別・年齢・購買商品カテゴリ」とします。</p>



<p>なお、クラスタリングにおいて<strong>強い相関をもつ変数の存在は冗長で無意味であり、予めどちらかを除外する</strong>必要がありますが、これらの各変数間に相関性が見られないことは確認済みとします。（※「<a href="https://uxmeetsdata.com/clustering-howto-02/">クラスター分析入門 #02</a>」を参照）</p>



<p>次にクラスタリング用のデータを用意するわけですが、ここでひとつ前処理が必要になります。クラスタリングでは<strong>要素間の距離を類似度とみなす</strong>ことで類似性を分析するのですが、距離を測定するためには変数が数値化されている必要があります。しかしながら、性別や購買商品カテゴリは質的変数であるため、そのままでは数値として扱うことができません。そこで<strong>ダミー変数（Dummy Variable）</strong>に置き換えます。また、年齢は量的変数であるため、説明変数として扱うことが可能ですが、クラスタリングに使うには他の説明変数と値の範囲を揃える必要があります。そこで<strong>正規化（Normalization）</strong>を行います。ダミー変数と正規化については「<a href="https://uxmeetsdata.com/clustering-howto-02/">クラスター分析入門 #02</a>」に詳しいので省略します。</p>



<p>以上を踏まえ、クラスタリング用のデータを以下のスキーマ定義で作成します。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td>変数</td>
<td>値</td>
</tr>
<tr>
<td style="background-color: #eee;">性別（gender）</td>
<td>男性：0、女性：1</td>
</tr>
<tr>
<td style="background-color: #eee;">年齢（age）</td>
<td>年齢の1/100</td>
</tr>
<tr>
<td style="background-color: #eee;">洋服の購買経験あり（is_buy_clothing）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">玩具の購買経験あり（is_buy_toy）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">スポーツ用品の購買経験あり（is_buy_sports）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">家庭用品の購買経験あり（is_buy_home）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">美容用品の購買経験あり（is_buy_beauty）</td>
<td>偽：0、真：1</td>
</tr>

<tr>
<td style="background-color: #eee;">本の購買経験あり（is_buy_books）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">自動車用品の購買経験あり（is_buy_automotive）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">映画の購買経験あり（is_buy_movie）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">電化製品の購買経験あり（is_buy_electronics）</td>
<td>偽：0、真：1</td>
</tr>
</tbody>
</table>



<p>この定義に従ってBigQueryで分析用のテーブルを作成します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。このクエリ結果をデータセット「DE」に「sum_members_cls_ non」という名前で保存します。これで分析用のデータと環境は整いました。</p>



<script src="https://gist.github.com/crosshack/bf6c976413ae7ee48e160cfba817a966.js"></script>



<h2><strong>モデルを作成する。</strong></h2>



<p>データの準備が整ったので、クラスタリングを進めて行きます。まずはモデルの作成を行います。モデルの作成には、BigQuery MLで用意されている<strong>CREATE MODEL</strong>という関数を使用し、以下の構文で記述します。なおクラスタリングは教師なし学習のため、正解を示す目的変数は存在せず、また訓練データと評価用データに分割する必要はありません。</p>



<pre class="wp-block-preformatted"><strong>CREATE OR REPLACE MODEL</strong> <em>データセット名</em>.<em>モデル名 </em>
<strong>OPTIONS</strong>( 
  model_type = <em>使用するモデリングタイプ</em>
  ,num_clusters = <em>クラスター数</em>
  ,standardize_features = <em>真偽値</em>
) <strong>AS</strong> (
  <strong>SELECT</strong> <em>説明変数</em>, ...
  <strong>FROM</strong> <em>機械学習用データテーブル</em>
)</pre>



<p>［model_type］には<strong>k平均法クラスタリング</strong>を示す［kmeans］を指定します。クラスター数を指定するオプションの［num_clusters］には妥当性が確認されているである10を指定します。（※「<a href="https://uxmeetsdata.com/clustering-howto-03/">クラスター分析入門 #03</a>」を参照）また、［standardize_features］は正規化を行うかどうかのオプションで、すでに処理済みですがTRUEを指定しておきます。なお、初期設定はTRUE であるため省略可能です。</p>



<p>BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。なおこのクエリ結果はデータセット「DE」に「mdl_members_cls」という名前で自動的に保存されます。</p>



<script src="https://gist.github.com/crosshack/43d096383f3cf185c468545f1e01cb81.js"></script>



<p>これでモデルの作成は完了です。次回は作成したモデルの可視化や予測結果の出力を行います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQuery ML 試し打ち #02</title>
		<link>https://uxmeetsdata.com/bigquery-ml-trial-02/</link>
				<pubDate>Thu, 20 Jun 2019 12:21:54 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=10974</guid>
				<description><![CDATA[モデルを評価する。 BigQuery MLと総合ECサイトの会員の購買履歴データを用いて、一年間の購買傾向から...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-ml-trial-02/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png" alt="" class="wp-image-10864" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>モデルを評価する。</strong></h2>



<p>BigQuery MLと総合ECサイトの会員の購買履歴データを用いて、一年間の購買傾向から、翌年も継続して購買する会員を予測するという試みをしていますが、前回「<a href="https://uxmeetsdata.com/bigquery-ml-trial-01/">BigQuery ML 試し打ち #01</a>」で予測モデルの作成まで完了したので、今回は<strong>モデルの評価</strong>と<strong>予測結果の出力</strong>、さらに<strong>重みの分析</strong>を行います。</p>



<p>まずは予測モデルの評価を行いますが、それにはBigQuery MLで用意されている<strong>ML.EVALUATE</strong>という関数を使用し、以下の構文で記述します。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> * 
<strong>FROM</strong> <strong>ML.EVALUATE</strong>(
  MODEL <em>モデル名</em>
  , (
    <strong>SELECT</strong> <em>目的変数</em>, <em>説明変数</em>, ...   
    <strong>FROM</strong> <em>機械学習用データテーブル</em>
    <strong>WHERE</strong> <em>評価データを指定</em>
  )
)</pre>



<p>モデル作成時と同様、目的変数は列名を「label」で指定するルールのため「retention」をそれに置き換えます。説明変数には「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」を指定するため、それ以外は除外します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/db1066b79c4267bc6a946ac6c24ba1a6.js"></script>



<p>すると、クエリ結果に以下のような表が出力されるかと思います。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td style="width: 100px;">項目</td>
<td style="width: 200px;">値</td>
</tr>
<tr>
<td style="background-color: #eee;">precision</td>
<td style="text-align:left;">0.8941798941798942</td>
</tr>
<tr>
<td style="background-color: #eee;">recall</td>
<td style="text-align:left;">0.5014836795252225</td>
</tr>
<tr>
<td style="background-color: #eee;">accuracy</td>
<td style="text-align:left;">0.7704517704517705</td>
</tr>
<tr>
<td style="background-color: #eee;">f1_score</td>
<td style="text-align:left;">0.6425855513307985</td>
</tr>
<tr>
<td style="background-color: #eee;">log_loss</td>
<td style="text-align:left;">0.5168232647120398</td>
</tr>
<tr>
<td style="background-color: #eee;">roc_auc</td>
<td style="text-align:left;">0.832985</td>
</tr>
</tbody>
</table>



<p>これらの項目と値の意味を簡単に解説しますが、その前に二項分類の予測と結果のマトリクスについて理解をしておく必要があります。それは以下の表で整理できます。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="background-color: #eee;">
<td rowspan="2" colspan="2"></td><td colspan="2">結果</td>
</tr>
<tr style="background-color: #eee;">
<td>TRUE</td><td>FALSE</td>
</tr>
<tr>
<td rowspan="2" style="background-color: #eee;">予測</td><td style="background-color: #eee;">TRUE</td><td>真陽性</td><td>偽陽性</td>
</tr>
<tr>
<td style="background-color: #eee;">FALSE</td><td>偽陰性</td><td>真陰性</td>
</tr>
</tbody>
</table>



<ul><li><strong>真陽性</strong>：TRUEの結果を正しくTRUEと予測</li><li><strong>真陰性</strong>：FALSEの結果を正しくFALSEと予測</li><li><strong>偽陽性</strong>：FALSEの結果を誤ってTRUEと予測</li><li><strong>偽陰性</strong>：TRUEの結果を誤ってFALSEと予測</li></ul>



<p>このマトリクスを基に、評価結果の［precision］［recall］［accuracy］［f1_score］の各項目の意味を以下のように説明することができます。またそれぞれの値は0から1の実数となり、1に近くほど精度が高いことを意味します。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td colspan="2" style="width: 200px;">項目</td>
<td>意味</td>
</tr>
<tr>
<td>precision</td>
<td>適合率</td>
<td>（真陽性）／（真陽性＋偽陽性）</td>
</tr>
<tr>
<td>recall</td>
<td>再現率</td>
<td>（真陽性）／（真陽性＋偽陰性）</td>
</tr>
<tr>
<td>accuracy</td>
<td>正解率</td>
<td>（真陽性＋真陰性）<br>／（真陽性＋真陰性＋偽陽性＋偽陰性）</td>
</tr>
<tr>
<td>f1_score</td>
<td>F値</td>
<td>２×（適合率×再現率）<br>／（適合率＋再現率）</td>
</tr>
</tbody>
</table>



<p>すなわち今回の予測モデルの評価結果としては、<strong>正解率は77%</strong>であり、TRUEと予測したものが結果としてTRUEであった確率を示す<strong>適合率は89%</strong>と非常に高いものの、結果が TRUEであるものを正しくTRUEと予測した確率を示す<strong>再現率は50%</strong>に止まった、ということになります。</p>



<h2><strong>継続か否かを予測する。</strong></h2>



<p>続いて、作成した予測モデルを使って、評価データに対する「継続か否か」の予測を行い、結果を出力します。それにはBigQuery MLで用意されている<strong>ML.PREDICT</strong>という関数を使用し、以下の構文で記述します。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>出力したい変数</em>
<strong>FROM</strong> <strong>ML.PREDICT</strong>(
  MODEL <em>モデル名</em>
  , (
    <strong>SELECT</strong><em><strong> *</strong></em>
    <strong>FROM</strong> <em>機械学習用データテーブル</em>
    <strong>WHERE</strong> <em>評価データを指定</em>
  )
)</pre>



<p>構文としては評価の場合とおおむね同じですが、機械学習用データテーブルから抽出する項目には、最終的に出力したい変数を含めておく必要があります。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/0cfb3eed49c42fdb4d98a1759c27061c.js"></script>



<p>すると、以下のスキーマのテーブルが出力されます。レコードは会員ID単位で、predicted_labelが<strong>予測結果</strong>となります。predicted_label_probs.probは真偽それぞれの予測の確からしさの値であり、高いほうが予測結果として選択されます。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td>フィールド名</td>
<td>概要</td>
<td>タイプ</td>
</tr>
<tr>
<td style="background-color: #eee;">predicted_label</td>
<td>予測結果</td>
<td>真偽</td>
</tr>
<tr>
<td style="background-color: #eee;">predicted_label_probs.label</td>
<td>予測の確からしさの項目</td>
<td>真偽</td>
</tr>
<tr>
<td style="background-color: #eee;">predicted_label_probs.prob</td>
<td>予測の確からしさの値</td>
<td>実数（0〜1）</td>
</tr>
<tr>
<td style="background-color: #eee;">member_id</td>
<td>会員ID</td>
<td>整数</td>
</tr>
</tbody>
</table>



<h2><strong>重みを分析する。</strong></h2>



<p>最後に重みの分析を行います。<strong>重み（Weight）</strong>とは結果の決定に対する影響力のことであり、それが大きい説明変数がわかれば、意図する結果を再現しやすくなります。機械学習の目的は、予測結果を導出することでもありますが、重みの大きい説明変数を発見することでもあります。それにはBigQuery MLで用意されている<strong>ML.WEIGHT</strong>という関数を使用し、以下の構文で記述します。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> * 
<strong>FROM</strong> <strong>ML.WEIGHT</strong>(
  MODEL <em>モデル名</em>
  ORDER BY ABS( weight ) DESC
)</pre>



<p>BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



<script src="https://gist.github.com/crosshack/419abf285711bade2bc85387811698f9.js"></script>



<p>すると、クエリ結果に以下のような表が出力されるかと思います。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td>processed_input</td>
<td>weight</td>
<td>category_weights.category</td>
<td>category_weights.weight</td>
</tr>
<tr>
<td>__INTERCEPT__</td>
<td>-1.198761487350279</td>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
</tr>
<tr>
<td>frequency</td>
<td>0.26443061661515105</td>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
</tr>
<tr>
<td>age</td>
<td>-5.464877050426754E-4</td>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
</tr>
<tr>
<td>monetary</td>
<td>1.4273789647951177E-5</td>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
</tr>
<tr>
<td>gender</td>
<td></td>
<td>女性</td>
<td>-0.06224747387551884</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>男性</td>
<td>-0.0016923874680583803</td>
</tr>
<tr>
<td>category</td>
<td></td>
<td>おもちゃ・子供・赤ちゃん</td>
<td>-0.27861305570603795</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>映画・音楽・ゲーム</td>
<td>0.12202359844247163</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>本・聞く本</td>
<td>0.006707035351433535</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>スポーツ・アウトドア</td>
<td>0.02979014651640284</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>エレクトロニクス・コンピューター</td>
<td>-0.04263333605516763</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>美容・健康・食料品</td>
<td>-0.03431735605454703</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>自動車・工業</td>
<td>-0.08863931077413578</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>ファッション・ジュエリー</td>
<td>0.04375393071659543</td>
</tr>
<tr>
<td style="background-color: #eee;"></td>
<td style="background-color: #eee;"></td>
<td>家庭・ガーデニング用品</td>
<td>-0.029685028287024184</td>
</tr>
</tbody>
</table>



<p>重みは、正の場合は値が大きいほど、その変数が目的変数の真値への影響力が強く、逆に負の場合は値が小さいほど、目的変数の偽値への影響力が強いことを意味します。この結果から、やはり<strong>購買金額</strong>（Monetary）と<strong>購買頻度</strong>（Frequency）が目的変数の真値への影響力が強い、すなわち購買金額や頻度が高い会員ほど継続する可能性が高いことがわかります。逆に<strong>年齢</strong>（Age）が目的変数の偽値への影響力が強い、すなわち年齢が高い会員ほど離反する可能性が高いことがわかります。</p>



<p>BigQuery MLと総合ECサイトの会員の購買履歴データを用いて、一年間の購買傾向から、翌年も継続して購買する会員を予測するという試みをしましたが、BigQuery上で完結して簡単に実現できることがわかりました。現時点で扱えるモデルは線形回帰・ロジスティック回帰・k 平均法クラスタリングのみですが、今後は協調フィルタリングやTensorFlowを用いたディープニューラルネットワークなど扱えるモデルも増えていくことが予定されているので、期待して待ちたいと思います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQuery ML 試し打ち #01</title>
		<link>https://uxmeetsdata.com/bigquery-ml-trial-01/</link>
				<pubDate>Wed, 19 Jun 2019 05:10:35 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=10862</guid>
				<description><![CDATA[SQLで機械学習。 BigQuery MLは、Googleが提供するデータウェアハウス（Data Wareho...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-ml-trial-01/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png" alt="" class="wp-image-10864" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/06/xmd_bq_ml-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>SQLで機械学習。</strong></h2>



<p><strong>BigQuery ML</strong>は、Googleが提供する<strong>データウェアハウス（Data Warehouse：DWH）</strong>である<strong>Google BigQuery</strong>上にて<strong>機械学習（Machine Learning：ML）</strong>を可能とするクラウドサービスです。最大の特徴は、モデルの作成から評価や予測までをBigQueryと同様の<strong>標準SQLによるクエリ形式</strong>で行う点です。これにより、データの準備を含めた機械学習のすべてのプロセスをBigQuery上でSQLのみで完結することが可能となり、作業効率やセキュリティの面で大きなメリットが得られます。</p>



<p>現時点で扱えるモデルは<strong>線形回帰</strong>・<strong>ロジスティック回帰</strong>・<strong>k 平均法クラスタリング</strong>のみですが、扱えるモデルは今後増えていくことが予定されています。</p>



<p>ベータ版リリースから一年近くが経過しており、いまさら試し打ちというのも変ですが、一般提供されたのを受けて、復習もかねてその触り心地をまとめておきます。それではBigQuery MLを用いた機械学習を始めましょう。</p>



<p>今回は「<a href="https://uxmeetsdata.com/data-ethnography-howto-01/">データエスノグラフィ入門</a>」と連動し、総合ECサイトの会員の<strong>継続購買の予測</strong>を行うという設定で進めます。分析対象データは、とある総合ECサイトの会員の購買履歴データとし、概要は以下のとおりです。</p>



<ul><li>種類：総合ECサイトの会員の購買履歴</li><li>期間：2005年1月〜2013年12月（9年間）</li><li>会員数：639,777人</li><li>購買数：7,599,650件（平均11.9件/人）</li></ul>



<p>データソースは以下の３つを使用します。なお、こちらはすでにBigQueryに投入済みとします。</p>



<table style="table-layout: fixed; width: 100%;">
<tbody>
<tr style="color: #fff; background-color: #000;">
<td>データソース</td>
<td>変数</td>
<td>ダウンロード</td>
</tr>
<tr>
<td style="background-color: #eee;">会員マスタ<br>mst_members</td>
<td>会員ID, 年齢, 性別, 居住地など</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/mst_members.csv">［↓］105MB﻿</td>
</tr>
<tr>
<td style="background-color: #eee;">商品マスタ<br>mst_products</td>
<td>商品ID, 商品カテゴリなど</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/mst_products.csv">［↓］53MB</td>
</tr>
<tr>
<td style="background-color: #eee;">購買履歴<br>trx_orders</td>
<td>会員ID, 商品ID, 注文日, 価格</td>
<td><a href="https://storage.googleapis.com/xmdcom-data/data-ethnography/trx_orders.csv">［↓］698MB</td>
</tr>
</tbody>
</table>



<p>これらのデータを使用し、<strong>2012年の一年間の購買傾向から、2013年も継続して購買する会員を予測</strong>してみます。</p>



<h2><strong>機械学習用のデータと環境を準備。</strong></h2>



<p>分析を進める前に、まずは分析手法を決めます。売上や継続率などの数値予測の場合は<strong>線形回帰（Linear Regression）</strong>を用いますが、「継続か否か」のような二項分類の場合は<strong>ロジスティック回帰（Logistic Regression）</strong>を用います。</p>



<p>また、予測対象の変数を<strong>目的変数（Objective Variable）</strong>といい、今回は「継続か否か」がそれになります。その結果を決定づける原因となる変数を<strong>説明変数（Explanatory Variable）</strong>といい、機械学習では<strong>特徴量（Feature Value）</strong>とも言います。説明変数は無数に存在しますが、結果の決定に対する影響力を<strong>重み（Weight）</strong>といい、重みの大きい説明変数がわかれば、意図する結果を再現しやすくなります。機械学習の目的は、<strong>予測結果を導出する</strong>ことでもありますが、<strong>重みの大きい説明変数</strong>を発見することでもあります。</p>



<p>説明変数を定義することを<strong>変数選択</strong>や<strong>特徴選択</strong>といいますが、非常に難しい問題なので、ここでは深く触れず、ひとまず「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」とします。なお、集計期間は2012年の一年間とします。</p>



<p>次に、BigQueryで機械学習用のテーブルを用意します。必要なのは会員IDごとの集計データで、そこに<strong>目的変数</strong>と<strong>説明変数</strong>を含めます。さらに、<strong>訓練データ（Training Data）</strong>で<strong>モデルを作成</strong>し、<strong>評価データ（Evaluation Data）</strong>で<strong>モデルを評価</strong>するというプロセスを踏まえるため、データをその二つに分割します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。また、このクエリ結果をデータセット「DE」に「sum_members_ret」という名前で保存します。</p>



<script src="https://gist.github.com/crosshack/22d35a7cd1cb1d5585adc9cd5e6c1369.js"></script>



<p>なお、処理の効率化のために<strong>10%のサンプリング</strong>をしていますが［※1］、これは会員IDを10で割った剰余が0の場合に限定するという意味です。また、<strong>欠損</strong>を除外するために性別がNULLでない会員に限定し［※2］、年齢の<strong>異常値</strong>を除外するために10歳以上90歳未満の会員に限定しています［※3］。さらに、集計期間中の購買がない会員を除外しています［※4］。</p>



<p>SQL内の「retention」が、目的変数である「継続か否か」を指す変数で、最終購買日が2013年以降の会員の場合のみ継続を意味する「TRUE」を、それ以外は離反を意味する「FALSE」を設定します。また「evaluation」が、訓練データと評価データを切り分ける変数で、90%が訓練データ、10%が評価データになるようランダムに振り分けます。もともと10%のサンプリングを行なっているため、会員IDを100で割った剰余が0の場合を評価データとして「TRUE」を、それ以外は訓練データとして「FALSE」を設定します。</p>



<p>ちなみに、説明変数に<strong>購買頻度（Frequency</strong>）や<strong>購買金額（Monetary）</strong>は含めますが、<strong>最終購買日（Recency）</strong>は含めません。これは、目的変数である「継続か否か」自体が最終購買日を基準に定義されるためです。これを含めてしまうと、当然ながら予測精度は自動的に100%になります。</p>



<h2><strong>モデルを作成する。</strong></h2>



<p>データの準備が整ったので、機械学習を進めて行きます。まずは「継続か否か」の予測モデルの作成を行います。モデルの作成には、BigQuery MLで用意されている<strong>CREATE MODEL</strong>という関数を使用し、以下の構文で記述します。</p>



<pre class="wp-block-preformatted"><strong>CREATE OR REPLACE MODEL</strong> <em>データセット名</em>.<em>モデル名 </em>
<strong>OPTIONS</strong>( 
  model_type = <em>使用するモデリングタイプ</em>
) <strong>AS</strong> (
  <strong>SELECT</strong> <em>目的変数</em>, <em>説明変数</em>, ...
  <strong>FROM</strong> <em>機械学習用データテーブル</em>
  <strong>WHERE</strong> <em>訓練データを指定</em>
)</pre>



<p>［model_type］には<strong>ロジスティック回帰</strong>を示す［logistic_reg］を指定します。目的変数は列名を「label」で指定するルールのため「retention」をそれに置き換えます。説明変数には「性別・年齢・購買商品カテゴリ・購買頻度・購買金額」を指定するため、それ以外は除外します。</p>



<p>BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。なおこのクエリ結果はデータセット「DE」に「mdl_members_ret」という名前で自動的に保存されます。</p>



<script src="https://gist.github.com/crosshack/8b049711d87747b45fe9ef495d3336c4.js"></script>



<p>これでモデルの作成は完了です。次回は作成したモデルの評価や予測結果の出力、さらに重みの分析を行います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQueryではじめるSQL #04</title>
		<link>https://uxmeetsdata.com/bigquery-sql-04/</link>
				<pubDate>Sun, 10 Mar 2019 07:35:16 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[DWH]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=3264</guid>
				<description><![CDATA[サブクエリはWITH句。 前回は検索の基本構文であるSELECT文と、集計と正規化の基本構文であるGROUP ...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-sql-04/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png" alt="" class="wp-image-3486" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>サブクエリはWITH句。</strong></h2>



<p>前回は検索の基本構文であるSELECT文と、集計と正規化の基本構文であるGROUP BY句について説明しましたが、今回は<strong>非正規化の基本構文であるJOIN句</strong>を中心に見ていきましょう。</p>



<p>練習用データ「E-Commerce Data」をBigQueryで操作します。なお、BigQueryと練習用データの準備は「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL #01</a>」を参照してください。</p>



<p><strong>非正規化（Denormalization）</strong>とは<strong>データの重複を許容する</strong>ことです。データが重複すると、データの追加・更新・削除における処理が冗長化するため、メンテナンス効率を重視する場合はなるべく排除しますが、処理速度を重視する場合はそれを犠牲にして、あえて非正規化を行います。</p>



<p>練習用データ「E-Commerce Data」は、とあるECサイトの購買履歴データで、各レコードには「CustomerID」（顧客ID）が紐づいているため、各顧客IDをグループとみなし、それぞれの購買回数に基づいた顧客ランクの集計が可能です。</p>



<p>その顧客IDごとの顧客ランクを、購買履歴と合わせて参照したい場合は、購買履歴の各レコードに、該当する顧客IDの顧客ランクを保持しておくと便利です。すなわち非正規化を行うということです。この非正規化を以下の手順で進めます。</p>



<ol><li>購買履歴データから、<strong>顧客IDごとの顧客ランクを集計</strong>する。</li><li>購買履歴データの各レコードに、上記1で集計した<strong>顧客IDごとの顧客ランクの列を結合</strong>する。</li></ol>



<p>このように、前のクエリの出力をもとに後のクエリを行うこと、あるいはその「前のクエリ」のことを<strong>サブクエリ（Subquery）</strong>といいます。サブクエリの記述方法には、後のクエリのFROM句に前のクエリを記述する方法もありますが、構文が視覚的に煩雑になるため、それを回避したい場合に<strong>WITH句</strong>を用います。WITH句を用いたサブクエリの構文は以下のようになります。</p>



<pre class="wp-block-preformatted"><strong>WITH</strong> <em>ビュー名</em> <strong>AS</strong> ( <em>サブクエリ</em> ) <em>クエリ</em></pre>



<p>ちなみに、サブクエリの出力は実体を持たない仮想的なテーブルですが、それを<strong>ビュー（View）</strong>といいます。また、構文中のASは<strong>AS句</strong>といい、ここでは<strong>サブクエリが出力したビューに名前をつける</strong>役割を担います。</p>



<p>前回の「<a href="https://uxmeetsdata.com/bigquery-sql-03/">BigQueryではじめるSQL #03</a>」で行った顧客IDごとの顧客ランクの集計をサブクエリとして、後のクエリに利用できるようWITH句を用いて以下の例文のように記述します。</p>



<script src="https://gist.github.com/crosshack/16ba1a8ef67090854d12a888ae98832d.js"></script>



<h2><strong>列結合による非正規化はJOIN句。</strong></h2>



<p>それでは、購買履歴データの各レコードに、上記で集計した顧客IDごとの顧客ランクの列を結合して、非正規化を行います。このように列方向に結合することを<strong>列結合</strong>といい、列結合による非正規化には<strong>JOIN句</strong>を用います。構文は以下のとおりです。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>列名</em>, <em>列名</em>, … <strong>FROM</strong> <em>テーブル名（ビュー名）</em> <strong>AS</strong> <em>略称</em> <strong>JOIN</strong> <em>テーブル名（ビュー名）</em> <strong>AS</strong> <em>略称</em> <strong>ON</strong> <em>結合条件式</em></pre>



<p>さきほどのサブクエリと組み合わせると、例文は以下のようになります。</p>



<script src="https://gist.github.com/crosshack/bca8816fe5661c1e60460008aa34e267.js"></script>



<p>上記の例文全体の意味は、<strong>テーブル「ECData」（略称「ED」）と顧客ランクの集計結果であるビュー「CRank」（略称「CR」）を、列「CustomerID」が一致する場合に列結合し、列「InvoiceNo」「StockCode」「UnitPrice」「CustomerID」「CustomerRank」を出力する</strong>、となります。青い［実行］ボタンをクリックして、出力結果を確認してみましょう。</p>



<p>なお、例文中のASは<strong>AS句</strong>といい、ここでは<strong>テーブルやビューに略称をつける</strong>役割を担います。略称は必須ではありませんが、つけておくと便利です。というのも、列結合ではテーブル間で列名が重複することが多く、その場合はどのテーブルの列かを「<em>テーブル名</em>.<em>列名</em>」の形で明記する必要があるのですが、テーブル名が長いとSQL文が冗長となり、可読性が損なわれるからです。この例文では「ED.CustomerID」がそれにあたります。</p>



<p>また、列結合には<strong>内部結合</strong>と<strong>外部結合</strong>があります。内部結合は結合条件に合致するレコードが双方にあるものだけを残す結合方式で、<strong>INNER JOIN</strong>を用います。ちなみに、単に<strong>JOIN</strong>と記述するとINNER JOINと同じ意味になります。つまり上記例文のJOINは内部結合となります。</p>



<p>一方で、外部結合は結合条件に合致するものが双方になくても残す結合方式で、<strong>OUTER JOIN</strong>を用いますが、左右どちらも残す場合は<strong>FULL OUTER JOIN</strong>、左のみ残す場合は<strong>LEFT OUTER JOIN</strong>、右のみ残す場合は<strong>RIGHT OUTER JOIN</strong>と、区別して指定する必要があります。</p>



<h2><strong>ビッグデータ分析に便利な構文。</strong></h2>



<p>複数のテーブルを列方向に結合することを列結合というのに対し、行方向に結合することを<strong>行結合</strong>といい、<strong>UNION句</strong>を用います。なお行結合では、<strong>結合するテーブルの列の構成が一致</strong>していることが前提となります。構文は以下のとおりです。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>列名</em>, <em>列名</em>, … <strong>FROM</strong> <em>テーブル名（ビュー名）</em> <strong>UNION</strong> <strong>SELECT</strong> <em>列名</em>, <em>列名</em>, … <strong>FROM</strong> <em>テーブル名（ビュー名）</em> </pre>



<p>ちなみに、上記のように単に<strong>UNION</strong>と記述すると、結合するテーブル間で重複するレコードは削除され、ユニークなものだけが残ります。重複を許容したい場合は<strong>UNION ALL</strong>と記述します。</p>



<p>行結合は、日時で分割して蓄積や集計したレコードを統合する場合などで利用されます。すなわち、ビッグデータ分析には便利な機能です。なお、大量のレコードを日時などで分割して管理することを<strong>パーティショニング</strong>といいます。</p>



<p>この他にも、ビッグデータ分析では<strong>集計関数＋OVER句</strong>をよく用います。これは、通常の集計処理をGROUP BY句を使った正規化状態で行うのに対し、<strong>非正規化状態のまま、特定のグループごとに集計処理を行う</strong>方法です。そのグループを<strong>ウィンドウ（Window）</strong>といい、<strong>PARTITION BY句</strong>で指定します。なお、この場合の集計関数は、分析関数やウィンドウ関数とも呼ばれます。構文は以下のとおりです。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>集計関数</em> <strong>OVER</strong>( <strong>PARTITION</strong> BY <em>列名</em> ) <strong>FROM</strong> <em>テーブル名（ビュー名）</em></pre>



<p>これを利用すれば、購買履歴などの時系列データの集計処理を行う場合に、サブクエリでGROUP BY句を使って集計し、その結果をJOIN句を使って時系列データに列結合する、という煩雑な処理をする必要がなくなり、とても便利です。</p>



<p>なお、時系列データの分析については、別の記事にて詳しく説明する予定なので、UNION句やOVER句の具体的な使い方や例文の紹介はその機会に譲りたいと思います。</p>



<p>また、この「BigQueryではじめるSQL」で触れたもの以外にも、SQLには多くの便利な構文・関数・演算子があります。とりわけBigQueryで利用可能なものについては、GCPの<a rel="noreferrer noopener" aria-label="BigQuery公式リファレンスサイト (新しいタブで開く)" href="https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators" target="_blank">BigQuery公式リファレンスサイト</a>に詳しいため、こちらをご参照されることをお勧めします。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQueryではじめるSQL #03</title>
		<link>https://uxmeetsdata.com/bigquery-sql-03/</link>
				<pubDate>Sat, 09 Mar 2019 07:31:01 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[DWH]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=3028</guid>
				<description><![CDATA[検索はSELECT文。 SQLによる検索の基本構文はSELECT文、集計と正規化の基本構文はGROUP BY句...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-sql-03/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png" alt="" class="wp-image-3486" width="480" height="239" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>検索はSELECT文。</strong></h2>



<p>SQLによる<strong>検索の基本構文はSELECT文</strong>、<strong>集計と正規化の基本構文はGROUP BY句</strong>になりますので、こちらを中心に見ていきましょう。</p>



<p>練習用データ「E-Commerce Data」をBigQueryで操作します。なお、BigQueryと練習用データの準備は「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL #01</a>」を参照してください。</p>



<p><strong>SELECT文</strong>は検索対象の<strong>テーブル（Table）</strong>と<strong>列（Column）</strong>の名前を指定する形で記述します。BigQueryの場合、テーブル名はデータセット名と合わせて記述し、その間をドット「.」で結びます。また、列名は複数の指定が可能で、その間をカンマ「,」で区切ります。構文と例文は以下のようになります。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>列名</em>, <em>列名</em>, ... <strong>FROM</strong> <em>テーブル名（ビュー名）</em><br></pre>



<script src="https://gist.github.com/crosshack/eab6fed31ccbfa9b650ba8466d140bb8.js"></script>



<p>ちなみに<strong>ビュー（View）</strong>とは、<strong>テーブルの一部を抽出</strong>あるいは<strong>複数のテーブルを結合</strong>するなどして作成した実体をもたない仮想的なテーブルのことで、SQL文中の<strong>サブクエリ（Subquery）</strong>の出力がそれにあたります。サブクエリについては次回説明します。</p>



<p>また、検索対象となる<strong>行（Record）</strong>の<strong>条件や数を指定する場合</strong>は、それぞれ<strong>WHERE句</strong>と<strong>LIMIT句</strong>を用います。構文と例文は以下のとおりです。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>列名</em>, <em>列名</em>, ... <strong>FROM</strong> <em>テーブル名（ビュー名）</em> <strong>WHERE</strong> <em>条件式</em> <strong>LIMIT</strong> <em>行数</em></pre>



<script src="https://gist.github.com/crosshack/1c6da4544d2f5fb74fbc80f4fa13dcf2.js"></script>



<p>なお、WHERE句には<strong>条件式</strong>を指定しますが、検索対象となる列名と、演算子や定数などを組み合わせて表現します。この例文でいうと「UnitPrice &gt;= 10」がそれにあたります。そして、この例文全体の意味は、<strong>テーブル「ECData」で、列「UnitPrice」が10以上の行を100行だけ抽出し、列「InvoiceNo」「StockCode」「UnitPrice」を出力する</strong>、となります。青い［実行］ボタンをクリックして、出力結果を確認してみましょう。</p>



<h2><strong>集計はGROUP BY句。</strong></h2>



<p>集計と正規化の基本構文である<strong>GROUP BY句</strong>は、SELECT文と組み合わせて使います。内容の説明は後述するとして、構文と例文はこのようになります。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong> <em>列名</em>, <em>集計関数</em> <strong>AS</strong> <em>列名,</em> ... <strong>FROM</strong> <em>テーブル名（ビュー名）</em> <strong>GROUP BY</strong> <em>列名</em></pre>



<script src="https://gist.github.com/crosshack/7a87b9ea715582365734c594b4b01e0d.js"></script>



<p><strong>集計（Aggregation）</strong>とは、データ内のある<strong>グループ（Group）</strong>について、頻度・合計値・平均値などを計算することをいいます。グループの軸には性別や年代などさまざまあり、この軸のことを<strong>ディメンション（Dimension）</strong>ともいいます。</p>



<p>練習用データ「E-Commerce Data」は、とあるECサイトの購買履歴データで、各レコードには「CustomerID」（顧客ID）が紐づいているため、各顧客IDをグループとみなし、それぞれの購買回数を集計することができます。</p>



<p>上記の例文全体の意味は、<strong>テーブル「ECData」で、グループの軸「CustomerID」ごとに、列「CustomerID」と、行数の集計結果である「InvoiceCount」を出力する</strong>、となります。こちらも、青い［実行］ボタンをクリックして、出力結果を確認してみましょう。</p>



<p>なお、例文中の<strong>COUNT</strong>は<strong>集計関数（Aggregate Function）</strong>と呼ばれ、行数を集計するものになります。集計関数は他に、合計値を集計する<strong>SUM</strong>や、平均値を集計する<strong>AVG</strong>などがあります。</p>



<p>また、例文中のASは<strong>AS句</strong>といい、ここでは<strong>集計関数の出力列に名前をつける</strong>役割を担います。つまり「COUNT(*)」の出力列に「InvoiceCount」という名前をつけることを意味します。AS句はこの他にも、SELECT文で出力されたテーブルに名前をつける機能もあります。こちらは次回の<strong>WITH句</strong>や<strong>JOIN句</strong>のところで説明します。</p>



<p>ちなみに、ここでもう少し踏み込んで、各顧客IDごとの顧客ランクを集計する方法を見てみます。顧客ランクの集計条件を、購買回数が300回以上を「A」、100回以上を「B」、それ未満を「C」と定義すると、例文は以下のようになります。なお、例文中のCASEは<strong>CASE句</strong>という<strong>条件分岐の基本構文</strong>のひとつで、<strong>分岐が多い場合</strong>に使います。条件分岐には他に<strong>IF句</strong>があり、こちらは<strong>分岐がひとつの場合</strong>に使います。</p>



<script src="https://gist.github.com/crosshack/38da929df291e9ac9e5099a64aa495c0.js"></script>



<p>上記の例文全体の意味は、<strong>テーブル「ECData」で、グループの軸「CustomerID」ごとに、列「CustomerID」と、顧客ランクの集計結果（集計条件は、購買回数が300回以上を「A」、100回以上を「B」、それ未満を「C」とする）である「CustomerRank」を出力する</strong>、となります。こちらも、青い［実行］ボタンをクリックして、出力結果を確認してみましょう。</p>



<h2><strong>正規化もGROUP BY句。</strong></h2>



<p>GROUP BY句は、集計の他に正規化の役割を持ちます。<strong>正規化（Normalization）</strong>とはデータの重複を排除することです。</p>



<p>練習用データ「E-Commerce Data」においては、<strong>StockCode（商品コード）</strong>と<strong>UnitPrice（商品単価）</strong>が重複しているはずです。なぜなら商品コードとは商品管理の最小単位であるため、商品単価が一意に定義されているはずだからです。すなわち、<strong>商品コードと商品単価の1対1の対応表を別テーブルで保持</strong>しておけば、購買履歴のテーブルとして保持する必要があるのは商品コードだけでよいことになります。</p>



<p>では、商品コードと商品単価の1対1の対応表を取り出して正規化してみましょう。例文はこのようになります。</p>



<script src="https://gist.github.com/crosshack/43e42b155e265fe78e0891a42d409443.js"></script>



<p>上記の例文全体の意味は、<strong>テーブル「ECData」で、グループの軸「StockCode」ごとに、列「StockCode」と、列「UnitPrice」の任意の値を列名「UnitPrice」として出力する</strong>、となります。こちらも、青い［実行］ボタンをクリックして、出力結果を確認してみましょう。</p>



<p>なお、例文中の<strong>ANY_VALUE</strong>も集計関数のひとつで、グループ内の指定した列の任意の値を取り出すものであり、データの重複を正規化する場合によく用います。</p>



<p>また、このように正規化された対応表データを<strong>マスタデータ（Master Data）</strong>といい、商品コードをキーとしたものを<strong>商品マスタ</strong>、顧客IDをキーとしたものを<strong>顧客マスタ</strong>といいます。逆に、購買履歴などの発生事象の時系列データを<strong>トランザクションデータ（Transaction Data）</strong>といいます。</p>



<p>次回は「BigQueryではじめるSQL」最終回、<strong>非正規化の基本構文であるJOIN句</strong>を中心に見ていきます。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQueryではじめるSQL #02</title>
		<link>https://uxmeetsdata.com/bigquery-sql-02/</link>
				<pubDate>Wed, 06 Mar 2019 12:55:48 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[DWH]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=2844</guid>
				<description><![CDATA[RDBとNoSQL。 BigQueryの準備が整ったところで、ビッグデータ分析のためのSQLの実践を進めていき...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-sql-02/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png" alt="" class="wp-image-3486" width="480" height="241" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>RDBとNoSQL。</strong></h2>



<p>BigQueryの準備が整ったところで、ビッグデータ分析のためのSQLの実践を進めていきましょう。なお、BigQueryの準備は「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL #01</a>」を参照してください。</p>



<p>とはいえ、<strong>データベース（Database：DB）</strong>や<strong>クエリ（Query）</strong>の基本概念を理解していないと、ただサンプルどおりにSQLを実行するだけになってしまうので、簡単におさらいしておきます。</p>



<p>蓄積や検索をしやすいように整理されたデータの集まりのことDBといい、蓄積や検索の指示を行うことをクエリといいます。また、単にDBというと<strong>関係データベース（Relational Database：RDB）</strong>のことをさします。RDBは、データを<strong>複数のテーブル（Table）</strong>として管理し、テーブル間の関係を定義することで、複雑なデータの関連性を扱えるようにしたもので、企業の基幹システムのような大規模なものから、個人のブログのような小規模なものまで、データ管理の領域で幅広く利用されています。</p>



<p>DBを管理するシステムのことを<strong>データベース管理システム（Database Management System：DBMS）</strong>といいますが、とりわけRDBによるものをRDBMS（Relational Database Management System）といい、代表的なものに<strong>PostgreSQL</strong>などがあります。GCP（Google Cloud Platform）では<strong>Cloud SQL</strong>、AWS（Amazon Web Services）では<strong>Amazon RDS</strong>がそれにあたります。</p>



<p>一方でRDBは、データ構造が複雑化したり、データ量が膨大化すると、整合性の確保のために処理速度が遅くなるという問題を抱えています。そこで<strong>NoSQL</strong>という概念が登場しました。NoSQLは「Not only SQL」の略とされる、RDB以外のDBを示す大まかな分類であり、特定のデータ管理方式を示すものではありません。代表的な方式として<strong>キーバリュー型が</strong>あり、GCPでは<strong>Cloud Bigtable</strong>、AWSでは<strong>Amazon DynamoDB</strong>がそれにあたります。</p>



<p>RDBとNoSQLは、どちらが優れているかということではなく、用途により使い分けることが重要です。NoSQLの登場前は、これらを考慮することなく無条件にRDBを採択していたことが問題であったわけで、RDBが劣るということではありません。RDBとNoSQLの比較表は以下のとおりで、ざっくり言うと、顧客ランクのような<strong>日々更新されるマスタデータの管理はRDB</strong>、購買履歴のような<strong>日々追加されるトランザクションデータの管理はNoSQL</strong>が、それぞれ得意領域としています。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>&nbsp;</td>
<td>RDB</td>
<td>NoSQL</td>
</tr>
<tr>
<td style="background-color: #eee;">データの整合性の確保</td>
<td>得意</td>
<td>苦手</td>
</tr>
<tr>
<td style="background-color: #eee;">登録済みデータの更新</td>
<td>得意</td>
<td>苦手</td>
</tr>
<tr>
<td style="background-color: #eee;">大量データの処理</td>
<td>苦手</td>
<td>得意</td>
</tr>
<tr>
<td style="background-color: #eee;">データの多様性への対応</td>
<td>苦手</td>
<td>得意</td>
</tr>
</table>



<p>なお、<strong>Google BigQuery</strong>や<strong>Amazon Redshift</strong>は<strong>カラムストア型</strong>と呼ばれ、RDBではないためにNoSQLに区分されますが、RDBと同じテーブルの概念を持ち、SQLによるデータ操作を可能としつつも、<strong>列指向</strong>にデータを蓄積することで処理速度を高速化させる方式となります。この列指向について詳しく見ていきます。</p>



<h2><strong>行指向と列指向。</strong></h2>



<p>テーブル型のDBには大きく、<strong>行指向DB</strong>と<strong>列指向DB</strong>の二つの方式があります。もともと行指向という概念や言葉は存在しませんでしたが、列指向の登場後、従来のRDBはそれと区別するために行指向と呼ばれるようになりました。</p>



<p>データの蓄積と検索を、行指向DBでは行単位、列指向DBでは列単位で行います。この方式の違いが、以下のような特徴の違いを生みます。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>&nbsp;</td>
<td>行指向</td>
<td>列指向</td>
</tr>
<tr>
<td style="background-color: #eee;">データの蓄積単位</td>
<td>行</td>
<td>列</td>
</tr>
<tr>
<td style="background-color: #eee;">多数の列への検索</td>
<td>得意</td>
<td>苦手</td>
</tr>
<tr>
<td style="background-color: #eee;">多数の行への検索</td>
<td>苦手</td>
<td>得意</td>
</tr>
<tr>
<td style="background-color: #eee;">1行に対する処理速度</td>
<td>速い</td>
<td>遅い</td>
</tr>
<tr>
<td style="background-color: #eee;">1列に対する処理速度</td>
<td>遅い</td>
<td>速い</td>
</tr>
<tr>
<td style="background-color: #eee;">代表的なDB</td>
<td>Oracle Database, MySQL, PostgreSQL</td>
<td>Google BigQuery, Amazon Redshift</td>
</tr>
</table>



<p>つまり<strong>列指向DB</strong>は、<strong>大量データの特定の列に対する集計処理が得意</strong>であり、ビッグデータ分析に向いているといえます。一方で、<strong>1行に対する計算処理が苦手</strong>なため、1行をまるごと更新する処理（SQLでいうとUPDATE）は推奨されません。またデータの抽出を行う際も、すべての列を指定するような処理（SQLでいうとSELECT *）も非効率であるため避けるべきです。なお、BigQueryはクエリ課金（クエリ時のデータスキャン量による従量課金）であるため、コスト面においても指定する列を必要最小限に抑えることは重要です。</p>



<h2><strong>正規化と非正規化。</strong></h2>



<p>DBの基本概念でもうひとつ重要なのが、<strong>正規化</strong>と<strong>非正規化</strong>です。これをきちんと理解することで、用途に対して効率的なDBを設計することが可能となります。</p>



<p><strong>正規化（Normalization）</strong>とはデータの重複を排除することであり、これによりデータの追加・更新・削除における<strong>処理の冗長化が抑制</strong>され、<strong>メンテナンスが効率化</strong>されます。この正規化を簡単に実現できるように考えられたのが<strong>RDB</strong>です。</p>



<p>正規化をするほど冗長化が抑制され、メンテナンス効率が上がる一方で、テーブルの分割により<strong>データ構造が複雑化し、処理速度が遅くなる</strong>という欠点があります。そこで、処理速度を重視する場合には、あえて<strong>非正規化（Denormalization）</strong>を行います。非正規化を前提として処理速度の高速化を追求したのが<strong>NoSQL</strong>であるともいえます。</p>



<p>正規化と非正規化の特徴を整理すると、このようになります。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>&nbsp;</td>
<td>正規化</td>
<td>非正規化</td>
</tr>
<tr>
<td style="background-color: #eee;">データの重複</td>
<td>なし</td>
<td>あり</td>
</tr>
<tr>
<td style="background-color: #eee;">メンテナンス効率</td>
<td>効率的</td>
<td>非効率的</td>
</tr>
<tr>
<td style="background-color: #eee;">処理速度</td>
<td>遅い</td>
<td>速い</td>
</tr>
<tr>
<td style="background-color: #eee;">前提とするDB方式</td>
<td>RDB</td>
<td>NoSQL</td>
</tr>
</table>



<p>この正規化と非正規化も、どちらが優れているかということではなく、用途に合わせて選択する、あるいは併用することが重要です。典型的な併用方法として、<strong>マスターとなるDBを正規化</strong>して管理し、メンテナンスを効率化させつつ、<strong>個別の分析用途に合わせて非正規化かつ高速化したDBを出力</strong>するという構造化手法がよく用いられます。その出力されたDBを<strong>データマート（Data Mart）</strong>といいます。また、正規化と非正規化に用いられるSQLの構文が<strong>GROUP BY句</strong>と<strong>JOINk句</strong>で、SQLを利用したデータ分析の主役となります。</p>



<p>次回は<strong>検索の基本構文であるSELECT文</strong>と、<strong>集計と正規化の基本構文であるGROUP BY句</strong>を中心に見ていきましょう。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQueryではじめるSQL #01</title>
		<link>https://uxmeetsdata.com/bigquery-sql-01/</link>
				<pubDate>Tue, 05 Mar 2019 11:54:34 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[DWH]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=2626</guid>
				<description><![CDATA[ビッグデータ分析のためのSQL。 Google BigQuery1)BigQuery vs. Redshift...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-sql-01/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png" alt="" class="wp-image-3486" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql.png 640w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_sql-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>ビッグデータ分析のためのSQL。</strong></h2>



<p><strong>Google BigQuery</strong><sup id="footnote_plugin_tooltip_1" class="footnote_plugin_tooltip_text" onclick="footnote_moveToAnchor('footnote_plugin_reference_1');">1)</sup><span class="footnote_tooltip" id="footnote_plugin_tooltip_text_1"><a href="https://uxmeetsdata.com/bigquery-vs-redshift/">BigQuery vs. Redshift どっち？</a></span><script type="text/javascript">	jQuery("#footnote_plugin_tooltip_1").tooltip({		tip: "#footnote_plugin_tooltip_text_1",		tipClass: "footnote_tooltip",		effect: "fade",		fadeOutSpeed: 100,		predelay: 400,		position: "top right",		relative: true,		offset: [10, 10]	});</script>は、Googleが提供するクラウドサービスで、フルマネージドな<strong>データウェアハウス（Data Warehouse：DWH）</strong>であり、総合的なクラウドコンピューティングサービスである<strong>GCP（Google Cloud Platform）</strong>の一部です。</p>



<p>BigQueryは、PostgreSQLなどの一般的なRDBでも使われている<strong>標準SQL（Standard SQL）</strong>で、大量データの処理に優れた<strong>列指向DB（Columner Database）</strong>でデータを自在に操作することが可能です。また、AWS（Amazon Web Services）の<strong>Amazon Redshift</strong>とよく比較されますが、SQLの実行に<strong>ブラウザUI</strong>を利用でき、さらに時間課金ではなく<strong>クエリ課金</strong>（クエリ時のデータスキャン量による従量課金）であるため、より手軽かつ安価にビッグデータのアドホック分析ができるという特徴を備えています。</p>



<p>そしてこのことは、これから<strong>ビッグデータ分析のためのSQLを学びたい人</strong>のトレーニング用としても相性がよく、Googleのアカウントがあれば、いますぐSQLの練習を開始できます。</p>



<p>ではさっそく、BigQueryによるビッグデータ分析のためのSQLをはじめてみましょう。<a href="https://console.cloud.google.com/">GCPコンソール</a>にアクセスしてみてください。検索エンジンで「Google Cloud」と検索してもらっても結構です。すると、初めてアクセスする方にはチュートリアルが、ログイン経験がある方にはデフォルトプロジェクトのダッシュボードが表示されるかと思います。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1a-e1552220555301-1024x558.jpg" alt="" class="wp-image-3487" width="480" height="239"/></figure></div>



<p>なお、GCPには12ヶ月間300ドル分の無料トライアルがあります。（2019年2月現在）画面上部［無料トライアルを試してみませんか&#8230;］の右横の［有効化］をクリックして、クレジットカードを登録すれば、無料トライアルを開始できます。また、無料トライアル終了後に自動的にクレジットカード課金されることはないので安心して利用できます。</p>



<p>ところで、GCPには<strong>プロジェクト（Project）</strong>という特徴的な概念があります。BigQueryはもちろん、Cloud StorageやCompute Engineなどの<strong>GCPのすべてのサービスインスタンスがこれにひもづき</strong>、また<strong>プロジェクトごとに参加するアカウントを設定</strong>することができます。まさに、現実世界のプロジェクトの概念に近いものと言えるでしょう。仕事で使うには、まずはプロジェクトを作成するところからスタートしますが、練習用にはデフォルト設定されている「My First Project」で問題ありません。</p>



<h2><strong>Kaggleで練習用データを準備。</strong></h2>



<p>さて、GCPの準備が整ったところで、BigQueryによるビッグデータ分析のためのSQLに挑戦するわけですが、それには分析用データが必要です。手元にあるデータでもよいのですが、せっかくなので<strong>ビッグデータ分析に向いたデータ</strong>で進めてみましょう。こんなときは<a rel="noreferrer noopener" aria-label="Kaggle (新しいタブで開く)" href="https://www.kaggle.com" target="_blank"><strong>Kaggle（カグル）</strong></a>がおすすめです。</p>



<p>Kaggleは世界中のデータサイエンティストが集まるコミュニティーサイトで、最大の特徴はコンペの開催です。企業や政府が<strong>データ分析や機械学習の課題</strong>を提示し、もっとも優れた分析や予測のモデルを賞金と引き換えに買い取る仕組みになっています。Kaggleに登録しているデータサイエンティストは、<strong>コンペへの参加や練習用データセットのダウンロードを無料で</strong>行えます。</p>



<p>ではKaggleに登録して、練習用データをダウンロードしてみましょう。Kaggleの登録はFacebookなどのSNSアカウントで簡単に行えます。登録が完了したら、ログインして「<a rel="noreferrer noopener" aria-label="E-Commerce Data (新しいタブで開く)" href="https://www.kaggle.com/carrie1/ecommerce-data" target="_blank">E-Commerce Data</a>」というデータセットのページにアクセスしてみてください。こちらは、とあるECサイトの購買履歴データで、内容・サイズともにビッグデータ分析の練習用にはちょうどよいものとなっています。このページの右上部の「Download」というリンクをクリックすれば、練習用データの準備は完了です。</p>



<h2><strong>簡単なクエリにトライ。</strong></h2>



<p>練習用データをさっそくBigQueryで操作してみましょう、と行きたいところですが、もう少し準備が必要です。BigQueryでデータを操作するには、<strong>テーブル（Table）</strong>を作成する必要があります。テーブルの作成には、データファイルをそのままBigQueryにアップロードする方法もありますが、ファイルサイズに10MBの上限がかかるため、今回の練習用データ（45.6MB）では使えません。別の方法として、<strong>Googleドライブ</strong>を経由する方法とGCPの<strong>Google Cloud Storage（GCS）</strong>を経由する方法がありますが、ここではGCSを経由する方法を選択します。</p>



<p>GCPコンソールの左上のハンバーガーメニューをクリックすると、GCPで利用できるサービスメニューが開くので［<strong>Storage</strong>］をクリックをしましょう。ここに練習用データをアップロードするわけですが、そのためには<strong>バケット（Bucket）</strong>の作成が必要になります。バケットはフォルダのようなものと考えてください。画面上部の［<strong>バケットを作成</strong>］をクリックし、任意の名前をつけて作成します。あとはそのバケット内に入り、練習用データファイル「data.csv」を画面内にドラック＆ドロップするか、［ファイルをアップロード］ボタンをクリックすることで、練習用データをアップロードできます。</p>



<p>GCSへのアップロードが完了したら、BigQueryのテーブルへの取り込みを行います。サービスメニューの［<strong>BigQuery</strong>］をクリックしましょう。ここでも、テーブルを作成する前に<strong>データセット（Dataset）</strong>を作成する必要がありますが、こちらもフォルダのようなものになります。右下ペインにある［<strong>データセットを作成</strong>］をクリックし、任意の名前をつけてデータセットを作成します。ここでは「Training」と命名します。すると左ペインに作成したデータセット「Training」がツリー状で表示されるので、それを選択し、右下ペインにある［<strong>テーブルを作成</strong>］をクリックします。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1b-e1555478207197-1024x561.jpg" alt="" class="wp-image-3488" width="480" height="262" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1b-e1555478207197-1024x561.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1b-e1555478207197-300x164.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1b-e1555478207197-768x420.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>そこで表示される［テーブルの作成］画面で、GCSにアップしたデータを取り込んでテーブルを作成します。手順は以下のとおり。</p>



<ol><li>［テーブルの作成元］で［Google Cloud Storage］を選択</li><li>［GCS バケットからファイルを選択］で「data.csv」を選択</li><li>［ファイル形式］で［CSV］を選択</li><li>［テーブル名］に任意のテーブル名を入力（ここでは「ECData」と命名）</li><li>［スキーマと入力パラメータ］にチェック</li><li>［詳細オプション］のアコーディオンを開く</li><li>［スキップするヘッダー行］に「1」を入力</li><li>［<strong>テーブルを作成</strong>］ボタンをクリック</li></ol>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1c-e1552220622925-1024x676.jpg" alt="" class="wp-image-3489" width="480" height="289"/></figure></div>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1d-e1552220641608-1024x736.jpg" alt="" class="wp-image-3490" width="480" height="315"/></figure></div>



<p>すると左ペインに作成したテーブル「ECData」がツリー状で表示されているかと思います。これでテーブルの作成は完了です。</p>



<p>試しに、簡単なSQL文を実行してみましょう。左ペインで作成したテーブルをクリックすると、右下ペインにテーブルのデータが表示されます。その状態で、同じく右下ペインの［<strong>テーブルをクエリ</strong>］をクリックしてみてください。すると右上ペインに「<strong>SELECT</strong>  <strong>FROM</strong> &#8216;Training.ECData&#8217; <strong>LIMIT</strong> 1000」というSQL文が表示されるかと思います。そのSQL文の「SELECT」と「FROM」の間に「InvoiceNo, StockCode」というテキストを挿入して、青い［<strong>実行</strong>］ボタンをクリックしてみましょう。「InvoiceNo」と「StockCode」の二つの列と1,000行に絞られたデータが右下ペインに表示されるかと思います。このように<strong>非常に手軽にSQLを実行することができる</strong>わけです。</p>



<pre class="wp-block-preformatted"><strong>SELECT</strong><br>  InvoiceNo<br> ,StockCode<br><strong>FROM</strong> 'Training.ECData'<br><strong>LIMIT</strong> 1000</pre>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1e-e1555478253730-1024x561.jpg" alt="" class="wp-image-3491" width="480" height="262" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1e-e1555478253730-1024x561.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1e-e1555478253730-300x164.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_1e-e1555478253730-768x420.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>では次回以降で、ビッグデータ分析のためのSQLの実践に踏み込んで行きたいと思います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>BigQuery vs. Redshift どっち？</title>
		<link>https://uxmeetsdata.com/bigquery-vs-redshift/</link>
				<pubDate>Thu, 07 Feb 2019 09:58:20 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[DWH]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=1274</guid>
				<description><![CDATA[セルフサービスなDWH。 データウェアハウス（Data Warehouse：DWH）は、直訳すれば「データの倉...<p class="more-link"><a href="https://uxmeetsdata.com/bigquery-vs-redshift/" class="themebutton3">Read More</a></p>]]></description>
								<content:encoded><![CDATA[<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/03/xmd_bq_rs.png" alt="" class="wp-image-3462" width="480" height="243"/></figure></div>



<h2><strong>セルフサービスなDWH。</strong></h2>



<p><strong>データウェアハウス（Data Warehouse：DWH）</strong>は、直訳すれば「データの倉庫」で、データベース（Database：DB）の一種ですが、過去すべての時系列データを要約せずにそのまま保持し続ける、文字通り倉庫のような役割から、区別してそう呼ばれています。</p>



<p>また、DWHはデータを活用した意思決定に利用されることから、<strong>ビジネスインテリジェンス（Business Intelligence：BI）</strong>のひとつに位置付けられます。BIは経営・会計・情報処理などの用語で、企業などの組織のデータを収集・分析・可視化することで、ビジネスの意思決定に役立てる手法や技術のことを言います。</p>



<p>DWHを利用するのは<strong>商品開発やマーケティングなどの部門</strong>ですが、基幹データを扱うことから、管理するのは<strong>情報システム部門</strong>であることがほとんどです。管理部門がDWHのデータ設計と実装を行い、分析可能な状態にして利用部門に提供するのが一般的な役割分担です。一方で、利用部門が分析を進める中で、データ構造を変更したいという要求がうまれるものの、自分たちでそれを実施できないため、分析や意思決定のスピードが上がらないこともよくあります。</p>



<p>そこで、利用部門が管理部門に頼ることなく、自分たちでデータの分析・可視化に必要な環境を構築するセルフサービスBIという考え方が生まれました。その中でも、とりわけDWHに特化したクラウドサービスとして、いま人気を二分しているのが、<strong>Google BigQuery</strong>（以下、BigQuery）と<strong>Amazon Redshift</strong>（以下、Redshift）です。</p>



<h2><strong>ツールのBigQuery、基盤のRedshift。</strong></h2>



<p>BigQueryとRedshiftはそれぞれ<strong>クラウドコンピューティングサービス</strong>である<strong>GCP（Google Cloud Platform）</strong>と<strong>AWS（Amazon Web Services）</strong>の一部であり、フルマネージドなDWHです。GCPとAWSはよく比較されますが、サービスラインナップ<sup id="footnote_plugin_tooltip_1" class="footnote_plugin_tooltip_text" onclick="footnote_moveToAnchor('footnote_plugin_reference_1');">1)</sup><span class="footnote_tooltip" id="footnote_plugin_tooltip_text_1"><a rel="noreferrer noopener" href="https://www.apps-gcp.com/gcp-aws-service-correspondence-comparison/" target="_blank">GCP・AWSサービス比較表</a></span><script type="text/javascript">	jQuery("#footnote_plugin_tooltip_1").tooltip({		tip: "#footnote_plugin_tooltip_text_1",		tipClass: "footnote_tooltip",		effect: "fade",		fadeOutSpeed: 100,		predelay: 400,		position: "top right",		relative: true,		offset: [10, 10]	});</script>としては同質化が進んでおり、いま現在はほぼ横並びといえます。</p>



<p>ただ、AWSがECサイトのAmazon.comの<strong>インフラのシェアリング</strong>を、GCPがGoogleの各種<strong>アプリケーションのエンジンのシェアリング</strong>をそれぞれルーツとしているため、それが特徴の違いを生んでいます。</p>



<p>サービス拡張の経緯にもそれは現れていて、IaaSについてはAWSは当初からAmazon EC2（Elastic Compute Cloud）として提供していましたが、GCPのGCE（Google Compute Engine）はかなり後発です。一方で、PaaSについてはGCPのGAE（Google App Engine）が先行しています。</p>



<p>また、導入されるケースの違いにも特徴があり、レガシーなインフラの置き換えには、インフラの導入実績が豊富なAWSが、ビッグデータ基盤の構築には、深層学習（Deep Learning）などの先進的なアプリケーションが充実したGCPが、それぞれ選ばれる傾向にあるように思います。</p>



<p>この特徴の違いがBigQueryとRedshiftにも引き継がれていて、GCPの一部であるBigQueryはアドホック分析のための<strong>分析ツール</strong>、AWSの一部であるRedshiftは既存のDWHを置き換えてセルフサービス化する<strong>分析基盤</strong>の性格が強いといえます。</p>



<h2><strong>用途に合わせた選択を。</strong></h2>



<p>BigQueryとRedshiftを、諸元レベルで比較してみます。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>&nbsp;</td>
<td>BigQuery</td>
<td>Redshift</td>
</tr>
<tr>
<td style="background-color: #eee;">SQL</td>
<td>標準SQL</td>
<td>標準SQL</td>
</tr>
<tr>
<td style="background-color: #eee;">データ格納方式</td>
<td>列指向</td>
<td>列指向</td>
</tr>
<tr>
<td style="background-color: #eee;">インデックス</td>
<td>なし</td>
<td>あり<br>※インターリーブインデックス</td>
</tr>
<tr>
<td style="background-color: #eee;">パーティション</td>
<td>あり<br>※日付分割テーブル</td>
<td>なし</td>
</tr>
<tr>
<td style="background-color: #eee;">マルチバイト文字対応（テーブル名・カラム名）</td>
<td>なし</td>
<td>あり</td>
</tr>
<tr>
<td style="background-color: #eee;">クエリ実行環境</td>
<td>ブラウザUI</td>
<td>コマンドライン<br>※GUIツールは別途必要</td>
</tr>
<tr>
<td style="background-color: #eee;">直接連携可能なストレージ</td>
<td>GCS（Gooble Cloud Storage）, Google Drive</td>
<td>Amazon S3（Simple Storage Service）</td>
</tr>
<tr>
<td style="background-color: #eee;">入力データフォーマット</td>
<td>Avro, JSON, CSV, Parquet, ORC</td>
<td>CSV/TSV, Avro, JSON</td>
</tr>
<tr>
<td style="background-color: #eee;">出力データフォーマット</td>
<td>Avro, JSON, CSV</td>
<td>CSV/TSV</td>
</tr>
<tr>
<td style="background-color: #eee;">基本的な課金体系</td>
<td>クエリ課金<br>※定額プランあり</td>
<td>時間課金<br>※クエリ課金プランあり</td>
</tr>
<tr>
<td style="background-color: #eee;">時間課金の料金</td>
<td>−</td>
<td>0.314USD〜/H<br>※東京リージョン</td>
</tr>
<tr>
<td style="background-color: #eee;">クエリ課金の料金</td>
<td>8.55USD/TB<br>※東京リージョン</td>
<td>5USD/TB<br>※Amazon Redshift Spectrum</td>
</tr>
</table>



<p>BigQueryの特徴をRedshiftとの比較で整理してみます。</p>



<ul><li>Redshiftと同じく、<strong>標準SQL</strong>に対応。</li><li>Redshiftと同じく<strong>、大量データの集計に優れた列指向の格納方式</strong>を採用。</li><li>テーブル名・カラム名の<strong>マルチバイト文字は非対応</strong>。</li><li>ブラウザUIのクエリ実行環境を装備。</li><li>課金体系は、時間課金ではなく<strong>クエリ課金</strong>。（データスキャン量による従量課金）</li></ul>



<p>BigQueryとRedshiftの共通点としては、<strong>標準SQLに対応した列指向DB</strong>であるということ。これにより、一般的なRDBと同様のSQLで、大量データの集計に優れた列指向DBとしてデータの操作が可能です。</p>



<p>BigQueryの特長は、<strong>ブラウザUI</strong>でクエリ実行が可能なのと、時間課金ではなく<strong>クエリ課金</strong>（クエリ時のデータスキャン量による従量課金）であるため、手軽にアドホック分析を行う分析ツールとして採用しやすいという点です。</p>



<p>一方で、時間課金ではないために<strong>コストを見積もりづらい</strong>のと、テーブル名・カラム名の<strong>マルチバイト文字は非対応</strong>という欠点があるため、既存のDWHの置き換えには不向きであり、その場合はRedshiftのほうが採用しやすいでしょう。</p>



<p>ちなみにAWSには、ブラウザGUIのクエリ実行環境を備え、クエリ課金であるAmazon Athenaという、BigQueryと似たサービスもあるので、AWSユーザーは用途に合わせて選択することが可能です。ただしSQL互換エンジンのPrestoを採用しており、関数の体系が異なるため注意が必要です。</p>



<p>このようにBigQueryとRedshiftは、同じセルフサービスDWHでも特徴がかなり異なるので、用途に合わせて選んでもらえればよいと思います。</p>
]]></content:encoded>
										</item>
	</channel>
</rss>
