การแบ่งกลุ่มลูกค้าออนไลน์ตามคำอธิบายรายการ

การแนะนำ

การแบ่งส่วนลูกค้าเป็นหนึ่งในการใช้งานทั่วไปของการวิเคราะห์ข้อมูล/วิทยาศาสตร์ข้อมูล ในสองโพสต์นี้ เราจะดูตัวอย่างการแบ่งส่วนลูกค้า เราจะใช้ "ชุดข้อมูลการค้าปลีกออนไลน์ II" ซึ่งประกอบด้วยธุรกรรมของการค้าปลีกออนไลน์ในสหราชอาณาจักรระหว่างวันที่ 1/12/2552 ถึง 09/12/2554 ชุดข้อมูลประกอบด้วย 1.067.371 แถวเกี่ยวกับการซื้อของลูกค้า 5.943 ราย

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

แผนคือการรวมการแบ่งส่วนต่างๆ สองส่วนเข้าด้วยกัน

  • การแบ่งส่วนตามสินค้าที่ลูกค้าแต่ละรายซื้อ
  • การแบ่งส่วนตามความใหม่ ความถี่ มูลค่าทางการเงิน (RFM) และประเทศ ("ส่วนที่ 2")

ในส่วนแรกนี้ เราจะดำเนินการแบ่งส่วนตามรายการต่างๆ ในส่วนที่สอง เราจะดำเนินการจัดกลุ่ม RFM-ประเทศ และเราจะรวมทั้งสองส่วนเข้าด้วยกัน

รหัสเต็มของส่วนนี้สามารถพบได้ที่ Github

การแบ่งส่วนตามรายการ

เพื่อทำการแบ่งส่วนตามรายการ เราจะกำหนดแต่ละรายการให้กับหมวดหมู่เฉพาะ เราสามารถแบ่งส่วนในระดับรายการได้ แต่การรวมเป็นหมวดหมู่มีประโยชน์ 2 ประการ:

  • เนื่องจากมีรายการที่ไม่ซ้ำกัน 5.699 รายการที่ใช้จึงหมายความว่าเราจะต้องทำงานในพื้นที่มิติสูง (เช่น พื้นที่ 5.699 มิติ) โดยทั่วไป พื้นที่มิติสูงมีแนวโน้มที่จะเป็นปัญหาเมื่อจัดกลุ่ม (เช่น ดูการสนทนาใน “ข้อดีและข้อเสียของ k-Means»” )
  • การอธิบายคลัสเตอร์จะง่ายกว่าหากเราใช้หมวดหมู่

ขออภัย ชุดข้อมูลไม่มีหมวดหมู่รายการ ดังนั้นเราจึงต้องหาทางสร้างมันขึ้นมา เมื่อต้องการทำเช่นนี้ เราจะดำเนินการจัดกลุ่มตามคำอธิบายของรายการ เราจะใช้การจัดกลุ่มเคมีนแบบเคมีน (หรือดีกว่ารูปแบบหนึ่งของเคมีนที่เรียกว่า MiniBatchKMeans) เนื่องจากเคมีนใช้ได้กับข้อมูลตัวเลขเท่านั้น เราจึงจับคู่คำอธิบายกับเวกเตอร์ที่มีมิติสูง ทำได้โดยใช้:

  • TfidfVectorizer
  • เครื่องนับเวกเตอร์

(ใน เอกสารประกอบของ sklearn คุณสามารถอ่านคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานทั้งสองวิธีได้)

วิธีการที่แตกต่างกันสองวิธีจะช่วยให้เราสามารถค้นหาวิธีที่ดีที่สุดในการสร้างแบบจำลองหมวดหมู่ผลิตภัณฑ์

กำลังประมวลผลล่วงหน้า

จำเป็นต้องมีการประมวลผลล่วงหน้าเล็กน้อย ขั้นแรก เราจะตรวจสอบค่าที่หายไปในคำอธิบายและแทนที่ด้วย "NA" จากนั้น เราจะแปลงคอลัมน์ "คำอธิบาย" เป็นสตริง (มีเซลล์ที่เป็นจำนวนเต็มทำให้เกิดปัญหาในภายหลัง) และสร้างรายการที่มีคำอธิบายเฉพาะ

นอกจากนี้ เราต้องการลบคำทั่วไปออกจากการวิเคราะห์ของเรา วิธีหนึ่งในการค้นหาคือการสร้าง word cloud จากคำอธิบายทั้งหมด

ตามคำว่าคลาวด์ เราสร้างรายการคำหยุดของเรา

การทำคลัสเตอร์โดยใช้ TfidfVectorizer

โค้ดด้านล่างนี้ใช้ TfidfVectorizer เพื่อจับคู่คำอธิบายกับเวกเตอร์ จากนั้นจะใช้ MiniBatchKMeans ซึ่งเป็นตัวแปรหนึ่งของ k-Means เพื่อการคำนวณที่เร็วขึ้นเพื่อทำการจัดกลุ่มสำหรับ 2, 3,…, 10 คลัสเตอร์ ผลลัพธ์จะใช้เพื่อสร้างกราฟผลรวมของระยะทางยกกำลังสอง

ตาม "วิธีข้อศอก" ค่าที่เป็นไปได้มากที่สุดสำหรับจำนวนคลัสเตอร์คือ 4, 6 และ 8 โค้ดด้านล่างคลัสเตอร์ออกเป็น 4 กลุ่ม จากนั้นจะแสดงคำว่า cloud จากคำอธิบายในแต่ละคลัสเตอร์

ดูเหมือนว่า:

  • หมวด 0 ค่อนข้างทั่วไป
  • หมวดที่ 1 เกี่ยวกับกระเป๋า
  • หมวดที่ 2 เป็นเรื่องเกี่ยวกับการตกแต่งคริสต์มาส
  • หมวดที่ 3 เป็นเรื่องเกี่ยวกับการตกแต่งประเภทอื่นๆ

โปรดสังเกตว่าหมวดหมู่ 0 มีคำอธิบายมากกว่า (5.026) มากเมื่อเทียบกับหมวดหมู่ที่เหลือ (275, 204 และ 194 ตามลำดับ) โดยทั่วไป นี่อาจเป็นข้อบ่งชี้ว่าเราควรเพิ่มจำนวนคลัสเตอร์

เราสามารถลองแบ่งออกเป็น 6 กลุ่มได้ โดยหวังว่ากลุ่มใหญ่จะแบ่งออกเป็นกลุ่มเล็ก ๆ อีกหลายกลุ่ม ในกรณีนี้ หมวดหมู่ 0 มีคำอธิบาย 4.956 รายการ และส่วนที่เหลือมี 197, 173,168,130 และ 75

  • หมวด 0 ค่อนข้างทั่วไป
  • หมวดที่ 1 เกี่ยวกับกระเป๋าในกรณีนี้ด้วย
  • หมวดที่ 2 เป็นเรื่องเกี่ยวกับเทียนหอม
  • หมวดที่ 3 เป็นเรื่องเกี่ยวกับการตกแต่งคริสต์มาส
  • หมวดที่ 4 เป็นเรื่องเกี่ยวกับการตกแต่งประเภทอื่น
  • หมวดที่ 5 เกี่ยวกับถ้วย ชาม และจาน

ดูเหมือนว่าจะมีการทับซ้อนกันมากขึ้นระหว่างหมวดหมู่ต่างๆ คำว่า "แก้ว" ปรากฏในหมวด 0 ในขณะที่คำว่า "ถ้วย" ในหมวด 5 คำว่า "ชาม" ปรากฏในทั้งหมวด 0 และ 5 คำว่า "กระเป๋า" ปรากฏในทั้งหมวด 1 และ 5 คำว่า "คริสต์มาส" ปรากฏในทั้งประเภทที่ 1 และ 3

การทำคลัสเตอร์โดยใช้ CountVectorizer

เราทำซ้ำขั้นตอนนี้โดยใช้ CountVectorizer เพื่อจับคู่คำอธิบายกับเวกเตอร์ เราจะละเว้นข้อมูลโค้ด คุณสามารถอ่านโค้ดได้ที่ Github (ผู้อ่านที่ระมัดระวังมากจะสังเกตเห็นว่าเราไม่ได้ปรับขนาดก่อนที่จะใช้ k-Means/MiniBatchKMeans เนื่องจากคำอธิบายของรายการมีความยาวเท่ากันไม่มากก็น้อย) ตามวิธีข้อศอก ตัวเลขที่เหมาะสมที่สุดสำหรับคลัสเตอร์คือ 3 และ 8

หากเราจัดกลุ่มออกเป็น 3 กลุ่ม เราจะมีสามหมวดหมู่พร้อมคำอธิบาย 5.334, 199 และ 166 ตามลำดับ ดังที่เราเห็นจากคำว่าเมฆ มีการทับซ้อนกันอย่างมีนัยสำคัญระหว่างหมวดหมู่ต่างๆ (โดยเฉพาะหมวดหมู่ 0 และ 2)

ดูเหมือนว่าการใช้สี่คลัสเตอร์กับ TfidfVectorizer นั้นชัดเจนกว่า เราจะใช้สิ่งนี้ โปรดทราบว่าควร ลอง ใช้ทั้ง TfidfVectorizer และ CountVectorizer สำหรับคลัสเตอร์จำนวนต่างๆ ทำคลัสเตอร์ลูกค้าให้เสร็จสิ้นด้วยคลัสเตอร์ทั้งหมด จากนั้นตัดสินใจว่าจะเก็บคลัสเตอร์ใดไว้ (เพิ่มเติมเกี่ยวกับหลังนี้)

การแบ่งส่วนลูกค้า — การประมวลผลล่วงหน้า

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

ด้วยเหตุนี้ เราจึงสามารถคำนวณต้นทุนรวม (การใช้จ่าย) ต่อหมวดหมู่ต่อเดือนได้ ในหมวด 2 มีการเพิ่มขึ้นอย่างมากในเดือนพฤศจิกายน ขณะที่มีค่าใกล้ศูนย์ในช่วงเดือนที่เหลือ ข้อมูลนี้เป็นการยืนยันว่าหมวดหมู่ 2 เกี่ยวข้องกับผลิตภัณฑ์ที่เกี่ยวข้องกับคริสต์มาส

เราคำนวณการใช้จ่ายทั้งหมด (ต้นทุน) ต่อหมวดหมู่สำหรับลูกค้าทุกราย

สุดท้ายนี้ เราจะแทนที่ต้นทุนรวมต่อหมวดหมู่ด้วยเปอร์เซ็นต์ของต้นทุนรวมในทุกหมวดหมู่ โปรดสังเกตว่าในบางกรณีเรามีค่าเป็นลบ บางทีนี่อาจหมายถึงผลตอบแทน เนื่องจากสินค้าที่ส่งคืนควรจะซื้อครั้งก่อน เราจึงเปลี่ยนค่าลบเป็นค่าบวก นี่จะเป็นอินพุตของ K-Mean เพื่อสร้างกลุ่มลูกค้า

การแบ่งส่วนลูกค้า — การจัดกลุ่ม

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

โปรดจำไว้ว่า ตามวิธีข้อศอก ค่าที่ดีที่สุดสำหรับจำนวนคลัสเตอร์คือตรงที่มีข้อศอก/มุมในกราฟ จากข้อมูลนี้ เราสามารถเลือก 4 หรือ 7 เป็นจำนวนคลัสเตอร์ได้

รหัสสำหรับการสร้าง 4 คลัสเตอร์และการจัดทำโปรไฟล์มีดังต่อไปนี้ ฟังก์ชัน cluster_profile คำนวณค่ามัธยฐานของเปอร์เซ็นต์การใช้จ่ายสำหรับแต่ละคลัสเตอร์ และวางแผนแผนที่ความร้อนพร้อมกับผลลัพธ์

เราพบว่าสำหรับทุกคลัสเตอร์มีเปอร์เซ็นต์การใช้จ่ายในหมวด 0 สูง นอกจากนี้:

  • คลัสเตอร์ 0 มีลูกค้าที่มีการใช้จ่ายสูงในหมวด 2
  • คลัสเตอร์ 1 มีลูกค้าที่มีการใช้จ่ายสูงเฉพาะในหมวด 0 เท่านั้น
  • คลัสเตอร์ 2 มีลูกค้าที่มีการใช้จ่ายสูงในหมวด 3
  • คลัสเตอร์ 3 มีลูกค้าที่มีการใช้จ่ายสูงในหมวด 1

หากเราลองสร้าง 6 คลัสเตอร์ ในบางกรณี เราจะได้คลัสเตอร์ที่มีเปอร์เซ็นต์สูงกว่าในหมวดหมู่ 1 หรือหมวดหมู่ 2 มากกว่าในหมวดหมู่ 0 ข้อเสียคือในการที่จะบรรลุเป้าหมายนั้น เราต้องสร้างคลัสเตอร์ที่มีลูกค้าเพียงไม่กี่ราย

การใช้การจัดกลุ่มแบบลำดับชั้นทำให้เราสามารถเข้าใจจำนวนคลัสเตอร์ที่เป็นไปได้ได้ดีขึ้น

เมื่อเลือก 4 คลัสเตอร์ เราพบว่าขณะนี้คลัสเตอร์ที่มีการใช้จ่ายสูงในหมวด 1 (คลัสเตอร์ 3) มีการใช้จ่ายในหมวด 1 สูงกว่าในหมวด 0 การกลับกันนี้เป็นผลมาจากขนาดที่เล็กลง ดังนั้นเราจะเลือกใช้เคมีน 4 กลุ่ม ข้อมูลสัมพัทธ์ จะถูกส่งออกพร้อมกับผักดอง

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

สุดท้ายนี้ รูปภาพด้านล่างแสดงผลลัพธ์ที่เราได้รับหากเราใช้หมวดหมู่รายการ 6 รายการ ทางด้านซ้ายจะแสดงกราฟข้อศอกสำหรับเลือกจำนวนกลุ่มในการแบ่งส่วนลูกค้า จากข้อมูลนี้ จำนวนคลัสเตอร์ที่ดีที่สุดคือ 3 หรือ 5 คลัสเตอร์ ถ้าเราลองใช้ 3 คลัสเตอร์ เราจะได้คลัสเตอร์หนึ่งที่มีลูกค้าส่วนใหญ่และอีกสองคลัสเตอร์ที่เล็กกว่ามาก ทางด้านขวาของภาพคือโปรไฟล์ที่มี 5 คลัสเตอร์ อย่างที่คุณเห็น ผลลัพธ์จะคล้ายกับโซลูชันการจัดกลุ่ม 4 รายการของเราซึ่งมีคำอธิบาย 4 หมวดหมู่ ข้อแตกต่างคือขณะนี้มีสองกลุ่มที่การใช้จ่ายส่วนใหญ่อยู่ในหมวด 0

ไม่ว่าดีหรือแย่กว่านั้น ไม่มีกฎเกณฑ์ที่ยากสำหรับการตัดสินใจจัดกลุ่มหลายครั้ง แนวทางเท่านั้น. คุณสามารถทดลองและสร้างสมุดบันทึกของคุณเองได้โดยใช้ "สมุดบันทึก jupyter" ใน colab ของ Google