数据分析-examination-1

数据集的处理、数据探索与清晰、数据分析、数据可视化四部分

1.数据处理

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

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

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


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



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



CMTE_ID 委员会ID
NAME 捐款人姓名
CITY 捐款人所在市
State 捐款人所在州
EMPLOYER 捐款人雇主/公司
OCCUPATION 捐款人职业
# 读取候选人信息,由于原始数据没有表头,需要添加表头
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'])


# 查看目前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
# 读取个人捐赠数据,由于原始数据没有表头,需要添加表头
# 提示:读取本文件大概需要5-10s
itcont = pd.read_csv('./by_date/itcont_2020_20200712_20200723.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'])
/home/dkky528_1/anaconda3/lib/python3.8/site-packages/IPython/core/interactiveshell.py:3165: DtypeWarning: Columns (10,18) have mixed types.Specify dtype option on import or set low_memory=False.
  has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
# 将候选人与委员会关系表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行
c_itcont.head(10)
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0CARL, JERRY LEE, JRORRELL, SIDNEY J. JR.ALRETIREDRETIRED257132020REP
1CARL, JERRY LEE, JRGRIGGS, STEPHENFLAEROCARE USAPRESIDENT28007152020REP
2CARL, JERRY LEE, JRGERLING, TARAMOFAMILY FACTORPATIENT ADVOCATE2007172020REP
3CARL, JERRY LEE, JRMILLER, BOYDALCABANISS & JOHNSTONATTORNEY2507172020REP
4CARL, JERRY LEE, JRSIDDIQUI, SHAHRURHALPROSPEROUS VENTURES LLCNaN10007202020REP
5CARL, JERRY LEE, JRGALLASPY, GLENNALRETIREDRETIRED2507172020REP
6CARL, JERRY LEE, JRHOWARD, STEWART L.ALHOWARD FESTA LLPPARTNER10007132020REP
7HIGHTOWER, BILLHILLMAN, TATNALLCONaNNaN28007152020REP
8HIGHTOWER, BILLHILLMAN, TATNALLCONaNNaN28007152020REP
9HIGHTOWER, BILLWINTERSTEEN, JIMCANaNNaN28007152020REP

2. 数据探索与清洗

调用shape属性查看数据的规模,调用info函数查看数据信息,调用describe函数查看数据分布

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

(405152, 8)
# 查看整体数据信息,包括每个字段的名称、非空数量、字段的数据类型
c_itcont.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 405152 entries, 0 to 405151
Data columns (total 8 columns):
 #   Column                Non-Null Count   Dtype 
---  ------                --------------   ----- 
 0   CAND_NAME             405152 non-null  object
 1   NAME                  405152 non-null  object
 2   STATE                 405073 non-null  object
 3   EMPLOYER              369711 non-null  object
 4   OCCUPATION            392749 non-null  object
 5   TRANSACTION_AMT       405152 non-null  int64 
 6   TRANSACTION_DT        405152 non-null  int64 
 7   CAND_PTY_AFFILIATION  405152 non-null  object
dtypes: int64(2), object(6)
memory usage: 27.8+ MB
# 空值处理,统一填充 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)  # 将int类型转换为字符串类型
# 将日期格式改为年月日  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: 405152 entries, 0 to 405151
Data columns (total 8 columns):
 #   Column                Non-Null Count   Dtype 
---  ------                --------------   ----- 
 0   CAND_NAME             405152 non-null  object
 1   NAME                  405152 non-null  object
 2   STATE                 405152 non-null  object
 3   EMPLOYER              405152 non-null  object
 4   OCCUPATION            405152 non-null  object
 5   TRANSACTION_AMT       405152 non-null  int64 
 6   TRANSACTION_DT        405152 non-null  object
 7   CAND_PTY_AFFILIATION  405152 non-null  object
dtypes: int64(1), object(7)
memory usage: 27.8+ MB
# 查看数据的前三行 
c_itcont.head(3)
CAND_NAMENAMESTATEEMPLOYEROCCUPATIONTRANSACTION_AMTTRANSACTION_DTCAND_PTY_AFFILIATION
0CARL, JERRY LEE, JRORRELL, SIDNEY J. JR.ALRETIREDRETIRED252020713REP
1CARL, JERRY LEE, JRGRIGGS, STEPHENFLAEROCARE USAPRESIDENT28002020715REP
2CARL, JERRY LEE, JRGERLING, TARAMOFAMILY FACTORPATIENT ADVOCATE2002020717REP
# 查看数据集种数据类型的列的数据分布情况

c_itcont.describe()
TRANSACTION_AMT
count4.051520e+05
mean1.718179e+02
std4.972200e+03
min-5.600000e+03
25%2.000000e+01
50%3.500000e+01
75%1.000000e+02
max3.000000e+06
# 查看单列的数据发布情况
c_itcont['CAND_NAME'].describe()
count                 405152
unique                  1175
top       BIDEN, JOSEPH R JR
freq                  106303
Name: CAND_NAME, dtype: object

3.数据分析

#  计算每个党派的所获得的的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
TRANSACTION_AMT
CAND_PTY_AFFILIATION
DEM37279654
REP28282701
OTH3000215
DFL568120
IND396280
LIB63667
GRE13047
NPP2000
UNK1995
CON1492
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
TRANSACTION_AMT
CAND_NAME
BIDEN, JOSEPH R JR10149060
SULLIVAN, DAN3645743
WILSON, WILLIE3000000
TRUMP, DONALD J.2620822
JACOBS, CHRISTOPHER L.2083750
GIDEON, SARA1792023
MCSALLY, MARTHA1319246
HARRISON, JAIME1261889
KELLY, MARK1139390
GOROFF, NANCY1125116

获得捐赠最多的党派有DEM(民主党)、REP(共和党),分别对应BIDEN, JOSEPH R JR(拜登)和TRUMP, DONALD J.(特朗普)

# 查看不同职业的人的捐款的总额,然后排序,取前十位
c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
TRANSACTION_AMT
OCCUPATION
RETIRED15209674
NOT EMPLOYED9275081
NOT PROVIDED4810975
BUSINESS OWNER3299087
ATTORNEY2804185
CEO1572726
PROFESSOR1527392
HOMEMAKER1225005
PHYSICIAN1220865
PRESIDENT1013452
# 查看每个职业捐款人的数量
c_itcont['OCCUPATION'].value_counts().head(10)
RETIRED         130653
NOT EMPLOYED     94869
NOT PROVIDED     12410
ATTORNEY         10230
PHYSICIAN         6772
PROFESSOR         4308
ENGINEER          3759
CONSULTANT        3629
TEACHER           3467
SALES             2458
Name: OCCUPATION, dtype: int64

从捐款人的角度来看,RETIRED(退休人员)的总捐赠额是最多的,其次是NOT EMPLOYED(自由职业)。

# 每个州获得捐赠的总额,然后排序,取前五位。
c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(5)
TRANSACTION_AMT
STATE
CA9982172
NY7492819
IL4882727
TX4855937
FL4297560
# 查看每个州捐款人的数量
c_itcont['STATE'].value_counts().head(5)
CA    65796
TX    32606
FL    26945
NY    25910
WA    14869
Name: STATE, dtype: int64

4.数据可视化

# 为了使matplotlib图形能够内联显示
%matplotlib inline

# 导入词云库
from wordcloud import WordCloud, ImageColorGenerator

# 按州总捐款数和总捐款人数绘制柱状图

# 各州总捐款数可视化
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')
<AxesSubplot:xlabel='STATE'>

各州总捐款数可视化

# 各州捐款总人数可视化

st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>

各州捐款总人数可视化

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

# 从所有数据中取出支持拜登的数据
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)

各州对于拜登的支持

!wget https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
--2021-11-13 15:23:23--  https://img.alicdn.com/tfs/TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg
正在连接 192.168.1.20:1079... 已连接。
已发出 Proxy 请求,正在等待回应... 200 OK
长度: 4236 (4.1K) [image/jpeg]
正在保存至: “TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg”

TB10Jx4pBBh1e4jSZFh 100%[===================>]   4.14K  --.-KB/s    用时 0s    

2021-11-13 15:23:23 (384 MB/s) - 已保存 “TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg” [4236/4236])

6])

import os
os.rename('TB10Jx4pBBh1e4jSZFhXXcC9VXa-689-390.jpg', 'biden.jpg')
# 热门候选人拜登在各州的获得的捐赠占比 中我们已经取出了所有支持拜登的人的数据,存在变量: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")
<wordcloud.wordcloud.WordCloud at 0x7fc9b447ca30>

捐赠者云图

# 按州总捐款热力地图
st_amt = c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending = False)

import seaborn as sb
import matplotlib.pyplot as plt


plt.figure(figsize=(8,8))

# 热力图
# annot=True 显示数值
sb.heatmap(st_amt,annot=True)

plt.show()

按州总捐款热力地图

# 收到捐赠额最多的两位候选人的总捐赠额变化趋势
# 计算每个总统候选人所获得的捐款总额,然后排序,取前十位
firsttwo_name = c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).iloc[:2]

BIDEN = c_itcont[c_itcont["CAND_NAME"]==firsttwo_name.index[0]]
TRUMP = c_itcont[c_itcont["CAND_NAME"]==firsttwo_name.index[1]]

x= BIDEN.groupby("TRANSACTION_DT")["TRANSACTION_AMT"].sum().index
y1 = BIDEN.groupby("TRANSACTION_DT")["TRANSACTION_AMT"].sum()
y2 = TRUMP.groupby("TRANSACTION_DT")["TRANSACTION_AMT"].sum()

plt.figure(figsize=(20,8))

plt.plot(x,y1,label='BIDEN')
plt.plot(x,y2,label = 'TRUMP')
plt.legend()

plt.xlabel("TRANSACTION_DT")
plt.ylabel("TRANSACTION_AMT")

plt.xticks(rotation=45)

plt.show()

拜登和特朗普获取捐赠款数的变化

BIDEN = c_itcont[c_itcont["CAND_NAME"]=="BIDEN, JOSEPH R JR"].groupby("STATE")["TRANSACTION_AMT"].sum()

TRUMP = c_itcont[c_itcont["CAND_NAME"]=="TRUMP, DONALD J."].groupby("STATE")["TRANSACTION_AMT"].sum()

reBIDEN=BIDEN[BIDEN.index.isin(TRUMP.index)]
reTRUMP=TRUMP[TRUMP.index.isin(BIDEN.index)]
x = reBIDEN.index

plt.figure(figsize=(20,8))

bar_width = 0.4 # 条形宽度
index_reBIDEN = np.arange(len(x)) # 男生条形图的横坐标
index_reTRUMP = index_reBIDEN + bar_width # 女生条形图的横坐标

plt.bar(index_reBIDEN,reBIDEN,width=bar_width,label='BIDEN')
plt.bar(index_reTRUMP,reTRUMP,width=bar_width,label ='TRUMP')

plt.legend()
plt.xticks(index_reBIDEN + bar_width/2,x,rotation=45)
plt.xlabel("STATE")
plt.ylabel("TRANSACTION_AMT")


plt.show()

各州支持拜登和特朗普的对对比图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值