wordpress 文章 路径,贵州网站建设seo,app门户网站,我想要个网站数据集取自#xff1a;2020年#x1f1fa;#x1f1f8;#x1f1fa;#x1f1f8;美国大选数据集 - Heywhale.com 前言
对2020年美国总统大选数据的深入分析#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理#xff0…数据集取自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(fQ1: {Q1}, Q3: {Q3}, IQR: {IQR})
# 定义异常值的边界
lower_bound Q1 - 1.5 * IQR
upper_bound Q3 1.5 * IQR
# 打印异常值的边界
print(fLower 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], markero, labelcandidate)ax.set_title(各州各候选人的得票情况)
ax.set_xlabel(州)
ax.set_ylabel(得票数)
plt.xticks(rotation90)
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(axis1)
agg_data[dominant_votes] agg_data[[DEM, REP]].max(axis1)# 创建热力图数据
heatmap_data agg_data.pivot(indexstate, columnsdominant_party, valuesdominant_votes)# 绘制热力图
plt.figure(figsize(10, 8))
sns.heatmap(heatmap_data, annotTrue, fmt.0f, cmapcoolwarm, 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(kindbar, color[blue if c Joe Biden else red for c in candidate_wins.index])
plt.title(候选人赢得的县数)
plt.xlabel(候选人)
plt.ylabel(县支持数)
plt.xticks(rotation0)
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(kindbar, color[blue if c Joe Biden else red for c in total_population.index])
plt.title(支持县总人口)
plt.xlabel(候选人)
plt.ylabel(总人口)
plt.xticks(rotation0)
plt.show()# 性别比例
plt.figure(figsize(10, 6))
gender_ratio[[male, female]].plot(kindbar, stackedTrue, color[blue, pink])
plt.title(选民性别比例)
plt.xlabel(候选人)
plt.ylabel(总人口)
plt.xticks(rotation0)
plt.legend(titleGender, labels[Male, Female])
plt.show()# 年龄中位数
plt.figure(figsize(10, 6))
median_age.plot(kindbar, color[blue if c Joe Biden else red for c in median_age.index])
plt.title(选民年龄中位数)
plt.xlabel(候选人)
plt.ylabel(年龄)
plt.xticks(rotation0)
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 redlabel 拜登 if color blue else 特朗普if not legend_labels[color]:plt.scatter(row[long], row[lat], ccolor, alpha0.5, labellabel)legend_labels[color] Trueelse:plt.scatter(row[long], row[lat], ccolor, alpha0.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], axis1, inplaceTrue)
cleaned_datas[candidate] cleaned_datas[candidate].astype(int)
# 定义特征X和标签y
X cleaned_datas.drop(candidate, axis1)
y cleaned_datas[candidate]
# 划分训练集和测试集
X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)
# 朴素贝叶斯模型
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, cv5, scoringaccuracy)
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))
结果展示