ใช้ Python ทำ proc varclus เหมือนบน SAS ได้แล้วนะ
ย้ำกันอีกทีว่า ผมเป็น SAS User นะ
ซึ่งมันจะปวดใจมาก ๆ เวลาทำ Cluster ใน Python อาจจะด้วยความไม่เก่งกาจ ความมักง่าย ความเคยชิน ความอะไรต่าง ๆ นานาของตัวเองด้วยแหละ ประกอบกับ SAS เนี่ย มันมีคำสั่ง proc varclus
ที่ใช้ในการจัดทำ clustering ได้อย่างสวยงาม
ความเจ๋งของ proc varclus
เนี่ยคือ เราไม่ต้องกำหนด “จำนวน cluster” ซึ่งมันเป็นคำถามง่าย ๆ ที่ Consultant อย่างเรา ๆ เวลาโดนลูกค้าถามมา มันตอบได้ยากเหลือเกิน
แล้วพี่จะรู้ได้ไงว่า จำนวน Clusters ของพี่จะเป็นเท่าไหร่ ?
อืม… นั่นสิ มันควรจะเป็นเท่าไหร่นะ เพราะปกติถ้า Project ไหนใช้ SAS นะ แค่เราอ่าน data เข้าไป ตัวคำสั่งมันจะ optimum number of clusters มาให้เราทันที พูดง่าย ๆ ก็คือฟังก์ชั่นสำเร็จนั่นแหละ
แล้วพอมาโปรเจคที่ต้องใช้ Python หรือ R ในการทำ… เอาละ เริ่มจะยังไง… เพราะเขียน Code จัด cluster ใคร ๆ ก็เขียนได้ แต่มันต้องกำหนดจำนวนตั้งแต่เริ่มนี่สิที่มันแปลกกกกกกกก
จริง ๆ ก็เคยทำ research กับเพื่อน ๆ ในทีมสำหรับวิธีการ optimum ถ้าถามว่ามันทำได้ไหม ตอบไว้ตรงนี้เลยว่า “ทำได้” ไม่ว่าจะเป็น Elbow method หรือ Silhouette analysis แต่ประสิทธิภาพจะเท่า proc varclus
ไหม… ก็แน่ใจ (เดี๋ยวถ้าไม่ขี้เกียจ จะเอามาเขียนให้ดู)
เกริ่นมานานมากแล้ว เข้าเรื่องดีกว่า
จริง ๆ แล้วผลลัพธ์สุดท้ายที่ได้จาก proc varclus
มันมีหน้าตาประมาณนี้ ซึ่งมันเป็นวิธีการ Hierarchical clustering นั่นเอง แต่ “Blackbox” ของ SAS อาจจะไม่เหมือนชาวบ้าน ดังนั้นเลยใช้ Package ของ scikit-learn ไม่ได้นะฮะ
เมื่อคืนนั่งค้นอะไรไปเรื่อย แล้วเจอเจ้านี้ varclushi เค้ามีบน github ด้วยนะ ง่าย ๆ คือมันเป็น Package ไว้สำหรับรัน proc varclus
บน Python IDE (Spyder, Jupyter) เห็นแล้วก็ว้าวสิครับ มาเริ่มทดสอบกันเลย รออะไรล่ะ
Install
ขั้นตอนแรกเราต้องติดตั้ง Package varclushi
ก่อนนะ ใช้ pip install
ก็ได้ง่ายดี
pip install varclushi
Code
เริ่มจาก Import
ตัว Package ก่อนเลย ที่เห็น Code ข้างบนมันเยอะ ๆ ยาว ๆ ไม่มีอะไรมากครับ ผมกำลังทำ Table ให้เหมือนที่เอาไปรันใน SAS เพื่อที่จะเทียบผลกันในตอนสุดท้าย
เริ่มต้นใช้งานตัว Package VarClusHi
เลย parameters ที่ต้องผ่านเข้าไปมีทั้งหมด 3 ตัวด้วยกันครับ คือ
- Data: อันนี้ไม่มีอะไรมาก จัด Table ให้เหมือน SAS เลย โดยให้ตัวแปรเป็น columns ทั้งหมด แล้วข้อมูลเรียงตาม rows ลงมา
- Maximum Second Eigenvalues
(maxeigval2)
: ตามค่า default บน SAS ถ้าไม่กำหนดอะไรจะเท่ากับ 1 ครับ - Maximum number of clusters
(maxclus)
: ถ้าไม่กำหนดอะไร มันจะ optimum number of clusters มาให้เองครับ
จากนั้นก็รันตัว object module ด้วยคำสั่ง .varclus()
ได้เลยครับ พอรันเสร็จก็สามารถนำผลที่ได้มาทำเป็น Pandas dataframe
ได้เลยด้วยคำสั่ง .rsquare
ตัว Dataframe
ที่ออกมาจะหน้าตาเหมือน Table results จาก SAS เลยครับ ดูง่ายมาก ๆ อ้อ… จำนวน Cluster จาก VarClusHi
มันเริ่มจาก 0 แต่จาก SAS มันเริ่มที่ 1 ดังนั้นเพื่อความเคยชิน ผมเลย +1 ของจำนวน Cluster บน Dataframe
ไปเลยละกัน cus_res[‘Cluster’] = cus_res[‘Cluster’]+1
มาลองเทียบผลกัน
Result
ขออนุญาตปิดชื่อตัวแปรทั้งหมดเลยละกัน ดูแค่ผล stat ที่ออกมาก็น่าจะเทียบกันได้แล้วครับ
สรุปเลยละกัน… (ตอนนี้รู้สึกว่าเขียนยาวไปหน่อย) มันใช้ได้ครับ แล้วถ้ามีโอกาสต่อ ๆ ไป จะเอาไปใช้กับงานของตัวเองบ้าง มันชินกว่าจริง ๆ นะ