ทำ Customer Segmentation ด้วย ML กับข้อมูล GA tracking

Methas Assanangkornchai
Data science at Predictive
7 min readJun 22, 2021

วันนี้เราจะมายกตัวอย่างการนำข้อมูล GA tracking มาใช้ในการทำ Customer Segmentation โดยใช้ ML (Machine Learning) เราจะใช้เทคนิค Clustering สำหรับการจัดกลุ่มข้อมูลพฤติกรรมของ user ที่คล้ายๆ กัน ไว้ในกลุ่มเดียวกัน กับข้อมูล GA tracking จากเว็บไซต์ Google Merchandise Store ที่ถูกเก็บไว้ใน BQ (BigQuery) Public Dataset

ข้อมูล GA จาก Google Merchandise Store ที่ถูกเก็บไว้ใน BQ Public Dataset
หน้าตาเว็บไซต์ https://www.googlemerchandisestore.com

รู้จักข้อมูล GA tracking เบื้องต้น

  1. Audience Data คือข้อมูลเกี่ยวกับ user ที่เข้ามาใช้งานเว็บไซต์ ตัวอย่างของข้อมูล Audience Data จะมีดังต่อไปนี้
  • New/Returning Visitor ระบุว่า user ที่เข้ามาในเว็บไซต์ครั้งแรก หรือเคยเข้ามาแล้วแล้วกลับเข้ามาอีก
  • Language, City, Country ระบุว่า user ใช้ภาษาอะไร ขณะที่กำลัง browse เว็บไซต์ user อยู่ที่เมืองอะไร ประเทศอะไร
  • Browser, Operating System, Device Category ระบุว่า user
    ใช้ browser อะไรเช่น Chrome, Safari, Internet Explorer, etc.
    ใช้ Operating System อะไรเช่น iOS, Android, Windows, etc.
    ใช้ Device Category อะไรเช่น Mobile, Tablet, Desktop, etc.

2. Acquisition Data คือข้อมูลว่า user ที่เข้ามาในเว็บไซต์เข้ามาจากช่องทางไหน ตัวอย่างข้อมูล Acquisition Data ที่ใช้กันหลักๆ จะมีดังต่อไปนี้

  • Source / Medium ระบุว่า user มาจากช่องทางไหน เช่น
    Facebook / social, Google / organic, Google / cpc
  • Campaign ระบุว่า user เข้ามาผ่าน marketing campaign อะไร

3. Behavior Data คือข้อมูลเชิงพฤติกรรมของ user ว่าขณะที่เข้ามาบนเว็บไซต์ user ทำ action อะไรบ้าง ตัวอย่างข้อมูล Behavior Data ที่ใช้กันหลักๆ จะมีดังต่อไปนี้

  • Landing Page คือหน้าแรกบนเว็บไซต์ที่ user เข้ามา
  • Page คือหน้าต่างๆที่ user browse บนเว็บไซต์
  • Event คือ action ต่างๆที่ user กระทำบนเว็บไซต์อย่างเช่น การกดปุ่มต่างๆ, การ scroll บนหน้าต่างๆ, การดูวิดีโอ, หรือ การดาวโหลดไฟล์บนเว็บไซต์

4. Conversion data ถ้าพูดเป็นภาษาไทยเลย คือ การวัดผลของความสำเร็จของเว็บไซต์ของเรา ซึ่งความสำเร็จของเว็บไซต์ของเรา (goal) เราสามารถกำหนดได้เองว่าจะวัดจากอะไร เช่น
เราเป็นเว็บไซต์ธนาคาร เราอาจจะตั้ง goal ว่าถ้า user สมัครสินเชื่อบนเว็บไซต์สำเร็จ ให้นับเป็น 1 goal

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

  • Purchasing funnel จะแบ่งออกเป็น steps ดังนี้
    product views → add to cart → check-out → purchase complete
    เราสามารถดูจำนวน user ที่ drop off ไปในแต่ละ step เพื่อนำมาวิเคราะห์ต่อได้
  • product, product category, product revenue, quantity คือ สินค้าที่ user ซื้อ, category ของสินค้า, รายได้ที่ได้จากการขายสินค้า และ ปริมาณสินค้าที่ขายได้ตามลำดับ
    ซึ่งเราจะได้ข้อมูลส่วนนี้เป็นหลักในการทำ clustering เพื่อจัดกลุ่ม user ตามพฤติกรรมการซื้อสินค้าบนเว็บไซต์
https://storage.googleapis.com/e-nor/visualizations/bigquery/ga360-schema.html#section-collapsible-tree

Clustering คือ อะไร?

Clustering คือการนำข้อมูลมาแบ่งเป็นกลุ่มย่อยๆ โดยข้อมูลที่มีลักษณะใกล้เคียงกัน หรือคล้ายๆกัน จะถูกจัดอยู่ในกลุ่มเดียวกัน เทคนิคดังกล่าวจัดเป็น Unsupervised Learning ML หรือพูดง่ายๆ คือ การสร้างโมเดลที่เรียนรู้จากข้อมูล แบบไม่ต้องมี label หรือ target กำกับ โดย model ที่เราจะนำมาใช้ คือ K-means clustering โดย model ดังกล่าวจะทดลองจัดกลุ่มข้อมูลหลายๆ รูปแบบ ตามจำนวนกลุ่มที่เรากำหนด และวัดผลการจัดกลุ่ม โดยใช้ความคล้ายคลึงกันของข้อมูลภายในกลุ่มเดียวกัน และจะพยายามจัดกลุ่มข้อมูลที่มีลักษณะคล้ายคลึงกันให้อยู่ในกลุ่มเดียวกันมากที่สุด

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.geeksforgeeks.org%2Fclustering-in-machine-learning%2F&psig=AOvVaw3JiwV8Wi4rjXRL7_KqdULe&ust=1624524417815000&source=images&cd=vfe&ved=0CAoQjRxqFwoTCLiA8pmvrfECFQAAAAAdAAAAABAD

วิดีโอแนะนำเพิ่มเติมเกี่ยวกับ K-means Clustering
https://www.youtube.com/watch?v=4b5d3muPQmA

ในบทความนี้การทำ customer segmentation ประกอบไปด้วย 4 ขั้นตอน

  1. การแบ่งประเภทของ feature
  2. สร้าง SCV (Single Customer View) จาก feature ที่วางแผนไว้ในขั้นตอนที่ 1
  3. ทำ Clustering สำหรับ feature แต่ละประเภท โดยใช้วิธีการ K-means clustering
  4. นำ segment ที่ได้จาก feature แต่ละประเภทมาวิเคราะห์ร่วมกัน

มาเริ่มกันเลย

  1. การแบ่งประเภทของ feature

ข้อมูลที่เรานำมาใช้ จะเป็นข้อมูลการซื้อสินค้าของ user ที่เข้ามาเยี่ยมชมเว็บไซต์ googlemerchandisestore.com โดยเราจะแบ่งประเภทของ feature เป็นดังนี้

  • RFM features (Recency, Frequency, Monetary)
    Recency
    = user เข้ามา vist เว็บไซต์ล่าสุด ผ่านมาแล้วนานแค่ไหน
    Frequency = ความถี่ในการเข้าเว็บไซต์ของ user (ครั้ง ต่อ สัปดาห์/เดือน)
    Monetary = กำลังใช้จ่ายของ user (spending รวมของ user และ spending เฉลี่ยของ user)
    RFM features ของ user สามารถช่วยเราวิเคราะห์ value ของ user เบื้องต้นได้ว่า user คนไหน มี value มากน้อยกว่ากันในมุมต่างๆ แน่นอนว่าโดยพื้นฐาน ธุรกิจต้องการสร้างฐาน user ที่มี recency ต่ำ frequency สูง และ monetary สูง แต่เราต้องสามารถวิเคราะห์ และแบ่งกลุ่มลูกค้าปัจจุบันออกมาให้ได้ก่อนว่าลูกค้าคนไหนเป็นลูกค้าที่มี value ที่สูงแล้ว เพื่อที่จะได้รักษาฐานลูกค้ากลุ่มนี้ต่อ หรือลูกค้าคนไหน ที่เป็นลูกค้าที่อาจจะยังมี value ไม่สูงมาก แต่มีศักยภาพที่ดีในอนาคต
  • User’s preference by revenue (Revenue distribution by product category)
    คือ revenue ที่ user ซื้อของใน product category ต่างๆ หรือ เป็นตัวแทนความชอบสินค้าแต่ละ category ของ user โดยวัดจาก revenue
  • User’s preference by quantity (Quantity distribution by product category)
    คือ quantity ที่ user ซื้อของใน product category ต่างๆ หรือ เป็นตัวแทนความชอบสินค้าแต่ละ category ของ user โดยวัดจาก quantity

2. สร้าง SCV

หลังจากที่เราแบ่งประเภท features กันแล้ว ก็ถึงเวลาเตรียมข้อมูล GA tracking บน BQ ให้อยู่ในรูป SCV หรือ เราจะทำการสรุปข้อมูลของ user แต่ละคน จากรูปแบบ raw data ให้กลายมาเป็นข้อมูล 1 row โดยเราจะดึง features ออกมาจากข้อมูลตามที่วางแผนไว้ในข้อ 1

2.1 เขียน query เพื่อหา RFM feature

  • clientId และ fullVisitorId จะเป็น ID ที่ใช้สำหรับบ่งบอกถึง user แต่ละคน
  • last_visit คือ เวลาเริ่มต้นของการเข้ามาเว็บไซต์ครั้งล่าสุดของ user
  • days_span คือ ระยะเวลาที่ user เคยเข้ามาซื้อของบนเว็บไซต์ของเรา คิดเป็นจำนวนวัน จากวันที่ session สุดท้าย ลบ วันที่ session แรก ยกตัวอย่างเช่น first visit =1/6/2021, latest visit = 7/6/2021 days_span จะเท่ากับ 6 วัน
  • total_visits คือจำนวนครั้งที่ user เข้ามาซื้อของบนเว็บไซต์
  • avg_monthly_visit, avg_weekly_visit, avg_daily_visit คือ จำนวนครั้งที่ user เข้ามาซื้อของบนเว็บไซต์ของเราเฉลี่ยต่อเดือน, สัปดาห์, วัน ตามลำดับ
  • total_spent คือจำนวนเงินทั้งหมดที่ user ซื้อของบนเว็บไซต์
  • avg_monthly_spent, avg_weekly_spent, avg_daily_spent คือ จำนวนเงินเฉลี่ยที่ user ซื้อของบนเว็บไซต์ของต่อเดือน, สัปดาห์, วัน ตามลำดับ
  • avg_basket_size คือจำนวนเงินเฉลี่ยของการซื้อสินค้าแต่ละครั้งของ user บนเว็บไซต์

ทั้งนี้ columns ทั้งหมดข้างต้นจะถูกคำนวณออกมาเป็นราย user สังเกตได้จากการ group by clientId, fullVisitorId

2.2 เขียน query เพื่อหา preference ของ user

Revenue by Product Category Level1 by Column

ในส่วนนี้จะต้อง clean data อยู่พอสมควร เพราะ product category ที่ได้มาจาก v2ProductCategory จะมาในรูปแบบ category หลายๆ level ที่แยกกันด้วย / เช่น Apparel/Shirt/Hawaii แบบนี้ เราจึงต้องเขียน regular expression เพื่อดึง product category ใน level ที่เราต้องการออกมา

จุดประสงค์ของเรา คือ หา revenue และ quantity ของแต่ละ user โดยแบ่งตาม product category ซึ่ง revenue และ quantity สำหรับแต่ละ product category จะถูกแยกออกมาเป็นราย column ตามภาพตัวอย่างข้างบน โดยเราเลือกใช้ category level 1 มากำหนด product category ที่เราจะดึงออกมา

ส่วนที่สำคัญคือสิ่งที่เราจะดึงออกมาจาก sub-query แรกนี้ได้แก่

  • clientId และ fullVisitorId จะเป็น ID ที่ใช้สำหรับบ่งบอกถึง user แต่ละคน
  • visitStartTime คือ เวลาเริ่มต้นของการเข้ามาเว็บไซต์แต่ละครั้งของ user
  • category_1 คือ product category level 1 ซึ่ง product category จะมีมากที่สุดได้ถึง 3 level ขึ้นอยู่กับสินค้าแต่ละชิ้น (บางชิ้นมีแค่ level เดียว บางชิ้นมี 2 level) แต่จากการสำรวจข้อมูล พบว่าสินค้าทุกชิ้นที่ถูกซื้อจะมีแค่ level เดียว เราจึงเลือกใช้ product category level 1
  • revenue และ quantity คือจำนวนเงินที่ใช้ซื้อสินค้าใน category_1 และจำนวนสินค้าใน category_1 ที่ถูกซื้อ ตามลำดับ

sub-query ที่สอง จะเป็นการนำ sub-query แรก มาคัด product category ที่มีสัดส่วนของข้อมูลค่อนเล็ก มารวมกันอยู่ในกลุ่ม others ส่วน product category ที่มีสัดส่วนของข้อมูลค่อนข้างใหญ่จะมีดังนี้ Apparel, Office, Drinkware, Lifestyle, Bags, Electronics, Headgear และ Notebooks & Journals

สำหรับ sub-query สุดท้าย เราจะเป็นการ แยก revenue และ quantity ของแต่ละ product category เป็นราย column

2.3 รวม query จากขั้นตอน 2.1 และ 2.2 เพื่อสร้าง SCV

ขั้นตอนสุดท้าย คือการนำ query ในส่วนของ RFM, user’s preference by revenue, และ user’s preference by quantity มารวมเข้าด้วยกันเพื่อสร้าง SCV

ผลลัพธ์สุดท้ายหลังจากการเขียน query ทั้งหมดเสร็จเรียบร้อย เราจะนำข้อมูลมาทำ Clustering model ต่อด้วย Python สำหรับหน้า DataFrame ของ SCV ก่อนจะไปต่อกันในขั้นตอนถัดไปจะมีหน้าตาประมาณนี้

Dataframe ของ SCV ที่โหลดเข้ามาใน python

3. ทำ Clustering สำหรับ feature แต่ละประเภท โดยใช้วิธีการ K-means clustering

เราจะนำ features ที่แยกไว้ตามประเภทที่กำหนดตามข้อ 1 มาทำ K-mean clustering แยกกัน เพื่อความง่ายในการสร้าง profile ของ segment แยกตามกลุ่ม feature โดยเราจะใช้ elbow method ในการกำหนดจำนวน cluster ที่เหมาะสม

โดยเราจะ plot เทียบค่า WCSS (within cluster sum of square — ระยะระหว่าง data point ในแต่ละ cluster กับจุด centroid ของ cluster) ของจำนวนการแบ่ง cluster ที่ต่างๆกัน และเราจะเลือกจำนวน cluster ที่ wcss เริ่มจะไม่ลดลงแล้ว หรือกราฟเริ่มมีการหักศอกนั่นเอง

Elbow Method

นอกเหนือจากการพิจารณาจำนวน cluster ด้วย elbow method การเลือกจำนวน cluster ที่เหมาะสม ต้องดูจำนวนประชากรที่ได้ในแต่ละ cluster ด้วยว่าเป็นกลุ่มประชากรที่เล็กเกินกว่าจะเอาไปทำอะไรไหม หรือ มี business requirement กำหนดไว้หรือไม่ว่าต้องการแบ่งกลุ่ม user ได้อย่างน้อยกี่กลุ่ม หรือไม่เกินกี่กลุ่ม

สำหรับ feature แต่ละประเภท เราเลือกจำนวน cluster ที่เหมาะสม ดังนี้

  • User’s preference by revenue (K = 7)
  • User’s preference by quantity (K = 7)
  • RFM (K = 3)

3.1 ทำ segmentation กับ feature กลุ่ม User’s preference by revenue

เราจะใช้ K-means clustering ซึ่ง import มาจาก library sklearn จะเห็นว่าโค้ดในการเทรนโมเดล ก็จะสั้นๆแค่ 2 บรรทัด ส่วนที่มีขั้นตอนเยอะ จะเป็นการทำ data preprocessing ที่เราทำมาแล้วเบื้องต้นบน SQL และจะมีขั้นตอนในการ preprocess ข้อมูลบน Python คือ การทำ feature scaling ซึ่งสำหรับ feature ในกลุ่มที่เป็น preference by revenue นี้ เราจะ normalize revenue ในแต่ละ category ของ user คนเดียวกัน ให้กลายเป็น % รวมกันได้ 100% ก่อน แล้วจึงค่อย normalize ข้อมูลในแต่ละ column ด้วย standard scaler หรือ min/max scaler

การแปลง revenue ในแต่ละ product category ภายใน row เดียวกันให้เป็น %
การทำ Standard Scaling ของข้อมูลในแต่ละ column

เราระบุจำนวน cluster ด้วย argument n_clusters = 7 และตัวแปร cat_rev_final คือ DataFrame ที่เป็นข้อมูล user’s preference by revenue ที่ถูก normalize แล้ว

หลังจากทำ clustering เสร็จ user แต่ละคนจากทั้งหมด 7,991 คน จะถูกจัดอยู่ใน segment กลุ่มใดกลุ่มหนึ่งในทั้งหมด 7 segment ซึ่ง แต่ละกลุ่มจะมีจำนวน users และค่าเฉลี่ยของ %revenue ในแต่ละ product category ตามภาพข้างล่าง

จำนวน users และค่าเฉลี่ยของ %revenue ในแต่ละ product category ของ cluster ทั้ง 7 กลุ่ม

หากนำค่าเฉลี่ย %revenue ของแต่ละ product category ของแต่ละ segment มาแสดงเป็น bar plot จะเห็นว่าแต่ละ segment จะรวม user ที่ซื้อของใน product category ที่เหมือนกันไว้ด้วยกัน

cluster_id = 0
cluster_id = 1
cluster_id = 2

ตัวอย่างผลลัพธ์ของการแบ่ง segment โดยใช้ user’s preference by revenue 3 กลุ่มแรก เราจะได้ segment ที่ชอบซื้อสินค้าประเภท apparel (เสื้อผ้า) ที่ cluster_id = 0, segment ที่ชอบซื้อสินค้าประเภท office (อุปกรณ์ออฟฟิศ) และ drinkware (บรรจุภัณฑ์เครื่องดื่ม) ที่ cluster_id = 1, และ segment ที่ชอบซื้อสินค้าประเภท bags (กระเป๋า) ที่ cluster_id = 2

3.2 ทำ segmentation โดยใช้ RFM

จากที่เราเลือกจำนวน cluster สำหรับ RFM feature โดยใช้ elbow method เลือก n_clusters = 3 หลังจากทำ clustering เสร็จ user ทั้งหมด 7,991 คน จะถูกจัดกลุ่มออกมาทั้งหมด 3 segment โดยแต่ละกลุ่มจะมีจำนวน users และค่าเฉลี่ยของ feature ต่างๆ ที่รวมอยู่ในกลุ่ม feature ประเภท RFM ตามภาพข้างล่าง

จำนวน users และค่าเฉลี่ยของ attributes ต่างๆของ RFM Status ของ cluster ทั้ง 3 กลุ่ม

หากนำค่าเฉลี่ยของ feature ที่น่าสนใจของแต่ละ cluster มาสร้าง bubble plot โดยให้ขนาดของแต่ละ bubble แทนจำนวนประชากรในแต่ละ cluster เราจะได้กลุ่ม user 3 segment ที่มี RFM แยกกันอย่างชัดเจนตามภาพด้านล่าง

avg_basket_size vs days_since_last_session
avg_basket_size vs days_span
avg_basket_size vs avg_weekly_visit

โดนเราสามารถจำแนกแต่ละ segment ตาม RFM ได้ดังนี้

  1. cluster_id = 0 : small basket size | new user | infrequent visitor -> เราจะเรียก segment นี้ว่า new user
  2. cluster_id = 1 : large basket size | loyal user | frequent visitor -> เราจะเรียก segment นี้ว่า loyal user
  3. cluster_id = 2 : large basket size | new user | infrequent visitor -> เราจะเรียก segment นี้ว่า potential user

4. นำ segment ที่ได้จาก feature แต่ละประเภทมาวิเคราะห์ร่วมกัน

หลังจากที่เราสร้าง segment ของ user ตามประเภทของ feature ได้แก่ RFM และ preference by revenue เสร็จแล้ว เราสามารถนำ segment ดังกล่าวมาวิเคราะห์ร่วมกัน เพื่อแบ่งประเภทของ user ทั้งในมุมของความชอบซื้อสินค้า category ต่างๆ กัน และ ในมุมของ value ที่แตกต่างกัน โดยใช้ RFM

การวิเคราะห์ segment ลูกค้าร่วมกันดังกล่าว สามารถให้ business นำไปใช้ประโยชน์ในการทำ CRM ได้เจาะจงมากยิ่งขึ้น เช่น business ต้องการจะทำแผนการตลาดสำหรับกลุ่ม segment คนชอบซื้อเสื้อผ้า (apparel) โดยต้องการเจาะจงเฉพาะ new user เป็นต้น

ในบทความนี้เรายังไม่ได้พูดถึงการทำ validation สำหรับการทำ clustering ซึ่งก็มี challenge พอสมควรว่า เราจะสามารถวัดความถูกต้องในมุมไหน แล้วจะใช้อะไรเป็น baseline ในแต่ะมุม ซึ่งในอนาคต เราจะมาพูดถึงเรื่องดังกล่าวกัน :)

--

--