前提
支持度(Support)
全ユーザの中で、商品が購入したユーザの割合
全ユーザに人気が商品は値が高くなる
商品Aの支持度:$3人÷4人=0.75$
商品Bの支持度:$4人÷4人=1$
商品Cの支持度:$2人÷4人=0.5$
もっと抽象化すると、Aに対する対抗軸の全体の中で、Aが選択された割合
支持度(A):Aの出現回数÷対抗軸の全データ数
ユーザ×購入商品の軸に話を戻すと
商品Aと商品Bを購入した = $ A \cap B $ にも適用できる
商品$ A \cap B $ の 支持度=$3÷4=0.75$
支持度($ A \cap B)$ は 支持度($A=>B)$ とも記述されるようだが、同一トランザクションで同時に購入される数であり A=>B でも B=>A でも 支持度は変わらない点に注意(順番を気にする場合は、確信度)
支持度$ (A =>B)= $
確信度(Confidence)
商品Aを購入したユーザが商品Bを購入する割合
$Confidence(A => B)$
の様に記述し、Aを条件部 (antecedents)、Bを帰結部 (consequents) と呼ぶ
$Confidence(商品A=>商品B)$
$\quad = 商品Aと商品Bを購入したユーザ数 ÷ 商品Aを購入ユーザ数$
$\quad = 3 ÷ 3$
$\quad = 1$
商品AとBを買っても、前提条件が異なれば確信度は異なる事に注意
$Confidence(商品B=>商品A)$
$\quad = 商品Aと商品Bを購入したユーザ数 ÷ 商品Bを購入ユーザ数$
$\quad = 3 ÷ 4$
$\quad = 0.75$
リフト値(Lift)
分子:Xを購入した人の中でYも購入している割合
分母:全体の中でYを購入した割合
となっており、単独で商品Yを購入するより、商品Xを購入した人はどれだけ商品Yも同時購入してくれるか(持ち上げる=lift)を表している。
例えば、プリンタインク(Y)を購入する際に、単体でインク(Y)を購入するよりも、プリンタ(X)+インク(Y)の組み合わせでインク(Y)を買う人の割合が高ければ、リフト値は1以上となり、プリンタを購入した際にはインクも薦めたほうが、後日にインク単独で購入してもらうよりも確率が高くなる
面白い事にリフトには X=>Yと Yを購入する際に Xを購入した人という前提条件が解釈的にあるが、上式を変形すると
\begin{align}
Lift(X =>Y) &=\frac{\frac{|X \cap Y|}{|X|}}{\frac{|Y|}{|A|}}\\\\[5pt]
&= \frac{\frac{|X \cap Y|\times\color{red}{|A|}}{\color{red}{|A|}\times|X|}}{\frac{|Y|}{|A|}}\\\\[5pt]
&= \frac{support(X \cap Y)}{Support(X) \times Support(Y)}\\\\[5pt]
\end{align}
となり、数学的には順番が関係ない式に変形される
\begin{align}
Lift(X =>Y) &=\frac{\frac{|X \cap Y|}{|X|}}{\frac{|Y|}{|A|}}\\\\[5pt]
&=\frac{\frac{|X \cap Y|\times\color{red}{|Y|}}{|X|\times\color{red}{|Y|}}}{\frac{|Y|\times\color{red}{|X|}}{|A|\times\color{red}{|X|}}}\\\\[5pt]
&=\frac{\frac{|X \cap Y|\times\color{red}{|Y|}}{\color{red}{|Y|}\times |X|}}{\frac{\color{red}{|X|}\times|Y|}{|A|\times\color{red}{|X|}}}\\\\[5pt]
&=\frac{\frac{|X \cap Y|}{|Y|}}{\frac{|X|}{|A|}}\\\\[5pt]
&=Lift(Y =>X)
\end{align}
あれ? => は意味がないの? となるが、この解釈は先のプリンタとインクを例にすると分かりやすい
例えば、プリンタ(X)を購入する際に、単体でプリンタ(X)を購入するよりも、プリンタ(X)+インク(Y)の組み合わせでプリンタ(X)を買う人の割合が高ければ、リフト値は1以上となり、インクを購入した際にはプリンタも薦めたほうが、後日にプリンタ単独で購入してもらうよりも確率が高くなる
これはこれで正しいが、過去にプリンタを購入していなければ という前提が付くはずである。
リフトは時間軸がない同時購入が前提の概念であり、過去にプリンタを過去に購入しているか否かは考慮していないのである(ビールとオムツのような消耗罪ならOK)
前述の通り、商品Aの購入が、商品Bの同時購入に正の相関がある場合は、リフト値は1より大きくなるが、逆に、負の相関がある場合は1より小さくなる
負の相関の例としては プリンタAを購入した際にプリンタBを購入するか?をイメージすると分かりやすい。
リフト値は数学や情報理論的にも面白い性質を持っていて、
リフト値の対数を取ると自己相互情報量(PMI:Pointwise Mutual Information)と呼ばれるものになります。本章の後半に出てくるword2vecというアルゴリズムは、この自己相互情報量を要素とする行列を行列分解したものになることが知られています。
[風間正弘、飯塚洸二郎、松村優也著『推薦システム実践入門』(オライリー・ジャパン)]より
との事
今回は、2つのアイテムで説明したが、勿論 アイテムが3以上になってもリフト値は計算可能
$リフト((A \cap B) => C) = 支持度(A \cap B \cap C) \div (支持度(A \cap B) \times 支持度(C))$
アプリオリ
アソシエーションは アイテムの組み合わせが増えてると計算量が膨大になりやすいのが弱点
それを解決する為のアルゴリズムがアプリオリ
とはいっても特別なものではなく単に閾値を設けて計算対象を絞っているだけww
具体的には、支持度(Support)が一定以上のアイテムやアイテムの組み合わせのみを計算対象とすることで、計算を高速化している
個人的には 5%位 が話題にあがりやすい気がする
PythonのライブラリだとApriori - mlxtend が有名で使いやすいと思う
参考
風間正弘、飯塚洸二郎、松村優也著『推薦システム実践入門』(オライリー・ジャパン、ISBN978-4-87311-966-3