SQL分析データ準備と基礎統計#14:グラフデータと関連性、のつづき
グラフデータに極めて近しい形式の出力データとして、関連性分析のデータがあります。典型例として挙げられるバスケット(買い物かご)分析や、オンラインショッピングにおいて推奨商品を決定する協調フィルタリングと呼ばれたりする分析のベースとなっているものです。単純化すれば「ある商品とある商品の関連性が高い」ことを見つけ出すことが目的で、これを整理するためにはグラフ分析同様、組み合わせのデータでデータを整理していくことになります。
縦の明細データを組み合わせに
ナチュラルボーンなグラフデータとは異なり、もともとのデータが、AとBの組み合わせを横に配置したデータになっていないケースにも遭遇します。例えばバスケット分析の元となるレシート明細データは、レシート番号をキーに、複数の商品が縦に蓄積されます。
このようなデータを横に並べる処理の例が以下です。単純化するため、各ノード、エッジ指標の計算は割愛します。
上記の例では最後に絞り込み条件を入れていますが、これは同一の商品同士の組み合わせを除外するのと、AとBという組み合わせとBとAという組み合わせの重複を除外するためのものです。一方で可視化の際に商品1のみでフィルターをかけたい場合もあるため、その際には[and a1.商品番号<a2.商品番号]が不要です。重複のままデータが残り、どちらかに対して絞り込みをかければ見たい組み合わせを網羅できます。
縦の明細データを組み合わせに、順序を考慮
オンラインサイトのレシート明細データであれば、カートに商品を投入した順番も理解できます。この順番を理解したい場合のサンプルが以下です。nPath関数を用いて前後関係を見ています。
レシート番号単位でデータを分割し、その中で順序を投入日付時刻で評価します。そして任意のA.B(Aに続いてB、正規表現)というパターン発生を1行ずつずらしながらoverlap(重複)させ、組み合わせを取得しています。関数の出力結果を集計して横持ちデータの完成です。
横持ちされたデータの組み合わせ
最後の例は、単純な属性データ同士を組み合わせと見立て、グラフデータを作成する例です。
性別、年齢層、持ち家区分の属性を顧客がそれぞれ有しており、この属性値(男性、女性、20歳代、30歳代、持家、借家 ..)が仮想的なノードになります。顧客番号がノードとノードをつなげる役割を担います。この場合、ちょっと厄介ですが3つの属性の組み合わせごとにSQLを書き、unionでつないであげる必要があります。属性のデータ型に文字型と数値型が混在する場合には、文字型にキャストしてあげてください。
///