下载地址

文件下载地址:2016 Election Polls | Kaggle(需要谷歌账号)

1.需求描述

利用2016年美国总统大选数据,选择克林顿和特朗普的数据进行分析,根据每月的平均预测数据与真实数据的平均值之差的绝对值生成热力图,并比较二人的预测偏差大小。

2.源码及注释语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

#读取我的CSV文件
df = pd.read_csv('C:/Users/94152/Desktop/presidential_polls.csv')

#将精确到日的日期转化为精确到月的日期
df['enddate'] = pd.to_datetime(df['enddate']).dt.to_period('M')

#提取相关列数据并计算每月差值的绝对值
df['diff_clinton'] = np.abs(df['adjpoll_clinton'] - df['rawpoll_clinton'])
df['diff_trump'] = np.abs(df['adjpoll_trump'] - df['rawpoll_trump'])

#创建透视表,计算每月差值绝对值的平均值
#根据enddate索引计算平均值
pivot_table = pd.pivot_table(df, values=['diff_clinton', 'diff_trump'], index='enddate', aggfunc='mean')

#创建热力图
plt.figure(figsize=(10, 6))
#将热力图的条形部分转置过来,防止图像出错
plt.imshow(pivot_table.values.T, cmap='hot', origin='lower')

#设置x轴和y轴的标签
#将索引(也就是月份)的内容增加到纵坐标上,并防止日期显示杂糅,将角度设为90度
plt.xticks(range(len(pivot_table.index)), pivot_table.index, rotation=90)
#标上两个总统候选人的名字
plt.yticks(range(2), ['Clinton', 'Trump'])

#添加颜色标尺
cbar = plt.colorbar()
cbar.set_label('Mean Absolute Difference')

#添加标题和标签
plt.title('Mean Absolute Difference of Clinton and Trump Polls')
plt.xlabel('Date')
plt.ylabel('Candidate')

#输出方差信息
variance_clinton = np.var(df['diff_clinton'])
variance_trump = np.var(df['diff_trump'])
#设置输出方差的位置与内容
plt.text(0, -4, f"Variance (Clinton): {variance_clinton:.2f}")
plt.text(0, -4.5, f"Variance (Trump): {variance_trump:.2f}")

# 显示热力图
plt.show()

3.结果展示及分析

图中可看出,对特朗普的预测偏差远远大于对克林顿的预测偏差,说明在人们心目中,特朗普的获胜出人意料,反映了美国大选的割裂性