数据分析入门活动赛事,利用Pandas分析美国选民总统喜爱

本次赛事由开源学习组织Datawhale主办,主要带领学习者利用Python进行数据分析以及数据可视化,包含数据集的处理、数据探索与清晰、数据分析、数据可视化四部分,利用pandas、matplotlib、wordcloud等第三方库带大家玩转数据分析

1.3 需要提前安装的包

# 安装词云处理包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)

CMTE_IDCAND_IDCAND_NAMECAND_PTY_AFFILIATION
0C00697789H0AL01055CARL, JERRY LEE, JRREP
1C00701557H0AL01063LAMBERT, DOUGLAS WESTLEY IIIREP
2C00701409H0AL01071PRINGLE, CHRISTOPHER PAULREP
3C00703066H0AL01089HIGHTOWER, BILLREP
4C00708867H0AL01097AVERHART, JAMESDEM
5C00710947H0AL01105GARDNER, KIANI ADEM
6C00722512H0AL01121CASTORANI, JOHNREP
7C00725069H0AL01139COLLINS, FREDERICK G. RICK'DEM
8C00462143H0AL02087ROBY, MARTHAREP
9C00493783H0AL02087ROBY, MARTHAREP

将候选人和捐赠人一一对应,通过CMTE_ID关联两个表

通过CMTE_ID将目前处理好的候选人和委员会关系表与人捐款档案表进行关联,得到候选人与捐赠人一一对应联系表cil

# 读取个人捐赠数据,由于原始数据没有表头,需要添加表头
# 提示:读取本文件大概需要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'])

# 将候选人与委员会关系表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'])

数据说明

  • CAND_NAME – 接受捐赠的候选人姓名
  • NAME – 捐赠人姓名
  • STATE – 捐赠人所在州
  • EMPLOYER – 捐赠人所在公司
  • OCCUPATION – 捐赠人职业
  • TRANSACTION_AMT – 捐赠数额(美元)
  • TRANSACTION_DT – 收到捐款的日期
  • CAND_PTY_AFFILIATION – 候选人党派
# 查看目前数据前10行
 
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0MORGAN, JOSEPH DAVIDMARTIN, WILLIAM IIAZRETIREDRETIRED1007242020REP
1MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH407242020REP
2MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH407312020REP
3WOOD, DANIELHOPKINS, RICHARDAZPOWERS-LEAVITTINSURANCE AGENT3008102020REP
4WOOD, DANIELPENDLETON, DIANEAZUNEMPLOYEDNaN5008072020REP
5WOOD, DANIELPREVATT, WILLIAMAZSELF-EMPLOYEDDVM5007312020REP
6WOOD, DANIELHARDING, DOUGAZMICROSUREOPERATIONS MANAGER28008102020REP
7WOOD, DANIELHARDING, MARIAZNaNNaN14008152020REP
8WOOD, DANIELHEDGER, CYNTHIATXNaNNaN2007312020REP
9HUANG, PEGGYHUANG - PERSONAL FUNDS, PEGGYCAOFFICE OF THE ATTORNEY GENERALDEPUTY ATTORNEY GENERAL26007252020REP

,

3、数据探索与清洗

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

# 查看数据规模 多少行 多少列
c_itcont.shape
(756205, 8)
# 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型
c_itcont.info()
<class 'pandas.core.frame.DataFrame'>

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,STATEEMPLOYEROCCUPATION有缺失值,另外日期列目前为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()
<class 'pandas.core.frame.DataFrame'>

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_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0MORGAN, JOSEPH DAVIDMARTIN, WILLIAM IIAZRETIREDRETIRED1002020724REP
1MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020724REP
2MORGAN, JOSEPH DAVIDRODRIGUEZ, GERARDOAZVA HOSPITALLAB TECH402020731REP

,

# 查看数据表中数据类型的列的数据分布情况
c_itcont.describe()

[44]:

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

TRANSACTION_AMT
count7.562050e+05
mean1.504307e+02
std2.320452e+03
min-5.600000e+03
25%2.000000e+01
50%3.500000e+01
75%1.000000e+02
max1.500000e+06
c_itcont['CAND_NAME'].describe()

[45]:

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
DEM75961730
REP37170653
IND328802
LIB169202
DFL76825
GRE18607
NON11256
UNK10195
CON4117
BDY3250
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

TRANSACTION_AMT
CAND_NAME
BIDEN, JOSEPH R JR68111142
TRUMP, DONALD J.16594982
SULLIVAN, DAN9912465
JACOBS, CHRISTOPHER L.6939209
BLOOMBERG, MICHAEL R.3451916
MARKEY, EDWARD J. SEN.606832
SHAHEEN, JEANNE505446
KENNEDY, JOSEPH P III467738
CORNYN, JOHN SEN345959
FIGLESTHALER, WILLIAM MATTHEW MD258221

,

获得捐赠最多的党派有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 EMPLOYED24436214
RETIRED18669950
NOT PROVIDED5089355
ATTORNEY4443569
FOUNDER3519109
PHYSICIAN3295595
CONSULTANT1647033
LAWYER1565976
PROFESSOR1481260
EXECUTIVE1467865
# 查看每个职业捐款人的数量
c_itcont['OCCUPATION'].value_counts().head(10)
NOT EMPLOYED    224109
,RETIRED         151834
,ATTORNEY         19666
,NOT PROVIDED     14912
,PHYSICIAN        14033
,CONSULTANT        8333
,PROFESSOR         8022
,TEACHER           8013
,ENGINEER          7922
,SALES             6435
,Name: OCCUPATION, dtype: int64

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

# 每个州获捐款的总额,然后排序,取前五位
c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False).head(5)

, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

TRANSACTION_AMT
STATE
CA19999115
NY11468537
FL8128789
TX8101871
MA5187957
# 查看每个州捐款人的数量
c_itcont['STATE'].value_counts().head(5)

[51]:

CA    127895
,TX     54457
,FL     54343
,NY     49453
,MA     29314
,Name: STATE, dtype: int64

最后查看每个州的捐款总金额,我们会发现CA(加利福利亚)NY(纽约)FL(弗罗里达)这几个州的捐款是最多的,在捐款人数上也是在Top端,另一方面也凸显出这些州的经济水平发达。 大家也可以通过数据查看下上面列举的高端职业在各州的分布情况,进行进一步的分析探索。

4、数据可视化

首先导入相关Python库

# 导入matplotlib中的pyplot
import matplotlib.pyplot as plt
%matplotlib inline
# 导入词云库
from wordcloud import WordCloud,ImageColorGenerator

4.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')

[53]:

<AxesSubplot:xlabel='STATE'>

4.2 各州捐款总人数可视化

# 各州捐款总人数可视化,取前10个州的数据
st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>

4.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)
array([<AxesSubplot:ylabel='TRANSACTION_AMT'>], dtype=object)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值