トレジャーデータ(Treasure Data)ブログ

トレジャーデータ(Treasure Data)ブログです。

本サイトは移転しました。新サイトにリダイレクトします。

トレジャーデータで実践:Basket 分析(心の準備編)

本記事は移転しました。新サイトにリダイレクトします。

Treasure Data - データ分析をクラウドで、シンプルに。 - Treasure Data

はじめに

前回の「頭の体操編」では,数字やトランプの組み合わせの抽出をSQLで実践してみました。本題に入る前に,今回はこの「組み合わせ」が引き起こすバスケット分析の本質的な問題の1つ:「計算量の問題」について説明し,分析の際にはいつもこの問題を心にとめておいてもらえる事を目的としています。

SQLで頭の体操 〜組み合わせの計算〜(続)

前回に引き続いてもう2つだけ頭の体操をしましょう。下のトランプテーブルを使います。

課題9:53枚のトランプのペアの組み合わせを全て考える。

今回の課題はシンプルに,53種のカードのペアが取り得る組み合わせ(順序は別とします)を考えてみましょう。クエリは課題1と同じです。

さて,このクエリで全部で何種類のペアが生成されたのでしょうか?

答えは 2,809 通り,これは 53×53 の値となっています。一般に n 通りの値のバリエーションを持つテーブルに対して,全ての組み合わせを求めるような計算では,その計算過程で n × n の組み合わせが生成され,処理されていきます。

ECの場合では,アイテムの品揃えが 10 万点以上,なんてところもざらにあると思います。そのような場合でバスケット分析を行う事は,100億通りの組み合わせが計算過程で考慮されることになります。

従来のシングルノードのデータベースではこのオーダーの計算量は対応できるレベルのものではありませんでした。インプットデータは小さくても組み合わせで「爆発」してしまうバスケット分析などが,簡単に実現できなかった原因の1つにこの問題があったのです。

課題10:53枚のトランプのトリプレット(三つ組み)の組み合わせを全て考える。

蛇足ですが,トランプの可能な3枚の組み合わせを考えると何通りの組み合わせが生まれてくるのでしょうか?

答えは 53×53×53 = 148,877 通りです。

もちろん,組み合わせの順序を区別しなかったり,同じカードの重複を避ける(いくつかの課題で求めてみましたね)ことで計算量は 1/2 〜 1/10 程度に減らすことができますが,逆に言えばその程度にしか工夫余地が無い事を示していることになります。

Treasure Data で組み合わせ問題を扱うことのメリット

f:id:doryokujin:20150412083534p:plain

トレジャーデータのようなクラウド型データ分析基盤でこれらの問題を扱うことのメリットは2つあります:

  1. 計算リソースを増やすことで力業で解決できる(かもしれない)
  2. 誤って大負荷のクエリを投げてしまっても,誰にも迷惑をかけない

1. は,実は多くのケースでは,Hiveのコア数(分散処理するノードの数)を増やせば,力業で何とかなるという事実です。従来のRDBMSでは大きなテーブル同士のJOIN,特に全組み合わせを出す "CROSS JOIN" 処理は御法度とされていましたが,大規模データ処理基盤上ではそれにトライする余地が含まれています。

2. は,様々なトライ&エラーを繰り返す「分析」という業務において非常に大きなメリットとなります。従来,データ分析はサービスのすぐ近くにありました。この状況下での分析は,購買履歴やアクセス履歴が書き出されているデータベースやサーバーに直接,またはそのレプリケーションに対して間接的にクエリを投げていました。これでは誤って大負荷のクエリを投げてしまったら,サービス自身に影響を与えてしまうことになり社内のサーバー管理者に迷惑をかけてしまうことになります。

「クラウド」型データ分析基盤は,データ分析をあえてサービスと切り離してクラウド上に隔離することによって,周囲に迷惑をかけずにのびのびと分析を行う環境を実現しました。バスケット分析やパス分析は,このような環境で初めてトライできる先進的な試みなのです。

EC購買サンプルログ

それでは今回扱うECの購買サンプルログを紹介します。"sales_slip" というテーブル名のこの購買ログには約50万点のgoodsが出現します。

バスケット分析で扱うアイテムのペアは同じもの同士を除き,かつペアの順序は同一視しますので最大 ( 50万件 × 50万件 - 50万件 ) / 2 ≃ 1250億通り の組み合わせが出現することになります。

timemember_idgoods_idcategorysub_categoryorder_dateship_dateamountprice
Sep 23, 2013 @ 05:11:49 AM 2026429 583266 Automotive and Industrial Industrial Supplies 2013-09-24 13:26:07 2013-09-27 1 277
Feb 17, 2013 @ 03:21:27 AM 1931260 109601 Automotive and Industrial Lab and Scientific 1900-01-01 00:00:00 2021-01-03 1 300
Dec 21, 2012 @ 08:19:02 AM 1962900 608838 Books and Audible Books 2012-12-25 13:47:22 2012-12-28 1 4753
May 23, 2012 @ 02:05:38 PM 1931260 109601 Automotive and Industrial Lab and Scientific 1900-01-01 00:00:00 2021-01-03 1 300
May 23, 2012 @ 02:04:30 PM 1931260 109601 Automotive and Industrial Lab and Scientific 1900-01-01 00:00:00 2021-01-03 1 300
Dec 15, 2011 @ 07:48:31 AM 288865 547369 Movies and Music and Games CDs and Vinyl 2011-12-20 14:08:15 2011-12-23 1 2648
Dec 11, 2011 @ 10:15:50 PM 1447334 544392 Home and Garden and Tools Fine Art 2011-12-13 14:05:04 2011-12-16 1 2648
Nov 12, 2011 @ 04:29:42 PM 907986 538981 Sports and Outdoors Leisure Sports and Game Room 2011-11-15 14:00:03 2011-11-18 1 8458
Oct 30, 2011 @ 10:10:23 PM 1931260 109601 Automotive and Industrial Lab and Scientific 1900-01-01 00:00:00 2021-01-03 1 300
Sep 03, 2011 @ 11:24:29 PM 1447249 525469 Movies and Music and Games Musical Instruments 2011-09-06 13:56:21 2011-09-09 1 952

↑ 必要な項目のみを抽出しましたが,ECの購買ログは概ね上の様な構造を持っています。今回,「categoty」,「sub_category」には amazon.com と同じカテゴリ構造 を割り振っています。

次回は実際にバスケット分析を進めていくとともに,トレジャーデータではこの規模のデータセットに対してどの程度のパフォーマンスを出すのかも紹介していくつもりです。

業界向けクエリテンプレート 

トレジャーデータでは,分析プラットフォームの提供に加えて,

  • 購買ログを初めとした一連のEC向けサンプルデータセット
  • バスケット分析やRFM分析をはじめとした一連の分析クエリテンプレート

をセットにした業界別アディショナルプランも提供しております。ご興味のある方はこれを機にトレジャーデータへぜひ一度お問い合わせ下さい。

お問い合わせ - Treasure Data

↓ クエリテンプレートページの一例

f:id:doryokujin:20150424121548p:plain