2016年总统选举的预测

ASA的美国总统竞选

在这个大选之年,美国统计协会(ASA)将学生竞赛和总统选举放在一起,将学生预测谁是2016年总统大选的赢家准确的百分比作为比赛点。详情见:

http://thisisstatistics.org/electionprediction2016/

获取数据

互联网上有很多公开的民调数据。可以下面的网站获取总统大选的相关数据:

http://projects.fivethirtyeight.com/2016-election-forecast/national-polls/

其他较好的数据源是:

http://www.realclearpolitics.com/epolls/latest_polls/

http://elections.huffingtonpost.com/pollster/2016-general-election-trump-vs-clinton

http://www.gallup.com/products/170987/gallup-analytics.aspx)

值得注意的是:数据是每天更新的,所以你在看本文的时候很可能数据变化而得到不同的结果。

因为原始的数据是JSON文件,R拉取下来将其作为了lists中的一个list(列表)。

原文的Github地址:https://github.com/hardin47/prediction2016/blob/master/predblog.Rmd

##载入需要的包
require(XML)
require(dplyr)
require(tidyr)
require(readr)
require(mosaic)
require(RCurl)
require(ggplot2)
require(lubridate)
require(RJSONIO)

##数据拉取

url = "http://projects.fivethirtyeight.com/2016-election-forecast/national-polls/"
doc <- htmlParse(url, useInternalNodes = TRUE) #爬取网页内容

sc = xpathSApply(doc,
                 "//script[contains(., ‘race.model‘)]",
                 function(x) c(xmlValue(x), xmlAttrs(x)[["href"]]))

jsobj = gsub(".*race.stateData = (.*);race.pathPrefix.*", "\\1", sc)

data = fromJSON(jsobj)
allpolls <- data$polls

#unlisting the whole thing
indx <- sapply(allpolls, length)
pollsdf <- as.data.frame(do.call(rbind, lapply(allpolls, ‘length<-‘, max(indx))))

##数据清洗
#unlisting the weights
pollswt <- as.data.frame(t(as.data.frame(do.call(cbind,
                                                 lapply(pollsdf$weight,
                                                       data.frame,
                                                       stringsAsFactors=FALSE)))))
names(pollswt) <- c("wtpolls", "wtplus", "wtnow")
row.names(pollswt) <- NULL

pollsdf <- cbind(pollsdf, pollswt)

#unlisting the voting
indxv <- sapply(pollsdf$votingAnswers, length)
pollsvot <- as.data.frame(do.call(rbind, lapply(pollsdf$votingAnswers,
                                                ‘length<-‘, max(indxv))))
pollsvot1 <- rbind(as.data.frame(do.call(rbind, lapply(pollsvot$V1, data.frame,
                                                       stringsAsFactors=FALSE))))
pollsvot2 <- rbind(as.data.frame(do.call(rbind, lapply(pollsvot$V2, data.frame,
                                                       stringsAsFactors=FALSE))))

pollsvot1 <- cbind(polltype = rownames(pollsvot1), pollsvot1,
                   polltypeA = gsub(‘[0-9]+‘, ‘‘, rownames(pollsvot1)),
                   polltype1 = extract_numeric(rownames(pollsvot1)))

pollsvot1$polltype1 <- ifelse(is.na(pollsvot1$polltype1), 1, pollsvot1$polltype1 + 1)

pollsvot2 <- cbind(polltype = rownames(pollsvot2), pollsvot2,
                   polltypeA = gsub(‘[0-9]+‘, ‘‘, rownames(pollsvot2)),
                   polltype1 = extract_numeric(rownames(pollsvot2)))

pollsvot2$polltype1 <- ifelse(is.na(pollsvot2$polltype1), 1, pollsvot2$polltype1 + 1)

pollsdf <- pollsdf %>%
  mutate(population = unlist(population),
         sampleSize = as.numeric(unlist(sampleSize)),
         pollster = unlist(pollster),
         startDate = ymd(unlist(startDate)),
         endDate = ymd(unlist(endDate)),
         pollsterRating = unlist(pollsterRating)) %>%
  select(population, sampleSize, pollster, startDate, endDate, pollsterRating,
         wtpolls, wtplus, wtnow)

allpolldata <- cbind(rbind(pollsdf[rep(seq_len(nrow(pollsdf)), each=3),],
                           pollsdf[rep(seq_len(nrow(pollsdf)), each=3),]),
                     rbind(pollsvot1, pollsvot2))

allpolldata <- allpolldata %>%
  arrange(polltype1, choice) 

查看所有的选择数据:allolldata

快速可视化

在找出2016年美国总统竞选的预测选票比例之前,简单的查看数据是非常有必要的。数据集已经整理好了,使用ggplot2包对其进行可视化(选取2016年8月以后的数据,x轴为endDate,y轴为adj_pct,颜色根据choice也就是两种颜色克林顿和希拉里,并根据wtnow设置点的大小):

##快速可视化
ggplot(subset(allpolldata, ((polltypeA == "now") & (endDate > ymd("2016-08-01")))),
       aes(y=adj_pct, x=endDate, color=choice)) +
  geom_line() + geom_point(aes(size=wtnow)) +
  labs(title = "Vote percentage by date and poll weight\n",
       y = "Percent Vote if Election Today", x = "Poll Date",
       color = "Candidate", size="538 Poll\nWeight")

快速分析

考虑到每位候选人的选票比例会基于当前投票的票数百分比,所以,必须基于538人(样本容量samplesize)的想法(投票举动)和投票关闭天数(day sine poll)进行选票权重设置。权重的计算公式如下:

使用计算出的权重,我将计算被预测选票百分比的加权平均和其标准偏差(SE)。标准偏差(SE)计算公式来自 Cochran (1977) 。

##快速分析

# 参考文献
# code found at http://stats.stackexchange.com/questions/25895/computing-standard-error-in-weighted-mean-estimation
# cited from http://www.cs.tufts.edu/~nr/cs257/archive/donald-gatz/weighted-standard-error.pdf
# Donald F. Gatz and Luther Smith, "THE STANDARD ERROR OF A WEIGHTED MEAN CONCENTRATION-I. BOOTSTRAPPING VS OTHER METHODS"

weighted.var.se <- function(x, w, na.rm=FALSE)
  #  Computes the variance of a weighted mean following Cochran 1977 definition
{
  if (na.rm) { w <- w[i <- !is.na(x)]; x <- x[i] }
  n = length(w)
  xWbar = weighted.mean(x,w,na.rm=na.rm)
  wbar = mean(w)
  out = n/((n-1)*sum(w)^2)*(sum((w*x-wbar*xWbar)^2)-2*xWbar*sum((w-wbar)*(w*x-wbar*xWbar))+xWbar^2*sum((w-wbar)^2))
  return(out)
}

# 计算累计平均和加权平均值Cumulative Mean / Weighted Mean
allpolldata2 <- allpolldata %>%
  filter(wtnow > 0) %>%
  filter(polltypeA == "now") %>%
  mutate(dayssince = as.numeric(today() - endDate)) %>%
  mutate(wt = wtnow * sqrt(sampleSize) / dayssince) %>%
  mutate(votewt = wt*pct) %>%
  group_by(choice) %>%
  arrange(choice, -dayssince) %>%
  mutate(cum.mean.wt = cumsum(votewt) / cumsum(wt)) %>%
  mutate(cum.mean = cummean(pct))
View(allpolldata2 )

可视化累计平均和加权平均值

##绘制累计平均/加权平均Cumulative Mean / Weighted Mean
# 累计平均
ggplot(subset(allpolldata2, ( endDate > ymd("2016-01-01"))),
       aes(y=cum.mean, x=endDate, color=choice)) +
  geom_line() + geom_point(aes(size=wt)) +
  labs(title = "Cumulative Mean Vote Percentage\n",
       y = "Cumulative Percent Vote if Election Today", x = "Poll Date",
       color = "Candidate", size="Calculated Weight")

# 加权平均
ggplot(subset(allpolldata2, (endDate > ymd("2016-01-01"))),
       aes(y=cum.mean.wt, x=endDate, color=choice)) +
  geom_line() + geom_point(aes(size=wt)) +
  labs(title = "Cumulative Weighted Mean Vote Percentage\n",
       y = "Cumulative Weighted Percent Vote if Election Today", x = "Poll Date",
       color = "Candidate", size="Calculated Weight")

选票百分比预测

此外,加权平均和平均的标准偏差(科克伦(1977))可以对每个候选人进行计算。使用这个公式,我们可以预测主要候选人的最后的百分比!

pollsummary <- allpolldata2 %>%
  select(choice, pct, wt, votewt, sampleSize, dayssince) %>%
  group_by(choice) %>%
  summarise(mean.vote = weighted.mean(pct, wt, na.rm=TRUE),
            std.vote = sqrt(weighted.var.se(pct, wt, na.rm=TRUE)))

pollsummary

## # A tibble: 2 x 3
##     choice mean.vote  std.vote
##      <chr>     <dbl>     <dbl>
## 1 Clinton  43.48713 0.5073771
## 2   Trump  38.95760 1.0717574

显然,主要的候选人是克林顿和希拉里,克林顿的选票平均百分比高于希拉里,并且其标准偏差小于希拉里,也就是说其选票变化稳定,最后胜出的很可能就是克林顿,但是按照希拉里的变化波动大,也不排除希拉里获胜的可能。可以看到希拉里的选票比例最高曾达到51%。

原文链接:https://www.r-statistics.com/2016/08/presidential-election-predictions-2016/

本文链接:http://www.cnblogs.com/homewch/p/5811945.html

时间: 2024-10-11 22:33:42

2016年总统选举的预测的相关文章

马克·扎克伯格回应:Facebook操纵美国总统选举

[阅读原文] 作者:海洋 在美国总统选举期间,Facebook假新闻泛滥,例如:一名联邦调查局特工因希拉里克林顿(Hillary Clinton)的电子邮件泄漏被谋杀或教皇支持特朗普.外界指责,Facebook未能及时截止假新闻的传播,致使房地产大亨特朗普在美国总统选的真人秀中取胜. 在美国总统选举之后,Facebook首席执行官马克·扎克伯格登上2016科技经济大会(Techonomy16)的讲台,就公众担心Facebook未采取足够措施制止消息流中假新闻泛滥一事作出回应. "就我个人而言,相

【bzoj4966】总统选举 随机化+线段树

题目描述 黑恶势力的反攻计划被小C成功摧毁,黑恶势力只好投降.秋之国的人民解放了,举国欢庆.此时,原秋之国总统因没能守护好国土,申请辞职,并请秋之国人民的大救星小C钦定下一任.作为一名民主人士,小C决定举行全民大选来决定下一任.为了使最后成为总统的人得到绝大多数人认同,小C认为,一个人必须获得超过全部人总数的一半的票数才能成为总统.如果不存在符合条件的候选人,小C只好自己来当临时大总统.为了尽可能避免这种情况,小C决定先进行几次小规模预选,根据预选的情况,选民可以重新决定自己选票的去向.由于秋之

省队集训Day1 总统选举

[题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变,给出下标,改变成当前的答案$s$. $n, m \leq 5*10^5, \sum k\leq 10^6$ By FJSDFZ ditoly [题解] 用这题的方法进行线段树操作即可:http://www.cnblogs.com/galaxies/p/20170602_c.html 但是这样需要验

BZOJ4966 : 总统选举

线段树维护每个点的最有可能是答案的数以及它的权重. 合并两个节点的时候,将权重互相抵消,保留较大的那一个. 得到答案后,再在对应权值的Treap中查询出现次数,检查是否真正是答案. 时间复杂度$O(n\log n)$. #include<cstdio> #include<cstdlib> const int N=500010,M=1100010,BUF=30000000; int n,m,i,a[N],c,d,pos[N],v[M],f[M],V,F;char Buf[BUF],*

luogu P3765 总统选举(线段树维护摩尔投票+平衡树)

这题需要一个黑科技--摩尔投票.这是一个什么东西?一个神奇的方法求一个序列中出现次数大于长度一半的数. 简而言之就是同加异减: 比如有一个代表投票结果的序列. \[[1,2,1,1,2,1,1]\] 我们记录一个\(num\)和\(cnt\)先别管它们是干什么的.我们模拟一遍模拟排序. \[首先读第一个数1,num==0,我们把cnt+1=1,num=1\] \[第二个数2,num==1\neq2,我们把cnt-1=0,num不变\] \[然后第三个数1,num==0,我们把cnt+1=1,nu

知物由学 | 虚假色情泛滥,人工智能可以做些啥?

本文由  网易云发布. "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物由学"希望通过一篇篇技术干货.趋势解读.人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你.当然,如果你有不错的认知或分享,也欢迎通过邮件([email protected])投稿. 本文作者:Louise Matsakis,<连线>杂志编辑,负

一首rap唱响百姓获得感 《厉害了,我们的2016年!》s

纵观经济发展趋势,吴晓波人为,每一轮财富积累都与经济大周期息息相关.今后十年,我们正迎来改革开放后的第三次产业大转型.以新实业.新消费.新金融.新城镇化为代表的四大新动力将引领未来增长. 会议在通过了市政协五届一次会议选举办法,通过了大会选举总监票人.监票人名单和总计票人.计票人名单后,开始投票选举.经投票选举,蒋善生当选为政协永州市第五届委员会主席,张建亮.彭爱华.吕斌.田洁.杨军元.文绍涛.宋可福.潘衡湘当选为政协永州市第五届委员会副主席,王小波当选为政协永州市第五届委员会秘书长,万萍等66

hihoCoder 1426 : What a Ridiculous Election(总统夶选)

hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 In country Light Tower, a presidential election is going on. There are two candidates,  Mr. X1 and Mr. X2, and both of them are not like good per

菲律宾总统候选人谈南海:愿永远闭嘴不挑争端

5月9日菲律宾将举行总统选举.目前支持率遥遥领先的杜特蒂近日频频对中国示好,强调中菲关系非常重要.对于南海争议问题,杜特蒂表示愿意在南海问题上“让步”,甚至包括永远“闭嘴”,不再挑起争端.杜特蒂表示,如果他上台,他会继续延续目前的多边讨论方式解决南海争端.如果这一方法在两年内无法取得成效,他将选择与中国的双边对话. 据香港<南华早报>5月3日报道,杜特蒂对其支持者阐述了对中菲关系的看法.杜特蒂也表示对中国投资的渴望.他表示,希望中国能够支援菲律宾连接首都马尼拉和其他省份的铁路.和他自己家乡的铁