原文:
https://tianchi.aliyun.com/notebook-ai/detail?&postId=137714
1.1 前言
本文通过Pandas分析了美国选民2020.7.22-2020.8.20期间的75w+条捐赠数据,分析揭秘美国选民对总统候选人的喜好,主要带领读者利用Python进行数据分析以及数据可视化,包含数据集的处理、数据探索与清晰、数据分析、数据可视化四部分,利用pandas、matplotlib、wordcloud等第三方库带大家玩转数据分析~
项目地址:
https://tianchi.aliyun.com/competition/entrance/531837/introduction
1.2 数据集来源介绍
「所有候选人信息(
weball20.txt
)」
该文件为每个候选人提供一份记录,并显示候选人的信息、总收入、从授权委员会收到的转账、付款总额、给授权委员会的转账、库存现金总额、贷款和债务以及其他财务汇总信息。
数据字段描述详细:https://www.fec.gov/campaign-finance-data/all-candidates-file-description/
关键字段说明
CAND_PTY_AFFILIATION 候选人党派
数据来源:https://www.fec.gov/files/bulk-downloads/2020/weball20.zip
「候选人委员会链接信息(
ccl.txt
)」
该文件显示候选人的身份证号码、候选人的选举年份、联邦选举委员会选举年份、委员会识别号、委员会类型、委员会名称和链接标识号。
信息描述详细:https://www.fec.gov/campaign-finance-data/candidate-committee-linkage-file-description/
关键字段说明
数据来源:https://www.fec.gov/files/bulk-downloads/2020/ccl20.zip
「个人捐款档案信息(
itcont_2020_20200722_20200820.txt
)」
【注意】由于文件较大,本数据集只包含2020.7.22-2020.8.20的相关数据,如果需要更全数据可以通过数据来源中的地址下载。
该文件包含有关收到捐款的委员会、披露捐款的报告、提供捐款的个人、捐款日期、金额和有关捐款的其他信息。
信息描述详细:https://www.fec.gov/campaign-finance-data/contributions-individuals-file-description/
关键字段说明
数据来源:https://www.fec.gov/files/bulk-downloads/2020/indiv20.zip
1.3 需要提前安装的包
# 安装词云处理包wordcloud pip install wordcloud# 数据可视化包matplotlib pip install matplotlib# 数据处理包pandas pip install pandas
1.4 需要提前下载好数据集
「方法一:」
本文相关数据集国内下载地址如下,访问后即可直接下载到本地:
https://tianchi.aliyun.com/dataset/dataDetail?dataId=79412
然后在本地复现本文案例代码;
「方法二:」
你也可以直接点击
「阅读原文」
或
「访问下方链接」
报名参与相关学习赛:
https://tianchi.aliyun.com/competition/entrance/531837/introduction
然后
Fork
赛事论坛的baseline到你的天池实验室,并点击
编辑
按钮就可以成功跳转到DSW在线编程环境了,你可以直接在哪里进行编程和数据集下载,更加方便。本案例数据集
2020_US_President_political_contributions
。
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' ])
数据字段说明:
CAND_PTY_AFFILIATION:候选人党派
# 查看目前ccl数据前10行 ccl.head(10 )
CMTE_ID
CAND_ID
CAND_NAME
CAND_PTY_AFFILIATION
0
C00697789
H0AL01055
CARL, JERRY LEE, JR
REP
1
C00701557
H0AL01063
LAMBERT, DOUGLAS WESTLEY III
REP
2
C00701409
H0AL01071
PRINGLE, CHRISTOPHER PAUL
REP
3
C00703066
H0AL01089
HIGHTOWER, BILL
REP
4
C00708867
H0AL01097
AVERHART, JAMES
DEM
5
C00710947
H0AL01105
GARDNER, KIANI A
DEM
6
C00722512
H0AL01121
CASTORANI, JOHN
REP
7
C00725069
H0AL01139
COLLINS, FREDERICK G. RICK'
DEM
8
C00462143
H0AL02087
ROBY, MARTHA
REP
9
C00493783
H0AL02087
ROBY, MARTHA
REP
2.2 将候选人和捐赠人一一对应,通过
CMTE_ID
关联两个表
通过
CMTE_ID
将目前处理好的候选人和委员会关系表与人捐款档案表进行关联,得到候选人与捐赠人一一对应联系表
cil
。
python基础 爬虫、数据分析
# 读取个人捐赠数据,由于原始数据没有表头,需要添加表头 # 提示:读取本文件大概需要5-10s itcont = pd.read_csv('itcont_2020_20200722_20200820.txt' , sep='|' ,names=['CMTE_ID' ,'AMNDT_IND' ,'RPT_TP' ,'TRANSACTION_PGI' , 'IMAGE_NUM' ,'TRANSACTION_TP' ,'ENTITY_TP' ,'NAME' ,'CITY' , 'STATE' ,'ZIP_CODE' ,'EMPLOYER' ,'OCCUPATION' ,'TRANSACTION_DT' , 'TRANSACTION_AMT' ,'OTHER_ID' ,'TRAN_ID' ,'FILE_NUM' ,'MEMO_CD' , 'MEMO_TEXT' ,'SUB_ID' ])
/opt/conda/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3058: DtypeWarning: Columns (10,15,16,18) have mixed types. Specify dtype option on import or set low_memory=False. interactivity=interactivity, compiler=compiler, result=result)
# 将候选人与委员会关系表ccl和个人捐赠数据表itcont合并,通过 CMTE_ID c_itcont = pd.merge(ccl,itcont)# 提取需要的数据列 c_itcont = pd.DataFrame(c_itcont, columns=[ 'CAND_NAME' ,'NAME' , 'STATE' ,'EMPLOYER' ,'OCCUPATION' , 'TRANSACTION_AMT' , 'TRANSACTION_DT' ,'CAND_PTY_AFFILIATION' ])
「数据说明」
TRANSACTION_AMT – 捐赠数额(美元)
CAND_PTY_AFFILIATION – 候选人党派
# 查看目前数据前10行 c_itcont.head(10 )
CAND_NAME
NAME
STATE
EMPLOYER
OCCUPATION
TRANSACTION_AMT
TRANSACTION_DT
CAND_PTY_AFFILIATION
0
MORGAN, JOSEPH DAVID
MARTIN, WILLIAM II
AZ
RETIRED
RETIRED
100
7242020
REP
1
MORGAN, JOSEPH DAVID
RODRIGUEZ, GERARDO
AZ
VA HOSPITAL
LAB TECH
40
7242020
REP
2
MORGAN, JOSEPH DAVID
RODRIGUEZ, GERARDO
AZ
VA HOSPITAL
LAB TECH
40
7312020
REP
3
WOOD, DANIEL
HOPKINS, RICHARD
AZ
POWERS-LEAVITT
INSURANCE AGENT
300
8102020
REP
4
WOOD, DANIEL
PENDLETON, DIANE
AZ
UNEMPLOYED
NaN
500
8072020
REP
5
WOOD, DANIEL
PREVATT, WILLIAM
AZ
SELF-EMPLOYED
DVM
500
7312020
REP
6
WOOD, DANIEL
HARDING, DOUG
AZ
MICROSURE
OPERATIONS MANAGER
2800
8102020
REP
7
WOOD, DANIEL
HARDING, MARI
AZ
NaN
NaN
1400
8152020
REP
8
WOOD, DANIEL
HEDGER, CYNTHIA
TX
NaN
NaN
200
7312020
REP
9
HUANG, PEGGY
HUANG - PERSONAL FUNDS, PEGGY
CA
OFFICE OF THE ATTORNEY GENERAL
DEPUTY ATTORNEY GENERAL
2600
7252020
REP
3、数据探索与清洗
进过数据处理部分,我们获得了可用的数据集,现在我们可以利用调用
shape
属性查看数据的规模,调用
info
函数查看数据信息,调用
describe
函数查看数据分布。
# 查看数据规模 多少行 多少列 c_itcont.shape
(756205, 8)
# 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型 c_itcont.info()
Int64Index: 756205 entries, 0 to 756204 Data columns (total 8 columns): CAND_NAME 756205 non-null object NAME 756205 non-null object STATE 756160 non-null object EMPLOYER 737413 non-null object OCCUPATION 741294 non-null object TRANSACTION_AMT 756205 non-null int64 TRANSACTION_DT 756205 non-null int64 CAND_PTY_AFFILIATION 756205 non-null object dtypes: int64(2), object(6) memory usage: 51.9+ MB
通过上面的探索我们知道目前数据集的一些基本情况,目前数据总共有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()
Int64Index: 756205 entries, 0 to 756204 Data columns (total 8 columns): CAND_NAME 756205 non-null object NAME 756205 non-null object STATE 756205 non-null object EMPLOYER 756205 non-null object OCCUPATION 756205 non-null object TRANSACTION_AMT 756205 non-null int64 TRANSACTION_DT 756205 non-null object CAND_PTY_AFFILIATION 756205 non-null object dtypes: int64(1), object(7) memory usage: 51.9+ MB
# 查看数据前3行 c_itcont.head(3 )
CAND_NAME
NAME
STATE
EMPLOYER
OCCUPATION
TRANSACTION_AMT
TRANSACTION_DT
CAND_PTY_AFFILIATION
0
MORGAN, JOSEPH DAVID
MARTIN, WILLIAM II
AZ
RETIRED
RETIRED
100
2020724
REP
1
MORGAN, JOSEPH DAVID
RODRIGUEZ, GERARDO
AZ
VA HOSPITAL
LAB TECH
40
2020724
REP
2
MORGAN, JOSEPH DAVID
RODRIGUEZ, GERARDO
AZ
VA HOSPITAL
LAB TECH
40
2020731
REP
# 查看数据表中数据类型的列的数据分布情况 c_itcont.describe()
TRANSACTION_AMT
count
7.562050e+05
mean
1.504307e+02
std
2.320452e+03
min
-5.600000e+03
25%
2.000000e+01
50%
3.500000e+01
75%
1.000000e+02
max
1.500000e+06
# 查看单列的数据发布情况 c_itcont['CAND_NAME' ].describe()
count 756205 unique 312 top BIDEN, JOSEPH R JR freq 507816 Name: CAND_NAME, dtype: object
4、数据分析
# 计算每个党派的所获得的捐款总额,然后排序,取前十位 c_itcont.groupby("CAND_PTY_AFFILIATION" ).sum().sort_values("TRANSACTION_AMT" ,ascending=False ).head(10 )
TRANSACTION_AMT
CAND_PTY_AFFILIATION
DEM
75961730
REP
37170653
IND
328802
LIB
169202
DFL
76825
GRE
18607
NON
11256
UNK
10195
CON
4117
BDY
3250
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位 c_itcont.groupby("CAND_NAME" ).sum().sort_values("TRANSACTION_AMT" ,ascending=False ).head(10 )
TRANSACTION_AMT
CAND_NAME
BIDEN, JOSEPH R JR
68111142
TRUMP, DONALD J.
16594982
SULLIVAN, DAN
9912465
JACOBS, CHRISTOPHER L.
6939209
BLOOMBERG, MICHAEL R.
3451916
MARKEY, EDWARD J. SEN.
606832
SHAHEEN, JEANNE
505446
KENNEDY, JOSEPH P III
467738
CORNYN, JOHN SEN
345959
FIGLESTHALER, WILLIAM MATTHEW MD
258221
获得捐赠最多的党派有
DEM(民主党)
、
REP(共和党)
,分别对应
BIDEN, JOSEPH R JR(拜登)
和
TRUMP, DONALD J.(特朗普)
,从我们目前分析的2020.7.22-2020.8.20这一个月的数据来看,在选民的捐赠数据中拜登代表的民主党完胜特朗普代表的共和党,由于完整数据量过大,所以没有对所有数据进行汇总分析,因此也不能确定11月大选公布结果就一定是拜登当选
# 查看不同职业的人捐款的总额,然后排序,取前十位 c_itcont.groupby('OCCUPATION' ).sum().sort_values("TRANSACTION_AMT" ,ascending=False ).head(10 )
TRANSACTION_AMT
OCCUPATION
NOT EMPLOYED
24436214
RETIRED
18669950
NOT PROVIDED
5089355
ATTORNEY
4443569
FOUNDER
3519109
PHYSICIAN
3295595
CONSULTANT
1647033
LAWYER
1565976
PROFESSOR
1481260
EXECUTIVE
1467865