Inside purchase behaviour with Market Basket Analysis
Uncover associations of items.
การวิเคราะห์ข้อมูลพฤติกรรมของลูกค้า ที่มีการซื้อสินค้ากับร้านค้า เป็นอีกช่องทางนึงในการทำกำไร เพิ่มยอดขายได้ Blog ตอนนี้เป็นการเล่าถึงการใช้ Statistical analysis เพื่อช่วยวิเคราะห์พฤติกรรมการซื้อของลูกค้า เป็นเครื่องมือที่ช่วยประกอบการตัดสินใจในเรื่องของ Promotion เป็นต้น
Market Basket Analysis
Market Basket Analysis คือเครื่องมือทางสถิติที่ใช้วัดความสัมพันธ์ของรายการซื้อของลูกค้าต่อ 1 Transaction ตัวอย่างเช่น การซื้อสินค้าในร้านสะดวกซื้อ เมื่อมีการซื้อน้ำอัดลม อาจต้องซื้อน้ำแข็งด้วยทุก ๆ ครั้ง ความสัมพันธ์นี้สามารถนำมาใช้วิเคราะห์ เพื่อช่วยร้านค้าในเรื่องต่าง ๆ ไม่ว่าจะเป็นการออก Promotion ซื้อสินค้า 2 ชนิดร่วมกัน จนไปถึงการวัดวางสินค้าให้อยู่ในระยะสายตาเดียวกัน เพื่อเพิ่มโอกาสในการหยิบสินค้าอีกชนิด
Library
Library ที่ใช้งานในการวิเคราะห์ Market Basket Analysis มีชื่อว่า Mlxtend (Machine learning extensions) สำหรับผู้ใช้งาน Google Colab แม้ว่ามีการติดตั้ง Library ไว้แล้วใน Default environment แต่แนะนำให้ทำการ Upgrade เพื่อได้ใช้งานในเวอร์ชั่นใหม่ เพราะเวอร์ชั่นเก่า ๆ ยังมี Bug อยู่บ้าง
Purchase transaction
ข้อมูลที่ใช้งานคือ Groceries dataset หรือเป็น Transaction ที่เก็บข้อมูลการซื้อสินค้าของลูกค้ารายวัน สามารถ Download ข้อมูลได้จาก Link ด้านล่าง
ข้อมูลประกอบไปด้วย 3 Columns คือรหัสลูกค้า วันที่ซื้อสินค้า และรายการสินค้าที่ซื้อ Table ถูกจัดเก็บในลักษณะ Long format หมายถึงรหัสลูกค้า และวันที่ซื้อสินค้าสามารถมีได้มากกว่า 1 บรรทัด สิ่งที่แตกต่างกันคือ รายการสินค้าที่ซื้อ
ก่อนเริ่ม Processing ให้ Transaction สามารถ Visualise รายการสินค้าเพื่อดูว่าสินค้าชนิดใดมีการซื้อเยอะที่สุด คำตอบที่ได้จากกราฟคือ whole milk
เมื่อ .sort_values()
ด้วยรหัสลูกค้าและวันที่ซื้อสินค้า สามารถดูตัวอย่างได้จากลูกค้ารหัส 1000
ที่ซื้อสินค้าในวันที่ 2014–06–24
ว่ามีการซื้อสินค้าทั้งหมด 3 รายการประกอบด้วย whole milk, pastry
และ salty snack
ในการทำ Market Basket Analysis ข้อมูลที่ต้องใช้จะอยู่ในรูปของ Sparse matrix หรือ Matrix ที่ประกอบไปด้วยเลข 0 จำนวนมาก โดยที่ Columns คือรายการสินค้าทั้งหมดใน Transaction และเลข 0 แสดงการไม่มีการซื้อสินค้าชนิดนั้น ๆ ใน Transaction และเลข 1 แสดงการซื้อสินค้าชนิดนั้น ๆ ใน Transaction
เพื่อให้เกิดเป็น Sparse matrix ดังนั้นจึงต้องจัด Long format table ให้เป็น Wide format table โดยให้ลูกค้า 1 คนมี 1 Transaction ใน 1 วัน เพราะ Assumption ว่ารายการสินค้าทั้งหมด ถูกซื้อครั้งเดียวกันในบิลเดียว
ใช้ pd.pivot_table()
เพื่อทำ Columns itemDescription
ให้เหลือ 1 Row ต่อ 1 วัน เมื่อข้อมูลใน itemDescription
เป็น String ใน aggfunc
สามารถเขียนเป็น lambda x: '|'.join(x)
เพื่อเป็นแยกชื่อสินค้าออกจากกันด้วย |
ใช้ .srt.get_dummies('|')
เพื่อสร้างเป็น One-Hot Encoding columns ตามจำนวนสินค้าแบบ Unique ทั้งหมด ซึ่งมีทั้งหมด 167 ประเภทสินค้า
Algorithms used
ใน Market Basket Analysis มี Algorithms ให้เลือกใช้หลายตัว แต่ Blog ตอนนี้เลือกใช้เป็น FP Growth หรือ Frequent Pattern Growth เป็นการใช้ความถี่ของการซื้อสินค้า เพื่อวิเคราะห์หาความสัมพันธ์ที่เกิดขึ้น โดยความถี่มีชื่อเรียกว่า Support สามารถคำนวณได้จากสูตรตามด้านล่าง
เช่นหากต้องการหาความถี่ในการซื้อ Whole milk หรือค่า Support ของ Whole milk สามารถหาได้จาก
dfBasket[‘whole milk’].sum() / len(dfBasket)
เพราะ Column whole milk
ถูกแทนที่เลข 0
หรือ 1
ดังนั้นเมื่อ .sum()
จึงได้เป็นผลรวมของเลขที่ 1
ทั้งหมดใน Column และหารด้วยจำนวน Transaction ทั้งหมด ทำให้ได้เป็น Support ของ Whole milk ออกมาได้ที่ 0.1579
เช่นเดียวกันหากต้องการหา Support ของการซื้อสินค้าทั้ง 2 ชนิดพร้อมกัน สามารถคำนวณได้จากสูตรด้านล่าง
((dfBasket['whole milk'] == 1) & (dfBasket['other vegetables'] == 1)).sum() / len(dfBasket)
จาก Code ด้านบนเป็นการคำนวณ Support ของ whole milk
และ other vegetables
ต้องเชื่อม Condition ด้วย &
เพราะต้องมีการซื้อสินค้าทั้ง 2 ชนิดนี้พร้อมกัน ค่าที่ได้คือ 0.0148
ใช้ fpgrowth()
เพื่อคำนวณ Support ของสินค้าทั้งหมดที่มี โดยเริ่มตั้งแต่สินค้าชนิดเดียว จนไปถึงการซื้อสินค้าพร้อมกันมากกว่า 1 ชนิด โดยสามารถกำหนด min_support
เพื่อให้ Return เฉพาะผลลัพธ์ Support ที่มากกว่าที่กำหนดไว้ เช่นกำหนดไว้ที่ 0.01
เป็นต้น
The likelihood
ขั้นตอนต่อมาเป็นการใช้ค่า Support เพื่อคำนวณความสัมพันธ์ที่อาจเกิดขึ้นได้ต่อ ๆ ไป (Likelihood) มี Metric ที่น่าสนใจหลายตัว แต่ใน Blog ตอนนี้ใช้เป็น Metric Lift มีการคำนวณที่ต้องทำความเข้าใจอีก 2 ตัวคือ Confidence และ Lift
Confidence คือโอกาสที่จะซื้อสินค้าชนิดนี้ เมื่อสินค้า “อีกชนิด” ถูกซื้อ สามารถคำนวณได้จากสูตรด้านล่าง
round(
(
(
(dfBasket['whole milk'] == 1) & (dfBasket['other vegetables'] == 1)
).sum() / \
len(dfBasket)
) / \
(
dfBasket['whole milk'].sum() / len(dfBasket)
),
4
)
ตัวอย่างเช่นโอกาสที่จะซื้อ Other vegetables เมื่อซื้อ Whole milk ไปแล้ว โดยมีโอกาสเป็น 0.0939
ในทางกลับกัน สามารถคำนวณหาโอกาสที่จะซื้อ Whole milk เมื่อ Other vegetables ไปแล้ว (ซื้อผักก่อนซื้อนม) สามารถเขียนเป็นสูตรได้คือ
round(
(
(
(dfBasket['whole milk'] == 1) & (dfBasket['other vegetables'] == 1)
).sum() / \
len(dfBasket)
) / \
(
dfBasket['other vegetables'].sum() / len(dfBasket)
),
4
)
คำตอบที่ได้คือ 0.1215
สังเกตได้ว่าการซื้อสินค้าชนิดในชนิดก่อน ส่งผลต่อโอกาสที่จะซื้อสินค้าชนิดถัดไป หมายความว่าแม้ว่าเป็นสินค้าสองชนิดที่เหมือนกัน แต่โอกาสที่จะเกิดขึ้นไม่เท่ากัน เพราะฉะนั้นลำดับการซื้อจึงมีผล
ต่อมาการคำนวณค่า Lift คือโอกาสที่จะสินค้าทั้ง 2 ชนิดพร้อมกัน เป็น “กี่เท่า” เทียบกับการซื้อสินค้าชนิดใดชนิดหนึ่ง สามารถคำนวณได้จากสูตรด้านล่าง
round(
(
(
(dfBasket['whole milk'] == 1) & (dfBasket['other vegetables'] == 1)
).sum() / \
len(dfBasket)
) / \
(
(dfBasket['whole milk'].sum() / len(dfBasket)) * \
(dfBasket['other vegetables'].sum() / len(dfBasket))
),
4
)
ผลลัพธ์ของ Lift ที่ได้คือ 0.7694
เมื่อพิจารณาที่สูตรการคำนวณ Lift แล้ว พบว่าไม่ว่าจะซื้อสินค้า 2 ชนิดพร้อมกันมากกว่าซื้อนมเพียงอย่างเดียว หรือซื้อผักเพียงอย่างเดียว โอกาสที่จะซื้อสินค้าทั้ง 2 พร้อมกันมากกว่าเป็น 0.7694
เท่าของการซื้อเพียงอย่างใดอย่างหนึ่ง เพราะฉะนั้นลำดับจึงไม่มีผลต่อการคำนวณ
ใช้ association_rules()
กำหนด metric = ‘lift’
ค่าที่ Return จากฟังก์ชั่นคือ Pandas DataFrame ดังนั้นจึงสามารถใช้ Operation ต่าง ๆ ของ Pandas ได้เช่น .sort_values()
เป็นต้น
ผลลัพธ์ของการคำนวณ Lift ระหว่างสินค้า 2 ชนิดมีค่าเท่ากัน จากตารางด้านบนหมายความว่า โอกาสที่จะซื้อนมและผักมีค่าเป็น 0.769
เท่ามากกว่าการซื้อเพียงอย่างใดอย่างนึง
Result
ข้อมูลใน Pandas DataFrame ถูกเก็บไว้ในรูปแบบ Set()
(สังเกตได้จากวงเล็บ () ที่ครอบ String อยู่) ดังนั้นหากต้องการ Query ข้อมูลให้ใช้ {}
เพื่อเป็น Set operation แทนการใช้ String
แสดงผลลัพธ์ที่ได้จากการวิเคราะห์ Market Basket Analysis ของสินค้า Whole milk ว่ามีสินค้าอื่นใดบ้างที่นิยมซื้อคู่กัน เห็นได้จากกราฟว่า Other vegetables มีโอกาสถูกซื้อมากที่สุด หากมีการซื้อ Whole milk ไปแล้ว
ต่อมาเป็นผลลัพธ์ของการซื้อสินค้าเป็นคู่กับ Whole milk จากกราฟเห็นได้ว่า Yogurt มีการจับคู่ซื้อพร้อมกันกับ Whole milk มากกว่าการซื้อเพียงอย่างใดอย่างหนึ่ง
Conclusion
Market Basket Analysis ถือว่าเป็น Marketing model หรือ Customer model ที่มีประโยชน์ในการบริหารสินค้าที่มีจำนวนมาก โดยมีพฤติกรรมการซื้อจริงมาเป็นเกณฑ์อ้างอิง และเป็นโมเดลที่มีความเป็นเหตุเป็นผล ไม่อยู่ใน Black box จนเกินไป สามารถใช้ข่วย Support การตัดสินใจได้ดี
สำหรับ Colab notebook ของเนื้อหา Market Basket Analysis สามารถดูได้ที่ Link ด้านบน