# AP5成型機 - 算法筆記 (關聯規則)
> [name=JayHsu][time=Sat, Sep 28, 2019 4:56 PM]
> [color=#00FF00]
[TOC]
## 算法介紹
[關聯規則](http://myweb.fcu.edu.tw/~mhsung/Ecommerce/Data_Mining/Association_Folder/DM_association.htm)
- 主要在分析當顧客購買一項產品時同時會購買何項商品
- 有用的規則:包含高品質的有效情報,例如將啤酒與自有品牌的尿布放在一起。
- 威名百貨WAL-MART發現,跟尿布一起購買最多的商品竟然是啤酒,後來透過市場調查才得知,原來美國的太太常叮嚀丈夫在下班前幫嬰兒買尿布,而40%的先生在買完尿布後,又會隨手拎兩罐啤酒,在各個賣店把啤酒和尿布擺在一起,結果尿布和啤酒的銷售量雙雙增加三成!
- 七五三感冒指數:如果一天當中溫度相差七度、今天和昨天的溫度差到五度、且溼度差大於30%的話,代表感冒的人會增加,商家就要考慮把感冒藥、溫度計和口罩之類的用品上架。
- 氣溫在二十四度到二十七度之間時,鰻魚、冰品和防曬乳會賣得好,溫度在二十二度到二十五度時,涼飲、冰咖啡和殺蟲劑就不可少,至於溫度在十七度到二十度當中時,布丁、沙拉和優格則很受歡迎。
- 明顯的結果:該行業的一般常識common sense,例如顧客簽訂維修合約後,通常會買大型家電用品。購買手電筒會買電池。
- 無法解釋的結果:看起來沒有合理的解釋,例如大型五金行開幕後,馬桶蓋昰熱門的商品之一。 多半是資料的巧合,無法做為決策的基礎,無法告訴原因,或是相因應之行銷活動。
**理論**
- 當挖掘演算法所找出的規則滿足使用者訂定的最小的minimum support與minimum confidence的門檻時,這個規則才會成立。
- Support: 就是一個元組在整個資料庫中出現的機率。P(condition)
- minimum support:界定一個規則必須涵蓋的最少資料數目
- Confidence:界定一個規則預測強度(信心水準)。P(condition and result)/P(condition)
- minimum confidence可信度:界定一個規則最小預測強度(信心水準)。
- 提高率(興趣度):P(condition and result)/P(condition) *P(result)
- 當興趣度大於1的時候,這條規則比較好的;
- 當興趣度小於1的時候,這條規則沒有很大意義的,應該略去這樣的一些規則。
- 興趣度越大,規則的實際意義就越好。
## python實作流程
[apriori](https://pypi.orfg/project/apriori/)
實作分成兩個部分, 訓練階段會從大量個相同案例中找出多條可以推論健康值異常的規則, 稱為案例規則庫.
在推論階段可以利用參數趨勢統計找出參數規則, 跟規則庫比對看看符合幾條規則.
**訓練**

**推論**

## Source Code
Source Code主要包含兩個Class, 一個(DataAgent)讀取數據, 另一個(AprioriAnalysis)分析案例規則庫與推論新案例與規則庫的吻合度
```python=
class AprioriAnalysis(object):
"""This class implement 關聯分析
functinos:
preparedata - 準備關聯分析要用的數據
getDevAnalysis - 關聯分析
rulebase - 案例規則庫
inference - 推論新案例與規則庫的吻合度
"""
def preparedata(self):
"""
準備關聯分析要用的數據
訓練案例數據 - df_evt
Parameters: NA
Returns: NA
"""
def aprioriAnalysis(self):
"""
關聯分析, 以下為分析步驟
1. 設定規則篩選條件
- support > 健康值異常數據點出現機率的一半
- confidence > 0.8
- lift > 1
2. 只留下Y為“異常”的規則
分析結果 - rulebase
Parameters: NA
Returns: NA
"""
def rulebase(self):
"""
display rulebase
Parameters: NA
Returns: NA
"""
def inference(self, case):
"""
推論新案例和案例規則庫的吻合程度
Parameters: NA
Returns: score
"""
```
## Demo
**Trainging**
```python=
clist=[]
for i in range(1,6):
clist.append(MCase("case%02d"%i))
aprioriAnalysis = AprioriAnalysis(clist=clist)
aprioriAnalysis.rulebase()
```
**Inference**
```python=
c = MCase("case07")
aprioriAnalysis.inference(c)
```
## Reference
- [Apriori演算法原理](https://www.maxlist.xyz/2018/11/03/python_apriori/)
## TODO:
- 20191001: 龍華server斷線, 無法驗證
###### tags: `AP5成型機`