fbpx
HOW TO TD(User Engagement)Treasure Data User Engagement

データサイエンティストのためのHiveQL分析クエリテンプレート その4

ホーム » データサイエンティストのためのHiveQL分析クエリテンプレート その4

この記事は最終更新から3年以上が経過しています。最新情報は担当のカスタマーサクセスにご確認ください。

データサイエンティストのためのHiveQL分析クエリテンプレートシリーズ:

C. バスケット分析

バスケット分析はアイテム間の関連度を知るための重要な指標であり,レコメンデーションのロジックとしても利用されています。ここでは最も単純な共起頻度による集計パターンを示します。

組み合わせ

まずは1つのテーブル内での組み合わせを求める事を考えます。以下の例はlogin ログに対して,同じ月で日が異なる日付の組み合わせ(同じ日付同志は除外)を全網羅しようとしたものです。この方法はかなり力業となりますのでレコード数が多いデータには適応できていないことに注意してください。

SELECT t1.d AS a, t2.d AS b
FROM
(
SELECT TD_TIME_FORMAT(time,’yyyy-MM-dd’) AS d, TD_TIME_FORMAT(time,’yyyy-MM’) AS m
FROM login
GROUP BY TD_TIME_FORMAT(time,’yyyy-MM-dd’), TD_TIME_FORMAT(time,’yyyy-MM’)
) t1
JOIN
(
SELECT TD_TIME_FORMAT(time,’yyyy-MM-dd’) AS d, TD_TIME_FORMAT(time,’yyyy-MM’) AS m
FROM login
GROUP BY TD_TIME_FORMAT(time,’yyyy-MM-dd’), TD_TIME_FORMAT(time,’yyyy-MM’)
) t2
ON (t1.m=t2.m)
GROUP BY t1.d, t2.d
HAVING t1.d!=t2.d
ORDER BY a, b


上記では「グループ=月」・「グループ内アイテム=日」を考え,同グループ内のアイテムの組み合わせを考えたことになります。POSデータなどにおいては「グループ=レシート」・「グループ内アイテム=レシート内の購入アイテム」となり,1つのレシートで購入されたアイテムの組み合わせを考え,全レシートで見たときにその組み合わせが何回登場したのかを求めるのが共起頻度を求めることになります。

定義

Basket(‘freq’, item_col, receipt_col) をレシート単位によるアイテム間の「共起頻度」と定義する。

パターン:Basket < ‘freq’, item_col , receipt_col>

SELECT t1.item_id, t2.item_id, COUNT(1) AS cnt
FROM
(
  SELECT receipt_id, item_id
  FROM receipt
  WHERE condition
  GROUP BY receipt_id, item_id
) t1
JOIN
(
  SELECT receipt_id, item_id
  FROM receipt
  WHERE condition
  GROUP BY receipt_id, item_id
) t2
ON
(t1.receipt_id = t2.receipt_id)
GROUP BY t1.item_id, t2.item_id
HAVING t1.item_id != t2.item_id
ORDER BY cnt DESC
LIMIT n


上記の集計方法では (a,b) と (b,a) の両方を求めてしまうために,実際に結果を使用する際には奇数行または偶数行のみを使用します。
このアイデアを発展させていけば,共起頻度以外にも cos 距離なども求められます。

UserEngagement事務局

ユーザーの皆さまへのお知らせや、Treasure Data UserEngagementのサイト運営を担当する事務局アカウント。
Back to top button