Supalerk Pisitsupakarn
Data Cafe Thailand
Published in
4 min readMar 16, 2020

--

เมื่อสาย DATA อยากจะกิน Pizza (โดยใช้ Jaccard Similarity และ Cosine Similarity)

คุณเคยเจอปัญหานี้ไหมครับ ??

ที่ร้านพิซซ่ามีโปรโมชั่น 1 แถม 1 แต่สั่งมาแล้วรสชาติคล้ายๆกัน ยิ่งกินยิ่งเลี่ยน ?

ซึ่งปัญหาด้านบนเป็น Pain point ที่ทำให้ผมกินไม่หมด ต้องห่อกลับบ้านไปกิน ซึ่งพอเวลาที่เปิดมากินก็รู้สึกไม่ค่อยอยากจะกินแล้ว เหตุการณ์นี้พึ่งเกิดขึ้นมาวานนี้เอง ผมก็เลยเกิด Idea ว่าอยากจะลองใช้ Data Analytics มาลองแก้ปัญหานี้ดู

มาเริ่มกันเลยครับ !!!! (ออกตัวก่อนเลยว่าผมยังเป็นมือใหม่ และเป็น Post แรกด้วยหากมีข้อผิดพลาดประการใด รบกวนผู้รู้ช่วยแนะนำด้วยนะครับ :D )

เอ๋…. ว่าแต่เราจะเอา Data มาจากไหนกันหล่ะ ผมก็เข้าไปที่ Website ของ The Pizza Company ละก็แอบแงะเอามาใส่ Excel File ซึ่งตอนที่ได้มาจะมีหน้าตาประมาณนี้

รูปที่ 1 : Excel File ที่ได้มาจาก https://1112.com/bogo

ข้อมูลใน 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 : ตารางที่ผ่านการ Clean และ Transform Data ให้อยู่ใน Format ที่พร้อมใช้งานมากขึ้น

จากรูปที่ 2 เราจะว่าพิซซ่าแต่ละหน้านั้น มีวัตถุดิบอะไรบ้าง ถ้ามีเป็น 1 ถ้าไม่มีเป็น 0

รูปที่ 3 : เป็นรูปที่แสดงว่าพิซซ่าแต่ละหน้านั้น มีวัตถุดิบอะไรบ้าง

จากรูปที่ 3 เราจะเห็นว่าหากเราดูด้วยตาไวๆ พิซซ่าทั้ง 2 หน้านั้นมี วัตถุดิบที่เหมือนกันอยู่ 4 อย่าง นั้นก็คือ pineapple , mozzarella cheese และ ham

คำถามถัดมาเราจะรู้ได้อย่างไรว่าพิซซ่าทั้ง 2 หน้านี้ต่างกันมากหรือน้อย …!! แหม่…!! เป็นคำถามที่ดี (ถามเอง-ตอบเอง 555+)

งั้นเรามาใช้วิธีวัดความเหมือนด้วย Jaccard Similarity ละกัน

รูปที่ 4 : สูตรของ 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 : Heatmap ที่แสดงค่าของ Jaccard Similarity

จากรูปที่ 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

รูปที่ 6 : Cosine Similarity

Cosine Similarity คือการวัดความเหมือนของ Vector 2 ว่าไปในทิศทางเดียวกันหรือไม่ โดยที่เป็นการตัดขนาด หรือ Magnitude ของ Vector ออกไป

รูปที่ 7 : สูตรของ Cosine Similarity

แหม่…!! เริ่มมีอักษรแปลกๆมาละ 555+ ในรูปที่ 7 สูตรนี้ผมอ่านว่า

“ A dot product B หารด้วยขนาดของ A คูณ ขนาดของ B”

ซึ่ง A dot product B มันคือการเอา Aตัวที่ 1 คูณ Bตัวที่ 1 ไปเรื่อยๆ แล้วเอาผลลัพธ์มาบวกกัน

ส่วนขนาดของ A หรือ B มันคือการเอาสมาชิก ทุกตัวยกกำลัง 2 บวกกันแล้วถอดรูท

เมื่อนำเอาผลลัพธ์ของทั้ง 2 วิธีมาเปรียบเทียบกัน

รูปที่ 8 : เปรียบเทียบผลลัพธ์ของ Jaccard Similarity กับ Cosine Similarity

พบว่าสิ่งที่ทั้ง 2 วิธีให้ค่าออกมานั้นจะแตกต่างกันที่ Scale ของข้อมูล ฝั่งของ Cosine Similarity นั้นจะมี Scale สูงกว่า Jaccard Similarity แต่ความหมายที่เราใช้ในการแปลเพื่อสื่อสารในมุมของวัตถุดิบที่นำมาใช้ทำพิซซ่าแต่ละหน้า ก็แทบจะไม่ต่างกันเลย

ขอแถมอีกนิดนึงงงงงง อยากรู้ว่าวัตถุดิบที่ชอบซ้ำๆกันเนี่ยมันคือตัวไหนกันแน่ และอะไรชอบเกิดคู่กันบ่อยผมเลยมา Plot ให้ดูได้ตามรูปนี้ครับ

รูปที่ 9 : ความสัมพันธ์ระหว่างวัตถุดิบแต่ละชนิดและตัด edge ที่มีค่าน้อยกว่า 3 ออก

จากรูปที่ 9 เราจะสังเกตได้ว่าที่มาคู่กันบ่อยๆคือ

  1. mozzarella cheese และ pizza sauce
  2. mozzarella cheese และ ham
  3. mozzarella cheese และ mushroom

และอื่นๆเป็นต้นเราจะ สามารถสังเกตได้ว่า mozzarella cheese มีความเป็น centrality สูงเนื่องจากมี edge เยอะมากถึง 7 เส้น (เส้นที่เชื่อมระหว่าง mozzarella cheese กับ วัตถุดิบอื่นๆ)

รูปที่ 10 : กราฟแสดงความสัมพันธ์ระหว่างวัตถุดิบ

จากรูปที่ 10 เราจะสังเกตได้ว่า วัตถุดิบหลักๆ คือ mozzarella cheese , mushroom , pizza sauce และ onion ทำไมผมถึงรู้เราดูอย่างไร ? คำตอบคือผมดูจากขนาดของวงกลมนั้นแทนความเป็น Centrality ของวัตถุดิบ (Set ไว้ให้ Size แทนค่าของ Centrality)

พอดีคนทางบ้านเรียกไปกินพิซซ่าแล้ว ได้ข่าวว่าสั่งพิซซ่าหน้า

SHRIMP COCKTAIL และ MEAT DELUXE มาซะด้วย แต่ก่อนไปกินขอเช็คนิดนึง :D

รูปที่ 11 : Jaccard Similarity ของ SHRIMP COCKTAIL และ MEAT DELUXE

แหม่ …….!! ค่อยยังชั่ว มี Jaccard Similarity แค่ 0.077 เองใช้ได้ๆ

สำหรับบทความนี้คงจะมีเพียงเท่านี้ จริงๆยังมี Idea อยากจะทำอีกหลายเรื่อง ไว้จะมาแชร์ต่อไปเรื่อยๆนะครับ

ขอบคุณทุกท่านที่อ่านมาจนจบ ขอบคุณครับ

Ref: สำหรับรูปภาพที่นำมาใช้ในบทความ

https://medium.com/@newnaveen/%E0%B9%80%E0%B8%AD%E0%B8%B2%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%A1%E0%B8%B9%E0%B8%A5%E0%B8%A1%E0%B8%B2%E0%B8%A2%E0%B8%B3-%E0%B9%81%E0%B8%AD%E0%B8%9A%E0%B8%94%E0%B8%B9-%E0%B9%80%E0%B8%9E%E0%B8%88%E0%B8%AA%E0%B8%B1%E0%B8%A1%E0%B8%9E%E0%B8%B1%E0%B8%99%E0%B8%98%E0%B9%8C-%E0%B8%9A%E0%B8%99%E0%B9%80%E0%B8%9F%E0%B8%8B%E0%B8%9A%E0%B8%B8%E0%B9%8A%E0%B8%81-d412f354a9c8

https://deepai.org/machine-learning-glossary-and-terms/cosine-similarity

--

--