程序地带

<利用Pandas进行数据分析>项目练习(二) ——用Pandas揭秘美国选民的总统喜好


1.1 前言

本次项目来源于阿里云天池,赛事由开源学习组织Datawhale主办。


主要带领学习者利用Python进行数据分析以及数据可视化。


包含数据集的处理、数据探索与清晰、数据分析、数据可视化四部分,利用pandas、matplotlib、wordcloud等第三方库。


学习赛事地址:https://tianchi.aliyun.com/competition/entrance/531837/introduction


1.2 数据集来源介绍

所有候选人信息 该文件为每个候选人提供一份记录,并显示候选人的信息、总收入、从授权委员会收到的转账、付款总额、给授权委员会的转账、库存现金总额、贷款和债务以及其他财务汇总信息。


数据字段描述详细:https://www.fec.gov/campaign-finance-data/all-candidates-file-description/ 关键字段说明


CAND_ID 候选人ID CAND_NAME 候选人姓名 CAND_PTY_AFFILIATION 候选人党派


数据来源:https://www.fec.gov/files/bulk-downloads/2020/weball20.zip


候选人委员会链接信息 该文件显示候选人的身份证号码、候选人的选举年份、联邦选举委员会选举年份、委员会识别号、委员会类型、委员会名称和链接标识号。 信息描述详细:https://www.fec.gov/campaign-finance-data/candidate-committee-linkage-file-description/ 关键字段说明


CAND_ID 候选人ID CAND_ELECTION_YR 候选人选举年份 CMTE_ID 委员会ID


数据来源:https://www.fec.gov/files/bulk-downloads/2020/ccl20.zip


个人捐款档案信息 【注意】由于文件较大,本数据集只包含2020.7.22-2020.8.20的相关数据,如果需要更全数据可以通过数据来源中的地址下载。 该文件包含有关收到捐款的委员会、披露捐款的报告、提供捐款的个人、捐款日期、金额和有关捐款的其他信息。 信息描述详细:https://www.fec.gov/campaign-finance-data/contributions-individuals-file-description/ 关键字段说明


CMTE_ID 委员会ID NAME 捐款人姓名 CITY 捐款人所在市 State 捐款人所在州 EMPLOYER 捐款人雇主/公司 OCCUPATION 捐款人职业


数据来源:https://www.fec.gov/files/bulk-downloads/2020/indiv20.zip


1.3 需要提前安装的包

在cmd的命令行中下载:


安装词云处理包wordcloud


pip install wordcloud --user
2、数据处理

进行数据处理前,我们需要知道我们最终想要的数据是什么样的,因为我们是想分析候选人与捐赠人之间的关系,所以我们想要一张数据表中有捐赠人与候选人一一对应的关系,所以需要将目前的三张数据表进行一一关联,汇总到需要的数据。


`


2.1 将委员会和候选人一一对应,通过CAND_ID关联两个表


由于候选人和委员会的联系表中无候选人姓名,只有候选人ID(CAND_ID),所以需要通过CAND_ID从候选人表中获取到候选人姓名,最终得到候选人与委员会联系表ccl。


# 导入相关处理包
import pandas as pd
# 读取候选人信息,由于原始数据没有表头,需要添加表头
candidates = pd.read_csv("weball20.txt", sep = '|',names=['CAND_ID','CAND_NAME','CAND_ICI','PTY_CD','CAND_PTY_AFFILIATION','TTL_RECEIPTS',
'TRANS_FROM_AUTH','TTL_DISB','TRANS_TO_AUTH','COH_BOP','COH_COP','CAND_CONTRIB',
'CAND_LOANS','OTHER_LOANS','CAND_LOAN_REPAY','OTHER_LOAN_REPAY','DEBTS_OWED_BY',
'TTL_INDIV_CONTRIB','CAND_OFFICE_ST','CAND_OFFICE_DISTRICT','SPEC_ELECTION','PRIM_ELECTION','RUN_ELECTION'
,'GEN_ELECTION','GEN_ELECTION_PRECENT','OTHER_POL_CMTE_CONTRIB','POL_PTY_CONTRIB',
'CVG_END_DT','INDIV_REFUNDS','CMTE_REFUNDS'])
# 读取候选人和委员会的联系信息
ccl = pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID'])
# 关联两个表数据
ccl = pd.merge(ccl,candidates)
# 提取出所需要的列
ccl = pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])

数据字段说明:


CMTE_ID:委员会ID CAND_ID:候选人ID CAND_NAME:候选人姓名 CAND_PTY_AFFILIATION:候选人党派


#查看目前ccl数据前10行
ccl.head(10)

输出结果如下: 在这里插入图片描述


3、数据探索与清洗

进过数据处理部分,我们获得了可用的数据集,现在我们可以利用调用shape属性查看数据的规模,调用info函数查看数据信息,调用describe函数查看数据分布。


# 查看数据规模 多少行 多少列
c_itcont.shape

输出结果:(756205, 8)


# 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型
c_itcont.info()

输出结果: 在这里插入图片描述 通过上面的探索我们知道目前数据集的一些基本情况,目前数据总共有756205行,8列,总占用内存51.9+MB,STATE、EMPLOYER、OCCUPATION有缺失值,另外日期列目前为int64类型,需要进行转换为str类型。


#空值处理,统一填充 NOT PROVIDED
c_itcont['STATE'].fillna('NOT PROVIDED',inplace=True)
c_itcont['EMPLOYER'].fillna('NOT PROVIDED',inplace=True)
c_itcont['OCCUPATION'].fillna('NOT PROVIDED',inplace=True)
# 对日期TRANSACTION_DT列进行处理
c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(str)
# 将日期格式改为年月日 7242020
c_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in c_itcont['TRANSACTION_DT'] ]

通过上述处理后再执行c_itcont.info() 得到如下结果,对比可知,各列数据的对象与大小都初步处理完成 在这里插入图片描述


查看数据表中数据类型的列的数据分布情况


c_itcont.describe()

得到如下相关汇总指标信息: 在这里插入图片描述


4、数据分析

计算每个党派的所获得的捐款总额,然后排序,取前十位


c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

得到结果: 在这里插入图片描述 计算每个总统候选人所获得的捐款总额,然后排序,取前十位


c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

得到结果: 在这里插入图片描述 对比可知: 获得捐赠最多的党派有DEM(民主党)、REP(共和党),分别对应BIDEN, JOSEPH R JR(拜登)和TRUMP, DONALD J.(特朗普),从我们目前分析的2020.7.22-2020.8.20这一个月的数据来看,在选民的捐赠数据中拜登代表的民主党完胜特朗普代表的共和党,由于完整数据量过大,所以没有对所有数据进行汇总分析,只能作为一个样本来参考,从选举结果来看,拜登取得总统席位,反映了样本的一定代表性。


查看不同职业的人捐款的总额,然后排序,取前十位


c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

结果如下: 在这里插入图片描述


查看每个职业捐款人的数量


c_itcont['OCCUPATION'].value_counts().head(10)

在这里插入图片描述 从捐款人的职业这个角度分析,我们会发现NOT EMPLOYED(自由职业)的总捐赠额是最多,通过查看每个职业捐赠的人数来看,我们就会发现是因为NOT EMPLOYED(自由职业)人数多的原因,另外退休人员捐款人数也特别多,所以捐款总数对应的也多,其他比如像:律师、创始人、医生、顾问、教授、主管这些高薪人才虽然捐款总人数少,但是捐款总金额也占据了很大比例。


5、数据可视化

首先导入python相关库


# 导入matplotlib中的pyplot
import matplotlib.pyplot as plt
# 为了使matplotlib图形能够内联显示
%matplotlib inline
# 导入词云库
from wordcloud import WordCloud,ImageColorGenerator

5.1 按州总捐款数和总捐款人数柱状图


各州总捐款数可视化


st_amt = c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False)[:10]
st_amt=pd.DataFrame(st_amt, columns=['TRANSACTION_AMT'])
st_amt.plot(kind='bar')

在这里插入图片描述


5.2 各州捐款总人数可视化


各州捐款总人数可视化,取10个州的数据


st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')

在这里插入图片描述


5.3 热门候选人拜登在各州的获得的捐赠占比


# 从所有数据中取出支持拜登的数据
biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
# 统计各州对拜登的捐款总数
biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
# 饼图可视化各州捐款数据占比
biden_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)

得到结果如下: 在这里插入图片描述 5.4 总捐最多的候选人捐赠者词云图 通过数据分析中获得捐赠总额前三的候选人统计中可以看出拜登在2020.7.22-2020.8.20这期间获得捐赠的总额是最多的,所以我们以拜登为原模型,制作词云图。


# 首先下载图片模型,这里提供的是已经处理好的图片
# 处理结果:需要将人图像和背景颜色分离,并纯色填充,词云才会只显示在人图像区域
# 拜登原图:https://img.alicdn.com/tfs/TB1pUcwmZVl614jSZKPXXaGjpXa-689-390.jpg
# 拜登处理后图片:https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
# 特朗普原图:https://img.alicdn.com/tfs/TB1D0l4pBBh1e4jSZFhXXcC9VXa-298-169.jpg
# 特朗普处理后图片:https://img.alicdn.com/tfs/TB1BoowmZVl614jSZKPXXaGjpXa-298-169.jpg
# 这里我们先下载处理后的图片
!wget https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg

由于下载图片文件名过长,我们对文件名进行重命名


import os
os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg', 'biden.jpg')
'''
在5.3中 热门候选人拜登在各州的获得的捐赠占比中,
我们已经取出了所有支持拜登的人的数据,存在变量:biden中
将所有捐赠者姓名连接成一个字符串
'''
data = ' '.join(biden["NAME"].tolist())
# 读取图片文件
bg = plt.imread("biden.jpg")
# 生成
wc = WordCloud(# FFFAE3
background_color="white", # 设置背景为白色,默认为黑色
width=890, # 设置图片的宽度
height=600, # 设置图片的高度
mask=bg, # 画布
margin=10, # 设置图片的边缘
max_font_size=100, # 显示的最大的字体大小
random_state=20, # 为每个单词返回一个PIL颜色
).generate_from_text(data)
# 图片背景
bg_color = ImageColorGenerator(bg)
# 开始画图
plt.imshow(wc.recolor(color_func=bg_color))
# 为云图去掉坐标轴
plt.axis("off")
# 画云图,显示
# 保存云图
wc.to_file("biden_wordcloud.png")

最后,我们就可以得到下面这张词云图: 在这里插入图片描述


(以上内容代码均来源于官方作为参考)


5.5 按州总捐款热力地图


绘制热力地图经查询,可用到folium库的相关信息, 由于篇幅与技术有限,此处采取seaborn.heatmap内容制作热力图。


代码如下:


import seaborn as sns
#统计各州的总捐款情况
state_contribution=c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False)
#为了便于观察,这里采取了各州捐款占所有捐款的百分比展示
all_contribution=state_contribution['TRANSACTION_AMT'].sum()
state_contribution['TRANSACTION_AMT']=state_contribution.TRANSACTION_AMT/all_contribution
sns.heatmap(state_contribution,cmap="YlGnBu")

得到下图: 在这里插入图片描述 总共有63个州(左侧坐标按降序排列,因图片限制有一部分州未能展示出来)但从热力图可以得知总捐款的分布属于偏态分布,主要集中在CA、MA、PA等州。


5.6收到捐赠额最多的两位候选人的总捐赠额变化趋势


由前边数据得知前两名候选人分别为川普与拜登,进而筛选他们的相关信息作折线图,代码如下:


#提取有用的信息
candidate=c_itcont[(c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR')|(c_itcont['CAND_NAME']=="TRUMP, DONALD J.")]
candidate_info=candidate_info[['CAND_NAME','TRANSACTION_DT','TRANSACTION_AMT']].sort_values("TRANSACTION_DT", ascending=True)
candidate_info_trend=candidate_info.groupby(["CAND_NAME",'TRANSACTION_DT'])['TRANSACTION_AMT'].cumsum()
#制作数据透视表,对捐赠作累计
candidate_info_trend=candidate_info.pivot_table('TRANSACTION_AMT',index='TRANSACTION_DT',columns='CAND_NAME',aggfunc=sum).cumsum()
#绘图
candidate_info_trend.plot(title='Trend chart of donations for candidates')

结果如下: 在这里插入图片描述 由图从结果来反映拜登的呼声大增,为拜登的上位埋下了伏笔。更为直观地反映了特朗普的种种所为(比如疫情的管控)多方因素所造成的直接后果。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Jintao_233/article/details/111246245

随机推荐

pytorch自定义dataloder的时候,返回参数

比如我想在返回矩阵同时,也返回地址。只需要将这两个信息用字典封装起来一起返回。在train的时候用XXX[‘path’]和XXX[‘data’]调用即可。(fori,XXX...

yijun009 阅读(398)

RxJS小记

文章目录Observable创建可观察对象订阅可观察对象执行可观察对象运算符运算符使用运算符种类Subjects创建一个主题订阅主题数据传递给主题Observable和Subjects的关系行为主题重...

小小的浮萍 阅读(590)

04 css Emmet语法

Emmet语法Emmet语法前身是Zencoding,它使用缩写,来提高html/css的编写速度,VsCode内部已经集成该语法快速生成HTML结构语法快速生成CSS样式语法快速生成HTML结构语法...

旅泊 阅读(750)

mysql分页查询关键_MySQL优化教程之超大分页查询

背景基本上只要是做后台开发,都会接触到分页这个需求或者功能吧。基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的。但是一旦数据量起来了...

以史为贱 阅读(806)

【剑指offer】41. 数据流中的中位数

题目描述//41.数据流中的中位数//力扣//如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,//那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中/...

战忽局小可爱 阅读(809)