เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 1

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python

ลองนึกภาพว่าคุณเป็นเจ้าของร้านค้า แล้วอยากเพิ่มยอดขาย นี่คือคำถามที่อาจจะช่วยคุณได้

“ตอนจัดเรียงชั้นวางของในร้าน ควรวางสินค้าอะไรใกล้กับอะไร?”
“สินค้า 2 ชิ้นไหนควรแนะนำคู่กันตอนจัดโปรโมชั่น?”
“หน้าร้านค้าออนไลน์ จะเสนอสินค้าอะไรเพิ่มเติมให้ลูกค้าที่ซื้อสินค้าชิ้นแรกไปแล้ว?”

การหาคำตอบของคำถามเหล่านี้ทำได้โดยเทคนิคหนึ่งของ data mining ที่เรียกว่าการวิเคราะห์ตะกร้าสินค้า (Market basket analysis) ซึ่งทำยังไงมาดูกันครับ

บทความนี้เป็นบทความจาก Content Creator
เขียนโดย ญาณวุฒิ คิมนารักษ์
บรรณาธิการ ตรวจสอบโดย ศิระ เอกบุตร (เทพเอ็กเซล)
กลั่นมาจากความคิดทั้งสองคน จึงมั่นใจได้ในความถูกต้องมากขึ้นไปอีกครับ

Market basket analysis คืออะไร?

การหาคำตอบของคำถามเหล่านี้ทำได้โดยเทคนิคหนึ่งของ data mining ที่เรียกว่าการวิเคราะห์ตะกร้าสินค้า (Market basket analysis) โดยการใช้กฎของความสัมพันธ์ (Association rule) ช่วยให้เราได้ข้อมูลเชิงลึกจากข้อมูลการซื้อขายจำนวนมากได้

Association rule เป็นการหาความสัมพันธ์ระหว่างรายการสินค้าในตะกร้า ตัวอย่างเช่น “ถ้าลูกค้าซื้อขนมปังก็มีโอกาส 80% ที่เขาจะซื้อเนยเช่นกัน” โดยการหากฎเหล่านี้จะพิจารณาจากความถี่ของการเกิดรายการสินค้าเหล่านี้ในข้อมูลการซื้อขาย อีกตัวอย่างยอดฮิตของเบียร์และผ้าอ้อม (Beer and Diapers) ในปี 1992 คือการค้นพบว่าพ่อบ้านวัย 30-40 ปีมักจะซื้อเบียร์และผ้าอ้อมพร้อม ๆ กัน การเข้าใจพฤติกรรมนี้แล้วนำมาปรับชั้นวางสินค้าให้เบียร์กับผ้าอ้อมอยู่ใกล้กัน ช่วยเพิ่มยอดขายได้ถึง 35% เลยทีเดียว

ในบทความนี้ ผมจะอธิบายเกี่ยวกับตัววัดประสิทธิภาพ (Metrics) ที่สำคัญในการใช้ Association rule คู่กับตัวอย่างที่เข้าใจง่ายและอัลกอริทึม Apriori ที่จะช่วยลดภาระในการคำนวณสำหรับ Association rule  แล้วปิดท้ายด้วยตัวอย่าง code Python ที่สามารถนำไปใช้งานได้กับข้อมูลจริง

กรณีตัวอย่าง ร้านขายของชำ

สมมติว่าคุณมีร้านขายของชำและมีสินค้าทั้งหมด 5 ชนิดในร้าน ได้แก่ ขนมปัง เนย แยม นม และไข่ โดยร้านคุณเก็บข้อมูลการซื้อขายทั้งหมดไว้ในฐานข้อมูลอย่างดี

ในตัวอย่างนี้จะดูการซื้อของลูกค้า 5 ครั้ง ตามรูปด้านล่าง

  • ลูกค้าคนที่ 1 ซื้อครบทุกอย่าง
  • คนที่ 2 ซื้อขนมปัง เนย นม
  • คนที่ 3 ซื้อขนมปัง เนย ไข่
  • คนที่ 4 ซื้อขนมปัง เนย
  • คนที่ 5 ซื้อนม ไข่
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 2

จากตัวอย่างนี้ คอมพิวเตอร์จะแปลงข้อมูลการซื้อแต่ละครั้งเป็นตารางที่มีคอลัมน์คือสินค้าแต่ละชนิดและแถวแต่ละแถวคือการซื้อแต่ละครั้ง ถ้าลูกค้าซื้อสินค้าชนิดไหน สินค้านั้นจะมีค่าเป็น 1

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 3

ตารางนี้จะช่วยให้เราคำนวณตัววัดประสิทธิภาพได้ง่ายขึ้น 

ผมขอแนะนำให้รู้จักกับตัววัดประสิทธิภาพ 5 ตัวที่เป็นพระเอกของเรา ได้แก่ support, confidence, lift, leverage และ conviction

ตัววัดประสิทธิภาพ (Metrics) ใน Market basket analysis

สรุปแบบรวบรัด

  1. Support: ความน่าจะเป็นที่จะซื้อสินค้านั้นในบรรดาการซื้อทั้งหมด
  2. Confidence: ความน่าจะเป็นที่จะซื้อสินค้า A ในการซื้อครั้งเดียวกับสินค้า B
  3. Lift: อัตราส่วนของความน่าจะเป็นที่จะซื้อสินค้า B เมื่อรู้ว่าลูกค้าซื้อสินค้า A เทียบกับความน่าจะเป็นที่จะซื้อ B โดยไม่รู้ว่าลูกค้าซื้อ A รึเปล่า
  4. Leverage: ความแตกต่างระหว่างความน่าจะเป็นที่จะซื้อสินค้า A และ B หร้อมกัน เทียบกับความน่าจะเป็นที่จะซื้อ A และ B แบบเป็นอิสระต่อกัน
  5. Conviction: ตรวจสอบว่าความสัมพันธ์นั้นเกิดขึ้นโดยบังเอิญหรือไม่

1. Support 

การซื้อขายทั้งหมดมีกี่รายการที่มีชุดสินค้านี้?

Support บอกว่าสินค้านี้มีการซื้อมากน้อยแค่ไหนจากการซื้อขายทั้งหมด

ค่าของ Support ช่วยให้เรารู้ว่าสินค้านี้ควรค่ากับการเอาไปวิเคราะห์ต่อไปรึเปล่า เช่น ที่แยมมีคนซื้อแค่ครั้งเดียวจากการซื้อขาย 5 ครั้งก็ไม่น่าสนใจเท่าไรเทียบกับสินค้าอื่น เป็นต้น

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 4

เช่น

  • Support ของขนมปัง = 4/5 = 0.8
  • Support ของขนมปัง คู่กับ นม = 2/5 = 0.4

ตารางด้านล่างแสดงค่า Support ของชุดสินค้า 1-2 ชิ้นทั้งหมด ลองคำนวณดูได้นะครับ ว่าได้เลขตรงกันมั้ย

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 5

Support สูงหมายถึงลูกค้าหลายคนซื้อสินค้านี้ ดังนั้นสินค้านี้จึงสำคัญสำหรับร้านของเรา

เราสามารถกรองชุดสินค้าที่มี Support ต่ำออกไปได้ เพราะจำนวนครั้งที่ซื้อน้อยเกินไปที่จะหาข้อมูลเชิงลึกได้

2. Confidence 

พิจารณาเฉพาะการซื้อขายที่มีสินค้า A มีการซื้อขายกี่ครั้งที่มีสินค้า B ด้วย

Confidence คือความน่าจะเป็นแบบมีเงื่อนไข (Conditional Probability) ซึ่งเป็นส่วนหนึ่งของสถิติแบบเบย์ (Baysian statistics) เป็นการหาความน่าจะเป็นของการเกิดสินค้าถัดไปในการซื้อขายเดียวกันเมื่อมีสินค้าก่อนหน้า (antecedents) อยู่แล้วในการซื้อขายนั้น

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 6

ตัวอย่างเช่น 

Confidence(ขนมปัง → นม) =
จำนวนครั้งที่ซื้อขนมปังและนมพร้อมกัน/จำนวนครั้งที่ซื้อขนมปัง = 2/4 = 0.5 

Confidence(นม → แยม) = 1/3 = 0.33

ถ้าพอเข้าใจแล้วลองคำนวณ  Confidence ของสินค้าแต่ละคู่แล้วมาเทียบกับตารางด้านล่างได้เลยครับ

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 7

Confidence ของสินค้าบางคู่สูงแปลว่า ตะกร้าที่มี A มักจะมี B ด้วย

อย่างไรก็ตาม การพิจารณาแค่ค่า Confidence ยังไม่เพียงพอที่จะตัดสินใจธุรกิจ เพราะว่า
ถ้า B (สินค้าที่ซื้อทีหลัง) เป็นชุดสินค้าที่มีความถี่สูงอยู่แล้ว Confidence ที่เกี่ยวข้องกับ B ก็จะสูงตามเสมอ ประมาณว่าทุกคนซื้อสินค้านี้อยู่แล้ว ไม่เกี่ยวว่าก่อนหน้าเขาซื้ออะไรมาก่อน

Lift จึงเป็นตัววัดประสิทธิภาพอีกตัวที่ควรดูคู่กับ Confidence

3. Lift 

เมื่อมีและไม่มีสินค้า A ในการซื้อขาย จะมีผลต่อสินค้า B มากน้อยแค่ไหน

Lift เป็นอัตราส่วนของความน่าจะเป็นของการเกิด B เมื่อมี A เทียบกับความน่าจะเป็นของการเกิด B ทั้งหมดโดยไม่คำนึงถึง A เลย

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 8

แนวคิดของ Lift: Lift วัดว่าการเกิด A และ B พร้อมกันแตกต่างจากการที่ A และ B เป็นอิสระต่อกันอย่างไร โดยเอา P(B|A)/P(B)

  • P(B|A) คือ ความน่าจะเป็นที่จะเกิด B เมื่อเกิด A แล้ว
  • P(B) คือ ความน่าจะเป็นที่จะเกิด B โดยไม่คำนึงถึง A
  • เมื่อเราหาร P(B|A) ด้วย P(B) ก็คือการเปรียบเทียบว่า “โอกาสที่ B จะเกิดเมื่อ A เกิดแล้ว” แตกต่างจาก “โอกาสที่ B จะเกิดโดยทั่วไป” กี่เท่า?

การตีความ Lift:

  • ถ้า Lift = 1: A และ B เป็นอิสระต่อกัน (ถ้าหารได้ 1 เท่า โอกาสเท่าเดิม ไม่เกี่ยวกัน)
  • ถ้า Lift > 1: A และ B มีความสัมพันธ์เชิงบวก (เกิดร่วมกันมากกว่าปกติ)
  • ถ้า Lift < 1: A และ B มีความสัมพันธ์เชิงลบ (เกิดร่วมกันน้อยกว่าปกติ)

ที่มาของสูตร

  • ความน่าจะเป็นแบบมีเงื่อนไข: ตามทฤษฎีความน่าจะเป็น เรามี P(B|A) = P(A ∩ B) / P(A) ซึ่งก็คือ Confidence(A->B) นั่นเอง
  • ความเป็นอิสระ: ถ้า A และ B เป็นอิสระต่อกัน จะได้ว่า P(A ∩ B) = P(A) * P(B) เพราะ หากเป็นอิสระจริง P(B|A) ก็จะเท่ากับ P(B) นั่นเอง

การสร้างสูตร:

  • เริ่มจาก P(B|A) = P(A ∩ B) / P(A)
  • หาร P(B) ทั้งสองข้าง: P(B|A) / P(B) = (P(A ∩ B) / P(A)) / P(B)
  • จัดรูปใหม่: Lift = P(B|A) / P(B) = P(A ∩ B) / (P(A) * P(B))

ดังนั้นการคิด Lift สามารถนำ support (หรือก็คือจำนวนครั้งการซื้อ) ของ A พร้อมกับ B มาหารด้วย support ของ A คูณกับ support ของ B

หรือจะเอา Confidence (A->B) / Support (B) ไปเลยก็ได้ เพราะจริงๆ ก็คือสิ่งเดียวกัน

ตัวอย่างเช่น

  • Lift(ขนมปัง → นม) = 0.5/0.4 = 1.25 
  • Lift(นม → แยม) = 0.33/0.2 = 1.65

ตารางด้านล่างนี้ ผมเอา Lift ของสินค้าบางคู่มาให้ดูกัน

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 9

ดังนั้นโดยสรุป ถ้า Lift มากกว่า 1 แปลว่าการซื้อสินค้า A ทำให้ความน่าจะเป็นที่จะซื้อสินค้า B พร้อมกันสูงขึ้นนั่นเอง

มีตัววัดประสิทธิภาพอีก 2 ตัวที่อาจไม่ดังเท่าตัววัดประสิทธิภาพก่อนหน้า แต่รู้ไว้ก็ดีเพราะช่วยให้เห็นมุมมองอื่น ๆ ได้

4. Leverage 

การซื้อหรือไม่ซื้อสินค้า A จะมีผลต่อการซื้อสินค้า B มากน้อยแค่ไหน

Leverage คำนวณความต่างของความน่าจะเป็นที่จะซื้อสินค้า A และ B พร้อมกัน กับความน่าจะเป็นโดยมองสินค้า A และ B เป็นอิสระจากกัน

Lift ใช้การหาร แต่ Leverage ใช้การลบ

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 10

Leverage(ขนมปัง → นม) = 0.4 – (0.8 x 0.6) = 0.08 

Leverage(นม → แยม) = 0.2 – (0.6 x 0.2) = 0.08

Leverage คล้ายกับ Lift แต่เข้าใจง่ายกว่าเพราะค่าของ Leverage อยู่ในช่วง -1 ถึง 1 ส่วน Lift จะมีค่าอยู่ในช่วง 0 ถึง Infinity

  • ค่า Leverage ถ้าเท่ากับ 0 บ่งบอกถึงความเป็นอิสระต่อกัน (ความน่าจะเป็นเท่ากัน ไม่ต่างกัน)
  • ถ้าเป็นบวกแสดงว่ามีแนวโน้มซื้อสินค้า 2 สิ่งนี้ด้วยกันมากขึ้น
  • ถ้าเป็นลบจะมีความสัมพันธ์แบบขัดแย้งกัน (ความน่าจะเป็นลดลง)
  • ยิ่งค่าเข้าใกล้ 1 หรือ -1 มาก ความสัมพันธ์ยิ่งแรงขึ้น

5. Conviction 

Conviction ช่วยให้ตัดสินว่าความสัมพันธ์นั้นเกิดขึ้นโดยบังเอิญหรือไม่

Conviction วัดว่ากฎความสัมพันธ์ A → B แข็งแกร่งกว่าสมมติฐานที่ว่า A และ B เป็นอิสระต่อกันมากน้อยเพียงใด

Conviction ใช้ในการวัดความน่าจะเป็นที่กฎความสัมพันธ์จะไม่ผิดพลาด

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 11

Conviction(ขนมปัง → นม) = (1 – 0.4) / (1 – 0.5) = 1.2 

Conviction(นม → แยม) = (1 – 0.2)/(1 – 0.33) = 1.19

การตีความ

  • Conviction = 1: A และ B เป็นอิสระต่อกัน
  • Conviction > 1: A และ B มีความสัมพันธ์เชิงบวก
  • Conviction < 1: A และ B มีความสัมพันธ์เชิงลบ
  • Conviction = ∞: กฎความสัมพันธ์สมบูรณ์ (ถ้าเกิด A แล้ว B จะเกิดเสมอ)
  • Conviction(A → B) ไม่จำเป็นต้องเท่ากับ Conviction(B → A)

โดยที่ Conviction สามารถแยกแยะระหว่างกฎที่มี Confidence สูงมากๆ ได้ดีกว่า Lift โดยที่ให้ผลลัพธ์ที่น่าเชื่อถือแม้ในกรณีที่ B มีความถี่สูง

อัลกอริทึม Apriori ตัวช่วยลดเวลาในการหา Association rule

เมื่อจำนวนชุดสินค้ามากขึ้น จะทำให้การคำนวณ Association rule เพิ่มขึ้นแบบทวีคูณ การคำนวณกฎความสัมพันธ์ทั้งหมดจึงไม่คุ้มค่า เช่น ถ้าเรามี 10 สินค้า จำนวนความสัมพันธ์ที่เป็นไปได้คือ 57,000 กรณี!!! แล้วถ้ามีสินค้ามากกว่า 100 ชิ้นล่ะ แม้แต่คอมพิวเตอร์ก็คงจะบ่นเหมือนกันว่าให้คำนวณอะไรมากมาย 

การคำนวณความสัมพันธ์ทั้งหมดอาจใช้เวลาและทรัพยากรมากเกินไป อัลกอริทึม Apriori จึงถูกออกแบบมาเพื่อหา Association rule ที่สำคัญเท่านั้นโดยใช้การคำนวณน้อยที่สุด

มี 2 ขั้นตอนในการหา Association rule คือ  การสร้างชุดสินค้า (Itemset Generation) และการสร้างกฎ (Rule Generation) เราจะดูว่าอัลกอริทึม Apriori ช่วยเราใน 2 ขั้นตอนนี้ได้อย่างไร

1. การสร้างชุดสินค้า 

เราต้องการเฉพาะชุดสินค้าที่มี Support สูง

เราต้องการเฉพาะชุดสินค้าที่ Support สูงกว่าค่าที่กำหนดไว้ หรือก็คือชุดสินค้าที่มีคนซื้อเยอะ ๆ นั่นเอง

วิธีที่ง่ายที่สุดคือการคำนวณ Support ของชุดสินค้าทั้งหมด แต่ว่ามันก็ยังเยอะไปอยู่ดีเพราะจำนวนชุดสินค้าจะเพิ่มขึ้นแบบทวีคูณตามจำนวนสินค้า

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 12

N = จำนวนสินค้า

ตัวอย่างเช่น ถ้าเรามี 4 สินค้า จำนวนชุดสินค้าคือ 2⁴ -1 = 15 ชุด ถ้าเรามี 10 สินค้า จะเพิ่มเป็น 2¹⁰ -1 = 1023 ชุด

ดังนั้นการคำนวณ Support ของชุดสินค้าทั้งหมดจึงใช้เวลาและทรัพยากรมาก เราสามารถลดจำนวนชุดสินค้าที่ต้องคำนวณ Support ได้โดยปฏิบัติตามหลักการ Apriori ดังนี้

“ชุดสินค้าที่มีสินค้าเพิ่มขึ้นจะมี Support ที่น้อยกว่าหรือเท่ากับ ชุดสินค้าที่มีจำนวนสินค้าน้อยกว่า”

พูดง่าย ๆ คือ ลูกค้าที่ซื้อสินค้า A, B และ C พร้อมกัน ย่อมน้อยกว่าหรือเท่ากับ จำนวนคนที่ซื้อสินค้า A และ B พร้อมกัน (ไม่สนใจว่าจะซื้อสินค้า C หรือไม่)

ตัวอย่าง

ร้านค้ามีสินค้า 4 ประเภท ได้แก่ ขนมปัง เนย แยม และนม

เราสามารถสร้างชุดสินค้า 15 ชุดตามภาพด้านล่าง (C1 คือสินค้า 1 ชิ้น, C2 คือสินค้า 2 ชิ้น …)

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 13
  • สมมติว่าเรากำหนดค่า Support ต่ำสุดที่ยอมรับได้คือ 0.3 
  • ถ้า Support ของขนมปังน้อยกว่า 0.3 ชุดสินค้าทั้งหมดที่มีขนมปังก็จะมี Support น้อยกว่า 0.3 ด้วย นั่นเอง!! 
  • เราสามารถตัดชุดสินค้าทั้งหมดที่มีขนมปังออกจากการคำนวณ Support ได้ เราเรียกสิ่งนี้ว่า “การคัดกรองจาก Support (Support-Based Pruning)”
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 14

วิธีนี้ทำให้การคำนวณสามารถลดลงได้มากถึงครึ่งหนึ่งเลยทีเดียว

หลังจากที่เรามีเฉพาะชุดสินค้าที่มีความถี่สูงแล้ว เราสามารถสร้าง Association rule ได้ต่อไป

2. การสร้างกฎ 

เราต้องการเฉพาะความสัมพันธ์ที่มี Confidence สูง

วิธีเลือกเฉพาะความสัมพันธ์ที่สำคัญคือการกรองเฉพาะความสัมพันธ์ที่มี Confidence สูงเพราะว่ามันหมายถึงความสัมพันธ์ระหว่างสินค้า A และ B สูง

แต่จะคำนวณ Confidence ของความสัมพันธ์ทั้งหมดก็ไม่ไหว (จำนวนความสัมพันธ์เยอะกว่าจำนวนชุดสินค้าอีก)

เราสามารถลดจำนวนความสัมพันธ์ที่ต้องคำนวณ Confidence ได้โดยใช้หลักการ Apriori นี้

“Confidence ของความสัมพันธ์จากชุดสินค้าจะต่ำลงเมื่อจำนวนสินค้าที่ตามมาเพิ่มขึ้น”

ตัวอย่างเช่น ถ้าเรามี 4 สินค้าในชุดสินค้า: A, B, C และ D
Confidence ของ (A,B,C→ D) ≥ (A,B → C,D) ≥ (A → B,C,D)

เพื่อพิสูจน์สิ่งนี้ ขอย้อนกลับไปที่สูตรของ Confidence ใครลืมให้กลับไปดูที่ตัววัดประสิทธิภาพตัวที่ 2

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 15

ความแตกต่างระหว่างกฎ 2 ข้อนี้มีเพียงแค่ตัวส่วน ตามที่เราพูดถึง Support ในขั้นตอนที่ 1 เมื่อสินค้ามีจำนวนมากขึ้นจะมี Support ต่ำลง (ความถี่ต่ำลง) ดังนั้น Confidence ของความสัมพันธ์แรกจึงมีตัวส่วนที่ต่ำกว่าทำให้มี Confidence ที่สูงกว่า

เราสามารถทำ “การคัดกรองจาก Confidence (Confidence-Based Pruning)” เหมือนกับที่ทำในขั้นตอนที่ 1 เราจะเริ่มด้วยความสัมพันธ์ที่มีสินค้าที่ตามมาเพียง 1 ประเภทก่อน

เคล็ดลับของผมคือให้เน้นที่สินค้าที่ตามมา  (สินค้าที่อยู่หลังลูกศร) และทำเหมือนที่เราทำกับ Support

ตัวอย่าง

ร้านค้ามีสินค้า 4 ประเภท ได้แก่ ขนมปัง เนย แยม และนม

เราสามารถสร้างความสัมพันธ์ได้ 14 แบบตามภาพด้านล่าง

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 16
  • สมมติว่าเรากำหนดค่า Confidence ต่ำสุดที่ยอมรับได้ คือ 0.3 
  • ถ้า Confidence ของ {เนย, แยม, นม} → {ขนมปัง} น้อยกว่า 0.3 ความสัมพันธ์ทั้งหมดที่สินค้าที่ตามมามีขนมปังก็จะมี Confidence น้อยกว่า 0.3 ด้วย 
  • เราสามารถตัดความสัมพันธ์ทั้งหมดที่สินค้าที่ตามมามีขนมปังออกจากการคำนวณ Confidence ได้
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 17

สุดท้าย เราจะคำนวณ Lift จากกฎที่เหลือและทำการตัดสินใจทางธุรกิจด้วยความสัมพันธ์เหล่านั้น

สรุปกันสักหน่อยก่อนไปเขียน code

ผมได้อธิบายตัววัดประสิทธิภาพในการทำ Market basket analysis ได้แก่ support, confidence, lift, leverage และ conviction จากนั้นผมได้แนะนำอัลกอริทึม Apriori ที่สามารถลดการคำนวณ Association rule โดยการตัดความสัมพันธ์ที่ไม่ผ่านเกณฑ์ออก

บอกเลยว่าจริงๆ แล้วขั้นตอนการเขียน code นั้นง่ายกว่าทฤษฎีของ Market basket analysis มากๆๆๆ เพราะเวลาเขียน code เขียนแค่ไม่กี่บรรทัดที่เหลือคอมพิวเตอร์จะคำนวณให้อัตโนมัติเลย แต่ที่ผมอธิบายทฤษฎียาวขนาดนี้เพราะถ้าเราไม่เข้าใจผลลัพธ์ว่าหมายความว่าอย่างไร สุดท้ายก็ไม่สามารถใช้งานจริงได้อยู่ดี

เริ่มเขียน code

คนที่ยังไม่รู้วิธีการใช้ library Pandas ใน Python แนะนำให้ไปอ่านบทความก่อนของผม เรื่อง “การวิเคราะห์ข้อมูลเบื้องต้นด้วย Python: เริ่มต้นด้วย Pandas และ Matplotlib” ก่อนนะครับ ไม่งั้นจะไม่เข้าใจ code หลังจากนี้

ข้อมูลตัวอย่างสามารถดาวน์โหลดได้จาก kaggle เลื่อนลงมาจะเจอไฟล์ชื่อ GroceryStoreDataSet.csv ให้กดที่สัญลักษณ์ download เพื่อ download มาลงเครื่อง ไฟล์ .csv มองว่าเป็น Excel ที่มี Sheet เดียวก็ได้

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 18

dataset นี้ประกอบด้วยสินค้า 11 ชนิด ได้แก่ JAM, MAGGI, SUGAR, COFFEE, CHEESE, TEA, BOURNVITA, CORNFLAKES, BREAD, BISCUIT, และ MILK 

1 แถวแทน 1 การซื้อขายและมีการซื้อขาย 19 ครั้ง ตามภาพด้านล่าง

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 19

สรุปขั้นตอน

  1. เรียกใช้ library และโหลดข้อมูล
  2. การเข้ารหัสแบบ one-hot (one-hot encoding)
  3. หาชุดสินค้าที่เกิดบ่อยโดยใช้อัลกอริทึม Apriori
  4. สร้าง Association rule 

1. เรียกใช้ library และโหลดข้อมูล

import pandas as pd

from mlxtend.preprocessing import TransactionEncoder

from mlxtend.frequent_patterns import apriori, association_rules

df = pd.read_csv("GroceryStoreDataSet.csv", names=['transaction'], sep=',')

Code นี้มีการเรียกใช้ library 3 ครั้ง

  • pandas ใช้สำหรับการจัดการ dataframe
  • mlxtend (machine learning extensions) เป็นไลบรารี่ Python ที่มีเครื่องมือด้าน data science มากมาย
  • mlxtend.preprocessing ใช้สำหรับการเตรียมข้อมูลให้พร้อมก่อนทำ Market basket analysis
  • mlxtend.frequent_patterns ใช้หา Association rule โดย import apriori, association_rules เข้ามา

หลังจากนั้น โหลดข้อมูล GroceryStoreDataSet.csv มาเก็บไว้ที่ตัวแปรชื่อ df แล้วให้ชื่อคอลัมน์ว่า transaction ดังภาพ

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 20

2. การเข้ารหัสแบบ one-hot (one-hot encoding)

เราต้องเปลี่ยนข้อมูลให้เป็นรูปแบบที่เหมาะสมก่อนที่จะนำเข้าไปในอัลกอริทึม Apriori เป้าหมายคือการได้ DataFrame แบบ one-hot (ตารางที่มี 0, 1 ตามประเภทสินค้า ใครจำไม่ได้เลื่อนไปดูตัวอย่างที่ด้านบนได้เลยครับ)

  • เปลี่ยน DataFrame เป็น list ของ list โดย list ก็เหมือนชุดของสินค้าที่ถูกครอบด้วยเครื่องหมาย [] นั่นเอง
df = list(df["transaction"].apply(lambda x:x.split(",")))
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 21
  • ใช้ TransactionEncoder จากไลบรารี่ mlxtend เพื่อเปลี่ยนรายการการซื้อขายเป็น one-hot array
one_hot_transformer = TransactionEncoder()

df_transform = one_hot_transformer.fit_transform(df)
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 22

ยังคงอ่านยากอยู่ ดังนั้นเราจะเปลี่ยนเป็น DataFrame พร้อมชื่อคอลัมน์

  • เปลี่ยน one-hot array เป็น DataFrame
df = pd.DataFrame(df_transform, columns=one_hot_transformer.columns_)
เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 23

นี่คือรูปแบบที่เราต้องการ แต่ละคอลัมน์คือชื่อสินค้าในร้านและแต่ละแถวแทนการซื้อขาย 1 ครั้ง ถ้าค่าเป็น True แสดงว่าสินค้านั้นถูกขายในการซื้อขายนั้น 

ตอนนี้ข้อมูลพร้อมที่จะถูกประมวลผลแล้ว

3. หาชุดสินค้าที่เกิดบ่อยโดยใช้อัลกอริทึม Apriori 

เราจะใช้ Apriori เพื่อหาชุดสินค้าที่เกิดบ่อยจาก DataFrame ที่เตรียมมาในขั้นตอนที่ 2 เป้าหมายของขั้นตอนนี้คือการลดภาระงานคำนวณใน Association rule 

ชุดสินค้าที่เกิดบ่อยจะต้องมี Support สูงกว่าค่า Support ที่กำหนด โดยเราสามารถปรับค่า min_support ให้เหมาะสมกับข้อมูลที่มีได้ ฟังกันที่ใช้คือ apriori ตรงตัวเลย

df = apriori(df, min_support=0.2, use_colnames=True)

df.sort_values(['support'], ascending=False, inplace=True)

ชุดสินค้าที่มี Support สูงกว่า 0.2 มี 15 รายการดังนี้

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 24

ในตัวอย่างนี้ ผมตั้งค่า min_support ที่ 0.2 ดังนั้นมันจะกรองเฉพาะชุดสินค้าที่มี Support มากกว่า 0.2 (หรือมากกว่า 20% จาก 19 การซื้อขาย)

เฉพาะชุดสินค้าที่สำคัญเหล่านี้ที่จะถูกนำไปใช้หา Association rule ต่อไป

4. สร้าง Association rule  

ถึงเวลาของขั้นตอนหลักแล้ว!!

ฟังก์ชัน association_rules จะคำนวณตัววัดประสิทธิภาพจากข้อมูลการซื้อขายของเรา ซึ่งรวมถึง support, confidence, lift, leverage และ conviction โดยอัตโนมัติ

df_ar = association_rules(df, metric="lift", min_threshold=1)

ผลลัพธ์แสดงด้านล่าง

เพิ่มยอดขายด้วย Market Basket Analysis : วิเคราะห์คู่สินค้าขายดีด้วย Python 25

หลังจากนี้หน้าที่ของเราคือต้องแปลความหมายเพื่อนำไปใช้ในธุรกิจต่อไป

ตัวอย่างการแปลความหมาย

  • แถวแรกที่มี Confidence สูงสุดคือ 0.8 ซึ่งหมายความว่าลูกค้าที่ซื้อนมจะซื้อขนมปังด้วย 80% อย่างไรก็ตาม อย่าลืมว่า Confidence ไม่ใช่ทุกอย่าง เพราะ Confidence ที่สูงในแถวนี้เกิดจากการที่ขนมปังมี support สูง (support ของขนมปังคือ 0.65) ซึ่งหมายความว่าขนมปังถูกซื้อหลายครั้งอยู่แล้ว ดังนั้นการขายขนมปังเมื่อซื้อนมอาจไม่ได้ช่วยอะไรมากนัก
  • ตัววัดประสิทธิภาพที่ดีกว่าคือ lift แถวหมายเลข 8 มี lift สูงสุดที่ 2.28 ซึ่งหมายความว่าลูกค้าที่ซื้อชามีแนวโน้มที่จะซื้อ Maggi มากกว่าลูกค้าปกติ 2.28 เท่าเลยที่เดียว

ดังนั้นการแปลความหมายที่เหมาะสม ในคู่ที่สำคัญๆ คือ

MAGGI และ TEA:

  • มี lift สูงสุด (2.285714) แสดงถึงความสัมพันธ์ที่แข็งแกร่งมาก
  • conviction สูงสุด (3.25) ยืนยันความสัมพันธ์ที่แข็งแกร่งมาก
  • 80% ของคนที่ซื้อ MAGGI จะซื้อ TEA ด้วย (confidence = 0.8)

MILK และ BREAD:

  • มี confidence สูง (0.8) แสดงว่า 80% ของคนที่ซื้อ MILK จะซื้อ BREAD ด้วย
  • lift (1.230769) > 1 แสดงว่ามีความสัมพันธ์เชิงบวก

COFFEE และ CORNFLAKES:

  • มี lift ค่อนข้างสูง (1.666667) แสดงถึงความสัมพันธ์ที่ดี
  • 50% ของคนที่ซื้อ COFFEE จะซื้อ CORNFLAKES ด้วย และในทางกลับกัน 66.67% ของคนที่ซื้อ CORNFLAKES จะซื้อ COFFEE

SUGAR และ COFFEE:

  • มีความสัมพันธ์ที่ดี โดยมี lift เท่ากับ 1.666667
  • 50% ของคนที่ซื้อ COFFEE จะซื้อ SUGAR ด้วย

เราสามารถทำอะไรได้บ้างหลังจากรู้เรื่องนี้

  • การจัดวางสินค้า: วางสินค้าที่มีความสัมพันธ์กันใกล้กัน เช่น MAGGI กับ TEA, MILK กับ BREAD
  • โปรโมชัน: สร้างโปรโมชันแบบคู่ เช่น ซื้อ COFFEE ได้ส่วนลด CORNFLAKES
  • การแนะนำสินค้า: เมื่อลูกค้าซื้อ MILK แนะนำให้ซื้อ BREAD เพิ่ม
  • การวางแผนสต็อกสินค้า: เตรียมสต็อก BREAD ให้เพียงพอเมื่อมีการสั่งซื้อ MILK จำนวนมาก
  • การพัฒนาผลิตภัณฑ์: อาจพิจารณาพัฒนาผลิตภัณฑ์ที่รวมสินค้าบางอย่างที่เหมาะสมเข้าด้วยกัน

สรุป 

ในบทความนี้ คุณได้รู้จักกับตัววัดประสิทธิภาพในการทำ Market basket analysis ทั้ง 5 ตัว คือ support, confidence, lift, leverage และ conviction  จากนั้นได้เข้าใจอัลกอริทึม Apriori ที่สามารถลดเวลาในการคำนวณ Association rule ได้ด้วยการคัดกรองจาก Support และ Confidene

ปิดท้ายด้วยการทำ Market basket analysis จากข้อมูลตัวอย่างโดยใช้ไลบรารี่ pandas คู่กับ mlxtend ใน Python แล้วแปลผลลัพธ์ของ Association rule จากตัววัดประสิทธิภาพ เช่น confidence และ lift ก่อนที่จะเสนอแผนธุรกิจต่อไป