มาหาข้อมูลความสัมพันธ์ของแต่ละ user กันเถอะ

Image placeholder
แวะมาทักทายกันได้


หลังจากที่กำเนิด platform ที่มีชื่อว่า Facebook มาหลายปี นับตั้งแต่ 2009 จนถึงปัจจุบัน 2022 ก็บริษัท Facebook ก็เริ่มเปลี่ยนเป้าหมายของบริษัท ไปทำระบบ Metaverse หลายๆคนอาจจะเคยสงสัยว่า เวลาที่ ระบบที่เรียกกันว่า Social Network และกิจกรรมที่เรียกกันเพิ่มเพื่อนๆ มีขั้นตอนหรือการทำงานอย่างไร

 

ผู้เขียนกำลังศึกษาหนังสือเล่มหนึ่งที่มีชื่อว่า Data Science from Scratch ในบทนำของหนังสือเล่มกำลังจะพูดถึง Data Science หรือ Data Analytic นั้นจะต้องทำอะไรบ้าง


ซึ่งก็มีการยกตัวอย่าง ด้วยการจำลองการเชื่อมต่อระหว่าง เพื่อนกับเพื่อน

เพื่อหาความสัมพันธ์ระหว่างเพื่อนกับเพื่อนว่ามี Insight อะไรที่น่าสนใจบ้าง

 

จากที่ผู้เขียนได้ลองทำตามแบบฝึกหัดของหนังสือ ผู้เขียนคิดว่าน่าสนใจดีจึงขอหยิบยก

ขึ้นมาบางส่วนเพื่อแนะนำและรีวิวหนังสือเล่มนี้ เป็นแนวทางสำหรับผู้ที่สนใจ

การทำงานของ Data Science ตามคำแนะนำของหนังสือเล่มนี้

 

มาหาข้อมูลความสัมพันธ์ของแต่ละ user กันเถอะ

 

สมมติว่า คุณกำลังทำงานเป็นผู้เชี่ยวชาญด้านข้อมูล หรือที่เรียกว่านักวิทยาศาสตร์ข้อมูล ผู้เขียนขอนิยามสั้นๆว่า DS (Data Science) และสมมติว่าเจ้าของบริษัทที่กำลังจ้างคุณทำงานอยู่นั้น มีคำถามมากมายที่เกี่ยวกับ ผู้ใช้งานในระบบ (user) ยกตัวอย่างเช่น ผู้ใช้งานที่ชื่อ “hero” มีใครบ้างที่ เพื่อนกับ คนๆนี้อยู่

 

คุณก็เริ่มดึงข้อมูลออกมา เพื่อจะดูว่า user ทั้งหมดในระบบมีใครบ้าง จาก code ตัวอย่างข้างนี้เป็นแค่การจำลองข้อมูลขึ้นมาเพื่อทดสอบ สมมติฐานต่างๆ ที่เราสนใจ (สามารถคัดลอก code ไปทดสอบบน jupyter notebook ได้)

 

users = [
       { "id": 0, "name": "Hero" },
       { "id": 1, "name": "Dunn" },
       { "id": 2, "name": "Sue" },
       { "id": 3, "name": "Chi" },
       { "id": 4, "name": "Thor" },
       { "id": 5, "name": "Clive" },
       { "id": 6, "name": "Hicks" },
       { "id": 7, "name": "Devin" },
       { "id": 8, "name": "Kate" },
       { "id": 9, "name": "Klein" }
]

 

โดยกำหนดความสัมพันธ์ ขึ้นมาโดยใช้ tuple ตามตัวแปรด้านล่าง

 

# สร้างความสัมพันธ์ relations


friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]

 

โดยในวงเล็บจะมี user_id อยู่ 2 ตัว ซึ่งหมายถึง user_id ทั้ง 2 ตัวนี้มีการเชื่อมต่ออยู่ ถ้าสามารถวาดของมาเป็น กราฟ ก็จะมีความเชื่อมโยงกันตามลักษณะในรูปภาพปก

 

 

คราวนี้ เราจะมาสร้างข้อมูล friendships ความสัมพันธ์ลงไปในแต่ละ user  โดยต้องกำลัง field ข้อมูลขึ้นมาตาม code ด้านล่างนี้

 

# สร้าง attribute ชื่อ friend ขึ้นมา


for user in users:
    user["friends"] = []

 

และ

 

users[0]["friends"].append(users[1]) # add 0 as a friend of 1


users[1]["friends"].append(users[0]) # add 1 as a friend of 0

 

หน้าตาของข้อมูลก็จะออกมาในลักษณะนี้ ใช้คำสั่ง print(users[0]) เพื่อแสดงข้อมูลของ user ที่ชื่อ “hero”


ผลลัพธ์  # {'id': 0, 'name': 'Hero', 'friends': [{'id': 1, 'name': 'Dunn', 'friends': [{...}]}]}


จะเห็นว่า ข้อมูล user id ที่ 0 ที่ชื่อ hero มี field ที่ชื่อ friends จะมี user_id ที่ 1 ชื่อ Dunn เข้ามา ในทางตรงกันข้าม Dunn ก็เป็นเพื่อนกับ user_id ที่ 0 เช่นกัน

 

จาก code ด้านบนเป็นเพียงทดสอบ การเพิ่มข้อมูลเบื้องต้น คราวนี้จะเพิ่มทั้งหมด โดยใช้ code ตามด้านล่างนี้

 

# add relations to users array


for i, j in friendships: # this works because users[i] is the user whose id is i
    users[i]["friends"].append(users[j]) # add i as a friend of j
    users[j]["friends"].append(users[i]) # add j as a friend of i

 

 

คราวนี้ในระบบจำลองนี้ ก็มีความสัมพันธ์ กันเสร็จสมบูรณ์เรียบร้อย

จากที่หัวหน้าคุณถามค้างเอาไว้ว่า user ที่ชื่อ hero มีใครเป็นเพื่อนบ้าง DS อย่างคุณก็ปิ้งไอเดียขึ้นมาทันที โดยเขียน function ขึ้นมาตัวหนึ่ง (สมมติว่าเราไม่รู้ข้อมูลตั้งต้น)

 

# แสดงข้อมูล เพื่อนของ user_id ที่เราสนใจ


print([friend["id"] for friend in users[0]["friends"]]).  # [1, 2]
print([friend["id"] for friend in users[1]["friends"]]).  ผลลัพธ์  [0, 2, 3]


เมื่อ print ออกมาก็จะเห็นว่า user_id ที่ 0 มีเพื่อน คือ user_id ที่ 1 และ user_id ที่ 2 เป็นเพื่อนอยู่ สามารถเช็คเปรียบเทียบกับ รูปภาพกราฟในรูปภาพปกได้

 

เมื่อหัวหน้าคุณ ได้ทราบข้อมูลตามที่ขอก็พอใจเป็นอย่างมาก จึงถาม DS ที่เก่งกาจเช่นคุณ ต่อรัวๆ ว่า และเพื่อนที่มีร่วมกันของแต่ละ user ละมีจำนวนเท่าไร DS ผู้ชำนาญ ก็ไม่รอช้า เขียน function ตามที่หัวหน้าของคุณขออย่างไว

 

# count mutual friend เพื่อนที่มีร่วมกัน มีจำนวนเท่าไร
from collections import Counter
 
def not_the_same(user, other_user):
    return user["id"] != other_user["id"]
 
def not_friends(user, other_user):
    return all(not_the_same(friend, other_user) for friend in user["friends"])
 
def friends_of_friend_ids(user):
    return Counter(foaf["id"]
                   for friend in user["friends"]
                   for foaf in friend["friends"]
                  if not_the_same(user, foaf)
                  and not_friends(user, foaf))

 

สมมติว่าเราอยากรู้ว่า user ที่ชื่อ Chi ก็ใช้คำสั่งที่เขียนเอาไว้ด้านบน ด้วย user_id ที่ 3


print(friends_of_friend_ids(users[3])) ผลลัพธ์  Counter({0: 2, 5: 1})

  

จะเห็นว่า user_id ที่ 3 นั้นจะมีเพื่อนร่วมกัน ที่เหมือนกันของ user_id ที่ 0  จำนวน 2 คน คือ 1 และ 2

ส่วน user_id ที่ 5 มีเพื่อนร่วมกันจำนวน 1 คน คือ 4

 

*User_id เป็นใครให้เทียบในรูปภาพปก

 

เมื่อหัวหน้าคุณได้ทราบ ข้อมูลตามที่ขอ โดยไม่รู้ว่า DS อย่างคุณจะผ่านร้อนผ่านหนาวมาเท่าไร จะเขียน code ยาวแค่ไหน ก็ได้ขอข้อมูลคุณเป็นครั้งสุดท้าย โดยขอว่า DS ได้ฟังอย่างตั้งใจ แล้วคิดใจว่า... ครั้งสุดท้ายแน่นะ

 

เราจะรู้ได้อย่างไรว่า มีเพื่อนคนไหนที่มีความสนใจ เหมือนกัน

 

เมื่อได้รู้คำถาม DS อย่างคุณก็ไม่รอช้า ด้วยความตื่นเต้น อยากแก้ปัญหานี้ ก็ดึงข้อมูลออกมาดูว่า ใครสนใจในเรื่องอะไรบ้าง

 

interests = [
       (0, "Hadoop"), (0, "Big Data"), (0, "HBase"), (0, "Java"),
       (0, "Spark"), (0, "Storm"), (0, "Cassandra"),
       (1, "NoSQL"), (1, "MongoDB"), (1, "Cassandra"), (1, "HBase"),
       (1, "Postgres"), (2, "Python"), (2, "scikit-learn"), (2, "scipy"),
       (2, "numpy"), (2, "statsmodels"), (2, "pandas"), (3, "R"), (3, "Python"),
       (3, "statistics"), (3, "regression"), (3, "probability"),
       (4, "machine learning"), (4, "regression"), (4, "decision trees"),
       (4, "libsvm"), (5, "Python"), (5, "R"), (5, "Java"), (5, "C++"),
       (5, "Haskell"), (5, "programming languages"), (6, "statistics"),
       (6, "probability"), (6, "mathematics"), (6, "theory"),
       (7, "machine learning"), (7, "scikit-learn"), (7, "Mahout"),
       (7, "neural networks"), (8, "neural networks"), (8, "deep learning"),
       (8, "Big Data"), (8, "artificial intelligence"), (9, "Hadoop"),
       (9, "Java"), (9, "MapReduce"), (9, "Big Data")
]

 

สมมติว่า Thor user id 4 ไม่ได้เป็นเพื่อนกับ user id 7 หรือ Devin แต่ว่าพวกเขาได้ share ความสนใจเอาไว้ คือ machine learning

 

def data_scientists_who_like(target_interest):
    return [user_id
           for user_id, user_interest in interests
           if user_interest == target_interest]
data_scientists_who_like("machine learning") ผลลัพธ์ [4, 7]

 

สิ่งที่ได้จากฟังก์ชันนี้ ก็คือ user_id ที่ 4 และ user_id ที่ 7 มีความสนใจชื่นชอบ Machine Learning เหมือนกัน

 

ด้วยความชำนาญ DS อย่างคุณก็แถม ให้อีก 1 function สำหรับ ดูว่าใครสนใจในเรื่องอะไร

 

from collections import defaultdict
 
user_ids_by_interest = defaultdict(list)
 
for user_id, interest in interests:
    user_ids_by_interest[interest].append(user_id)

ผลลัพธ์ defaultdict(list,
            {'Hadoop': [0, 9],
             'Big Data': [0, 8, 9],
             'HBase': [0, 1],
             'Java': [0, 5, 9],
             'Spark': [0],
             'Storm': [0],
             'Cassandra': [0, 1],
             'NoSQL': [1],
             'MongoDB': [1],
             'Postgres': [1],
             'Python': [2, 3, 5],
             'scikit-learn': [2, 7],
             'scipy': [2],
             'numpy': [2],
             'statsmodels': [2],
             'pandas': [2],
             'R': [3, 5],
             'statistics': [3, 6],
             'regression': [3, 4],
             'probability': [3, 6],
             'machine learning': [4, 7],
             'decision trees': [4],
             'libsvm': [4],
             'C++': [5],
             'Haskell': [5],
             'programming languages': [5],
             'mathematics': [6],
             'theory': [6],
             'Mahout': [7],
             'neural networks': [7, 8],
             'deep learning': [8],
             'artificial intelligence': [8],
             'MapReduce': [9]})

 

จากที่หัวหน้าของคุณ ถามมาทั้งหมด ได้คำตอบไปอย่างพอใจมาก จึงได้ตบรางวัลมาให้คุณอย่างงาม

 

คุณก็ตอบกลับไปอย่างเท่ๆว่า

ผมสร้างอิฐไม่ได้ โดยไม่มีดินเหนียว – Arthur Conan Doyle

 

 

ผู้เขียนได้นำส่วนหนึ่งของหนังสือ Data Science from Scratch เพื่อศึกษาแนวทางกระบวนการทางวิทยาศาสตร์ข้อมูล ถ้าเพื่อนๆที่ชอบบทความนี้ อยากให้ กด Ads มากกว่า 1 ครั้งเพื่อเป็นกำลังใจในการทำบทความต่อๆไปครับ

 

 

Background vector created by GarryKillian - www.freepik.com

แวะมาทักทายกันได้
donate