เมื่อสาย DATA อยากจะกิน Pizza (โดยใช้ Jaccard Similarity และ Cosine Similarity)
คุณเคยเจอปัญหานี้ไหมครับ ??
ที่ร้านพิซซ่ามีโปรโมชั่น 1 แถม 1 แต่สั่งมาแล้วรสชาติคล้ายๆกัน ยิ่งกินยิ่งเลี่ยน ?
ซึ่งปัญหาด้านบนเป็น Pain point ที่ทำให้ผมกินไม่หมด ต้องห่อกลับบ้านไปกิน ซึ่งพอเวลาที่เปิดมากินก็รู้สึกไม่ค่อยอยากจะกินแล้ว เหตุการณ์นี้พึ่งเกิดขึ้นมาวานนี้เอง ผมก็เลยเกิด Idea ว่าอยากจะลองใช้ Data Analytics มาลองแก้ปัญหานี้ดู
มาเริ่มกันเลยครับ !!!! (ออกตัวก่อนเลยว่าผมยังเป็นมือใหม่ และเป็น Post แรกด้วยหากมีข้อผิดพลาดประการใด รบกวนผู้รู้ช่วยแนะนำด้วยนะครับ :D )
เอ๋…. ว่าแต่เราจะเอา Data มาจากไหนกันหล่ะ ผมก็เข้าไปที่ Website ของ The Pizza Company ละก็แอบแงะเอามาใส่ Excel File ซึ่งตอนที่ได้มาจะมีหน้าตาประมาณนี้
ข้อมูลใน Excel File นี้ประกอบไปด้วย 14 Rows 4 Columns เท่านั้น
Column 1 : pizza คือ ชื่อของหน้าพิซซ่า
Column 2 : size คือ ขนาดของถาด
Column 3 : price คือ ราคาของพิซซ่า
Column 4 : ingredient คือ ส่วนผสมของพิซซ่า
ข้อมูลที่ได้มานั้นอาจจะยังไม่ได้พร้อมใช้งานเท่าใหร่นัก เนื่องจากใน Columns ingredient นั้นยังเป็น Text และอ่านค่อนข้างยากว่าพิซซ่าแต่ละหน้านั้นมีวัตถุดิบอะไรที่เหมือนกันบ้าง จึงจะต้องทำการ Clean และ Transform Data ให้อยู่ในรูปแบบที่พร้อมใช้มากขึ้น
จากรูปที่ 2 เราจะว่าพิซซ่าแต่ละหน้านั้น มีวัตถุดิบอะไรบ้าง ถ้ามีเป็น 1 ถ้าไม่มีเป็น 0
จากรูปที่ 3 เราจะเห็นว่าหากเราดูด้วยตาไวๆ พิซซ่าทั้ง 2 หน้านั้นมี วัตถุดิบที่เหมือนกันอยู่ 4 อย่าง นั้นก็คือ pineapple , mozzarella cheese และ ham
คำถามถัดมาเราจะรู้ได้อย่างไรว่าพิซซ่าทั้ง 2 หน้านี้ต่างกันมากหรือน้อย …!! แหม่…!! เป็นคำถามที่ดี (ถามเอง-ตอบเอง 555+)
งั้นเรามาใช้วิธีวัดความเหมือนด้วย Jaccard Similarity ละกัน
Concept มันก็คือเอาส่วนที่เหมือนกันมาหารด้วยสิ่งที่ทั้งคู่มีทั้งหมด ค่าจะอยู่ระหว่าง 0 จนถึง 1 ซึ่ง 0 คือไม่เหมือนกันเลย และ 1 คือเหมือนกันทุกตัว
M11 หรือวัตถุดิบที่พิซซ่าทั้ง 2 หน้ามีเหมือนกัน
= 3 ชนิด(pineapple , mozzarella cheese และ ham)
M01 หรือวัตถุดิบที่พิซซ่าหน้าที่หนึ่งไม่มี แต่พิซซ่าหน้าที่สองมี
= 2 ชนิด(pizza sauce และ bacon slice)
M10 หรือวัตถุดิบที่พิซซ่าหน้าที่หนึ่งมี แต่หน้าที่สองไม่มี
= 2 ชนิด(crab sticks และ thousand island)
M00 หรือวัตถุดิบที่พิซซ่าทั้ง 2 หน้าไม่มีทั้งคู่ → Jaccard จะไม่นำมาคำนวนเพราะถือว่าไม่มีเหมือนกันอยู่แล้ว
ดังนั้นถ้าเราคำนวนมือ หาค่า Jaccard Similarity ระหว่าง HAM&GRAB STICKS และ HAWAIIAN จะคำนวนได้ดังนี้
Jaccard Similarity (H&G ,HAW) = M11 / (M11+M01+M10) = 3 / (3+2+2) = 3 / 7 หรือ 0.429 ซึ่งก็ถือว่าเหมือนกันพอสมควรเลย
แต่ถ้าจะให้มานั่งคำนวนพิซซ่าทุกหน้าด้วยมือคงจะไม่ไหว เพราะฉะนั้นเราก็เขียน Code วน Loop ให้ Computer ช่วยคำนวนแทน จากนั้นเอามา Plot เป็น Heatmap ให้ดูง่ายๆจะได้ตามรูปนี้
จากรูปที่ 5 เราก็จะเห็นว่ามีหลายคู่เลยที่มีการใช้วัตถุดิบคล้ายๆกัน ได้แก่
1. SEAFOOD COCKTAIL และ HAM&CRAB STICKS = 0.83
2. DOUBLE PEPPERONI และ DOUBLE CHEESE = 0.67
3. SUPER DELUXE และ PORK DELUXE = 0.64
4. SUPER DELUXE และ MEAT DELUXE = 0.58
5. SHRIMP COCKTAIL และ SEAFOOD COCKTAIL = 0.50
ดังนั้นครับ ถ้าเกิดใครสั่งพิซซ่าทั้ง 2 หน้าตามข้อด้านบน ก็อาจจะเลี่ยนได้ !! (ความเห็นส่วนตัวนะครับ 555+ เพราะบางท่านอาจจะไม่เลี่ยนก็ได้)
เอ๊ะ การที่เราจะวัดความเหมือนนี้มีแต่ Jaccard Similarity รึเปล่าครับ (เสียงกุมาร ที่เลี้ยงไว้ถาม หลอกๆ) จริงๆอาจจะมีอีกหลาย Technique เลยครับ แต่จะขอยกตัวอย่างอีก 1 วิธีคือ Cosine Similarity
Cosine Similarity
Cosine Similarity คือการวัดความเหมือนของ Vector 2 ว่าไปในทิศทางเดียวกันหรือไม่ โดยที่เป็นการตัดขนาด หรือ Magnitude ของ Vector ออกไป
แหม่…!! เริ่มมีอักษรแปลกๆมาละ 555+ ในรูปที่ 7 สูตรนี้ผมอ่านว่า
“ A dot product B หารด้วยขนาดของ A คูณ ขนาดของ B”
ซึ่ง A dot product B มันคือการเอา Aตัวที่ 1 คูณ Bตัวที่ 1 ไปเรื่อยๆ แล้วเอาผลลัพธ์มาบวกกัน
ส่วนขนาดของ A หรือ B มันคือการเอาสมาชิก ทุกตัวยกกำลัง 2 บวกกันแล้วถอดรูท
เมื่อนำเอาผลลัพธ์ของทั้ง 2 วิธีมาเปรียบเทียบกัน
พบว่าสิ่งที่ทั้ง 2 วิธีให้ค่าออกมานั้นจะแตกต่างกันที่ Scale ของข้อมูล ฝั่งของ Cosine Similarity นั้นจะมี Scale สูงกว่า Jaccard Similarity แต่ความหมายที่เราใช้ในการแปลเพื่อสื่อสารในมุมของวัตถุดิบที่นำมาใช้ทำพิซซ่าแต่ละหน้า ก็แทบจะไม่ต่างกันเลย
ขอแถมอีกนิดนึงงงงงง อยากรู้ว่าวัตถุดิบที่ชอบซ้ำๆกันเนี่ยมันคือตัวไหนกันแน่ และอะไรชอบเกิดคู่กันบ่อยผมเลยมา Plot ให้ดูได้ตามรูปนี้ครับ
จากรูปที่ 9 เราจะสังเกตได้ว่าที่มาคู่กันบ่อยๆคือ
- mozzarella cheese และ pizza sauce
- mozzarella cheese และ ham
- mozzarella cheese และ mushroom
และอื่นๆเป็นต้นเราจะ สามารถสังเกตได้ว่า mozzarella cheese มีความเป็น centrality สูงเนื่องจากมี edge เยอะมากถึง 7 เส้น (เส้นที่เชื่อมระหว่าง mozzarella cheese กับ วัตถุดิบอื่นๆ)
จากรูปที่ 10 เราจะสังเกตได้ว่า วัตถุดิบหลักๆ คือ mozzarella cheese , mushroom , pizza sauce และ onion ทำไมผมถึงรู้เราดูอย่างไร ? คำตอบคือผมดูจากขนาดของวงกลมนั้นแทนความเป็น Centrality ของวัตถุดิบ (Set ไว้ให้ Size แทนค่าของ Centrality)
พอดีคนทางบ้านเรียกไปกินพิซซ่าแล้ว ได้ข่าวว่าสั่งพิซซ่าหน้า
SHRIMP COCKTAIL และ MEAT DELUXE มาซะด้วย แต่ก่อนไปกินขอเช็คนิดนึง :D
แหม่ …….!! ค่อยยังชั่ว มี Jaccard Similarity แค่ 0.077 เองใช้ได้ๆ
สำหรับบทความนี้คงจะมีเพียงเท่านี้ จริงๆยังมี Idea อยากจะทำอีกหลายเรื่อง ไว้จะมาแชร์ต่อไปเรื่อยๆนะครับ
ขอบคุณทุกท่านที่อ่านมาจนจบ ขอบคุณครับ
Ref: สำหรับรูปภาพที่นำมาใช้ในบทความ
https://deepai.org/machine-learning-glossary-and-terms/cosine-similarity