<?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/tag/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>データエスノグラフィ入門 #04</title>
		<link>https://uxmeetsdata.com/data-ethnography-howto-04/</link>
				<pubDate>Mon, 22 Apr 2019 12:36:55 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[Tableau]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=7109</guid>
				<description><![CDATA[データエスノグラフィ環境を構築。 それでは、BigQueryとTableauによるデータエスノグラフィの環境を...<p class="more-link"><a href="https://uxmeetsdata.com/data-ethnography-howto-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/04/xmd_de.png" alt="" class="wp-image-6409" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de.png 720w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>データエスノグラフィ環境を構築。</strong></h2>



<p>それでは、<strong>BigQueryとTableauによるデータエスノグラフィ</strong>の環境を構築し、<strong>会員ランクごとに行動データを観察</strong>していきます。なお、BigQueryとTableauの使い方については「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL</a>」「<a href="https://uxmeetsdata.com/tableau-bi-01/">TableauではじめるBI</a>」を参照してください。</p>



<p>まずは分析用テーブルを作成します。観察したいのは一人ひとりの<strong>購買履歴</strong>なので、前回とは違い、会員IDではなく購買履歴ごとの行を持つテーブルを作ります。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



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



<p>すると、以下のスキーマのテーブルが出力結果で表示されるので、それをデータセット「DE」に「sum_orders」という名前で保存します。なお、フィールド名の頭に「Axx」などのアルファベットと数字を付与していますが、これはTableauのビューでデータの内容を確認する際に用いる［データの表示］画面のフィールドの並び順が、フィールド名のアルファベットと数字の順序になるため、スキーマ定義のとおり意図的に並べたい場合はこのように命名しておく必要があるからです。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>フィールド名</td>
<td>概要</td>
<td>タイプ</td>
</tr>
<tr>
<td style="background-color: #eee;">A00_member_id</td>
<td>会員ID</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">A01_gender</td>
<td>性別</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">A02_age</td>
<td>年齢</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">B00_order_no</td>
<td>購買履歴番号</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">B01_order_date</td>
<td>購買日</td>
<td>日付</td>
</tr>
<tr>
<td style="background-color: #eee;">B02_category</td>
<td>商品カテゴリ</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">B03_sub_category</td>
<td>商品サブカテゴリ</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">B04_price</td>
<td>価格</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">C00_rank</td>
<td>会員ランク</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">C01_frequency</td>
<td>購買頻度（日数）</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">C02_monetary</td>
<td>累積購買金額</td>
<td>整数</td>
</tr>
</table>



<p>続いて、テーブル「sum_orders」をTableauに取り込んで分析します。Tableau Desktopであれば、スタート画面の［接続］にあるメニュー［Google BigQuery］から選択するだけでシームレスに連携できます。Tableau Publicであれば、GCS（Google Cloud Storage）経由でCSVファイルとしてエクスポートしてから取り込みます。</p>



<p>ワークシート編集画面で「A00_member_id」を［行］、「C01_frequency」「C02_monetary」を［列］、「C00_rank」を［フィルター］と［色］に、それぞれドラッグ＆ドロップすると、データエスノグラフィ環境の構築は完了です。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4a-e1556343774370-1024x566.jpg" alt="" class="wp-image-7186" width="480" height="265" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4a-e1556343774370-1024x566.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4a-e1556343774370-300x166.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4a-e1556343774370-768x424.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>一人ひとりの行動データを観察。</strong></h2>



<p>では会員ランクごとに一人ひとりの購買履歴を観察していきましょう。まずはF1会員から見て行きます。右上の「C00_rank」フィルタで「4: F1」を選択し、ビュー内に表示される会員IDをF1会員のみに絞り込みます。その中から無作為に抽出してそれぞれの購買履歴を観察するわけですが、それには各会員の行をクリックした際に表示されるポップアップの右上にある［データを表示］ボタンをクリックします。すると［データを表示」という画面がモーダル表示されるので、画面下の［すべてのデータ］をクリックすると、選択した会員の購買履歴を見ることができます。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4b-e1556369382551-1024x584.jpg" alt="" class="wp-image-7187" width="480" height="274" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4b-e1556369382551-1024x584.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4b-e1556369382551-300x171.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4b-e1556369382551-768x438.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>選択した会員の購買履歴がこのように表示されます。当たり前ですが、F1会員は初回購買の購買履歴しかありません。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4c-e1556370790309-1024x207.jpg" alt="" class="wp-image-7193" width="480" height="99"/></figure></div>



<p>では続けてF2会員を観察します。「C00_rank」フィルタで「3: F2」を選択し、F2会員に絞り込んで無作為に何人かを見て行きます。するとどうでしょうか。初回購買から二回目購買までの期間が何ヶ月も空いている会員が意外と多い印象を受けるのではないでしょうか。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4d-e1556370821786-1024x210.jpg" alt="" class="wp-image-7196" width="480" height="98" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4d-e1556370821786-1024x210.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4d-e1556370821786-300x61.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4d-e1556370821786-768x157.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>続けてF3会員・優良会員についても観察します。するとやはり、初回購買から二回目購買までの期間が長い会員が多いように思います。さらに、<strong>3回目購買から定着化し、比較的コンスタントに購入している</strong>ことがわかります。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4e-e1556370844865-1024x351.jpg" alt="" class="wp-image-7197" width="480" height="165" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4e-e1556370844865-1024x351.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4e-e1556370844865-300x103.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4e-e1556370844865-768x263.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>さらに、優良会員は比較的多くの商品カテゴリを購買していることに気づきます。<strong>長期間にわたり何度も購買しているため必然的にカテゴリ数が増えている</strong>だけかもしれませんし、<strong>何でもECサイトで買うタイプが総合ECサイトを継続的に利用している</strong>だけかもしれません。ただ、いずれにせよ相関はありそうです。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4f-e1556370892177-1024x494.jpg" alt="" class="wp-image-7198" width="480" height="231" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4f-e1556370892177-1024x494.jpg 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4f-e1556370892177-300x145.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4f-e1556370892177-768x370.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>ここまでの行動データ観察による発見を通して、二つの仮説が浮かび上がります。</p>



<ol><li>初回購買後に<strong>休眠化した会員についても優良化するポテンシャルがある</strong>のではないか</li><li><strong>新たな商品カテゴリを提案することが優良化につながる</strong>可能性があるのではないか</li></ol>



<p>これらの仮説をもとに、データの深掘分析やA/Bテストによる実証実験を行うことで、まだ<strong>優良化していな会員を意図的に優良化する</strong>ためのヒントが得られる可能性があります。一方で、観察した一部の会員だけに見られる特徴である可能性も否定できず、もしそうなら、この仮説の検証に意味はありません。そこで<b><span>代表性</span>の検証</b>を行います。<strong>代表性（Representativeness）</strong>とは、調査対象者全体の中から抽出された一部の対象者の調査結果が、調査対象者全体の結果を、偏りなく正確に反映出来ているかどうかのことです。</p>



<h2><strong>その発見に代表性はあるか。</strong></h2>



<p>代表性検証のための分析テーブルを作成します。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしましょう。</p>



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



<p>このクエリ結果をデータセット「DE」に「sum_members_rep」という名前で保存します。このテーブルから以下の結果が得られます。</p>



<ul><li>休眠会員（初回購買から91日以上購買がない会員）：78.6%</li><li>そのまま離反する会員：64.7%（休眠会員の82.3%）</li><li>復帰してF2転換する会員：13.9%（休眠会員の17.7%）</li><li>復帰してF3転換する会員：7.7%（休眠会員の9.8%）</li></ul>



<p>初回購買から91日以上購買がない会員を休眠会員とすると、<strong>80%近くが休眠会員</strong>となるものの、そのうちの<strong>20%近くが復帰</strong>し、<strong>10%近くがF3転換</strong>していることになります。逆に休眠会員の80%近くがそのまま離反しており、大きなポテンシャルがあることがわかります。とはいえ下図のとおり休眠期間が長くなるほど優良化率が下がるため、早いタイミングでの復帰促進が望ましいようです。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4g-1024x749.png" alt="" class="wp-image-7254" width="480" height="353"/><figcaption>休眠期間別会員ランク構成比率</figcaption></figure></div>



<p>さらに下図のとおり、購買商品カテゴリ数と優良化には明らかな相関があることがわかります。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4h-1024x749.png" alt="" class="wp-image-7255" width="480" height="352" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4h-1024x749.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4h-300x219.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4h-768x561.png 768w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_4h.png 1450w" sizes="(max-width: 480px) 100vw, 480px" /><figcaption>購買商品カテゴリ数別会員ランク構成比率</figcaption></figure></div>



<p>これらの分析結果は、さきほどの二つの仮説が正しいことを証明するものではありません。ただ、その<strong>発見には代表性があり、データの深掘分析や実証実験を行うことに意味がある</strong>ことを示唆しています。</p>



<p>また、購買商品カテゴリ数には優良化との明らかな相関があるため、<strong>結果との相関が強いサブセグメント</strong>に指定し、8以上に絞って改めて行動データ観察をするのもよいでしょう。</p>



<p>このようにデータエスノグラフィは、一人ひとりの行動データをミクロ視点で観察することで、<strong>行動の実態を把握し、意図した結果に導くためのヒントが得られる手法</strong>であることを理解してもらえたのではないかと思います。</p>
]]></content:encoded>
										</item>
	<item>
		<title>データエスノグラフィ入門 #03</title>
		<link>https://uxmeetsdata.com/data-ethnography-howto-03/</link>
				<pubDate>Sun, 21 Apr 2019 07:12:37 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[Tableau]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=6798</guid>
				<description><![CDATA[観察すべきセグメント。 データエスノグラフィは、一人ひとりの行動データをミクロ視点で観察し、時系列に追うことで...<p class="more-link"><a href="https://uxmeetsdata.com/data-ethnography-howto-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/04/xmd_de.png" alt="" class="wp-image-6409" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de.png 720w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>観察すべきセグメント。</strong></h2>



<p>データエスノグラフィは、<strong>一人ひとりの行動データをミクロ視点で観察</strong>し、時系列に追うことで、ユーザーの意思決定プロセスの<strong>理解や発見</strong>を行う手法です。とはいえすべてのユーザーの行動を観察するわけには行きません。そこで、似たユーザーを<strong>セグメント（Segment）</strong>に<strong>分類</strong>し、観察すべきセグメントを<strong>選定</strong>する必要があります。</p>



<p>では、観察すべきセグメントとはいったい誰でしょうか。ここで再び分析目的に立ち戻ります。今回の分析目的は「<strong>優良化する会員の行動特性を、購買履歴データから把握する</strong>」でした。</p>



<p>優良化の要因となる行動特性を把握するには、<strong>優良化している会員</strong>と<strong>優良化していない会員</strong>との間に存在する違いを比較観察すればよいことになります。すなわち<strong>因果推論（Causal Inference）</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/causal-inference/">いまさら聞けない因果推論</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>でいう<strong>疑似実験（Quasi Experiment）</strong>を行うわけです。</p>



<p>とはいえ、優良かどうかのみでは範囲が広すぎるため、もう少し絞り込みたいところですが、それには<strong>結果との相関が強いサブセグメント</strong>が有効です。例えば、優良化と高齢者の相関が強ければ、高齢者同士で比較すれば違いを発見しやすくなるはずです。これは疑似実験における<strong>マッチング法</strong>と同じ考え方です。</p>



<p>まとめると、以下の二つの軸で分類していけばよいことになります。</p>



<ul><li><strong>優良会員と非優良会員</strong>のセグメント</li><li><strong>優良化との相関が強い</strong>サブセグメント</li></ul>



<p>まず優良会員と非優良会員の分類が必要ですが、詳細はさておき、以下のように分類します。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td style="width: 20px;"></td>
<td style="width: 100px;">会員ランク</td>
<td style="width: 200px;">条件</td>
</tr>
<tr>
<td style="background-color: #eee;">1</td>
<td style="background-color: #eee;">優良</td>
<td>購買頻度が30日以上<br>かつ累積購買金額が10万円以上</td>
</tr>
<tr>
<td style="background-color: #eee;">2</td>
<td style="background-color: #eee;">F3</td>
<td>購買頻度が3日以上<br>かつ優良会員の条件に満たない</td>
</tr>
<tr>
<td style="background-color: #eee;">3</td>
<td style="background-color: #eee;">F2</td>
<td>購買頻度が2日﻿</td>
</tr>
<tr>
<td style="background-color: #eee;">4</td>
<td style="background-color: #eee;">F1</td>
<td>購買頻度が1日</td>
</tr>
</table>



<h2><strong>結果との相関が強いサブセグメント。</strong></h2>



<p>続いて、<strong>優良化との相関が強いサブセグメント</strong>を探ります。これには大きく、<strong>検証的アプローチ</strong>と<strong>発見的アプローチ</strong>の二つがあります。</p>



<p><strong>検証的アプローチ（Verifying Approach）</strong>は、二つの事象間の<strong>相関が仮説として想定されるもの</strong>について事実を検証していくアプローチで、質的変数であれば<strong>クロス集計（Cross Tabulation）</strong>、量的変数であれば<strong>散布図（Scatter Plot）</strong>などの手法を用いて分析します。今回の場合でいうと、特定の<strong>性別や年代</strong>、あるいは<strong>購買商品カテゴリ</strong>などの変数と優良化との間に相関があるのではないかという仮説をたてて検証していきます。</p>



<p>一方で、人の行動を決定づける要因は無数にあるため、<strong>優良化につながる思わぬ要因が潜んでいる可能性</strong>がありますが、検証的アプローチでそれを見つけることはできません。そこで多くの変数をもつデータから、二つの事象間の相関を機械的に取り出すアプローチが有効となります。それを、<strong>発見的アプローチ（Discovering Approach）</strong>といい、主に<strong>アソシエーション分析（Association Analysis）</strong><sup id="footnote_plugin_tooltip_2" class="footnote_plugin_tooltip_text" onclick="footnote_moveToAnchor('footnote_plugin_reference_2');">2)</sup><span class="footnote_tooltip" id="footnote_plugin_tooltip_text_2"><a href="https://uxmeetsdata.com/association-howto-01/">アソシエーション分析入門</a></span><script type="text/javascript">	jQuery("#footnote_plugin_tooltip_2").tooltip({		tip: "#footnote_plugin_tooltip_text_2",		tipClass: "footnote_tooltip",		effect: "fade",		fadeOutSpeed: 100,		predelay: 400,		position: "top right",		relative: true,		offset: [10, 10]	});</script>や<strong>クラスタリング（Clustering）</strong>などの手法があります。</p>



<p>とはいえ今回のように、分析対象データの変数が少ない場合は検証的アプローチで十分です。ではBigQueryとTableauで実際に検証していきます。なお、それぞれの使い方については「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL</a>」「<a href="https://uxmeetsdata.com/tableau-bi-01/">TableauではじめるBI</a>」を参照してください。</p>



<h2><strong>検証的アプローチで相関分析。</strong></h2>



<p>まずは分析用のテーブルを作成します。検証したいのは、特定の性別・年代・購買商品カテゴリと会員ランクの間に相関があるかどうかですが、それには<strong>会員IDごとに性別・年代・購買商品カテゴリ・会員ランクの変数をもつテーブル</strong>を作成する必要があります。BigQueryのクエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。</p>



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



<p>なお、処理の効率化のために<strong>10%のサンプリング</strong>をしていますが［※1］、これは会員IDを10で割った剰余が0の場合に限定するという意味です。また、<strong>欠損</strong>を除外するために性別がNULLでない会員に限定し［※2］、年齢の<strong>異常値</strong>を除外するために10歳以上90歳未満の会員に限定しています［※3］。さらに、<strong>時系列データの開始と終了の問題</strong>を解決するために、初回購買日が2006年1月以後かつ最終購買日が2012年12月以前の会員に限定しています［※4］。</p>



<p>すると、以下のスキーマのテーブルが出力結果で表示されるので、それをデータセット「DE」に「sum_members」という名前で保存します。</p>



<table style="table-layout: fixed; width: 100%;">
<tr style="color: #fff; background-color: #000;">
<td>フィールド名</td>
<td>概要</td>
<td>タイプ</td>
</tr>
<tr>
<td style="background-color: #eee;">member_id</td>
<td>会員ID</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">gender</td>
<td>性別</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">age</td>
<td>年齢</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">category</td>
<td>購買商品カテゴリ ※複数ある場合はランダム</td>
<td>文字列</td>
</tr>
<tr>
<td style="background-color: #eee;">first_date</td>
<td>初回購買日時</td>
<td>日時</td>
</tr>
<tr>
<td style="background-color: #eee;">last_date</td>
<td>最終購買日時</td>
<td>日時</td>
</tr>
<tr>
<td style="background-color: #eee;">frequency</td>
<td>購買頻度（日数）</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">monetary</td>
<td>累積購買金額</td>
<td>整数</td>
</tr>
<tr>
<td style="background-color: #eee;">rank</td>
<td>会員ランク</td>
<td>文字列</td>
</tr>
</table>



<p>続いて、テーブル「sum_members」をTableauに取り込んで分析します。Tableau Desktopであれば、スタート画面の［接続］にあるメニュー［Google BigQuery］から選択するだけでシームレスに連携できます。Tableau Publicであれば、GCS（Google Cloud Storage）経由でCSVファイルとしてエクスポートしてから取り込みます。</p>



<p>あとは、性別・年齢・購買商品カテゴリと会員ランクの関係を可視化して分析するだけです。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_3a-1024x749.png" alt="" class="wp-image-7005" width="480" height="292"/><figcaption>性別会員ランク構成比率</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_3b-1024x749.png" alt="" class="wp-image-7006" width="480" height="291"/><figcaption>年代別会員ランク構成比率</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_3c-1024x749.png" alt="" class="wp-image-7009" width="480" height="267"/><figcaption>購買商品カテゴリ別会員ランク構成比率</figcaption></figure></div>



<p>これらは、<strong>性別・年代別・購買商品カテゴリ別での会員ランクの構成比率</strong>ですが、どの切り口でもほぼ同じで、<strong>性別・年齢・購買商品カテゴリは、会員の優良化に対して何の影響も及ぼしていない</strong>ことがわかります。どうやら今回の分析対象データからは、<strong>優良化との相関が強いサブセグメント</strong>を特定することは難しそうです。</p>



<p>ということで「データエスノグラフィ入門」最終回である次回は、サブセグメントでの絞り込みは諦めて、<strong>会員ランクごとに行動データを観察</strong>していくことにします。</p>
]]></content:encoded>
										</item>
	<item>
		<title>データエスノグラフィ入門 #02</title>
		<link>https://uxmeetsdata.com/data-ethnography-howto-02/</link>
				<pubDate>Sat, 20 Apr 2019 11:04:06 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[Tableau]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=6481</guid>
				<description><![CDATA[必要なデータは揃っているか。 分析対象である、ECサイトの購買履歴データのBigQueryへの投入が完了したら...<p class="more-link"><a href="https://uxmeetsdata.com/data-ethnography-howto-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/04/xmd_de.png" alt="" class="wp-image-6409" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de.png 720w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>必要なデータは揃っているか。</strong></h2>



<p>分析対象である、ECサイトの購買履歴データのBigQueryへの投入が完了したら、データ準備を行います。<strong>データ準備（Data Preparation）</strong>とは、データを分析可能な状態にすることを指します。なお、ここまでのプロセスは「<a href="https://uxmeetsdata.com/data-ethnography-howto-01/">データエスノグラフィ入門 #01</a>」を参照してください。</p>



<p>ところで、データが分析可能とはどういう状態でしょうか。以下の三つのポイントで整理します。</p>



<ol><li>分析目的の達成に<strong>必要なデータが揃っている</strong></li><li>分析しやすいよう<strong>構造化されている</strong></li><li>分析を妨げる<strong>欠損・異常値・表記揺れがない</strong></li></ol>



<p>当たり前ですが、必要なデータが揃っていなければ分析目的を達成することができません。今回の分析目的は「<strong>優良化する会員の行動特性を、購買履歴データから把握する</strong>」でした。</p>



<p>「優良」が何かにもよりますが、ここでは<strong>RFMがある水準以上となること</strong>と定義します。RFMは<strong>Recency（最終購買日）</strong> ・<strong>Frequency（購買頻度）</strong>・<strong>Monetary（累積購買金額）</strong>の頭文字をとったもので、現在の優良顧客を分析したり、未来に優良化する顧客を予測する指標としてよく用いられます。なお、Monetaryに近い概念として、顧客が企業やサービスに対して生涯で消費する合計金額を表す<strong>顧客生涯価値（Life Time Value：LTV）</strong>もよく使う指標です。</p>



<p>そうすると、<strong>RFMを切り口に会員の行動データを分析する</strong>ことになるため、<strong>会員ごとの購買履歴があれば条件を満たす</strong>ことになります。もちろん、購買金額がわかることが前提です。今回のデータソースでは「購買履歴」がそれにあたります。</p>



<p>一方でRFMは、優良であるという結果を測る指標にすぎないため、<strong>なぜ優良化したかの原因を探るには別の情報が必要</strong>となります。人の行動を決定づける要因は無数にあり、たとえば優良化の原因として<strong>ウェブサイトのUIが使いやすい</strong>なども考えられます。ECサイトの売上向上にむけて本格的にPDCAを回すのであれば、RFMを押し上げる原因の仮説をたて、その検証に必要な情報を新たに獲得することも必要です。</p>



<p>とはいえここでは、すでにあるデータから原因を探るほかありません。今回のデータソースでは「会員マスタ」と「商品マスタ」が利用可能であるため、<strong>どんな人で、どんな物を買っていると優良化しやすいかを分析することは可能</strong>そうです。逆にいうと、その範囲での分析に必要なデータはひとまず揃っているといえます。</p>



<h2><strong>分析可能な形になっているか。</strong></h2>



<p>次に、分析するにはデータが構造化されている必要があります。データは<strong>構造化</strong>と<strong>非構造化</strong>に大別されますが、<strong>構造化データ（Structured Data）</strong>は、端的にいえば<strong>行と列による表形式</strong>のデータのことで、CSVがその代表です。逆に表形式ではないものを<strong>非構造化データ（Unstructured Data）</strong>といい、XMLなどの記述様式に従ったものや、単なるテキスト・画像など全てを含みます。なお、ビッグデータの多くは非構造化データです。</p>



<p>Excelをはじめとして、ここで用いるBigQueryやTableau、あるいはPythonのデータ分析用拡張モジュールであるPandasなど、<strong>ほとんどの分析ツールは構造化データであることが前提</strong>となっています。したがって、非構造化データは構造化データに変換しなければなりません。</p>



<p>さらに、複数の表に別れている場合、同じ採番体系のキー情報により結合できる必要があります。今回のデータソースでいうと、購買履歴はどの会員がどの商品を買ったかを示すデータですが、それぞれ会員IDと商品IDのみで構成されており、その中身は会員マスタと商品マスタを参照する必要があります。つまり、購買履歴・会員マスタ・商品マスタの間で、会員IDと商品IDが一致している必要があります。当たり前のように思いますが、とくに顧客を示すIDが統一されていないケースも多く、その場合はさらに異なる採番体系のIDを紐づける別のマスタが必要なこともあります。</p>



<p>最後に、データの<strong>欠損・異常値・表記揺れ</strong>を考慮します。例えば、ECサイトなどの会員の情報は会員登録時に入力するものですが、一部が任意となっていることがあり、入力されない場合は<strong>欠損</strong>となります。今回のデータでいうと、性別を切り口に分析する際に、欠損を考慮せずに女性比率を集計するとミスリードする可能性があります。</p>



<p>また、年齢は会員登録時に入力された生年月日から割り出すことが多いですが、いい加減な情報が入力されてしまい、「2歳」のような常識ではありえない年齢が混入することもあります。これを<strong>異常値</strong>といい、考慮せずに平均年齢を集計すると、実態を見誤る危険性があります。</p>



<p>さらに、住所の市区町村より以下はフリーテキストで入力されることが多く、同じ市区町村を表すものでも表記が異なる場合があります。このような状態を<strong>表記揺れ</strong>（同義だが異句の状態）といい、あらかじめ補正しておく必要があります。</p>



<p>なお今回のデータソースは、事前に構造化され、欠損・異常値・表記揺れがない状態に加工されたものであるため、これらを考慮する必要はありません。</p>



<h2><strong>選択バイアスを回避する。</strong></h2>



<p>データ準備が完了したら、基礎分析を行います。<strong>基礎分析（Basic Analysis）</strong>とは、データの全体像を俯瞰して<strong>分布と偏り</strong>を把握することをいい、その主な目的は<strong>選択バイアスの回避</strong>です。<strong>選択バイアス（Selection Bias）</strong>とは、分析対象として選ばれたものと選ばれなかったものの間に見られる特性の差により生ずる<strong>系統誤差</strong>をいいます。すべてのデータを分析対象にできない上に、そもそもデータとして存在しないものもあるため、大なり小なり必ず発生します。例えば、プリペイドカードの購買履歴には、カードの入金額の上限を超える高額商品の購買履歴が含まれていません。</p>



<p>選択バイアスの把握は難しい問題ですが、以下の二つのポイントを抑えるとよいでしょう。</p>



<ol><li>既知の分布との違い</li><li>時系列データの開始と終了の問題</li></ol>



<p>例えばECサイトの会員の性別や年齢の分布について、同じ業態で一般的に知られている分布があれば、それと照らし合わせることも有効です。もっとも特定の性別や年齢にターゲットをしぼった商品やサービスを展開している場合は、そこに偏りがあるのは当然でしょう。また、ECサイトと小売店の両方で販売展開している場合に、商品カテゴリごとの売上構成比率がそれぞれで異なることがあります。このような<strong>ビジネス特性を考慮すること</strong>も重要です。</p>



<p>そして、行動データ分析において特に注意すべきなのが、<strong>時系列データの開始と終了の問題</strong>です。RFMの計測には、<strong>初回購入日</strong>と<strong>最終購入日</strong>を正確に把握する必要がありますが、例えば今回利用する2005年1月から2013年12月までの購買履歴データにおいて、2005年1月1日に最初の購買履歴がある会員の初回購入日を2005年1月1日としてもよいのでしょうか。事実かもしれませんが、<strong>それ以前に購買履歴はあるもののデータとして選ばれていない</strong>だけの可能性もあります。</p>



<p>購買履歴データ以外に、会員の初回購入日がわかるデータがあればよいですが、なければ正しい初回購入日を把握することはできません。その場合は、購買履歴上で<strong>最初に登場する購買日が初回購入日である可能性が高い会員</strong>のみを対象とする必要があります。これは最終購買日についても同様で、<strong>最後に登場する購買日が最終購買日である可能性が高い会員</strong>のみを対象とする必要があります。仮に、<strong>購買間隔が一年以上開く会員がほとんどいなければ、購買履歴データの最初と最後の一年間に購買履歴が存在する会員を除外すればよい</strong>ことになります。今回のデータで言い方を変えると、初回購買日が2006年1月以後かつ最終購買日が2012年12月以前の会員のみを対象とすればよいわけです。</p>



<p>では次回以降で、実際にBigQueryとTableauを操作しながら、<strong>顧客の分類と行動観察</strong>を行なっていきます。</p>
]]></content:encoded>
										</item>
	<item>
		<title>データエスノグラフィ入門 #01</title>
		<link>https://uxmeetsdata.com/data-ethnography-howto-01/</link>
				<pubDate>Fri, 19 Apr 2019 14:20:24 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[BigQuery]]></category>
		<category><![CDATA[Data Ethnography]]></category>
		<category><![CDATA[Tableau]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=6180</guid>
				<description><![CDATA[行動データ観察によるユーザー理解。 モバイルアプリのアクセスログや店舗での購買履歴など、あらゆるユーザー行動が...<p class="more-link"><a href="https://uxmeetsdata.com/data-ethnography-howto-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/04/xmd_de.png" alt="" class="wp-image-6409" width="480" height="241" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de.png 720w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de-300x150.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>行動データ観察によるユーザー理解。</strong></h2>



<p>モバイルアプリの<strong>アクセスログ</strong>や店舗での<strong>購買履歴</strong>など、あらゆるユーザー行動がデータ化されています。今後は5GやIoTの普及により、生体データや撮影データなどが集約され、さらにビッグデータ化されていくことでしょう。ただ、データは貯めているだけでは何の価値も生みません。分析し、有用な知識を獲得してこそ意味があります。 </p>



<p>また、多くのマーケターやビジネスパーソンにとって、ユーザーの行動データから、購買の<strong>意思決定プロセス</strong>を把握したい、<strong>思いもよらないニーズ</strong>を発見したい、というのは、データ活用におけるもっとも重要な関心ごとのひとつでしょう。</p>



<p>あるコンテンツXの閲覧（事象X）と、ある商品Yの購買（事象Y）には、強い共起性があるから、事象Yの意思決定に事象Xがなんらか関与している可能性が高いのではないか。そのような分析はよく行われることと思います。購買という結果につながる原因がわかれば、さらなる購買向上にむけた対策を講じることが可能となります。二つの事象間の因果関係を明らかにする考え方や手法には<strong>因果推論（Causal Inference）</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/causal-inference/">いまさら聞けない因果推論</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>や<strong>ベイズ推定（Bayesian Inference）</strong><sup id="footnote_plugin_tooltip_2" class="footnote_plugin_tooltip_text" onclick="footnote_moveToAnchor('footnote_plugin_reference_2');">2)</sup><span class="footnote_tooltip" id="footnote_plugin_tooltip_text_2"><a href="https://uxmeetsdata.com/bayesian-inference/">いまさら聞けないベイズ推定</a></span><script type="text/javascript">	jQuery("#footnote_plugin_tooltip_2").tooltip({		tip: "#footnote_plugin_tooltip_text_2",		tipClass: "footnote_tooltip",		effect: "fade",		fadeOutSpeed: 100,		predelay: 400,		position: "top right",		relative: true,		offset: [10, 10]	});</script>などがありますが、簡単ではありません。</p>



<p>一方で、<strong>一人ひとりの行動データをミクロ視点で観察</strong>し、時系列に追うことで、ユーザーの意思決定プロセスの<strong>理解や発見</strong>が進むことがあります。<a rel="noreferrer noopener" href="http://crosshack.jp/" target="_blank">クロスハック</a>ではこれを<strong>データエスノグラフィ（Data Ethnography）</strong><sup id="footnote_plugin_tooltip_3" class="footnote_plugin_tooltip_text" onclick="footnote_moveToAnchor('footnote_plugin_reference_3');">3)</sup><span class="footnote_tooltip" id="footnote_plugin_tooltip_text_3"><a href="https://uxmeetsdata.com/data-ethnography/">データエスノグラフィって？</a></span><script type="text/javascript">	jQuery("#footnote_plugin_tooltip_3").tooltip({		tip: "#footnote_plugin_tooltip_text_3",		tipClass: "footnote_tooltip",		effect: "fade",		fadeOutSpeed: 100,		predelay: 400,		position: "top right",		relative: true,		offset: [10, 10]	});</script>と呼んでいます。エスノグラフィとは、生活者のありのままの行動を観察することで、アンケートやインタビューからは得られない洞察や発見の獲得を目指す手法のことですが、これはそのデータ版と言えます。</p>



<p>そこで今回は、データエスノグラフィ実践の入門編をご紹介したいと思います。なお、分析ツールは<strong>Google BigQuery</strong>と<strong>Tableau Desktop</strong>を用いて進めます。それぞれについては「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL</a>」「<a href="https://uxmeetsdata.com/tableau-bi-01/">TableauではじめるBI</a>」を参照してください。</p>



<h2><strong>データエスノグラフィの手順。</strong></h2>



<p>データエスノグラフィは以下の手順で進めます。</p>



<ol><li>分析の<strong>背景の整理</strong>と<strong>目的の明確化</strong></li><li><strong>データ準備</strong>と<strong>基礎分析</strong></li><li>ユーザーの<strong>分類と選定</strong></li><li><strong>行動データの観察</strong></li><li><strong>代表性の検証</strong></li></ol>



<p>データ分析に限らず、何らかの課題解決をするには、まずその<strong>背景を整理し、目的を明確化する</strong>必要があります。当たり前の話ですが、失敗するデータ分析の多くは、ここをあいまいにしたまま、<strong>とにかく何らかの有用な知識を獲得したい</strong>という思いのみで行われており、時間とコストを浪費する結果となっています。</p>



<p>また、データは「存在する」状態と「分析できる」状態では全く異なります。そして多くのデータは分析することを目的に収集されておらず、そもそも<strong>構造化されていない</strong>、あるいは<strong>欠損・異常値・表記揺れ</strong>（同義だが異句の状態）を含むこともあります。それらを加工し「分析できる」状態にすることを<strong>データ準備（Data Preparation）</strong>といいます。</p>



<p>さらに、あまねく全てのデータを準備することはできないため、必然的に<strong>選択</strong>が行われ、<strong>偏り</strong>が必ず発生します。これを<strong>選択バイアス（Selection Bias）</strong>といいます。例えば、プリペイドカードの購買履歴には、カードの入金額の上限を超える高額商品の購買履歴がそもそも含まれていません。おそらくクレッジトカードなどの他の決済手段で購買しているのでしょう。このような偏りのあるデータで無邪気にRFM分析などを行うと、<strong>ミスリード（Misslead）</strong>を起こします。</p>



<p>選択バイアスを無くすことが理想ですが、現実には不可能であるため、データの全体像を俯瞰して<strong>分布と偏り</strong>を把握し、分析を進める上での前提条件として捉えておくことが重要です。その作業を<strong>基礎分析（Basic Analysis）</strong>といいます。</p>



<p>ここまで完了してようやくデータエスノグラフィが実施可能となるわけですが、とはいえすべてのユーザーの行動を観察するわけには行きません。そこで、似たユーザーを<strong>セグメント（Segment）</strong>に<strong>分類</strong>し、観察すべきセグメントを<strong>選定</strong>します。</p>



<p>観察すべきセグメントが決まれば、その中から数名のユーザーを抽出し、<strong>一人ひとりの行動データをミクロ視点で観察</strong>し、何人かに共通して見られる<strong>典型的な行動パターン</strong>を分析します。例えば、アパレルのモバイルアプリのアクセスログと店舗での購買履歴のデータであれば、「<strong>来店前に会員向け先行情報を閲覧</strong>」「<strong>来店中にポイントを確認</strong>」「<strong>来店後にコーディネート機能を利用</strong>」などの行動パターンを捉えていきます。</p>



<p>これがわかれば、先行情報を閲覧したセグメントは、閲覧しなかったセグメントと比べて購買しているかという<strong>疑似実験（Quasi Experiment）</strong>を行うことで、先行情報の因果効果を明らかにする<strong>因果推論</strong>が可能となります。</p>



<p>ただし、行動観察から捉えた行動パターンは、観察したその数名にのみ見られるものかもしれません。そこで<strong>代表性の検証</strong>が必要となります。<strong>代表性（Representativeness）</strong>とは、調査対象者全体の中から抽出された一部の対象者の調査結果が、調査対象者全体の結果を、偏りなく正確に反映出来ているかどうかのことです。（※代表性の検証の方法は最終回に説明）</p>



<h2><strong>ECサイトの継続率をどう上げるか。</strong></h2>



<p>では、データエスノグラフィの実践を進めて行きましょう。まずは分析の<strong>背景の整理</strong>と<strong>目的の明確化</strong>を行います。</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>データソースは以下の３つを使用します。</p>



<table style="table-layout: fixed; width: 100%;">
<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>
</table>



<p>まずはこれらのデータをBigQueryに投入します。データセット名とテーブル名は任意ですが、この後の解説で使う名前と合わせておきたい方は、データセット名を「DE」、テーブル名はファイル名をそのまま設定しておきましょう。投入が完了すると、このような状態になります。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_1a-e1556842844377-1024x543.jpg" alt="" class="wp-image-6500" width="480" height="253" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_1a-e1556842844377-300x159.jpg 300w, https://uxmeetsdata.com/wp-content/uploads/2019/04/xmd_de_1a-e1556842844377-768x407.jpg 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>次回は、<strong>データ準備と基礎分析</strong>について見て行きます。</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>
	</channel>
</rss>
