エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

友達の友達が多い!友達パラドックスについて

エンジニアチームのUK. ( @ukohank517 )です。このブログはエムスリーアドベントカレンダー15日目の記事です。 今日は友達に関すパラドックス(Friendship Paradox)について紹介したいと思います!

はじめに

実は10年も前の論文で発表された内容なんですが、最近見かけて読んだら思わず「えっ、こんなことあるんだ!」と驚いてしまったんです。

気になる方はこちらのリンクから論文をチェックしてみてくださいね:

www.nature.com

友達パラドックスとは?

友達パラドックス(Friendship Paradox)とは、シンプルに言うと、「あなたの友達はあなたよりも友達が多い傾向にある」という現象です。

でも、みなさんもこんな風に感じたことってありませんか?

「あの人、なんでこんなに友達が多いんだろう?」 SNSでフォロワー数が多いと、「ああ、私は友達少ないなぁ…」ってちょっと落ち込んじゃうこと。 私の実体験だと、大学の昼休みに友達と食堂に行って、列に並んでたら、友達がすれ違った人のほとんどに挨拶していたんです。その光景を見て「こいつがコミュニケーションの怪物だ!」って感じたこと、ありますよね。

でも、これって実は気のせいではなく、統計的に証明された現象なんですよ! この現象があることを、私はある論文を読んで知りました。なお実際にシミュレーションしても同じ結果が得られます!

友達数のシミュレーションをしてみよう

実際に「本当に友達の方が友達が多いのか?」をシミュレーションしてみました。 次のコードを使って、簡単な統計シミュレーションを行いました。

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import random

# ランダムグラフを作成する関数(友人数の分布を制御)
def generate_biased_graph(num_nodes):
    graph = nx.Graph()
    graph.add_nodes_from(range(num_nodes))

    for node in graph.nodes():
        # 各ノードの友人数を確率的に決定
        if random.random() < 0.5:  # 50%の確率で少ない友人
            num_friends = random.randint(1, 3)
        else:  # 50%の確率で多い友人
            num_friends = random.randint(5, 10)

        # エッジをランダムに生成
        possible_friends = list(set(graph.nodes()) - {node} - set(graph.neighbors(node)))
        friends = random.sample(possible_friends, min(num_friends, len(possible_friends)))
        graph.add_edges_from((node, friend) for friend in friends)

    return graph

# ノード数
num_nodes = 30
graph = generate_biased_graph(num_nodes)

# 各ノードの友人の数と友人の友人の平均数を計算
friend_counts = []
friends_of_friends_avg_counts = []

for node in graph.nodes():
    friends = list(graph.neighbors(node))
    friend_counts.append(len(friends))
    if len(friends) > 0:
        friends_of_friends = [len(list(graph.neighbors(friend))) for friend in friends]
        friends_of_friends_avg_counts.append(np.mean(friends_of_friends))
    else:
        friends_of_friends_avg_counts.append(0)

# グラフ形式でノードと関係性を可視化
plt.figure(figsize=(12, 8))
pos = nx.spring_layout(graph, seed=42)  # ノードの配置を決定
nx.draw(graph, pos, with_labels=True, node_size=500, node_color="skyblue", font_size=10, font_color="black", edge_color="gray")
plt.title("Visualization of the Biased Random Graph")
plt.show()

# 友人の数と友人の友人の平均数のヒストグラムを表示
plt.figure(figsize=(12, 8))
plt.hist(friend_counts, bins=20, color="skyblue", alpha=0.7, label="Friend Counts")
plt.hist(friends_of_friends_avg_counts, bins=10, color="gray", alpha=0.7, label="Friends of Friends Avg Counts")
plt.xlabel("Number of Friends")
plt.ylabel("Number of Nodes")
plt.title("Histogram of the Number of Friends and the Average Number of Friends of Friends")
plt.legend()
plt.show()

# 全体の友人の平均数と友人の友人の平均数を計算
avg_friend_counts = np.mean(friend_counts)
avg_friends_of_friends_avg_counts = np.mean(friends_of_friends_avg_counts)
print(f"Average number of friends: {avg_friend_counts}")
print(f"Average number of friends of friends: {avg_friends_of_friends_avg_counts}")

このシミュレーションでは、30人のグループにおいて、半分の人々は少ない友達(1~3人)、半分の人々は多い友達(10人以上)を持つように分けています。そして、全体の友達関係は下記のようなネットワーク図で可視化されます。

友達ネットワーク図

その後、友達の数と、友達の友達の数をそれぞれヒストグラム上で表現すると:

友達の数、友達の友達の数のヒストグラム

ヒストグラムから、友達の数を統計すると友達が少ない人もいれば多い人もいます。しかし友達の友達の統計は、全体の右寄りになっており、結果として、過半数の人は、友達の数よりも友達の友達が多くなる傾向が見られました。なお、全員に対して友人の平均数が9.7人前後でですが、友人の友人の平均数は11.3人前後とちょっと多めになります。

さて、なぜ友達の友達の方が多くなるのでしょうか? その理由は簡単です。友達が多い人は、あなたと友達になる確率が高いからです。

ちなみに、友達の友達の数の期待値は次の式で表されます:

 \displaystyle
E = \mu + \frac{\sigma^2}{\mu} \\
\mu = 全ての人の平均友人数、 \sigma = 友人数の標準偏差

繰り返しになりますが、論文の本文をぜひ一度読んでみましょう:

www.nature.com

まとめ

友情のパラドックスと同じような事象は、実は社会の至るところで見られます。たとえば、航空会社が「平均の満席率は高くない」と統計で言っても、実際に乗っているお客さんにアンケートを取ると、「混んでる!」と感じる人が多く集まるのが常ですよね。これは、混んでいる便に乗っている人が多いからです。

また、社会全体で見れば、技術好きな人は少数派かもしれませんが、この記事を読んでいるあなたは、ほぼ間違いなく技術が好きだと思います。だって、アドベントカレンダーを読むってことは、少なくともある程度の技術に興味がある証拠ですから。

友情のパラドックスをさらに広げると、友達の数だけじゃなくて、友達が自分より優れていると感じることも説明できちゃうんです。

でも、ここでネガティブに捉える必要はまったくありません! この現象は、基本的にネットワークの構造が生み出すものですし、それがあなたの価値に影響を与えるわけではないからです。

SNSが普及した今の時代では、こうしたパラドックスをより感じやすい環境が整っています。ただし、こういった現象があることを知っていれば、他の人との比較に対して、少し肩の力を抜いて前向きに受け止められるかもしれません。

最後に、「隣の芝生は青い」というのは、実は普通のことだということを理解してもらえれば嬉しいです。

追記

advent of codeもやっております! ちょっと先週今週寝る時間も削って色々やって遅れ気味ですが、頑張って追い上げますので、興味ある方は下記リードボードに参加して一緒に今月解きましょう

3533898-f84e2f85

We are hiring !!

エムスリーでは技術大好きなギークエンジニアを募集しています! 少しでも興味がある方は、下記URLからカジュアル面談をご応募ください!

エンジニアの採用ページはこちら

jobs.m3.com

カジュアル面談もお気軽にどうぞ

(ばんくしさんと話せるチャンス! @vaaaaanquish )

jobs.m3.com

インターンも常時募集しています

open.talentio.com