2020年美国总统大选数据分析与模型预测

news2024/11/7 16:33:43

数据集取自:2020年🇺🇸🇺🇸美国大选数据集 - Heywhale.com

前言

对2020年美国总统大选数据的深入分析,提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理,以确保分析的准确性。通过数据清洗、集成、转换将为后续分析整理合理的数据集。在数据分析阶段,本次实训关注候选人在各州的得票情况及各州的政党优势,同时对县级投票支持率和选举结果进行可视化。此外,人口特征分析将帮助我们理解不同性别、年龄及地域对投票的影响。模型建立阶段将应用KNN和朴素贝叶斯算法,对大选结果预测进行建模,以其发现潜在的影响因素并为未来的选举策略提供依据。

数据预处理

数据清洗

导入csv文件,后使用 data.isnull() 检查数据框中每个元素是否为缺失值,并返回一个布尔值数据框。接着,sum() 方法计算每一列缺失值的总数,输出缺失值的统计信息。然后填充缺失值并检查。

# # 加载数据
data = pd.read_csv('president_counties.csv')

# 查看前几行数据
print(data.head())

# 检查缺失值
print(data.isnull().sum())
# 处理缺失值
data['state_code'] = data['state_code'].fillna('DC')
# 再次检查
print(data.isnull().sum())

数据集中fips联邦信息代码这列在分析中用不到,选择删除,并查看删除后的数据 

# 使用drop方法移除fips列
data = data.drop(columns=['fips'])

# 查看移除后的数据
print(data.head())

 利用箱型图以经度为判断依据,判断并删除数据集中的异常数据,如图2-3所示。异常值处理后输出结果如图

 异常值数据在经度-160左右处,这里采取删除异常值的方式处理数据。

# 计算四分位数
Q1 = data['long'].quantile(0.25)
Q3 = data['long'].quantile(0.75)
IQR = Q3 - Q1
# 打印四分位数和IQR
print(f"Q1: {Q1}, Q3: {Q3}, IQR: {IQR}")
# 定义异常值的边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 打印异常值的边界
print(f"Lower Bound: {lower_bound}, Upper Bound: {upper_bound}")
# 找出异常值
outliers = data[(data['long'] < lower_bound) | (data['long'] > upper_bound)]
print("异常值:")
print(outliers[['id', 'state', 'county', 'long']])
# 如果没有异常值,打印提示信息
if outliers.empty:
    print("没有找到异常值。")
# 删除异常值获取完成预处理的数据cleaned_data
cleaned_data = data[(data['long'] >= lower_bound) & (data['long'] <= upper_bound)]

# 查看删除异常值后的数据
print("\n删除异常值后的数据:")
print(cleaned_data.head())

 数据集成

 检查cleaned_data中的重复行数量,然后删除这些重复行,再次检查并输出处理后的数据框中是否还有重复行。通过这种方式,可以确保数据的唯一性,便于后续的数据分析和处理。

# 检查重复数据
print("重复数据情况:")
print(cleaned_data.duplicated().sum())

# 删除重复数据
cleaned_data = cleaned_data.drop_duplicates()

# 再次检查重复数据
print("处理后的重复数据情况:")
print(cleaned_data.duplicated().sum())

 数据转换

针对一个数据集,进行类型转换和计算,并新增县人民投票参与率特征vote_percentage。先将数据集中 id 列的类型转换为整数型,将 total_votes 列转换为整数型,以确保其可以进行数学运算。然后将 male 和 female 列的类型转换为整数型,这分别是男性和女性的投票数。再将 population 列转换为整数型,表示总人口数,将 long 列转换为浮点型,表示地理坐标的经度。最后计算每个数据行的投票百分比,其中 vote_percentage 列为总投票数与总人口数的比值,乘以 100 以转换为百分比形式。

# 转换数据类型
data['id'] = data['id'].astype(int)
data['total_votes'] = data['total_votes'].astype(int)
data['male'] = data['male'].astype(int)
data['female'] = data['female'].astype(int)
data['median_age'] = data['median_age'].astype(float)
data['population'] = data['population'].astype(int)
data['female_percentage'] = data['female_percentage'].astype(float)
data['lat'] = data['lat'].astype(float)
data['long'] = data['long'].astype(float)

# 添加或计算新的特征
data['vote_percentage'] = data['total_votes'] / data['population'] * 100

数据探索分析


数据可视化

对各州各县各候选人的得票情况进行数据可视化,使用折线图展示不同候选人在各州的投票情况。通过对数据的分组和汇总,生成清晰的图表,以便观察各候选人在不同州的表现。从图上可以看出在大多数州,乔·拜登(蓝色线条)的得票数高于唐纳德·特朗普(红色线条),尤其是在人口较多的州。特朗普在一些州的表现较好,但在整体上落后于拜登。效果图和代码如下。

# 各州各候选人的得票情况(折线图)
# 按州和候选人分组,计算每个候选人在每个州的总得票数
grouped_data = cleaned_data.groupby(['state', 'candidate'])['total_votes'].sum().unstack().fillna(0).reset_index()

plt.style.use('ggplot')

fig, ax = plt.subplots(figsize=(12, 8))

for candidate in grouped_data.columns[1:]:
    ax.plot(grouped_data['state'], grouped_data[candidate], marker='o', label=candidate)

ax.set_title('各州各候选人的得票情况')
ax.set_xlabel('州')
ax.set_ylabel('得票数')
plt.xticks(rotation=90)
ax.legend(title='候选人')
plt.tight_layout()
plt.show()

 分析不同州的投票数据,确定每个州的主导政党,并将结果以热力图的形式可视化,以便更直观地展示各州的投票趋势。可以看到一些州的条颜色较深,表明这些州的主要政党贡献了大量的选票。相反,有些州的条形颜色较浅,说明这些州的主要政党贡献的选票较少。效果图和代码如下.

# 州政党优势

agg_data = cleaned_data.groupby(['state', 'party'])['total_votes'].sum().unstack().fillna(0).reset_index()

# 确定优势政党
agg_data['dominant_party'] = agg_data[['DEM', 'REP']].idxmax(axis=1)
agg_data['dominant_votes'] = agg_data[['DEM', 'REP']].max(axis=1)

# 创建热力图数据
heatmap_data = agg_data.pivot(index='state', columns='dominant_party', values='dominant_votes')

# 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(heatmap_data, annot=True, fmt='.0f', cmap='coolwarm', cbar_kws={'label': 'Total Votes'})
plt.title('2020年美国大选中各州占主导地位的政党')
plt.xlabel('主要政党')
plt.ylabel('州')
plt.show()

 从候选人投票数据中生成一个条形图,直观展示不同候选人的县支持数,并在图中显著标识“Joe Biden”。图中Donald Trump 获得了更多的县数,柱子的高度明显高于 Joe Biden 的柱子。具体来说,Donald Trump 赢得了大约 2,500 个县,而 Joe Biden 赢得了约 400 个县。效果图和代码如下。

#  计算每个候选人赢得的县数量
candidate_wins = cleaned_data['candidate'].value_counts()

#  绘制条形图
plt.figure(figsize=(10, 6))
candidate_wins.plot(kind='bar', color=['blue' if c == 'Joe Biden' else 'red' for c in candidate_wins.index])
plt.title('候选人赢得的县数')
plt.xlabel('候选人')
plt.ylabel('县支持数')
plt.xticks(rotation=0)
plt.show()

根据人口数据绘制一个条形图,使用不同颜色区分候选人名字,并设置了相应图表的标题和坐标轴标签,这样能直观地展示支持候选人的县总人口数据。从图表中可以看出,拜登的支持县总人口明显多于特朗普的支持县总人口。这意味着在选举中,拜登获得了更多来自人口密集地区的选民支持。

综合来看,虽然 特朗普 在县的数量上占据了优势,但 拜登 在人口较多的地区获得了更多的支持。这意味着 拜登 在大城市和人口稠密的地区表现更好,而 特朗普 则在较小的城市和地区有更多的支持者。

因此,可以推断出 拜登 在总统大选中获胜的可能性更大,因为他在人口众多的关键州份取得了领先。

可视化性别比例数据,通过堆叠条形图直观地展示男性和女性的人口比例。这张图表展示了两位候选人的性别比例分布情况。具体来说:对于 特朗普 来说,男性选民的比例略高于女性选民;对于 拜登 来说,则是相反的情况,即女性选民的比例更高。

 绘制一个柱状图,展示选民的中位年龄

代码: 

# 按候选人分组
grouped = cleaned_data.groupby('candidate')

# 总人口
total_population = grouped['population'].sum()

# 性别比例
gender_ratio = grouped[['male', 'female']].sum()
gender_ratio['female_percentage'] = gender_ratio['female'] / (gender_ratio['male'] + gender_ratio['female']) * 100

# 年龄中位数
median_age = grouped['median_age'].mean()

 # 绘制图表

# 总人口
plt.figure(figsize=(10, 6))
total_population.plot(kind='bar', color=['blue' if c == 'Joe Biden' else 'red' for c in total_population.index])
plt.title('支持县总人口')
plt.xlabel('候选人')
plt.ylabel('总人口')
plt.xticks(rotation=0)
plt.show()

# 性别比例
plt.figure(figsize=(10, 6))
gender_ratio[['male', 'female']].plot(kind='bar', stacked=True, color=['blue', 'pink'])
plt.title('选民性别比例')
plt.xlabel('候选人')
plt.ylabel('总人口')
plt.xticks(rotation=0)
plt.legend(title='Gender', labels=['Male', 'Female'])
plt.show()

# 年龄中位数
plt.figure(figsize=(10, 6))
median_age.plot(kind='bar', color=['blue' if c == 'Joe Biden' else 'red' for c in median_age.index])
plt.title('选民年龄中位数')
plt.xlabel('候选人')
plt.ylabel('年龄')
plt.xticks(rotation=0)
plt.show()

通过选择经纬度作为横纵轴并将大选投票支持度对应地理位置可视化。通过散点图,用户可以直观地看到选举结果的地理分布,从而为后续的数据分析或建模提供依据。这张图显示了特朗普和拜登在美国各州的支持率分布情况。特朗普在传统共和党势力较强的南部和中西部地区表现较好,而拜登在民主党传统的东北部和西海岸地区表现出色。代码和效果图如下。

 

# 大选投票地理分布
plt.figure(figsize=(10, 10))

legend_labels = {'blue': False, 'red': False}

for index, row in cleaned_data.iterrows():
    color = 'blue' if row['color'] == 'blue' else 'red'
    label = '拜登' if color == 'blue' else '特朗普'

    if not legend_labels[color]:
        plt.scatter(row['long'], row['lat'], c=color, alpha=0.5, label=label)
        legend_labels[color] = True
    else:
        plt.scatter(row['long'], row['lat'], c=color, alpha=0.5)

plt.title('选举结果地理分布')
plt.xlabel('经度')
plt.ylabel('纬度')

plt.legend()
plt.show()

从清洗后的数据集中选择特定特征,计算这些特征之间的相关性矩阵,并通过热图进行可视化。

其具体步骤包括:定义特征列表,提取相关特征,计算相关性矩阵并打印结果,然后使用 Seaborn 库绘制热图来直观展示各个特征之间的相关性。热图通过颜色和数值标注清晰地展示了变量之间的关系,帮助用户更好地理解数据中的关联性。

从图上可以得出,总票数与男性和女性选民的数量之间存在很强的正相关性;中位年龄与总票数、男性和女性选民数量之间存在负相关性,但与人口数量和女性比例之间存在正相关性;人口数量与总票数、中位年龄和女性比例之间存在正相关性,但与男性和女性选民数量之间存在负相关性;性比例与总票数、中位年龄和人口数量之间存在正相关性,但与男性和女性选民数量之间存在负相关性。

总体投票数与人口总数高度相关:

这意味着人口较多的地区通常会有更多的投票人数。大都市区可能对选举结果有更大的影响。

建模与评估

朴素贝叶斯

首先复制了数据集并进行了清理,提取了特征,如党派、总票数、性别、年龄、人口及性别比例等,以及目标变量。然后,数据被分为训练集和测试集,模型评估的结果显示了多个指标,包括精确度、召回率、F1-score、支持度以及整体准确率。这些评估指标用于衡量模型在分类任务中的性能,表明模型在预测候选人类别时的有效性。

代码:

# 明确复制数据集
cleaned_datas = cleaned_data.copy()
# 将分类数据转换为数字编码
cleaned_datas.loc[:, 'candidate'] = cleaned_datas['candidate'].map({'Joe Biden': 0, 'Donald Trump': 1})
cleaned_datas.loc[:, 'party'] = cleaned_datas['party'].map({'DEM': 0, 'REP': 1})
# 移除不需要的列
cleaned_datas.drop(['id', 'state', 'county', 'won', 'fips', 'state_code', 'color'], axis=1, inplace=True)
cleaned_datas['candidate'] = cleaned_datas['candidate'].astype(int)
# 定义特征X和标签y
X = cleaned_datas.drop('candidate', axis=1)
y = cleaned_datas['candidate']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 朴素贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)
nb_predictions = nb_model.predict(X_test)
print("朴素贝叶斯模型准确率:", accuracy_score(y_test, nb_predictions))
print(classification_report(y_test, nb_predictions))

结果展示

K近邻

使用K近邻(KNN)分类器进行超参数调优和模型评估。首先,定义了一个参数网格,其中n_neighbors的范围从1到20,用于设置KNN模型中考虑的邻居数量。接着,利用网格搜索和5折交叉验证来寻找最佳参数,并对训练数据进行拟合。获得最佳模型后,使用它对测试数据进行预测,并通过计算精确率、召回率和F1分数等指标来评估模型性能。最终,模型的整体准确率达到了86.49%,表明其分类效果良好。

代码

# K近邻模型
param_grid = {'n_neighbors': list(range(1, 21))}
knn_grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5, scoring='accuracy')
knn_grid.fit(X_train, y_train)
best_knn_model = knn_grid.best_estimator_
print("最佳KNN模型参数:", knn_grid.best_params_)

knn_predictions = best_knn_model.predict(X_test)
print("KNN模型准确率:", accuracy_score(y_test, knn_predictions))
print(classification_report(y_test, knn_predictions))

结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A Consistent Dual-MRC Framework for Emotion-cause Pair Extraction——论文阅读笔记

前言 这是我第一次向同学院同年级的学生和老师们汇报的第一篇论文,于2022年发表在TOIS上,属于CCF A类,主要内容是将MRC应用到情感原因对抽取中。 论文链接:用于情绪-原因对提取的一致双 MRC 框架 |信息系统上的 ACM Transactions 这里我就不放上我自己翻译的中文版还有我…

智慧公厕解决方案是未来厕所新建和改造的方向

在当今科技飞速发展的时代&#xff0c;智慧公厕解决方案正逐渐成为厕所新建和改造的主流方向&#xff0c;为人们带来更便捷、卫生、高效的使用体验。 一、智能化体验提升便捷性 智慧公厕配备了一系列智能设施&#xff0c;极大地提升了使用的便捷性。比如&#xff0c;智能环保取…

python爬取m3u8视频(思路到实现全讲解!!!)

文章目录 抓取m3u8视频1、思路分析2、实现分析index.m3u8 3、代码实现3.1 获取最后一个m3u8的url地址3.2 多线程下载ts文件与视频合并3.3 合并获取上面俩个代码段的代码 4、注意事项4.1 说明4.2 使用代码进行处理4.3 完整代码 5、解密处理 处理m3u8文件中的url问题 抓取m3u8视频…

“方块兽神仙猿点石成金”游戏搭建开发

“方块兽神仙猿点石成金”是一款结合了策略和运气的休闲游戏。玩家需在规定时间内向不同的山头投入矿石&#xff0c;等待神仙猿降临并随机选择一座山进行“点石成金”。根据神仙猿的选择&#xff0c;玩家将获得不同的奖励。 游戏核心机制 矿石投入&#xff1a;玩家在游戏开始…

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器&#xff08;需要不被服务商限制发件收件的&#xff0c;也就是端口25、110、143、465、587、993、995不被限制&#xff09;&#xff0c;如有防火墙或安全组需要把这些端口开放 2. 一个域名&#xff0c;最好是com cn org的一级域名 3. 域名备案&am…

二级列表联动

介绍 本示例主要介绍了List组件实现二级联动&#xff08;Cascading List&#xff09;的场景。 该场景多用于商品种类的选择、照片不同类型选择等场景。 效果图 使用说明&#xff1a; 滑动二级列表侧控件&#xff08;点击没用&#xff09;&#xff0c;一级列表随之滚动。&…

简易三步骤教程:轻松在本地搭建并运行大型模型!

在当前的技术环境下&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为人工智能领域的一个重要里程碑。这些模型能够在各种任务上展现出人类水平的性能&#xff0c;包括但不限于文本生成、语言理解和问题解答。随着开源项目的发展&#xff0c;个人开发者现在有机会…

C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)

1、前言 共享内存&#xff08;Shared Memory&#xff09;是一种高效的跨进程通信方式&#xff0c;尤其适用于同一台计算机上的进程之间的高速数据传输。与套接字相比&#xff0c;共享内存允许多个进程直接访问同一块内存区域&#xff0c;减少了数据传输的中间步骤&#xff0c;…

萌熊数据科技:剑指脑机转入,开启科技新篇章

近日&#xff0c;科技圈传来一则令人瞩目的消息&#xff0c;天津萌熊数据科技有限公司和天津一万年科技发展有限公司在全国范围内大力开展AI加生命科学的主体业务&#xff0c;并明确将朝着脑机转入方向深入发展&#xff0c;引发了行业内外的广泛关注。 天津萌熊数据科技有限公司…

计算机网络:网络层 —— IP 多播技术

文章目录 基本概念IP多播地址和多播组 IP多播的类型硬件多播将IPv4多播地址映射为多播MAC地址 基本概念 多播&#xff08;Multicast&#xff0c;也称为组播&#xff09;是一种实现“一对多”通信的技术&#xff0c;允许一台或多台主机&#xff08;多播源&#xff09;发送单一数…

使用Markdown编写适用于GitHub的README.md文件的目录结构

文章目录 [toc] 顶部1. 使用[TOC]自动生成2. VSCode中的插件3. 手搓目录目录相关资料本文相关代码一、概述1.1 基本概念1.2 两种处理模型&#xff08;1&#xff09;微批处理&#xff08;2&#xff09;持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编…

旧衣回收小程序:提高回收效率,扩大服务范围

近年来&#xff0c;旧衣回收作为一种新兴回收模式&#xff0c;逐渐走入了大众的生活中&#xff0c;在回收市场中形成了新的商业模式&#xff0c;也为大众带来了新的创业选择。 随着社会生活的快速发展&#xff0c;人们的生活水平不断提高&#xff0c;为旧衣市场发展提供了基础…

0-基于图的组合优化算法学习(NeurIPS 2017)(未完)

文章目录 Abstract1 Introduction2 图上的贪婪算法的通用表述3 表示:图嵌入3.1 Structure2Vec3.2 参数化 Q ^ ( h ( S ) , v ; Θ ) \widehat{Q}(h(S), v; \Theta) Q ​(h(S),v;Θ)4 Training: Q-learningAbstract 为NP-hard组合优化问题设计好的启发式或近似算法通常需要大…

python验证码滑块图像识别

文章目录 1、案例图片1、需求说明2、代码实现总结 1、案例图片 1、需求说明 python 3.10,写一个滑块验证码的自动化程序。需要一个opencv的函数&#xff0c;能准确的计算&#xff0c;在这同一张图片上&#xff0c;滑块形状和缺口形状的坐标位置及两个形状之间在X轴上的距离。请…

Spring AI 核心概念

SpringAI 核心概念 1. Models2. Prompts3. Prompt Templates4. Embeddings5. Tokens6. Structured Output7. Bringing Your Data & APIs to the AI Model7.1 Retrieval Augmented Generation7.2 Function Calling 1. Models AI 模型是用于处理和生成信息的算法&#xff0c…

从0开始学习Linux——文本编辑器

往期目录&#xff1a; 1、从0开始学习Linux——Linux简介&安装 2、从0开始学习Linux——搭建属于自己的Linux系统 我们通过前面教程的学习已经了解了什么是Linux&#xff0c;并且我们也定制安装了属于我们自己的一个Linux系统。从这个章节开始我们将开始学习如何去操作Linu…

外包干了三年,精神严重内耗。。。

前段时间我同事&#xff08;做测试的一个妹子&#xff09;跟我讲&#xff0c;感觉早上起来十分的疲惫&#xff0c;不想上班&#xff0c;问我们这是什么样的现象&#xff0c;其实有时候我也有这种感觉&#xff0c;虽然我卷&#xff0c;但我也是肉体凡胎啊&#xff01;不是机器人…

华宇TAS应用中间件入围鲲鹏应用创新大赛2024全国总决赛

近日&#xff0c;鲲鹏应用创新大赛2024全国总决赛入围名单出炉。华宇TAS应用中间件经过区域赛、半决赛一路披荆斩棘&#xff0c;在众多优秀的解决方案中脱颖而出&#xff0c;成功入围全国总决赛。 这也表明华宇TAS应用中间件在方案创新性、技术领先性、商业前景、社会价值等方…

惊爆!内容创业新纪元:AI工作流助你打造自媒体帝国!

又是一个研究AI工作流的深夜。看着扣子商店里各种神奇的智能体,我不禁感叹技术的魔力。一个简单的工作流模板,居然能把过去需要一整天才能完成的工作,压缩到几分钟… 扣子模板 大家好,我是momo,一个专注教人使用AI工作流做自媒体的创业者。今天想和你分享一个能让内容创作效率…

史上最大应用层DDoS攻击 H2 Rapid Reset攻击研究

前言 2023年10月Cloudflare、Google、AWS等厂商公布了一种利用HTTP/2快速重置进行应用层DDoS攻击的0day漏洞(CVE-2023-44487)[1][2]&#xff0c;即H2 Rapid Reset DDoS。Google宣传其监控到此种攻击峰值超过每秒3.98亿个请求&#xff0c;打破互联网历史最大应用层DDoS攻击记录…