ใช้ Python ทำ proc varclus เหมือนบน SAS ได้แล้วนะ

Sasiwut Chaiyadecha
2 min readApr 7, 2020

--

ย้ำกันอีกทีว่า ผมเป็น SAS User นะ

ซึ่งมันจะปวดใจมาก ๆ เวลาทำ Cluster ใน Python อาจจะด้วยความไม่เก่งกาจ ความมักง่าย ความเคยชิน ความอะไรต่าง ๆ นานาของตัวเองด้วยแหละ ประกอบกับ SAS เนี่ย มันมีคำสั่ง proc varclus ที่ใช้ในการจัดทำ clustering ได้อย่างสวยงาม

proc varclus using python

ความเจ๋งของ proc varclus เนี่ยคือ เราไม่ต้องกำหนด “จำนวน cluster” ซึ่งมันเป็นคำถามง่าย ๆ ที่ Consultant อย่างเรา ๆ เวลาโดนลูกค้าถามมา มันตอบได้ยากเหลือเกิน

แล้วพี่จะรู้ได้ไงว่า จำนวน Clusters ของพี่จะเป็นเท่าไหร่ ?

อืม… นั่นสิ มันควรจะเป็นเท่าไหร่นะ เพราะปกติถ้า Project ไหนใช้ SAS นะ แค่เราอ่าน data เข้าไป ตัวคำสั่งมันจะ optimum number of clusters มาให้เราทันที พูดง่าย ๆ ก็คือฟังก์ชั่นสำเร็จนั่นแหละ

แล้วพอมาโปรเจคที่ต้องใช้ Python หรือ R ในการทำ… เอาละ เริ่มจะยังไง… เพราะเขียน Code จัด cluster ใคร ๆ ก็เขียนได้ แต่มันต้องกำหนดจำนวนตั้งแต่เริ่มนี่สิที่มันแปลกกกกกกกก

จริง ๆ ก็เคยทำ research กับเพื่อน ๆ ในทีมสำหรับวิธีการ optimum ถ้าถามว่ามันทำได้ไหม ตอบไว้ตรงนี้เลยว่า “ทำได้” ไม่ว่าจะเป็น Elbow method หรือ Silhouette analysis แต่ประสิทธิภาพจะเท่า proc varclus ไหม… ก็แน่ใจ (เดี๋ยวถ้าไม่ขี้เกียจ จะเอามาเขียนให้ดู)

cluster analysis

เกริ่นมานานมากแล้ว เข้าเรื่องดีกว่า

จริง ๆ แล้วผลลัพธ์สุดท้ายที่ได้จาก proc varclus มันมีหน้าตาประมาณนี้ ซึ่งมันเป็นวิธีการ Hierarchical clustering นั่นเอง แต่ “Blackbox” ของ SAS อาจจะไม่เหมือนชาวบ้าน ดังนั้นเลยใช้ Package ของ scikit-learn ไม่ได้นะฮะ

proc varclus using python

เมื่อคืนนั่งค้นอะไรไปเรื่อย แล้วเจอเจ้านี้ 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 ตัวด้วยกันครับ คือ

  1. Data: อันนี้ไม่มีอะไรมาก จัด Table ให้เหมือน SAS เลย โดยให้ตัวแปรเป็น columns ทั้งหมด แล้วข้อมูลเรียงตาม rows ลงมา
  2. Maximum Second Eigenvalues (maxeigval2): ตามค่า default บน SAS ถ้าไม่กำหนดอะไรจะเท่ากับ 1 ครับ
  3. 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 ที่ออกมาก็น่าจะเทียบกันได้แล้วครับ

proc varclus using python
ผลจาก proc varclus บน SAS
proc varclus using python
ผลจาก Package VarClusHi บน Python

สรุปเลยละกัน… (ตอนนี้รู้สึกว่าเขียนยาวไปหน่อย) มันใช้ได้ครับ แล้วถ้ามีโอกาสต่อ ๆ ไป จะเอาไปใช้กับงานของตัวเองบ้าง มันชินกว่าจริง ๆ นะ

--

--

Sasiwut Chaiyadecha
Sasiwut Chaiyadecha

No responses yet