多数決は実力差を消さずに増幅する。Condorcetの陪審定理を101人分シミュレーションしたら、p=0.55の集団は正解率0.84、p=0.45は0.16まで転落した
約12分で読めます

多数決は実力差を消さずに増幅する。Condorcetの陪審定理を101人分シミュレーションしたら、p=0.55の集団は正解率0.84、p=0.45は0.16まで転落した


「みんなで話し合って多数決を取れば、個人の判断よりマシになる」——直感的にはそう思う。集合知、群衆の英知、そういう言葉もよく聞く。

でもこれ、いつでも成り立つ話なのだろうか。18世紀の数学者コンドルセが考えたのはまさにこの問いで、Condorcetの陪審定理として知られている。設定は驚くほど単純だ。

  • N人の投票者がいて、それぞれ独立に、確率pで「正しい」判断をする
  • 全員の判断を多数決にかける

このとき、pが0.5より大きければ、Nを増やすほど集団の正解率は1に近づく。逆にpが0.5未満なら、Nを増やすほど集団の正解率は0に近づく。ちょうどp=0.5なら、何人集めても0.5のままだ。

教科書ではよく「大数の法則で個人のブレが打ち消し合うから」という説明で終わるのだが、p<0.5のときに何が起きるかまで含めて自分の手で確かめた記事はあまり見ない。多数決は個人の実力差を「打ち消す」のではなく「増幅する」装置だという、教科書の一文からは実感しにくい部分を、実際にPythonで動かして見てみることにした。

シミュレーションの中身

投票者1人1人を、確率pで1(正しい)・確率1-pで0(間違い)を返すBernoulli試行として表す。それをN人分並べて多数決を取り、正解だったかどうかを記録する——これをtrials回繰り返して、正解した割合を実測する。

def explicit_vote_simulation(N, p, trials, seed):
    r = np.random.default_rng(seed)
    votes = r.random((trials, N)) < p   # 各投票者が正しいか(独立Bernoulli(p))
    n_correct = votes.sum(axis=1)        # 正しい投票者の人数
    majority_correct = n_correct > N / 2
    return majority_correct.mean()

Nは奇数だけを使う(同数決になる状況を避けるため)。この明示的な配列でいくつかの代表点をシミュレーションし(1点あたり2万試行)、解析解——二項分布を使った P(正しい人数>N/2)P(\text{正しい人数} > N/2)——と比べてみた。

N=   1  p=0.30   simulated=0.2958   analytic=0.3000   diff=0.0042
N=   1  p=0.70   simulated=0.7024   analytic=0.7000   diff=0.0024
N=  11  p=0.30   simulated=0.0807   analytic=0.0782   diff=0.0025
N=  11  p=0.70   simulated=0.9219   analytic=0.9218   diff=0.0001
N=  51  p=0.30   simulated=0.0016   analytic=0.0014   diff=0.0002
N=  51  p=0.70   simulated=0.9986   analytic=0.9986   diff=0.0001
N= 101  p=0.30   simulated=0.0000   analytic=0.0000   diff=0.0000
N= 101  p=0.55   simulated=0.8429   analytic=0.8438   diff=0.0008
N= 101  p=0.70   simulated=1.0000   analytic=1.0000   diff=0.0000
N= 101  p=0.50   simulated=0.4984   analytic=0.5000   diff=0.0016
N=   1  p=0.50   simulated=0.4980   analytic=0.5000   diff=0.0020
N= 101  p=0.45   simulated=0.1567   analytic=0.1562   diff=0.0004

どの組み合わせも誤差は0.005以下に収まっていて、シミュレーションは理論通りに動いている。特に印象的だったのはN=101・p=0.30の行で、個人としてはまだ30%の確率で正解する人たちを101人集めているのに、多数決の正解率は2万試行して1回も正解しなかった(0.0000)。個人の実力はそこそこあるのに、集団になった瞬間ほぼ確実に間違えるようになる——これが「増幅」の意味だ。

(Nとpの全格子を敷き詰めた本実験では、N人分の配列を毎回作る代わりに、二項分布からの直接サンプリングrng.binomial(N, p, size=trials)を使っている。「N個の独立なBernoulli(p)の和」を直接乱数生成しているだけなので数学的には同じシミュレーションだが、N×pの格子(51点×61点=3,111通り)を現実的な時間で回すための実装上の工夫だ。)

(N, p) → 正解率の全体像

N(1〜101の奇数、51点)とp(0.30〜0.90、61点)の全格子で同じシミュレーションを回し、3D曲面にした。ドラッグで回転できる。

黒い線がp=0.5の等高線だ。曲面はこの線を境に、Nが増えるほど1(賢くなる)に張り付く側と、0(悪くなる)に張り付く側にはっきり分かれている。p軸方向にほんの少し動くだけで、N軸方向の挙動が丸ごとひっくり返る——この曲面が、陪審定理の主張をそのまま絵にしたものだ。

2Dで見ると、運命の分かれ方がもっと分かりやすい

3D曲面は全体像をつかむのにはいいが、「N人集めたときに実際どうなるか」を読み取るには、pを固定した断面のほうが分かりやすい。p=0.70・0.55・0.50・0.45・0.30の5本を1枚に重ねた。

p=0.70・0.55・0.50・0.45・0.30それぞれについて、投票者数Nを1から101まで増やしたときの多数決正解率を示す折れ線グラフ。p=0.70とp=0.55はNが増えるほど1に向かって上昇し(N=101でそれぞれ1.0000と0.84)、p=0.30とp=0.45はNが増えるほど0に向かって下降し(N=101でそれぞれ0.0000と0.16)、p=0.50はNによらずずっと0.5付近に留まる

N=101での正解率を数字で並べるとこうなる。

p=0.70: 1.0000
p=0.55: 0.8413
p=0.50: 0.4991
p=0.45: 0.1614
p=0.30: 0.0000

(細かい話だが、p=0.55がさっきの検証表では0.8429、ここでは0.8413と微妙に違うことに気づいた人がいるかもしれない。この一覧は全格子シミュレーション——1点あたり8,000試行——側の実測値で、検証表の2万試行とは乱数も試行回数も別の独立な実行だからだ。どちらも解析解0.8438のまわりの正常なばらつきに収まっている。p=0.45の0.1567と0.1614、p=0.50の0.4984と0.4991も同じ事情だ。)

p=0.70とp=0.30は、個人の実力がそれぞれ「7割当たる」「3割当たる」という、直感的にもそこそこ差がある設定だ。101人集めた結果が1.0000と0.0000まで開くのは、まあ予想通りではある。

驚いたのはp=0.55とp=0.45の組だ。個人の実力差はわずか10ポイント(55% vs 45%)しかないのに、101人集めた結果は0.84 vs 0.16——実に68ポイントもの差に広がっている。 個人のレベルではほとんど誤差の範囲に見える差が、集団になった瞬間に「賢い集団」と「愚かな集団」という質的に違うものになる。人数を増やすというのは、この意味で諸刃の剣だ。正しい方向に少しでも傾いていれば強力な補正力になるが、間違った方向にわずかでも傾いていれば、その間違いを容赦なく拡大する。

pを0.30から0.90へ動かしてみる

同じデータを、pを掃引しながらアニメーションにしてみた。曲線がp=0.5を境にひっくり返る瞬間が見える。

pを0.30から0.90へ動かしながら、投票者数Nに対する正解率の折れ線グラフが変化するアニメーション。p<0.5では曲線が赤色でNが増えるほど0へ向けて下降し、p=0.5では灰色でほぼ水平、p>0.5では青色でNが増えるほど1へ向けて上昇する。0.5をまたぐ瞬間に曲線の傾きが完全に反転する

赤(p<0.5)の間はNを増やすほど下に沈んでいき、p=0.5でほぼ水平になり、青(p>0.5)に切り替わった瞬間からNを増やすほど上に伸びていく。「人数を増やす」という同じ操作が、pのどちら側にいるかだけで正反対の効果になる。

定理の”注意書き”を掘り下げる

ここまでは陪審定理の主張通りの挙動を確認しただけだが、実はこの定理、成り立つための前提条件が2つある。今回のシミュレーションはこの2つを最初から満たすように作ってあるので、逆に「満たさなかったらどうなるか」を考えると定理の意味がよく分かる。

  1. 各投票者が、個別に見てコイントス(p=0.5)より少しでも良い(p>0.5)必要がある。 これは今回はっきり見た通りで、p<0.5側では人数を増やすことがそのまま「愚かさの増幅」になる。「みんなで考えれば何とかなる」は、個々人がまず多少なりとも正しい方向を向いていることが前提になっている。
  2. 投票者同士が独立でなければならない。 これは今回のシミュレーションのコードにr.random((trials, N)) < pという形でそのまま埋め込んである仮定だ——N人分の乱数はお互いに完全に無関係に引かれている。

2番目の独立性の仮定は、シミュレーションのコード上では1行で済むが、現実で満たすのはかなり難しい。もし投票者同士の意見が相関していたら(全員が同じニュースを見て同じ結論に達している、最初に発言した人の意見に他の人が引きずられている、など)、それは実質的に「N人の独立な意見」ではなく「もっと少ない実質的な意見の数」に縮退する。極端な話、全員が同じ1人の意見をコピーしているなら、Nをいくら増やしても実質的にN=1のままで、正解率はpそのものから一切動かない。独立性が崩れるということは、曲面や折れ線グラフのNを、額面通りの人数より小さい「実効的な人数」に読み替えなければいけなくなる、ということだ。

会議の多数決が理論通りに機能しない理由

この独立性の話は、実際の会議や打ち合わせの光景とかなり重なる。

会議で誰かが最初に強い意見を言うと、その後に発言する人はどうしてもその意見の影響を受ける。表立って反対しづらい空気もあれば、単に「最初に聞いた説明が思考の土台になってしまう」というアンカリングの効果もある。全員が同じ資料、同じニュース記事、同じ社内の「空気」を情報源にしていれば、それぞれが自分の頭で考えたつもりでも、実質的には同じ1つの情報源に対する反応を、人数分だけ複製しているに過ぎない。

こうなると、会議の参加者は名目上10人いても、独立な判断の実効的な数はもっと少ない。陪審定理の恩恵——「人数を増やせば増やすほど、集団は個人より賢くなる」——は、この独立性が保たれている前提のもとでしか働かない。人数だけ揃えて「みんなで決めたから正しいはずだ」と考えるのは、今回のシミュレーションで言えば、N=101で回しているつもりが実際にはN=3くらいの精度しか出ていない、ということが十分に起こり得る。

かといって、これは「多数決に意味がない」という話ではない。むしろ逆で、本当に独立な視点をどれだけ集められるかが、多数決の効き目をほぼ決めてしまう、というのが実験を通した実感だ。異なる情報源に当たっている人、あえて違う立場から検討する人、発言順を工夫して最初の強い意見に引きずられないようにする——そういう地味な設計が、名目上の人数を実質的な独立票にどれだけ近づけられるかを左右する。人数を集めることそのものよりも、集めた人数がちゃんと独立に効いているかのほうが、実は重要なのだと思う。

まとめ

  • Condorcetの陪審定理(N人の独立な投票者がそれぞれ確率pで正しい判断をし、多数決を取る)を、明示的なBernoulli試行の配列シミュレーションで実測した
  • N=101・p=0.30では、2万試行して多数決が正解した回数は0回(0.0000)。個人はまだ30%当たるのに、集団はほぼ確実に間違える
  • N=101・p=0.70では逆に正解率1.0000。同じ「101人集める」という操作が、pのどちら側にいるかで正反対の結果になる
  • 個人の実力差がわずか10ポイント(p=0.55 vs 0.45)でも、101人集めた結果は0.84 vs 0.16と68ポイントの差に拡大した——多数決は実力差を消すのではなく増幅する
  • 定理が効くには「個々人がp>0.5であること」に加えて「投票者同士が独立であること」が必要。この独立性は現実の会議では簡単に崩れ、名目上の人数より実効的な独立票の数のほうが結果を左右する