テレビの選挙特番などで
「当確」って出てきますよね。
あれの推定方法などについてです。

解説動画はこちら



テレビ番組によっては開票が行われてすぐに
当確が出てしまったりするケースがあります。

なぜこんなにも早く当確が出るのか
選挙の出口予想の仕組みについて解説します。




出口調査と区間推定の仕組み

選挙の当確を出すためには、それぞれの候補者の得票率を
「だいたい、ここからこの位までの区間に入ってるんじゃないか?」
という区間推定を行なっています。

出口調査で得られた、ある候補者の得票率を p とすると

その区間は次のような計算式で求められます。
スクリーンショット 2025-07-19 15.20.10
ここで必要になってくるのは
出口調査に必要な人数( n ) です。

この区間の誤差を少なくするためには
ある程度の人数が必要で、一般的には無作為に選ばれた
400人ほどが必要になってきます。




区間推定の計算

たとえばある選挙において
候補者 A , B の二人がいるとして
出口調査400人の結果が 
A : 220人
B : 180人
だったとします。

この際のA候補の得票率は

p = 220/400 = 0.55 

全体での得票率の区間の推定は
スクリーンショット 2025-07-19 17.52.43

50.12% ~ 59.88%
となります。

得票率の下限が50%を上回っているため
このまま行けば勝ちが見えてきます。



これが400人中210人だった場合はどうでしょうか

推定得票率: 52.50%
95% 信頼区間: 47.61% ~ 57.39%

これだと得票率の下限が50%を下回っているので
まだ決着がつけられません

もう少しサンプル数が増えた場合はどうなるでしょうか

今度は出口調査で4000人中2100人としてみます。
推定得票率: 52.50%
95% 信頼区間: 50.95% ~ 54.05%

n 調査人数が増えるほど誤差が少なくなり
推定された区間は短くなります。




実際には当確を決めるには

実際には候補者も多く、出口調査のみでは
正確には決まらないことが多いです。


スクリーンショット 2025-07-19 15.52.41

という計算式で当確ラインがもとまります。

これを用いて開票率が進むにつれ
区間推定の下限が当確ラインを超える得票率が獲得できている場合
当確が出せるということになります。






区間推定で当確を計算するコード

候補者が2人
開票が進んで、得票数と全体の数が分かったとします。
関数の引数に入力すると、当確結果がわかります。

最初は全体400 , 獲得210票とします。
import math

def check_win(candidate_votes, total_samples, confidence=0.99):
    if total_samples == 0:
        print("❌ 標本数が0のため、判定できません。")
        return

    # 推定得票率
    phat = candidate_votes / total_samples
    
    # z値の選択
    z = 1.96 if confidence == 0.95 else 2.58 if confidence == 0.99 else 1.64
    
    # 標準誤差と信頼区間
    se = math.sqrt(phat * (1 - phat) / total_samples)
    lower = phat - z * se
    upper = phat + z * se
    
    # 当確ラインの計算
    win_threshold = (1 + math.sqrt(z**2 / (z**2 + total_samples))) / 2

    # 表示
    print(f"推定得票率 : {phat:.2%}")
    print(f"{int(confidence * 100)}% 信頼区間 : {lower:.2%} ~ {upper:.2%}")
    print(f"当確ライン(開票数={total_samples}) : {win_threshold:.2%}")
    
    # 当確判定
    if lower >= win_threshold:
        print("OK : 候補者は『当確』と判断できます。")
    else:
        print("X :  まだ『当確』とは言えません。")

# 使用例
check_win(candidate_votes=210, total_samples=400, confidence=0.95)
推定得票率 : 52.50%
95% 信頼区間 : 47.61% ~ 57.39%
当確ライン(開票数=400) : 54.88%
X :  まだ『当確』とは言えません。

信頼区間の下限は
当確ラインを上回らないので、まだ当確出ません。


2100 , 4000 でやってみると

推定得票率 : 52.50%
95% 信頼区間 : 50.95% ~ 54.05%
当確ライン(開票数=4000) : 51.55%
X :  まだ『当確』とは言えません。

少し、区間が狭まりましたが
信頼区間の下限は
当確ラインを上回らないので、まだ当確出ません。


21000 , 40000 でやってみると

推定得票率 : 52.50%
95% 信頼区間 : 52.01% ~ 52.99%
当確ライン(開票数=40000) : 50.49%
OK : 候補者は『当確』と判断できます。


ようやく上回りました
これでようやく当確が出せるようになります。


出口調査で最初から大差がついている場合は
開票前にすでに決着がついている場合もあるようです。


今回は選挙の当確や
出口調査の仕組みについてでした。

こういった統計を用いた計算なんかも
Pythonを用いると簡単に計算できますね

選挙以外にも使えるので
覚えておくと仕事の幅が広がって便利です。

それでは。