2020年美国总统大选数据分析与模型预测
数据集取自: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] = Trueelse: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))
结果展示
相关文章:

2020年美国总统大选数据分析与模型预测
数据集取自:2020年🇺🇸🇺🇸美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析,提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理࿰…...
C++应用场景开发——学生信息管理系统!!!
C 是一种多功能且高效的编程语言,广泛应用于多种领域。 以下是一些常见的 C 应用场景: 1. 系统软件开发 C 经常用于开发操作系统、文件系统、设备驱动程序和其他底层系统软件。由于其高效的内存管理和性能优势,C 在这些领域非常受欢迎。 …...

Pytorch实现transformer语言模型
转载自:| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型,使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…...
Java后台生成指定路径下创建指定名称的文件
1.Java后台生成指定路径下创建指定名称的CSV文件 /*** <生成csv文件>* param filePath 文件路径名称* param fileName 文件名称* param colNameList 标题数据信息* param dataList CSV的文件数据* return filePathfileName* throws*/public static File genera…...
sqlcoder70b模型,如果需要训练或者微调需要什么样的GPU机器
要训练或微调 SQLCoder-70B 这样的大规模模型,需要高性能 GPU 资源。以下是硬件资源的推荐配置,特别是针对内存需求较大的模型: 1. GPU 显存要求 至少 8 张 A100 80GB GPUs:70B 参数模型在微调时需要高显存,80GB A10…...

【Python实战案例】爬虫项目实例(附赠源码)
文章目录 声明安装必要的库项目结构技术细节小结 声明 请您遵守网站的robots文件规定,本文目的只是做学习交流使用,包括多个模块,例如数据存储、日志记录、错误处理、多线程或异步请求 安装必要的库 pip install requests beautifulsoup4 sq…...

PDF多功能工具箱 PDF Shaper v14.6
如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验,因为PDF Shaper是一款免费的PDF工具集合的软件。有了PDF Shaper,你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有:合并,分割,加…...

Jupyter Notebook添加kernel的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Linux 无名管道
无名管道(unnamed pipe)是一种进程间通信的方式,通常用于父子进程之间的通信。下面是使用无名管道的基本步骤: pipe 调用的返回值如下: 成功时:pipe 调用成功时返回 0。失败时:如果 pipe 调用…...

Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…...

前端拖拽库方案之react-beautiful-dnd
近期,知名 React 拖拽库 react-beautiful-dnd 宣布了项目弃用的决定,未来将不再维护。这一决定源于其存在的缺陷与局限性,促使作者转向开发一个更加现代化的拖拽解决方案——Pragmatic drag and drop(下面会介绍)&…...

【题解】CF2033G
题目 CF2033G 分析 一道很显然是树形dp的题,但非常恶心QwQ。 先不管复杂度,找找递推关系,一种很直接的想法如下(我觉得是错误的): d p [ i ] [ k ] m a x ( d p [ f a i ] [ k − 1 ] , d p [ s o …...

【error】 react 控制台报错Invalid hook call
目录 事件起因解决办法结束语 事件起因 我的前端react ant-design-pro项目能正常启动 但是网页这边就是一片空白,然后在浏览器的控制台报错: index.js:1 Warning: Invalid hook call. Hooks can only be called inside of the body of a function co…...
SDL基本使用
#include <stdio.h>#include <SDL.h>#undef main int main() {printf("Hello World!\n");SDL_Window *window NULL; // 声明窗口SDL_Init(SDL_INIT_VIDEO); // 初始化SDL// 创建SDL Windowwindow SDL_CreateWindow("Basic Window"…...
大模型的temperature参数
目录 模型的temperature参数 一、定义与作用 二、工作原理 三、举例说明 四、应用场景与调整策略 五、注意事项 模型的temperature参数 是人工智能领域中,特别是在生成式模型中使用的一个重要概念。它主要用于控制生成结果的多样性和随机性。以下是对该参数的详细解释和…...

软件项目功能复用指南,复用方案,评估方案(word原件)
6 复用原则 6.1 单一职责原则 SRP (Single Responsibility Principle) 6.2 开放封闭原则 OCP (Open Closed Principle) 6.3 Liskov 替换原则 LSP (Liskov Subtitle Principle) 6.4 接口隔离原则 ISP &a…...
leetcode 3255 长度为 K 的子数组的能量值 II 中等
给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为: 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 请你返回一个长度为 n …...

CCS下载安装(以12.3.0版本为例)
Code Composer Studio 是一个集成开发环境 (IDE),简称CCS软件。支持 TI 的微控制器和嵌入式处理器产品的开发。Code Composer Studio 包含一整套用于开发和调试嵌入式应用程序的工具。 CCS9.3.0及以上版本不需要License文件,但是CCS旧版本比如CCS5.5.0需…...

C++STL容器详解——list
目录 一.list 1.list的介绍 2.为什么会有list? 二.list的常见接口 1.list的构造函数 2.list的遍历 3.迭代器类型 4.list的头插头删和尾插尾删 5.list任意位置的插入和删除 6.list的sort()及reverse() 7.迭代器失效 三.整体代码 一.list 1.list的介绍 list的文档说…...
linux tar 打包为多个文件
将目录打包成多个大小为 80MB 的文件,可以使用以下命令: tar -cf - my_folder | split -b 80m - my_folder.tar.解释: tar -cf - my_folder 将 my_folder 目录打包成一个 tar 文件并通过管道 (|) 输出到标准输出。 split -b 80m - my_fold…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...