先日、大きな選挙が有りましたね。
何故にすぐ当確が出るのでしょう?

その仕組みを解説してみました。
解説動画はこちら




なぜ開票率1%で当確が出るのか?
今回は選挙のお話です。

各局がどのような仕組みで
当確を出しているかは不明ですが

少なくとも投票所の出口調査や
事前アンケートなどの結果などを用いて
統計的なサンプリング調査を元に
最終的な判断をしていると思います。


当確が分かる仕組み
無作為な1%分の投票結果が分かれば
票全体の動向が推計できます。

これはお味噌汁の味見に似ていますね。

ちゃんと掻き回したものを
お玉に一掬い程度味見すれば
味噌汁全体の味はおおよその検討はつくでしょう。

ここで用いられるのが
母比率の信頼区間です。


区間推定「母比率」の信頼区間の求め方

母比率の信頼区間を求める式
スクリーンショット 2021-11-06 16.55.09

なんだかややこしいと思いますが
R:標本比率(得票率)
z:標準化変数(Z-score)
n:標本数(サンプル)
となっています。

また信頼係数というモノがあります。

これは母集団から標本を取って
その平均からXX%信頼区間を
求めるという作業を100回やったとき
XX回はその区間の中に母平均が含まれる
というものです。

通常は95%を用いることが多いですが

信頼係数におけるzの値は
90%で1.64
95%で1.96
99%で2.58
という値になります。


さて、ここで問題を考えてみましょう。

有効投票数10万票の選挙で開票率1%(1000票)時点の
A候補者の得票率は60%でした。

このとき信頼係数95%で
母比率の信頼区間を計算してみよう。

Pythonを使って計算してみました。
#標本比率:
R=0.6
# 標準化変数
z=1.96
# 標本数
n=1000

lower = (R - z*((R*(1-R))/n)**0.5)*100
upper = (R + z*((R*(1-R))/n)**0.5)*100
print('{0:.3f} - {1:.3f}'.format(lower,upper))
56.964 - 63.036

これによると母比率の信頼区間は
最低でも56.9%、最高で63%


他に候補者がどれだけいても
過半数以上を獲得できる見込みになります。

計算式上ではサンプリングした標本数の数で
信頼区間の幅は大きく変わります。

10万票ほどの選挙区ではおよそ1%
1000票もあれば誤差は3%程度で
最終結果を導くことができます。

標本数を増やせば、区間はグッと縮まります。
開票率が上がっていけば
どんどん精度は上がりますね。

候補者同士の結果に差のない場合は
開票率100%に近付かないと
結果が出ないこともありますが

元々大差がついている選挙区では
開票率が低くても当確が出るようですね。

さてここからは
選挙区のシミュレーションをしてみましょう。

神奈川11区でシミュレーション

元セクシー担当大臣のいる選挙区の結果を用いて
シミュレーションしてみましょう。

結果は
小泉 進次郎氏 14万7634票
林 伸明氏 3万8843票
となっていました。

データ化してみます。
# 小泉票
k = ['K']*147634
# 林票
h = ['H']*38843
# 全体の票
v = k+h

print(len(v))
print(v.count('K'))
print(v.count('H'))
186477
147634
38843

これで票のデータを用意できました。
ランダムサンプリングして結果を見てみましょう。
1%でランダムサンプリング
import random

n = len(v)//100
d = random.sample(v , n)

print(len(d))
print(d.count('K'))
print(d.count('H'))
1864
1469
395

1%時の票数は1864
小泉氏は1469票獲得
林氏は395票獲得で
小泉氏の圧勝・・・・・・

一回やっただけでは分からないですよね・・・

頑張って100回対決してみましょう。
import random
import pandas as pd

n = len(v)//100
df = pd.DataFrame(columns=['小泉票','林票'])
for i in range(100):
    d = random.sample(v , n)
    k_count = d.count('K')
    h_count = d.count('H')
    tmp = pd.DataFrame([[k_count,h_count]],columns=['小泉票','林票'])
    df = df.append(tmp)

df = df.astype('int')
df.describe()
小泉票林票
count100.000000100.000000
mean1473.930000390.070000
std18.06176618.061766
min1427.000000351.000000
25%1462.000000376.000000
50%1475.000000389.000000
75%1488.000000402.000000
max1513.000000437.000000

結果から言えば
林氏はどんなに頑張っても
437票しかとれず小泉氏が圧勝です。

箱髭図にして差し上げました。
スクリーンショット 2021-11-06 17.26.44

1%の時点でこれなんで
まあ、諦めろって事ですwwwwwww

政策や人柄、人気などで
相手を上回るしかないでしょうね
まあほぼ無理ゲーでしょうけど。


まとめ
1000票ほどを集めれば
おおよその結果が予想できてしまう

得票率1%の時点で
大きく差がついていたら諦めろ

ただしデータに偏りが無いことが大前提!

あくまでもこの推定はデータに偏りがない所で
サンプリングされたデータを用いての推定です。

恣意的に歪められた結果を用いれば
作為的に誘導することも出来てしまいます。

使う側も見る側も
注意が必要なポイントです。


今回は選挙にまつわる
統計のお話でした。

それでは。