PTT推薦

Re: [新聞] 柯P遭疑民調加權才贏侯友宜 柯辦反擊了!

看板HatePolitics標題Re: [新聞] 柯P遭疑民調加權才贏侯友宜 柯辦反擊了!作者
ulycess
(ulycess)
時間推噓 1 推:1 噓:0 →:10

※ 引述《Homura (德意志國防貓)》之銘言:
: 我們以黃揚明提供的
: 求真民調的資料來舉例

我也對加權很奇妙,所以我直接拿程式模擬誤差範圍

首先我定義誤差範圍如下
假設20~25歲的人群百分比是20%
這次抽1000人,理論上應該要有200人
實際上這次民調在20~25%的人有210人
誤差則為 絕對值(210-200)/200 = 5%

最大誤差範圍則為該次民調中各分組誤差範圍最大組別


首先我用一次民調抽9000人,進行10000次民調,得到結論是
最大誤差範圍5%以內,共占有21.77%
最大誤差範圍5~10%以內,共占有74.46%
最大誤差範圍10~15%以內,共占有3.71%
最大誤差範圍15~20%以內,共占有0.05%
最大誤差範圍20~25%以內,共占有0.0%
最大誤差範圍超過25%,共占有0.0%


接下來我用一次民調抽3000人,進行10000次民調,得到結論是
最大誤差範圍5%以內,共占有0.62%
最大誤差範圍5~10%以內,共占有37.92%
最大誤差範圍10~15%以內,共占有49.78%
最大誤差範圍15~20%以內,共占有10.63%
最大誤差範圍20~25%以內,共占有1.01%
最大誤差範圍超過25%,共占有0.03%


最後我用一次民調抽1000人,進行10000次民調,得到結論是
最大誤差範圍5%以內,共占有0.01%
最大誤差範圍5~10%以內,共占有1.76%
最大誤差範圍10~15%以內,共占有20.04%
最大誤差範圍15~20%以內,共占有35.97%
最大誤差範圍20~25%以內,共占有26.3%
最大誤差範圍超過25%,共占有15.91%



所以我的結論如下
如果用9000人來比民調,96%的機率誤差範圍在10%以內
所以加權範圍不應該超過10%才對


如果用3000人比民調
最有可能的最大誤差範圍是10%~15%之間,所以加權範圍不應該超過15%


至於用1000人比民調
最有可能的誤差範圍是15~20%,而且標準差極大
這時候才有加權的必要



程式碼如下,請用python開啟

import random


抽多少人 = 1000 # 預設一次抽9000人來比民調
總共進行幾次民調 = 10000


台灣人口分布 = {
"20~24": 1345864,
"25~29": 1591927,
"30~34": 1589933,
"35~39": 1672483,
"40~44": 2009683,
"45~49": 1827312,
"50~54": 1770183,
"55~59": 1782312,
"60~64": 1715580,
"65~69": 1489738,
"70~74": 1115706,
# "75~79": 593730,
# "80~84": 468252,
# "85~89": 262833,
# "90~94": 119210,
# "95~99": 31423,
# "100+": 4901,
}


台灣總人口 = 0
for i in 台灣人口分布:
台灣總人口 = 台灣總人口 + 台灣人口分布[i]

誤差絕對值 = {"3%以內": 0, "3%~6%": 0, "6%~9%": 0, "9%~12%": 0, "超過12%": 0}

def 預期每個組別應該有多少人(抽多少人):
result = {}
for i in 台灣人口分布:
result[i] = 抽多少人 * (台灣人口分布[i] / 台灣總人口)
return result


def 抽人口確定是哪個組別():
分組在哪裡 = ""
random_number = random.randint(1, 台灣總人口)
for i in 台灣人口分布:
random_number = random_number - 台灣人口分布[i]
if random_number <= 0:
分組在哪裡 = i
break
return 分組在哪裡


def 開始抽人口(抽幾次):
抽完的人口組別 = {}
for i in range(1, 抽幾次):
開始抽籤 = 抽人口確定是哪個組別()
if 開始抽籤 not in 抽完的人口組別:
抽完的人口組別[開始抽籤] = 1
else:
抽完的人口組別[開始抽籤] = 抽完的人口組別[開始抽籤] + 1

最大誤差值 = 0
for i in 抽完的人口組別:
誤差百分比 = abs(100 * (預期每個組別應該有多少人(抽幾次)[i] - 抽完的人口組別[i]) / 預期每個組別應該有多少人(抽幾次)[i])
# print(誤差百分比)
if 誤差百分比 >= 最大誤差值:
最大誤差值 = 誤差百分比

return 最大誤差值


# print(開始抽人口(9000))
誤差值範圍 = {
"5%以內": 0,
"5~10%以內": 0,
"10~15%以內": 0,
"15~20%以內": 0,
"20~25%以內": 0,
"超過25%": 0,
}


for i in range(1, 總共進行幾次民調):
開始抽人 = 開始抽人口(抽多少人)
if 開始抽人 < 5:
誤差值範圍["5%以內"] = 誤差值範圍["5%以內"] + 1
elif 開始抽人 >= 5 and 開始抽人 < 10:
誤差值範圍["5~10%以內"] = 誤差值範圍["5~10%以內"] + 1
elif 開始抽人 >= 10 and 開始抽人 < 15:
誤差值範圍["10~15%以內"] = 誤差值範圍["10~15%以內"] + 1
elif 開始抽人 >= 15 and 開始抽人 < 20:
誤差值範圍["15~20%以內"] = 誤差值範圍["15~20%以內"] + 1
elif 開始抽人 >= 20 and 開始抽人 < 25:
誤差值範圍["20~25%以內"] = 誤差值範圍["20~25%以內"] + 1
else:
誤差值範圍["超過25%"] = 誤差值範圍["超過25%"] + 1

for i in 誤差值範圍:
print(f"最大誤差範圍{i},共占有{100*誤差值範圍[i]/總共進行幾次民調}%")


: 四腳督市話加權前
: 賴清德 748 35.47%
: 侯友宜 535 25.37%
: 柯文哲 230 10.91%
: 郭台銘 125 5.93%
: 市話單獨加權後
: 賴清德 685 32.49%
: 侯友宜 433 20.52%
: 柯文哲 382 18.12%
: 郭台銘 163 7.74%
: 四腳督手機加權前
: 賴清德 239 26.21%
: 侯友宜 143 15.68%
: 柯文哲 305 33.44%
: 郭台銘 87 9.54%
: 手機單獨加權後
: 賴清德 251 27.52%
: 侯友宜 150 16.46%
: 柯文哲 257 28.21%
: 郭台銘 85 9.27%
: 市話手機合併加權後
: 賴清德 887 29.35%
: 侯友宜 513 16.98%
: 柯文哲 758 25.09%
: 郭台銘 255 8.44%
: 原始資料侯的市話+手機是678、22.44%
: 柯文哲是535、17.71%
: 經過柯學加權後
: 侯友宜變成513、16.98%
: 柯文哲則是758、25.09%
: 有人可以解惑一下
: 為何柯文哲市話加權特別高?(230→382)
: 然後侯從原本的+143變成-245
: 一來一往落差將近400
: 加權的依據是?

--

※ PTT 留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.40.72.175 (臺灣)
PTT 網址

davidpanda 11/09 21:36問題就在市話/手機抽樣的母體和人口

davidpanda 11/09 21:36分布不同,所以才需要加權。前提錯了

davidpanda 11/09 21:36計算過程就沒有意義了。

tm731531 11/09 21:42你這個有點類似跑賭馬程式 算機率

tm731531 11/09 21:43民調有Paper根據母體跟抽樣子體做比例的

tm731531 11/09 21:43會根據你隨機的抽樣跑第一次民調

tm731531 11/09 21:43然後才根據母體跟子體的差異程度

tm731531 11/09 21:43再做調整

tm731531 11/09 21:44所以之前金小刀PO的那個PAPER

tm731531 11/09 21:44有說比較好的比例是怎樣的

tm731531 11/09 21:44但是那個可能也有國情問題