Association rule คือกฏที่สร้างขึ้นมาเพื่อบอกว่า หากลูกค้าเลือกซื้อสิ่งนี้แล้ว มีความเป็นไปได้ที่จะเลือกซื้อสินค้าไหนคู่กันบ้าง…โดยการได้มาซึ่งกฏเหล่านี้ จะมี
- Metrics(Support) ในการดูว่าสินค้านี้ถูกซื้อบ่อยแค่ไหนจากการซื้อขายทั้งหมด
- Metrics(Confidence) เพื่อดูว่าในการตะกร้าการซื้อขายที่มีกลุ่มสินค้า A จะมีสินค้า B อยู่ด้วยเป็นสัดส่วนเท่าไร
- Metrics(Lift) บอกถึงโอกาสที่เมื่อหยิบกลุ่มสินค้า A แล้ว จะเพิ่มโอกาสที่ต้องหยิบ กลุ่มสินค้า B เข้าไปด้วยแต่ในความเป็นจริงสินค้าในร้านเราอาจมีเป็นหลักร้อยหรือมากกว่า หากเราจะมาคำนวณทุก ๆ Metrics ในทุกสินค้าจะเกิด combination ของกลุ่มสินค้าที่แตกต่างกันถึง (2^N)-1 รูปแบบเลยทีเดียว
ดังนั้นจึงมี Apriori Algorithm ที่มาช่วยลดจำนวนชนิดสินค้าที่เราจะคำนวณหากฏต่าง ๆ ด้วย Concept “ถ้า itemset ใดเกิดไม่บ่อย superset ทั้งหมดของ itemset นั้น ก็จะเกิดไม่บ่อยด้วยเช่นกัน” หรือเรียกอีกอย่างว่าการ Pruning ด้วยการพิจารณา Support Count(ความถี่สินค้านั้น) > minimun support count หรือไม่ ซึ่งจะเรียกว่า frequent_itemsets แล้วเราก็ทำการสร้าง Association rule จาก frequent_itemsets
เรามาลองจินตนาการว่า “เราเปิดห้างสรรพสินค้าเป็นของเราเอง ทีนี้ เราจะเลือกวางสินค้าอะไรคู่กับอะไรดีล่ะ เพื่อให้เกิดกำไรสูงที่สุด หรือเราจะแนะนำ Promotion อะไรให้ลูกค้าดี”
Association rule หรือ กฎความสัมพันธ์ เป็นหนึ่งในเครื่องมือเพื่อการวิเคราะห์ตะกร้าตลาด (Market basket analysis) ที่สามารถเข้ามาช่วยตอบคำถามเหล่านี้ได้
Market Basket Analysis หรือ การวิเคราะห์ตะกร้าตลาด เพื่อศึกษาพฤติกรรมการซื้อสินค้าของลูกค้า และหาความสัมพันธ์ของสินค้าที่ลูกค้าซื้อ โดยผลลัพธ์ที่ได้จะแสดงในรูปของกฎที่บ่งบอกถึงความเป็นไปได้ในการซื้อสินค้าต่าง ๆ ร่วมกัน
โดยเราได้มี Code ตัวอย่างการนำ Association rule มาใช้งานด้วย mlxtend
และผมขอยกตัวอย่างตามบทความนี้ พร้อมกับอธิบาย Code ประกอบ
ก่อนจะไปเริ่มกัน ผมไปเจอ Story สั้น ๆ เกี่ยวกับ Association Rule Learning และอยากให้ทุกคนลองอ่านดูก่อนเพื่อให้เห็นถึงประโยชน์ของ Association Rule
สมมติว่าในร้านค้าของเรามีสินค้าอยู่ 5 ชนิด ได้แก่ Bread Egg Butter Water และ Rice โดยมีการซื้อขายทั้งหมด 4 ตะกร้า ดังต่อไปนี้
dataset = [[‘Bread’, ‘Egg’, ‘Butter’],
[‘Bread’, ‘Butter’, ‘Water’],
[‘Bread’, ‘Water’, ‘Rice’],
[‘Egg’, ‘Water’]]
แล้วเราจะทำการแปลง Dataset นี้ให้อยู่ในรูปของ DataFrame
Row index ที่ 0, 1, 2, 3 จะหมายถึง Transaction(การซื้อขาย) ที่ครั้งที่ N
Column จะบอกว่ามีสินค้านี้ใน Transaction ไหนบ้าง
Metrics(Support)
ในการดูว่าสินค้านี้ถูกซื้อบ่อยแค่ไหนจากการซื้อขายทั้งหมด
Metrics(Confidence)
เพื่อดูว่าในการตะกร้าการซื้อขายที่มีกลุ่มสินค้า LHS จะมีสินค้า RHS อยู่ด้วยเป็นสัดส่วนเท่าไร
Metrics(Lift)
บอกถึงโอกาสที่เมื่อหยิบกลุ่มสินค้า LHS แล้ว จะเพิ่มโอกาสที่ต้องหยิบ กลุ่มสินค้า RHS เข้าไปด้วย
ทีนี้เราจะมาใช้ Apriori ในการเลือก frequent_itemsets ตามตัวอย่างโดยกำหนด minimum support = 0.5
เมื่อเราได้ frequent_itemsets มาแล้ว เราจะเอา frequent_itemsets เหล่านี้ไปคำนวณ confidence และ lift เพื่อสร้าง Association Rule
โดยจะเลือก rule ที่มีค่า confidence ≥ 0.3 และ filter ออกมาเฉพาะ [‘antecedents’, ‘consequents’, ‘support’, ‘confidence’, ‘lift’]
จากตรงนี้จะเห็นว่าแม้ค่า Confidence ใน Bread → Water กับ Water → Bread confidence ≥ 0.3 ซึ่งมีค่า Confidence ถึง 0.67 หรือ Confidence ของ Rice → Water ที่มีค่าเท่ากับ 1 จะสรุปว่า Rule จะมีประสิทธิภาพจริงหรือ?
หาก RHS เป็นกลุ่มของสินค้าที่พบเจอในแทบทุกตะกร้าการซื้อขาย (a very frequent itemset) ไม่ว่า LHS จะเป็นกลุ่มของสินค้าใดก็ตาม Confidence(LHS => RHS) จะมีค่าค่อนข้างสูงเสมอ
ดังนั้นเราจึงต้องมีค่า lift วัดประสิทธิภาพสำหรับ association rule ที่ทำการเปรียบเทียบ ความน่าจะเป็นที่จะพบกลุ่มของสินค้า RHS ในตะกร้าที่มีการซื้อขายกลุ่มของสินค้า LHS กับ ความน่าจะเป็นที่จะพบกลุ่มของสินค้า RHS ในตะกร้าทั้งหมด
หากค่า Lift > 1 (เท่า) แสดงว่า การที่ภายในตะกร้ามีกลุ่มสินค้า LHS อยู่ ทำให้ความน่าเป็นที่ลูกค้าจะหยิบ RHS มาใส่ตะกร้ามีค่าเพิ่มขึ้น
แต่ใน rule ของ Bread →Water และ Water →Bread ค่า Lift ≤ 1 แสดงว่า กลุ่มสินค้า LHS และ กลุ่มสินค้า RHS ไม่ขึ้นต่อกัน (independent)
ครั้งนี้อาจเป็นการเขียนบทความแบบรีบ ๆ ไปนิดนึง ก็หวังว่าจะเป็นประโยชน์ต่อทุกคนได้บ้าง…ไว้พอมีเวลา ผมจะกลับมาขยายความบางส่วนและยกตัวอย่างขึ้นนะครับ
More For Association rule :
Reference