Python训练营—task04
题目说明:
1、数据准备
1.1 数据集来源介绍
所有候选人信息
该文件为每个候选人提供一份记录,并显示候选人的信息、总收入、从授权委员会收到的转账、付款总额、给授权委员会的转账、库存现金总额、贷款和债务以及其他财务汇总信息。
数据字段描述详细: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
2、数据处理
对于数据处理前,我们需要知道最终想要的数据是什么样的,因想分析候选人与捐赠人之间的关系,所以我们想要一张数据表中有捐赠人与候选人一一对应的关系,所以需要将目
前的三张数据表进行一一关联,汇总得到需要的数据集。
因候选人和委员会的联系表中均无候选人姓名,只有候选人ID(CAND_ID
),所以需要通过CAND_ID
从候选人表中获取到候选人姓名,最终得到候选人与委员会联系表ccl
。
1 # 导入相关处理包 2 import pandas as pd 3 # 读取候选人信息,由于原始数据没有表头,需要添加表头 4 candidates = pd.read_csv("weball20.txt", sep = '|',names=['CAND_ID','CAND_NAME','CAND_ICI','PTY_CD','CAND_PTY_AFFILIATION','TTL_RECEIPTS', 5 'TRANS_FROM_AUTH','TTL_DISB','TRANS_TO_AUTH','COH_BOP','COH_COP','CAND_CONTRIB', 6 'CAND_LOANS','OTHER_LOANS','CAND_LOAN_REPAY','OTHER_LOAN_REPAY','DEBTS_OWED_BY', 7 'TTL_INDIV_CONTRIB','CAND_OFFICE_ST','CAND_OFFICE_DISTRICT','SPEC_ELECTION','PRIM_ELECTION','RUN_ELECTION' 8 ,'GEN_ELECTION','GEN_ELECTION_PRECENT','OTHER_POL_CMTE_CONTRIB','POL_PTY_CONTRIB', 9 'CVG_END_DT','INDIV_REFUNDS','CMTE_REFUNDS']) 10 11 # 读取候选人和委员会的联系信息 12 ccl = pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID']) 13 14 # 关联两个表数据 15 ccl = pd.merge(ccl,candidates) 16 # 提取出所需要的列 17 ccl = pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])
新表cll字段说明:
- CMTE_ID:委员会ID
- CAND_ID:候选人ID
- CAND_NAME:候选人姓名
- CAND_PTY_AFFILIATION:候选人党派
2.2 将候选人和捐赠人一一对应,通过CMTE_ID
关联两个表
通过CMTE_ID
将目前处理好的候选人和委员会关系表与人捐款档案表进行关联,得到候选人与捐赠人一一对应联系表cil
。
1 # 读取个人捐赠数据,由于原始数据没有表头,需要添加表头 2 itcont = pd.read_csv('itcont_2020_20200722_20200820.txt', sep='|',names=['CMTE_ID','AMNDT_IND','RPT_TP','TRANSACTION_PGI', 3 'IMAGE_NUM','TRANSACTION_TP','ENTITY_TP','NAME','CITY', 4 'STATE','ZIP_CODE','EMPLOYER','OCCUPATION','TRANSACTION_DT', 5 'TRANSACTION_AMT','OTHER_ID','TRAN_ID','FILE_NUM','MEMO_CD', 6 'MEMO_TEXT','SUB_ID'])
1 # 将候选人与委员会关系表ccl和个人捐赠数据表itcont合并,通过 CMTE_ID 2 ccl_itcont = pd.merge(ccl,itcont) 3 # 提取需要的数据列 4 ccl_itcont = pd.DataFrame(ccl_itcont, columns=[ 'CAND_NAME','NAME', 'STATE','EMPLOYER','OCCUPATION', 5 'TRANSACTION_AMT', 'TRANSACTION_DT','CAND_PTY_AFFILIATION'])
新表ccl_itcont字段说明:
- CAND_NAME – 接受捐赠的候选人姓名
- NAME – 捐赠人姓名
- STATE – 捐赠人所在州
- EMPLOYER – 捐赠人所在公司
- OCCUPATION – 捐赠人职业
- TRANSACTION_AMT – 捐赠数额(美元)
- TRANSACTION_DT – 收到捐款的日期
- CAND_PTY_AFFILIATION – 候选人党派
3、数据清洗探索分析
经过上面的数据合并处理后获得了可用的数据集,现在我们可以利用调用shape
属性查看数据的规模,调用info
函数查看数据信息,调用describe
函数查看数据分布。
1 cll_itcont.shape #(756205, 8) 2 3 # 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型 4 c_itcont.info()
Int64Index: 756205 entries, 0 to 756204 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 CAND_NAME 756205 non-null object 1 NAME 756205 non-null object 2 STATE 756160 non-null object 3 EMPLOYER 737413 non-null object 4 OCCUPATION 741294 non-null object 5 TRANSACTION_AMT 756205 non-null int64 6 TRANSACTION_DT 756205 non-null int64 7 CAND_PTY_AFFILIATION 756205 non-null object dtypes: int64(2), object(6)
通过上面的显示可以看出数据总共有756205行,8列,STATE
、EMPLOYER
、OCCUPATION
有缺失值,另外日期列目前为int64类型,需要进行转换为str类型。
1 #空值处理,统一填充 nonumber 2 cll_itcont['STATE'].fillna(' nonumber',inplace=True) 3 cll_itcont['EMPLOYER'].fillna(' nonumber',inplace=True) 4 cll_itcont['OCCUPATION'].fillna(' nonumber',inplace=True) 5 6 # 对日期TRANSACTION_DT列进行处理 7 cll_itcont['TRANSACTION_DT'] = cll_itcont['TRANSACTION_DT'] .astype(str) 8 # 将日期格式改为年月日 7242020 9 cll_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in cll_itcont['TRANSACTION_DT'] ] 10 11 # 再次查看数据信息 12 cll_itcont.info()
1 # 查看数据表中数据类型的列的数据分布情况 2 cll_itcont.describe()
3、数据分析汇总
1)每个党派捐款总额排序
1 # 计算每个党派的所获得的捐款总额,然后排序,取前十位 2 cll_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
2)总统候选人获得的捐款总额排序
1 # 计算每个总统候选人所获得的捐款总额,然后排序,取前十位 2 cll_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这一个月的数据来看,
在选民的捐赠数据中拜登代表的民主党完胜特朗普代表的共和党,由于完整数据量过大,所以没有对所有数据进行汇总分析,因此也不能确定最终大选公布结果就一定是拜登当选。
3)不同职业的人的捐款总额
1 # 查看不同职业的人捐款的总额,然后排序,取前十位 2 cll_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
4)不同职业捐款人的数量
1 # 查看每个职业捐款人的数量 2 cll_itcont['OCCUPATION'].value_counts().head(10)
从捐款人的职业这个角度分析,会发现NOT EMPLOYED(自由职业)
的总捐赠额是最多,通过查看每个职业捐赠的人数来看,我们就会发现是因为NOT EMPLOYED(自由职业)
人数多的原因,
另外退休人员捐款人数也特别多,所以捐款总数对应的也多,其他比如像:律师、创始人、医生、顾问、教授、主管这些高薪人才虽然捐款总人数少,但是捐款总金额也占据了很大比例。
4、数据可视化分析
导入相关的库
1 # 导入matplotlib中的pyplot 2 import matplotlib.pyplot as plt 3 # 为了使matplotlib图形能够内联显示 4 %matplotlib inline
1)州维度展示总捐款人数及捐款总额
1 # 各州总捐款数可视化 2 st_amt = cll_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False)[:10] 3 st_amt=pd.DataFrame(st_amt, columns=['TRANSACTION_AMT']) 4 st_amt.plot(kind='bar')
1 # 各州捐款总人数可视化,取前10个州的数据 2 st_amt = cll_itcont.groupby('STATE').size().sort_values(ascending=False).head(10) 3 st_amt.plot(kind='bar')
2)候选人拜登在各州的获得的捐赠占比
1 # 从所有数据中取出支持拜登的数据 2 biden = cll_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR'] 3 # 统计各州对拜登的捐款总数 4 biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10) 5 # 饼图可视化各州捐款数据占比 6 biden_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)