<?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>Clustering &#8211; uxmeetsdata.com</title>
	<atom:link href="https://uxmeetsdata.com/tag/clustering/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>クラスター分析入門 #04</title>
		<link>https://uxmeetsdata.com/clustering-howto-04/</link>
				<pubDate>Tue, 23 Jul 2019 12:00:57 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[Cloud Datalab]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Data Mining]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=11327</guid>
				<description><![CDATA[非階層型クラスタリングを実践。 前回は階層型クラスタリングでクラスター数のあたりをつけ、各クラスターの特徴を捉...<p class="more-link"><a href="https://uxmeetsdata.com/clustering-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/05/xmd_cls-e1556962655252.jpg" alt="" class="wp-image-8366" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252.jpg 640w, https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252-300x150.jpg 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>非階層型クラスタリングを実践。</strong></h2>



<p>前回は階層型クラスタリングでクラスター数のあたりをつけ、各クラスターの特徴を捉えました。今回は非階層型クラスタリングを実践します。</p>



<p><strong>非階層型クラスタリング（Non-hierarchical Clustering）</strong>は階層的な構造を持たず、最初に決めたクラスター数にサンプルを分けていく手法です。ただし、いくつのクラスターに分けるかは分析者が決める必要があり、最適クラスター数を自動的には計算する方法は確立されていません。階層型と比較して計算量が少なく、サンプル数が多いデータの分析に適しています。</p>



<p>まずは階層型クラスタリングの結果との比較を行うため、前回と同様にサンプリングデータである「sum_members_cls_smp」を使用します。</p>



<p>まずはCloud Datalabで非階層型クラスタリングのための実行環境を準備します。とはいえCloud Datalabには、GCP（Google Cloud Platform）との連携や、メジャーなデータ分析・機械学習系の拡張モジュールがあらかじめインストールされているため、インポートするだけです。データ操作やBigQueryとの連携用に「pandas」、作成したクラスターの主成分分析の結果の可視化用に「matplotlib」、各種計算処理用に「numpy」「scikit-learn」 をそれぞれインポートします。</p>



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



<p>拡張モジュールの準備が完了したら、BigQueryで作成した分析用テーブルを取り込みます。それには「read_gbq」関数を使い、引数にBigQueryのクエリを実行するSQL文とGCPのプロジェクトIDを指定します。以下のコードを入力エリアに記述し、実行してみてください。</p>



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



<h2><strong>K平均法による併合。</strong></h2>



<p>では、機械学習用の拡張モジュールであるscikit-learnを用いて、非階層型クラスタリングを行います。以下のようなコードで実現できるので、入力エリアに記述し、実行してみてください。</p>



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



<p>なお、分類方法には<strong>k平均法</strong>を用いています。<strong>k平均法（k-Means Method）</strong>は非階層型クラスタリングの代表的な分類手法で、クラスターの平均を用い、与えられたクラスター数k個に分類することからこのように命名されたものです。この計算処理にはscikit-learnのKMeansメソッドを用います。</p>



<p>また、k平均法の結果は多次元の距離で表現されるため、可視化するには次元圧縮を行う必要があります。次元圧縮のアルゴリズムとして最も一般的なのは<strong>主成分分析（Principal Component Analysis：PCA）</strong>ですが、ここでは非線形データを扱える<strong>カーネル主成分分析（Kernel PCA）</strong>を選択します。この計算処理には同じくscikit-learnのKernel PCAメソッドを用います。結果をクラスターごとに色分けして散布図で描画すると以下のようになります。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4a-1024x565.png" alt="" class="wp-image-11782" width="480" height="265" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4a-1024x565.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4a-300x165.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4a-768x423.png 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>この散布図から、大きく上下に塊が分離していることがわかります。これは縦軸に性別が選択された結果です。年齢はクラスタリングに影響を与えておらず、無視されています。横軸には商品カテゴリの購買傾向が表現されており、右側のオレンジとブルーの塊は、全商品カテゴリを購入している層となります。このうように散布図を見ることで、ある程度は視覚的に捉えることができます。とはいえ詳しく把握するには、クラスターごとに特徴を見る必要があります。</p>



<p>Tableauで可視化するとわかりやすいので、クラスタリング結果をいったんBigQueryに戻します。以下のコードを入力エリアに記述し、実行してみましょう。なお「to_gbq」関数の引数には、元の会員マスタにクラスターIDである「cluster」列を追加したデータフレーム、書き込み先のテーブル名、GCPのプロジェクトIDを指定します。</p>



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



<p>なお、BigQueryへの書き出しがうまく行かない場合は、以下のコードでCSVファイルに書き出し、GCS（Google Cloud Storage）経由でBigQueryに取り込みます。</p>



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



<h2><strong>クラスターごとの特徴を可視化。</strong></h2>



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



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4b-1024x514.png" alt="" class="wp-image-11786" width="480" height="241" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4b-1024x514.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4b-300x150.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_4b-768x385.png 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>クラスターごとの特徴を見ると、クラスターID:1は女性のみで構成され、平均年齢は30代半ば、主に「家庭・ガーデニング用品」を購入しているセグメント、クラスターID:2は男性のみで構成され、平均年齢は30代半ば、全商品カテゴリを購入しているセグメント、などがわかります。</p>



<p>階層型と比較して、<strong>性別による分類が強く働いている</strong>ことがわかります。また平均年齢については階層型と同様に分類にはほとんど影響を与えていません。購買商品カテゴリについては階層型と似たような分類結果となっています。</p>



<p>ここまでは階層型との比較のため、サンプリングデータを用いた非階層型クラスタリングを実施しましたが、同様の手順でノンサンプリングデータについても実施することが可能です。それには「sum_members_cls_non」テーブルを使用します。このデータの非階層型クラスタリングの分析結果も、上記と同様にTableauで可視化すると、以下のようなビューが表示されます。</p>



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



<p>クラスターごとの特徴を見ると、さきほどは男女で分かれていた全商品カテゴリ購買層が統合されて一つのクラスターになっているなど、分類に対する性別の影響力が弱まっており、概ね<strong>商品カテゴリの購買傾向による分類</strong>になっていることがわかります。これはサンプル数が増えているにも関わらず、購買傾向のパターンが増えずに固定化されることで影響力が高まり、相対的に性別の影響力が低下しているものと思われます。購買商品カテゴリの変数の値を購買頻度に合わせて重み付けするなど行えば、また違った分類結果が導出される可能性があります。</p>



<p>ここまで階層型および非階層型の両方のアプローチによるクラスター分析の実践を進めてきましたが、今回のようなビッグデータでもサンプル数を減らすことで階層型クラスタリングを実行でき、分類構造を視覚的に捉えながら妥当なクラスター数にあたりをつけた上で、最終的に非階層型クラスタリングでノンサンプリングデータの分類が可能であることがわかったかと思います。</p>



<p>このプロセスにより、大量の顧客データから「<strong>似た者同士</strong>」であるセグメントを分析し、<strong>すべての顧客データに割り当てた上でパーソナライゼーションを実行する</strong>ことが可能となります。</p>
]]></content:encoded>
										</item>
	<item>
		<title>クラスター分析入門 #03</title>
		<link>https://uxmeetsdata.com/clustering-howto-03/</link>
				<pubDate>Mon, 22 Jul 2019 11:00:21 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[Cloud Datalab]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Data Mining]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=11325</guid>
				<description><![CDATA[階層型クラスタリングを実践。 BigQueryにて分析データ環境が整ったところで、Cloud Datalabに...<p class="more-link"><a href="https://uxmeetsdata.com/clustering-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/05/xmd_cls-e1556962655252.jpg" alt="" class="wp-image-8366" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252.jpg 640w, https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252-300x150.jpg 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>階層型クラスタリングを実践。</strong></h2>



<p>BigQueryにて分析データ環境が整ったところで、Cloud Datalabによるクラスター分析を行います。クラスター分析には<strong>階層型</strong>と<strong>非階層型</strong>の二つがあり、ここでは両方のアプローチを試みますが、今回は階層型クラスタリングを実践します。</p>



<p><strong>階層型クラスタリング（Hierarchical Clustering）</strong>は、最も似ている対象の組み合わせから順にグルーピングしていく手法で、その過程で階層が構成され、最終的に<strong>デンドログラム（Dendrogram）</strong>と呼ばれる樹形図が完成します。順にグルーピングするため最初にクラスター数を決める必要はなく、後から決めることが可能であり、決めたクラスター数により最終的にどのグループをクラスターとするかが決まります。</p>



<p>まずはクラスターの分類構造を視覚的に捉えることが可能な階層型から行い、妥当なクラスター数のあたりをつけつつ、各クラスターの特徴を捉えてみることにします。</p>



<p>なお階層型クラスタリングではサンプル数が多いと<strong>極端に計算量が増え</strong>、また<strong>分類構造を捉えづらくなる</strong>ためサンプリングデータで行います。分析対象データの会員数は64万人程度ですが、わかりやすさを重視して0.1%の636人にサンプリングします。前回作成した「sum_members_cls_smp」テーブルがそれに該当します。</p>



<p>まずはCloud Datalabで階層型クラスタリングのための実行環境を準備します。とはいえCloud Datalabには、GCP（Google Cloud Platform）との連携や、メジャーなデータ分析・機械学習系の拡張モジュールがあらかじめインストールされているため、インポートするだけです。データ操作やBigQueryとの連携用に「pandas」、作成したデントログラムの可視化用に「matplotlib」、各種計算処理用に「numpy」「scipy」 をそれぞれインポートします。</p>



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



<p>拡張モジュールの準備が完了したら、BigQueryで作成した分析用テーブルを取り込みます。それには「read_gbq」関数を使い、引数にBigQueryのクエリを実行するSQL文とGCPのプロジェクトIDを指定します。以下のコードを入力エリアに記述し、実行してみてください。</p>



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



<h2><strong>ウォード法による併合。</strong></h2>



<p>では、科学計算の拡張モジュールであるscipyを用いて、階層型クラスタリングを行います。以下のようなコードで実現できるので、入力エリアに記述し、実行してみてください。</p>



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



<p>なお、併合方法に<strong>ウォード法</strong>を、測定距離に<strong>ユークリッド距離</strong>をそれぞれ指定しています。<strong>ユークリッド距離（Euclidean Distance）</strong>については「<a href="https://uxmeetsdata.com/clustering-howto-01/">クラスター分析入門 #01</a>」で説明しているのでそちらを参照してください。ここでは<strong>ウォード法（Ward Method）</strong>について簡単に補足しておきます。クラスターXの重心とクラスター内の各要素との距離の二乗和をL(X)とするとして、クラスターAとBを併合したクラスターのL(A∪B)と、併合前のそれぞれのクラスターのL(A)およびL(B)の合計との差が最小になるようなクラスター同士を併合する手法がウォード法です。式で表現すると、以下のΔが最小になるように計算します。計算量は多いものの分類精度が高く、階層型クラスタリングの併合手法としてよく用いられます。</p>







<p>$$Δ = L(A∪B) -(L(A)+L(B))\\$$</p>



<p>実行結果として、以下のような<strong>デンドログラム（Dendrogram）</strong>が描画されるかと思います。なお、上記のプログラムでthresholdという変数に8を指定していますが、これは縦軸の8の位置に水平方向の補助線を引くという意味で、その補助線とデンドログラムが交差する点がクラスターの分割ポイントとなります。すなわち指定する値によりクラスター数を変えることが可能ということです。冒頭で階層型は最初にクラスター数を決める必要はなく、後から決めることが可能だと言いましたが、これがそのことです。補助線で分割された各クラスターは色分けして描画され、左から順に正の整数でクラスターIDが付与されます。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_3a-1024x586.png" alt="" class="wp-image-11703" width="480" height="272"/></figure></div>



<p>このデンドログラムから、クラスター数は10程度が妥当ではないかというあたりがつけられます。とはいえ各クラスターの特徴や、なぜこのように分類されたのかがわかりません。それにはクラスターごとに特徴量を見る必要があります。</p>



<p>Tableauで可視化するとわかりやすいので、クラスタリング結果をいったんBigQueryに戻します。以下のコードを入力エリアに記述し、実行してみましょう。なお「to_gbq」関数の引数には、元の会員マスタにクラスターIDである「cluster」列を追加したデータフレーム、書き込み先のテーブル名、GCPのプロジェクトIDを指定します。</p>



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



<p>なお、BigQueryへの書き出しがうまく行かない場合は、以下のコードでCSVファイルに書き出し、GCS（Google Cloud Storage）経由でBigQueryに取り込みます。</p>



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



<h2><strong>クラスターごとの特徴を可視化。</strong></h2>



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



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_3b-1024x514.png" alt="" class="wp-image-11704" width="480" height="241" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_3b-1024x514.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_3b-300x150.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_3b-768x385.png 768w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<p>説明変数はすべて0から1の値であるため、平均値の範囲も同様になります。また、平均値が0から1のどこにあるかで変数の特徴がわかります。たとえばクラスターID:1は性別が0.4程度と男性の比率が高く、クラスターID:4は性別が0.6程度と女性の比率が高いことがわかります。</p>



<p>このようにクラスターごとの各変数の値を見ることで、各クラスターの特徴や、なぜそのように分類されたのかが見えてきます。具体的には、クラスターID:2は男女比率が同程度で、平均年齢は30代後半、全商品カテゴリを購入しているセグメント、クラスターID:4は女性の比率が高く、平均年齢は30代半ば、主に「エレクトロニクス・コンピューター」「家庭・ガーデニング用品」を購入しているセグメント、などがわかります。</p>



<p>また全体感として<strong>平均年齢にあまり差異はなく</strong>、分類にはほぼ影響していないことがわかります。<strong>性別については、男女比40%から60%の範囲でばらついており</strong>、やや影響していることがわかります。購買商品カテゴリについては、<strong>全商品カテゴリを購入している層と特定の商品カテゴリのみを購入している層に分かれている</strong>ことがわかります。これは購入頻度との相関がありそうです。</p>



<p>ここでの階層型クラスタリングは、わかりやすさを重視してサンプル数をかなり減らしており、統計的な信頼度は低いといえます。しかしながら、仮説として妥当なクラスター数のあたりをつけたり、どのように分類されるかの傾向を見るには十分な材料と言えるでしょう。</p>



<p>次回は非階層型クラスタリングを実践します。</p>
]]></content:encoded>
										</item>
	<item>
		<title>クラスター分析入門 #02</title>
		<link>https://uxmeetsdata.com/clustering-howto-02/</link>
				<pubDate>Sun, 21 Jul 2019 12:00:56 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[Cloud Datalab]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Data Mining]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=11323</guid>
				<description><![CDATA[Cloud Datalabでクラスター分析。 ここからクラスター分析の実践を進めて行きますが、分析ツールはGo...<p class="more-link"><a href="https://uxmeetsdata.com/clustering-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/05/xmd_cls-e1556962655252.jpg" alt="" class="wp-image-8366" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252.jpg 640w, https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252-300x150.jpg 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>Cloud Datalabでクラスター分析。</strong></h2>



<p>ここからクラスター分析の実践を進めて行きますが、分析ツールは<strong>Google BigQuery</strong>と<strong>Google Cloud Datalab</strong>を用います。BigQueryついては「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL</a>」、Cloud Datalabについては選択する理由と合わせて「<a href="https://uxmeetsdata.com/association-howto-02/">アソシエーション分析入門 #02</a>」に詳しいのでそちらを参照してください。</p>



<p>なお、Cloud Datalabに近いものとして「<a href="https://uxmeetsdata.com/colab-python-01/">ColabではじめるPython</a>」でも紹介した、同じくGoogleが提供する<strong>Google Colab</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/colab-python-01/">ColabではじめるPython</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>という無料サービスがあります。ただ、Colabはあくまで教育・研究用であり、秘匿性の高いデータを扱うことができないなどの制約があるため、ビジネス利用にはCloud Datalabを推奨します。</p>



<p>今回は「<a href="https://uxmeetsdata.com/data-ethnography-howto-01/">データエスノグラフィ入門</a>」と連動し、とある総合ECサイトの会員のセグメンテーションを行うという設定でクラスター分析の実践を行うため、ビジネス利用を想定し、Cloud Datalabを用いることにします。</p>



<h2><strong>新しい商品カテゴリの提案。</strong></h2>



<p>それでは、Cloud Datalabを利用したPythonによるクラスター分析のプログラミングを実践していきます。まず分析の背景と目的を整理します。</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>



<h2><strong>変数選択とダミー変数。</strong></h2>



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



<p>次に、定義した説明変数の中で相関する変数がないかを確認します。「<a href="https://uxmeetsdata.com/clustering-howto-01/">クラスター分析入門 #01</a>」でも触れたとおり、クラスター分析において<strong>強い相関をもつ変数の存在は冗長で無意味であり、予めどちらかを除外する</strong>必要があります。</p>



<p>変数間の相関性は、質的変数であれば<strong>クロス集計（Cross Tabulation）</strong>、量的変数であれば<strong>散布図（Scatter Plot）</strong>などの手法を用いて分析します。ここでは詳しいプロセスは省略しますが、各変数間に相関性が見られないことが下図にて確認できます。</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2a-1024x728.png" alt="" class="wp-image-11621" width="480" height="342" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2a-1024x728.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2a-300x213.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2a-768x546.png 768w" sizes="(max-width: 480px) 100vw, 480px" /><figcaption>年代別性別比率</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2b-1024x728.png" alt="" class="wp-image-11622" width="480" height="342" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2b-1024x728.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2b-300x213.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2b-768x546.png 768w" sizes="(max-width: 480px) 100vw, 480px" /><figcaption>商品カテゴリ別性別比率</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2c-1024x728.png" alt="" class="wp-image-11623" width="480" height="342" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2c-1024x728.png 1024w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2c-300x213.png 300w, https://uxmeetsdata.com/wp-content/uploads/2019/07/xmd_cls_2c-768x546.png 768w" sizes="(max-width: 480px) 100vw, 480px" /><figcaption>商品カテゴリ別年代比率</figcaption></figure></div>



<p>次にクラスタリング用のデータを用意するわけですが、ここでひとつ前処理が必要になります。「<a href="https://uxmeetsdata.com/clustering-howto-01/">クラスター分析入門 #01</a>」で説明したとおり<strong>要素間の距離を類似度とみなす</strong>ことで類似性を分析するのですが、距離を測定するためには変数が数値化されている必要があります。年齢のような量的変数は問題ありませんが、性別や購買商品カテゴリは質的変数であるため、そのままでは数値として扱うことができません。そこで<strong>ダミー変数</strong>という概念を用います。</p>



<p><strong>ダミー変数（Dummy Variable）</strong>とは、質的変数を量的変数として扱うための変数のことで、0と1の二項値を持ちます。例えば、性別であれば&#8221;男性&#8221;と&#8221;女性&#8221;の二項値の場合はそのまま男性を0、女性を1のように設定します。</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>
</tbody>
</table>



<p>ただし、最近では性別の選択肢に&#8221;その他&#8221;を設定しているケースも多く、その場合は二項値になりません。このような多項値の場合には、変数の値を別々の真偽値をもつ変数に分解し、偽を0、真を1のように設定します。</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;">性別が男性である（is_gender_male）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">性別が女性である（is_gender_female）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
<td style="background-color: #eee;">性別がその他である（is_gender_other）</td>
<td>偽：0、真：1</td>
</tr>
<tr>
</tbody>
</table>



<p>今回の対象データでいうと、性別は男性と女性の二項値になっているため、そのままダミー変数にすることができます。なお、購買商品カテゴリについては、それぞれについて購買経験の有無により真偽値を設定することとします。</p>



<p>ところで、年齢については量的変数であるため説明変数として扱うことが可能ですが、クラスタリングに使うには他の説明変数と値の範囲を揃える必要があります。すなわちダミー変数と同じ0から1の値になるように調整することになります。年齢はおよそ0歳から100歳なので、100で割った値を説明変数とします。なお、このように説明変数の値の範囲を変えることを<strong>特徴のスケール（Feature Scaling）</strong>、値の範囲を揃えることを<strong>正規化（Normalization）</strong>といいます。</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」という名前で保存します。なお、こちらは<strong>ノンサンプリングデータ</strong>になります。</p>



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



<p>また、計算量を減らし、かつ分類構造を視覚的に捉えやすくするため、ここでは主に<strong>サンプリングデータ</strong>を用いることにします。クエリエディタに以下のSQL文を入力し、青い［実行］ボタンをクリックしてみましょう。このクエリ結果をデータセット「DE」に「sum_members_cls_smp」という名前で保存します。さきほどとの違いは、WHERE文に会員IDを1,000で割った剰余が0の場合に限定するという条件文を追加している点で［※1］、<strong>0.1%のサンプリング</strong>を意味します。</p>



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



<p>これで分析用のデータと環境は整いました。次回以降で、階層型・非階層型のそれぞれのアプローチでクラスター分析を進めて行きます。</p>
]]></content:encoded>
										</item>
	<item>
		<title>クラスター分析入門 #01</title>
		<link>https://uxmeetsdata.com/clustering-howto-01/</link>
				<pubDate>Sat, 20 Jul 2019 09:00:50 +0000</pubDate>
		<dc:creator><![CDATA[Atsushi Sugawa]]></dc:creator>
		<category><![CDATA[Data]]></category>
		<category><![CDATA[Data Science]]></category>
		<category><![CDATA[Cloud Datalab]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Data Mining]]></category>

		<guid isPermaLink="false">https://uxmeetsdata.com/?p=11298</guid>
				<description><![CDATA[似た者同士を集める。 クラスター分析（Cluster Analysis）は、異なる性質を持つ要素が混ざり合った...<p class="more-link"><a href="https://uxmeetsdata.com/clustering-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/05/xmd_cls-e1556962655252.jpg" alt="" class="wp-image-8366" width="480" height="240" srcset="https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252.jpg 640w, https://uxmeetsdata.com/wp-content/uploads/2019/05/xmd_cls-e1556962655252-300x150.jpg 300w" sizes="(max-width: 480px) 100vw, 480px" /></figure></div>



<h2><strong>似た者同士を集める。</strong></h2>



<p><strong>クラスター分析（Cluster Analysis）</strong>は、異なる性質を持つ要素が混ざり合った集合から、互いに似た性質を持つ要素を集めた部分集合を作る手法で、<strong>データマイニング（Data Mining）</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/data-mining/">再考するデータマイニング</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></a>の中核をなす分析手法のひとつです。なお、<strong>クラスター（Cluster）</strong>とは房・群れ・集団を意味します。</p>



<p>ところで「<a href="https://uxmeetsdata.com/machine-learning/">いまさら聞けない機械学習</a>」で<strong>教師なし学習（Unsupervised Learning）</strong>の手法として<strong>クラスタリング（Clustering）</strong>を紹介しましたが、手法としては全く同じものです。データマイニングでは気づいていない似た性質を持つ集合を<strong>発見する</strong>ことを主な目的とし、機械学習では今後発生する事象がどの集合に分類されるかを<strong>予測する</strong>ことを主な目的とします。</p>



<p>なお、教師なし学習であるため、クラスターの分類基準はあらかじめ決まっていません。与えられた変数や特徴量をもとに、性質の近い要素を半自動的に抽出して分類することになります。</p>



<p>クラスター分析はマーケティング領域でよく用いられます。「<a href="https://uxmeetsdata.com/personalization/">再考するパーソナライゼーション</a>」でも触れたとおり、多様化する生活者の価値観に個別に最適化することを<strong>パーソナライゼーション（Peasonalization）</strong>といい、そのアプローチにより売上を最大化するマーケティング戦略を<strong>1to1マーケティング</strong>といいますが、実際にはすべての個人に対して個別に最適化することは難しく、似た者同士での分類、すなわち<strong>セグメンテーション（Segmentation）</strong>を行う必要があります。一方で、分類基準が自明である場合はよいものの、顧客の価値観や意思決定に関わる因子は極めて複雑であり、多くの場合は自明ではありません。</p>



<p>そのような場合においてクラスター分析は有効な手段であり、顧客データが持つ性別・年齢・購買傾向などのさまざまな変数から似た者同士をクラスターとして抽出することで、セグメンテーションのヒントを得ることが可能となります。</p>



<p>そこで今回は、このクラスター分析の実践にむけた入門編をご紹介します。なお、分析ツールはGoogle BigQueryとGoogle Cloud Datalabを用いて進めます。BigQueryついては「<a href="https://uxmeetsdata.com/bigquery-sql-01/">BigQueryではじめるSQL</a>」、Cloud Datalabについては選択する理由と合わせて「<a href="https://uxmeetsdata.com/association-howto-02/">アソシエーション分析入門 #02</a>」に詳しいのでそちらを参照してください。</p>



<h2><strong>階層型と非階層型。</strong></h2>



<p>実践に入る前に、分析の基本的な考え方についてまとめておきます。まずクラスター分析は要素間の類似性を分析する手法の総称であり、特定の分析手法をさすものではありません。分類の形式や要素間の類似度の計算ロジックにより、いくつかの手法に分かれます。</p>



<ul><li><strong>分類の形式</strong>：階層型、非階層型</li><li><strong>分類に用いる距離</strong>：ユークリッド距離、マハラノビス距離など</li><li><strong>分類における併合方法</strong>：ウォード法、k平均法など</li></ul>



<p>まず大きく階層型と非階層型に分かれます。それぞれの詳細は次回以降に後述するとして、ここでは概要を説明しておきます。</p>



<p><strong>階層型クラスタリング（Hierarchical Clustering）</strong>は、最も似ている対象の組み合わせから順にグルーピングしていく手法で、その過程で階層が構成され、最終的に<strong>デンドログラム（Dendrogram）</strong>と呼ばれる樹形図が完成します。順にグルーピングするため最初にクラスター数を決める必要はなく、後から決めることが可能であり、決めたクラスター数により最終的にどのグループをクラスターとするかが決まります。</p>



<p><strong>非階層型クラスタリング（Non-hierarchical Clustering）</strong>は階層的な構造を持たず、最初に決めたクラスター数にサンプルを分けていく手法です。ただし、いくつのクラスターに分けるかは分析者が決める必要があり、最適クラスター数を自動的には計算する方法は確立されていません。階層型と比較して計算量が少なく、サンプル数が多いデータの分析に適しています。</p>



<p>階層型と非階層型の使い分けについて、データのサンプル数が多い場合には非階層型が有利であることから、ビッグデータ分析では非階層型を使うと説明される場合もありますが、それには異論があります。</p>



<p>ビッグデータであっても、分類の軸となる変数や特徴量をつかむことが目的であれば、サンプリングによりサンプル数を減らしての分析も可能です。むしろ、どのように分類されるかの傾向や、あるいは分類の構造をつかみたい場合は、最初にクラスター数を決める必要がなく、さらに分類結果が構造化される階層型のほうが有利な場合も少なくありません。非階層型は、とにかく分類はされるものの、指定したクラスター数の妥当性や、なぜそのように分類されたかの構造を視覚的につかむことができないからです。</p>



<p>このように、階層型と非階層型のどちらが適しているかは、データ量だけでなく分析の目的やデータの理解度などによっても異なりますし、どちらが適しているかがわからない場合も多いため、両方のアプローチをとることをおすすめします。この記事においても、両方のアプローチで進めることにします。</p>



<h2><strong>距離を類似度とみなす。</strong></h2>



<p>続いて、クラスター分析における距離について説明します。クラスター分析は似た者同士に分類する手法ですが、それには要素間の類似度を定量的に測定する必要があります。そして類似度は、要素間の距離として定量的に測定することが可能です。例えば、あるクラスの生徒の身長と体重のデータを二次元平面にプロットしたとします。その中で、似た体格の生徒は距離的に近い場所にプロットされるはずです。これが、類似度を距離で測定できるということです。すなわち<strong>要素間の距離を類似度とみなす</strong>ことができるということになります。</p>



<p>ところで、数学やデータサイエンスで使う距離にはいくつかの種類があります。日常で用いる距離は、数学的には<strong>ユークリッド距離（Euclidean Distance）</strong>と呼ばれるもので、要素Aと要素Bの二点間の距離は、二次元平面であればピタゴラスの定理により計算することが可能です。これをN次元に拡張にすると、以下の数式で表現されることになります。</p>







<p>$$d(A, B) =\sqrt{(A_1-B_1)^2+&#8230;+(A_n-B_n)^2}\\$$</p>



<p>数学の世界では、ユークリッド距離以外にも、マハラノビス距離やコサイン距離など多数の距離が存在します。ここでは距離の深掘りは避けておきますが、ユークリッド距離以外の距離の捉え方がある、ということを理解するために、マハラノビス距離について簡単に触れておきます。<strong>マハラノビス距離（Mahalanobis&#8217; Distance）</strong>は、<strong>相関性を考慮した</strong>距離の捉え方です。</p>



<p>先ほどの例で、あるクラスの生徒の身長と体重のデータを二次元平面にプロットした場合に、似た体格の生徒は距離的に近い場所にプロットされると言いました。では身長も体重も平均的な生徒Aさんから見た場合に等距離にいる生徒は、みな体格の類似度は同じに見えると言えるでしょうか。たとえば、Aさんよりも身長が高く体重も重いBさんと、Aさんよりも身長は低いものの体重が重いCさんがいた場合に、Aさんからの距離がBさんとCさんで同じになることがありますが、Bさんの体型はAさんと比較的似ているものの、Cさんはかなり太っているように見えるはずです。</p>



<p>これは、身長と体重の間に相関がある、すなわち身長が高くなるほど体重も重たくなるという性質によるものです。この場合は相関性を考慮し、相関の強い方向の距離を、実際のユークリッド距離よりも相対的に短く測定することで、実態に近い類似度を表現することが可能となります。これがマハラノビス距離の考え方です。</p>



<p>実際のデータ分析においては、先ほどの身長と体重のように、データの変数間に相関が存在することが少なくありません。その場合はマハラノビス距離を用いるべき、という話になりそうですが、実際にはほとんど用いることはありません。なぜならクラスター分析では、身長と体重のように<strong>強い相関をもつ変数の存在は冗長で無意味であり、予めどちらかを除外する</strong>からです。言い方を変えると、クラスター分析を行うプロセスにおいては、変数間の相関性を予め分析しておく必要があるということになります。</p>



<p>以上の考え方を踏まえ、次回以降でクラスター分析の実践を進めて行きます。</p>
]]></content:encoded>
										</item>
	</channel>
</rss>
