第13回 相関を探そう!SQLちょっと応用講座

さて、前回はサイトの流れに沿って必要なSQLを紹介していきました。
こういう、SQLで行う仕事を一般にはOLTPといいます。まぁリアルタイムで発生するトランザクションを捌くことが目的です。
Web-DBにとって当然これも重要なのですが、やはりWeb-DBがWeb-DBであるメリットを考えると、このアクションを通じて集まったデータを分析してサービスに反映させたいところです。そういう作業を一般にはデータマイニングとかOLAPとかいいます。
そもそも、こういうのをやるためにWeb-DBを作るといっても過言じゃありません。 ここでは、そういうものの基礎になる相関の探し方を、いくつかを、あらっぽく紹介します。
ほとんどselect文を論理的に並べるだけです。 特にwhere句のなかの作り方がポイントになります。 selectを制するものは世界を制するといったところでしょうか。

○ある商品と一緒によく買われる商品を探す。
これが出来ると便利ですよね。ある商品のページに、その商品へのリンクつけたりすればうまくいきそうですよね。

購買履歴テーブルがポイントになります。

一緒に買う商品というのは、以下のように定義できます。
1.まず、ある商品のIDでレコードをとってくる。
2.次にそのレコードの日時をみて、その日時に同時に買った商品をリストアップする。
3.そこで一番登場頻度の高い商品が、一緒に買うことが多い商品である。

ですので、ここで見るのは、購買履歴テーブル一つで十分です。

この言葉を、SQLで実現するとどうなるでしょう?
まず、1は
 select 日付 from 購買履歴テーブル where 商品ID=ある商品のID
となります。
 次に、2は
 select 商品ID from 購買履歴テーブル
 where 日付= (select 日付 from 購買履歴テーブル where 商品ID=ある商品のID)
となります。
後は一覧を見て、手で数えても良いですが、SQLの機能は活用しましょう。
 select 商品ID,count(*) from 購買履歴テーブル
 where 日付= (select 日付 from 購買履歴テーブル where 商品ID=ある商品のID)
 GROUPR BY 商品ID
とやると、各商品IDと、カウント数が並んで出てきますので、それを比較すればすぐ分かります。

○ある商品を買う人の嗜好にあった商品を探す。
これも、上のような使い方ができますよね。結構便利です。

これも購買履歴テーブルだけでも十分行けます。
ある商品を買う人の嗜好にあった商品は以下のように定義できます。
1.ある商品を買った人の顧客IDをとってくる。
2.その顧客IDが買った商品の一覧を取ってくる。
3.そこで、登場頻度が高い商品がその人の嗜好にあった商品である。

この定義も、SQLで実現してみましょう。
 1.select 顧客ID from 購買履歴テーブル where 商品ID=ある商品のID
 2.select 商品ID from 購買履歴テーブル where
  顧客ID=(select 顧客ID from 購買履歴テーブル where 商品ID=ある商品のID)
 3.select 商品ID,count(*) from 購買履歴テーブル where
  顧客ID=(select 顧客ID from 購買履歴テーブル where 商品ID=ある商品のID)
  GROUPE BY 商品ID
このときに、恐らく1番に来るのは、ある商品それ自体が来ますので、実際には2番目に来る商品が問題になる商品となります。

○ある人の嗜好にあったいままで買ったことがない商品を探す。
マイページに実装したり、メールでのリコメンドとかに活用したいですよね。

これも購買履歴テーブルだけでも十分行けます。
ある人の嗜好にあった商品は以下のように定義できます。
1.ある人が買ったことがある商品IDをとってくる。
2.この商品を買ったことがある顧客IDを取ってくる。
3.この顧客IDの人が買ったことがある商品一覧を取ってくる。
4.次に、1の商品IDを全て削除する。
5.残ったもののうち、登場頻度が高いものが、嗜好にあった買った
  ことのないものである。

どんなSQLになるかは、練習問題ということで。
次回からは、こうしたことを踏まえて実際に作る講座に移ります。 いままで全然分からなかった人も、次回以降進みながら読み返してもらえると また理解できるかと思います。----- EXTENDED BODY: