相関ルール apriori

kaggleの「Transactions from a bakery」を最近見てたのと、
この本にもちょうど出てたので
https://www.ohmsha.co.jp/book/9784274224010/


相関ルールとaprioriについて軽くメモ

##相関ルール

どのような商品がお互いに関連しているのか、それを発見するための手法に「相関ルール」というものがある。

###代表例
- スーパーマーケットのカゴに入っている商品の組み合わせ

- ある病気に対する依存症  

とかこういうものの、関連状況を数字化してみるもの

##用語
※スーパーマーケットのカゴの中身で説明

- 項目：購入する商品

- 項目セット：項目の集合（ようはカゴの中の商品全体）

- トランザクションセット：購入した組み合わせ
 
■トランザクションの例

| トランザクションID|項目セット|
|:-----------------|------------------:|
|トランザクション1 |りんご, ビール,コメ,鶏肉|
|トランザクション2 |りんご, ビール,コメ|
|トランザクション3 |りんご, ビール|
|・・・ |・・・|

詳しくは書籍参照

## apyoriで確認

```bash:インストール
pip install apyori
```

```python:sample.py
from apyori import apriori

transactions = [
    ['apple', 'beer','rice','chiken'],
    ['apple', 'beer','rice'],
    ['apple', 'beer'],
    ['apple', 'peer'],
    ['milk', 'beer','rice','chiken'],
    ['milk', 'beer','rice'],
    ['milk', 'beer'],
    ['milk', 'peer'],
]

results = list(apriori(transactions))

for item in results:
  for data in item:
    print(data)

  print("----")
```

```出力結果
frozenset({'apple'})
0.5
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'beer'})
0.75
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'beer'}), confidence=0.75, lift=1.0)]
----
frozenset({'chiken'})
0.25
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'chiken'}), confidence=0.25, lift=1.0)]
----
frozenset({'milk'})
0.5
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0)]
----
frozenset({'peer'})
0.25
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'peer'}), confidence=0.25, lift=1.0)]
----
frozenset({'rice'})
0.5
[OrderedStatistic(items_base=frozenset(), items_add=frozenset({'rice'}), confidence=0.5, lift=1.0)]
----
frozenset({'apple', 'beer'})
0.375
[OrderedStatistic(items_base=frozenset({'apple'}), items_add=frozenset({'beer'}), confidence=0.75, lift=1.0), OrderedStatistic(items_base=frozenset({'beer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'apple'})
0.125
[OrderedStatistic(items_base=frozenset({'apple'}), items_add=frozenset({'chiken'}), confidence=0.25, lift=1.0), OrderedStatistic(items_base=frozenset({'chiken'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'peer', 'apple'})
0.125
[OrderedStatistic(items_base=frozenset({'apple'}), items_add=frozenset({'peer'}), confidence=0.25, lift=1.0), OrderedStatistic(items_base=frozenset({'peer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'rice', 'apple'})
0.25
[OrderedStatistic(items_base=frozenset({'apple'}), items_add=frozenset({'rice'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'rice'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'beer'})
0.25
[OrderedStatistic(items_base=frozenset({'beer'}), items_add=frozenset({'chiken'}), confidence=0.3333333333333333, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'chiken'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
frozenset({'milk', 'beer'})
0.375
[OrderedStatistic(items_base=frozenset({'beer'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'milk'}), items_add=frozenset({'beer'}), confidence=0.75, lift=1.0)]
----
frozenset({'rice', 'beer'})
0.5
[OrderedStatistic(items_base=frozenset({'beer'}), items_add=frozenset({'rice'}), confidence=0.6666666666666666, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'rice'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
frozenset({'chiken', 'milk'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'milk'}), items_add=frozenset({'chiken'}), confidence=0.25, lift=1.0)]
----
frozenset({'chiken', 'rice'})
0.25
[OrderedStatistic(items_base=frozenset({'chiken'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'rice'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0)]
----
frozenset({'peer', 'milk'})
0.125
[OrderedStatistic(items_base=frozenset({'milk'}), items_add=frozenset({'peer'}), confidence=0.25, lift=1.0), OrderedStatistic(items_base=frozenset({'peer'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0)]
----
frozenset({'rice', 'milk'})
0.25
[OrderedStatistic(items_base=frozenset({'milk'}), items_add=frozenset({'rice'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'rice'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'apple', 'beer'})
0.125
[OrderedStatistic(items_base=frozenset({'apple', 'beer'}), items_add=frozenset({'chiken'}), confidence=0.3333333333333333, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'chiken', 'apple'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'chiken', 'beer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'rice', 'apple', 'beer'})
0.25
[OrderedStatistic(items_base=frozenset({'apple', 'beer'}), items_add=frozenset({'rice'}), confidence=0.6666666666666666, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'rice', 'apple'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'rice', 'beer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'rice', 'apple'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken', 'apple'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'rice', 'apple'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'milk', 'beer'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken', 'beer'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'milk', 'beer'}), items_add=frozenset({'chiken'}), confidence=0.3333333333333333, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'chiken', 'milk'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
frozenset({'chiken', 'rice', 'beer'})
0.25
[OrderedStatistic(items_base=frozenset({'chiken', 'beer'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'rice', 'beer'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
frozenset({'rice', 'milk', 'beer'})
0.25
[OrderedStatistic(items_base=frozenset({'milk', 'beer'}), items_add=frozenset({'rice'}), confidence=0.6666666666666666, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'rice', 'beer'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'rice', 'milk'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
frozenset({'chiken', 'rice', 'milk'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken', 'milk'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'rice', 'milk'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0)]
----
frozenset({'chiken', 'rice', 'apple', 'beer'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken', 'apple', 'beer'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'rice', 'apple', 'beer'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice', 'apple'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333), OrderedStatistic(items_base=frozenset({'chiken', 'rice', 'beer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)]
----
frozenset({'chiken', 'rice', 'milk', 'beer'})
0.125
[OrderedStatistic(items_base=frozenset({'chiken', 'milk', 'beer'}), items_add=frozenset({'rice'}), confidence=1.0, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice', 'beer'}), items_add=frozenset({'milk'}), confidence=0.5, lift=1.0), OrderedStatistic(items_base=frozenset({'rice', 'milk', 'beer'}), items_add=frozenset({'chiken'}), confidence=0.5, lift=2.0), OrderedStatistic(items_base=frozenset({'chiken', 'rice', 'milk'}), items_add=frozenset({'beer'}), confidence=1.0, lift=1.3333333333333333)]
----
```


#見方

例えば
frozenset({'apple', 'beer'})
について。

- 0.375 ⇒　**支持度**＝すべてのトランザクションにおいてどの程度の頻度でこの組み合わせを含むトランザクションがあるかの割合。

- OrderedStatistic(items_base=frozenset({'apple'}), items_add=frozenset({'beer'}), confidence=0.75, lift=1.0)

これは{apple⇒beer}ということで、具体的にはappleを購入した時にbeerを購入する、という意味。
・confidence=0.75　⇒　**信頼度**＝項目Ｘを購入した場合にどの程度Ｙも購入されているかを示す割合。
　※この例ではappleを購入したときにbeerを購入している割合。（７５％になっているということ）

## 上記の逆パターン{beer⇒apple}
OrderedStatistic(items_base=frozenset({'beer'}), items_add=frozenset({'apple'}), confidence=0.5, lift=1.0)

逆パターンで**信頼度（confidence)=0.5**となっているように、信頼度は一致しないのがふつう。
※こっちはbeerを購入したときに、appleを購入している割合.





## リフト値

１を基準にする

・１よりでかい　⇒　大きいほどＸを購入すればＹも購入する可能性が高くなる
・１よりちいさい　⇒　小さいほどＸを購入してもＹを購入する可能性が低い
・１のばあい　⇒　ＸとＹの購入に関連がない

という感じになってる。

例えば
frozenset({'chiken', 'rice'})
について、この場合どっちでもいいけどリフト値が2.0 なので関連性あり。一緒に購入する可能性あるよってことになる。