数据:https://github.com/GibZhang/datasets/blob/master/P00000001-ALL.csv.zip
引入相关库:
# coding=utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1.数据载入与总览
df= pd.read_csv('ALL.csv') //ALL.csv是竞选资助详情
在ipython交互环境输入:df.columns
Index(['cmte_id', 'cand_id', 'cand_nm', 'contbr_nm', 'contbr_city',
'contbr_st', 'contbr_zip', 'contbr_employer', 'contbr_occupation',
'contb_receipt_amt', 'contb_receipt_dt', 'receipt_desc', 'memo_cd',
'memo_text', 'form_tp', 'file_num'],
dtype='object')
其中:cand_id:竞选者编号、cand_nm:竞选者姓名、contbr_nm:捐助者姓名、contbr_city:捐助者所在城市、contbr_st:捐助者所在州、contbr_zip:捐助者邮政编码、contbr_employer:捐助者公司、contbr_occupation:捐助者职业、contb_receipt_amt:捐助金额、contb_receipt_dt:捐助时间、receipt_desc:收据描述、memo_cd:无、memo_text:无、form_tp:无
2.了解数据(缺失值处理及信息填充)
1.党派信息填充
首先我们看一下竞选者列表:unique_cand = df['cand_nm'].unique()
array(['Bachmann, Michelle', 'Romney, Mitt', 'Obama, Barack',
"Roemer, Charles E. 'Buddy' III", 'Pawlenty, Timothy',
'Johnson, Gary Earl', 'Paul, Ron', 'Santorum, Rick',
'Cain, Herman', 'Gingrich, Newt', 'McCotter, Thaddeus G',
'Huntsman, Jon', 'Perry, Rick'], dtype=object)
由于数据中没有竞选者的党派信息,而该信息在竞选过程中又有一定的意义,因此我们将对应的党派信息用字典保存并加入读取的dataframe中。
parties= {'Bachmann, Michelle':'Republican',
'Cain, Herman':'Republican',
'Gingrich, Newt':'Republican',
'Huntsman, Jon':'Republican',
'Johnson, Gary Earl':'Republican',
'McCotter, Thaddeus G':'Republican',
'Obama, Barack':'Democrat',
'Paul, Ron':'Republican',
'Pawlenty, Timothy':'Republican',
'Perry, Rick':'Republican',
"Roemer, Charles E. 'Buddy' III":'Republican',
'Romney, Mitt':'Republican',
'Santorum, Rick':'Republican'}
利用pandas的map命令将党派数据加入数据表中:df['party']=df['cand_nm'].map(parties)
再来查看df的基本信息:df.columns
Index(['cmte_id', 'cand_id', 'cand_nm', 'contbr_nm', 'contbr_city',
'contbr_st', 'contbr_zip', 'contbr_employer', 'contbr_occupation',
'contb_receipt_amt', 'contb_receipt_dt', 'receipt_desc', 'memo_cd',
'memo_text', 'form_tp', 'file_num', 'party'],
dtype='object'),党派信息已成功插入。
2.由于df中某些参数并没有特别有价值的信息(cmte_id,file_num,form_tp,contbr_zip等),还有些信息存在冗余(cand_id与cand_nm都表示竞选者,cand_id冗余),因此我们将这些信息移除。
>>> dt =df.drop(labels=['cmte_id', 'cand_id','contbr_zip','form_tp', 'file_num'],axis=1)
3.数据缺失值处理
我们注意到contbr_city、contbr_st、contbr_employer、contbr_occupation、receipt_desc、memo_cd、memo_text数据均存在缺失。由于这些数据并非数值数据,且这些数据所在列,并非异常数据,仅仅可能是由于登记不全,所以我们可以在这些缺失的数据设置默认值。
dt['contbr_employer'].fillna('NOT PROVIDED',inplace=True)
dt['contbr_occupation'].fillna('NOT PROVIDED',inplace=True)
dt['memo_text'].fillna('default',inplace=True)
dt['memo_cd'].fillna('default',inplace=True)
dt['receipt_desc'].fillna('default',inplace=True)
3.数据基本性质初窥(数据探索)
>>> dt['cand_nm'].value_counts()
可以看出捐助Obama竞选的人达到了593746人,远远超过排在第二、第三,甚至人数超过了其他所有人数之和。Obama看来真的当之无愧是人民心中的总统人选。
>>> dt['contbr_occupation'].value_counts()[:20]
从出资额表中,可以看到出资额最小值为-30800,这是由于有些退款事项。我们关注出资额大与0的部分数据。从数据可以看出,出资额方差很大,说明出资额非常分散,其中,中值为100,75%分位线位250,而平均值为298,可以看出大部分人,
>>> data= dt[dt['contb_receipt_amt']>0]
查看不同候选人获得资助情况:
>>> data.groupby('cand_nm')['contb_receipt_amt'].sum().sort_values(ascending=False)
从上面可以看到,Obama,Barack和Romney,Mitt获得资金额度最多,他们两个是大选热门。因此在下一部分,我们会针对这两个人的数据进行对比分析。
4.数据可视化
数据可视化是数据分析中的一项重要工作,它可以帮助我们快速清晰的了解数据的特征。现在我们对第3部分的单项数据特征以及接下来的不同数据之间的特征进行挖掘。
>>> byocc =pd.pivot_table(data,values=['contb_receipt_amt'],index=['contbr_occupation'],columns=['party'],aggfunc='sum')
>>> byocc[byocc.sum(axis=1)>2000000]
从上图看出,代理人、律师、医生、教授等职业主要倾向于支持民主党,而公司CEO,企业主、投资人、Owner、自我创业者等职业主要倾向于资助共和党,这可能和这两个党派所支持的利益有关,可以关注候选人在这方面的政策倾向等。
下面我们分析给予Obama,Barack和Romney,Mitt资助额最大的前几个职业
def get_top_amounts(group, key, n=5):
totals = group.groupby(key)['contb_receipt_amt'].sum()
return totals.nlargest(n)
cand_nm_grouped= cand_nm_dt.groupby('cand_nm')
cand_amt= cand_nm_grouped.apply(get_top_amounts,'contbr_occupation',10)
可以看出,支持Obama的职业排名靠前的主要是医生、律师、咨询师、教授等社会精英,而支持Romney的职业则主要为企业CEO,企业主等。
Obama:微软、盛德国际律师事务所; Romney:瑞士瑞信银行、摩根斯坦利、高盛公司、巴克莱资本、H.I.G.资本。
出资额分布分析:
bins= np.array([0,1,100,1000,10000,100000,1000000])
labels = pd.cut(dt['contb_receipt_amt'],bins)
现在可根据候选人姓名对obama和Romney进行分组,已得到一个对比图。
从上图可以看出,对于小额出资者人数而言,支持Obama的人数远远多于第二位候选人Romney。从这里也可以看出Obama真的是民心所向,深得广大人民的支持。
另外,从各州的投票情况看,在出资额最多的10个州,Obama都要领先于Romney,特别是在PA、MD、MA、IL、CA这些州,这种优势更加明显。
从投资人出资情况看,也可以发现,越是临近大选,出资人额度越大,竞争也更加白热化,充分说明了美国大选真的是极其烧钱的,要想获得大选的胜利,不仅要有人脉,而且要有资金支持。