SNS分析(NetworkX)

SNS分析

SNS上で、あるユーザーが自分の友達の友達の中で最も人気がある人を見つけるために、ネットワーク分析を行いたいと考えています。

この問題を解決するために、与えられたSNSグラフ内で、指定されたユーザーの友達の友達の中で最も人気がある人を見つける関数を実装してください。

解法

以下は、この問題に対するNetworkXによる実装例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import networkx as nx

def find_most_popular_friend_of_friends(G, user):
"""
指定されたユーザーの友達の友達の中で最も人気がある人を見つける関数

Parameters
----------
G : NetworkXのグラフオブジェクト
SNSグラフ
user : ノード
検索対象のユーザー

Returns
-------
ノード
最も人気があるユーザー
"""
# userの友達を取得
friends = set(nx.neighbors(G, user))

# userの友達の友達を取得
friends_of_friends = set()
for friend in friends:
friends_of_friends.update(nx.neighbors(G, friend))

# userとその友達の友達を除く
friends_of_friends.discard(user)
friends_of_friends.difference_update(friends)

# 各ノードの次数を計算
degrees = G.degree(friends_of_friends)

# 次数の降順にソート
sorted_degrees = sorted(degrees, key=lambda x: x[1], reverse=True)

# 最も人気のあるユーザーを返す
return sorted_degrees[0][0]

この関数は、与えられたSNSグラフ内で指定されたユーザーの友達の友達の中で最も人気がある人を見つけるために使用できます。

与えられたユーザーの友達の友達を取得し、各ノードの次数を計算して、次数が最大のノードを返します。

動作確認

テスト用のデータを作成して、上記の関数を使用して解決してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import networkx as nx

# SNSグラフを作成
G = nx.Graph()
G.add_edges_from([
('Alice', 'Bob'),
('Alice', 'Charlie'),
('Bob', 'David'),
('Bob', 'Eve'),
('Charlie', 'David'),
('Charlie', 'Frank'),
('David', 'Eve'),
('Eve', 'Frank'),
('Eve', 'Grace'),
('Frank', 'Grace')
])

# 'Alice'の友達の友達で最も人気がある人を見つける
most_popular_friend_of_friends = find_most_popular_friend_of_friends(G, 'Alice')

print(f"Most popular friend of friends of Alice: {most_popular_friend_of_friends}")

このコードでは、GというSNSグラフを作成し、find_most_popular_friend_of_friends関数を使用して、’Alice’の友達の友達で最も人気がある人を見つけています。

出力結果は以下の通りになります。

[実行結果]
Most popular friend of friends of Alice: Grace

与えられたSNSグラフ内で指定されたユーザーの友達の友達の中で最も人気がある人を見つけることができました。