利用python进行数据分析-14.5 2012美国大选数据分析(基础复习)
美国大选数据分析
- 导入数据及相关库
- 数据清洗
- 填充缺失值
- 数据转换
- 面元化数据(分桶)
- 数据聚合与分组运算
- 时间处理
- str转datetime(datetime为时间序列数据类型)
- 重新采样和频率转换
导入数据及相关库
#import相关的库
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsdf = pd.read_csv('datasets/fec/P00000001-ALL.csv')
df.head()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
0 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 250.0 20-JUN-11 NaN NaN NaN SA17A 736166
1 C00410118 P20002978 Bachmann, Michelle HARVEY, WILLIAM MOBILE AL 3.6601e+08 RETIRED RETIRED 50.0 23-JUN-11 NaN NaN NaN SA17A 736166
2 C00410118 P20002978 Bachmann, Michelle SMITH, LANIER LANETT AL 3.68633e+08 INFORMATION REQUESTED INFORMATION REQUESTED 250.0 05-JUL-11 NaN NaN NaN SA17A 749073
3 C00410118 P20002978 Bachmann, Michelle BLEVINS, DARONDA PIGGOTT AR 7.24548e+08 NONE RETIRED 250.0 01-AUG-11 NaN NaN NaN SA17A 749073
4 C00410118 P20002978 Bachmann, Michelle WARDENBURG, HAROLD HOT SPRINGS NATION AR 7.19016e+08 NONE RETIRED 300.0 20-JUN-11 NaN NaN NaN SA17A 736166
取几个典型特征分析
df1 = df[["cand_nm","contbr_nm","contbr_st","contbr_employer","contbr_occupation","contb_receipt_amt","contb_receipt_dt"]]
df1.head()cand_nm contbr_nm contbr_st contbr_employer contbr_occupation contb_receipt_amt contb_receipt_dt
0 Bachmann, Michelle HARVEY, WILLIAM AL RETIRED RETIRED 250.0 20-JUN-11
1 Bachmann, Michelle HARVEY, WILLIAM AL RETIRED RETIRED 50.0 23-JUN-11
2 Bachmann, Michelle SMITH, LANIER AL INFORMATION REQUESTED INFORMATION REQUESTED 250.0 05-JUL-11
3 Bachmann, Michelle BLEVINS, DARONDA AR NONE RETIRED 250.0 01-AUG-11
4 Bachmann, Michelle WARDENBURG, HAROLD AR NONE RETIRED 300.0 20-JUN-11
简单总览数据情况
#查看数据框形状
df1.shape#查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型
df1.info
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1001731 entries, 0 to 1001730
Data columns (total 7 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 cand_nm 1001731 non-null object 1 contbr_nm 1001731 non-null object 2 contbr_st 1001727 non-null object 3 contbr_employer 988002 non-null object 4 contbr_occupation 993301 non-null object 5 contb_receipt_amt 1001731 non-null float646 contb_receipt_dt 1001731 non-null object
dtypes: float64(1), object(6)
各字段含义
cand_nm – 接受捐赠的候选人姓名
contbr_nm – 捐赠人姓名
contbr_st – 捐赠人所在州
contbr_employer – 捐赠人所在公司
contbr_occupation – 捐赠人职业
contb_receipt_amt – 捐赠数额(美元)
contb_receipt_dt – 收到捐款的日期
#对数据进行统计性分析
df1.describe
数据清洗
填充缺失值
#从data.info()得知,contbr_employer、contbr_occupation均有少量缺失值,均填充为NOT PROVIDED
data['contbr_employer'].fillna('NOT PROVIDED',inplace=True)
data['contbr_occupation'].fillna('NOT PROVIDED',inplace=True)
数据转换
针对"cand_nm 候选人姓名"这一条特征,我们查看他的所有名单(pd.Series.value_counts()),
并用字典标明是属于共和党还是民主党
df1["cand_nm"].value_counts() #显示这一特征下不同类别的数量
Obama, Barack 593746
Paul, Ron 143757
Romney, Mitt 107229
Gingrich, Newt 47679
Santorum, Rick 46559
Cain, Herman 20107
Perry, Rick 13575
Bachmann, Michelle 13140
Roemer, Charles E. 'Buddy' III 5920
Pawlenty, Timothy 4555
Huntsman, Jon 4156
Johnson, Gary Earl 1234
McCotter, Thaddeus G 74
Name: cand_nm, dtype: int64
df['cand_nm'].unique() 也可以查看这一列的不同值,返回值为一维数组
#建立字典标明对应党派
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'}
#通过pd.Series.map()函数添加一列存储党派信息
df1["party"] = df1["cand_nm"].map(parties)
df1.groupby('party').sum() #查看不同党派贡献金额contb_receipt_amt
party
Democrat 1.335026e+08
Republican 1.652488e+08
#查看两党得票数
df1['party'].value_counts()
Democrat 593746
Republican 407985
Name: party, dtype: int64
发现Republican(共和党)接受的赞助总金额更高,Democrat(民主党)获得的赞助次数更多一些
#为了简化分析,我们将范围控制在contb_receipt_amt>0中
df2= df1[df1["contb_receipt_amt"]>0]
由于奥巴马和罗姆尼为两个主要候选人,因此准备一个仅对他们有贡献的子集
df_lmab = df2[df2['cand_nm'].isin(['Obama, Barack','Romney, Mitt'])]
排序:按照职业汇总对赞助总金额进行排序
根据职业分析捐赠是一个常见的统计分析:律师倾向于捐更多的钱给民主党,商务人士更偏向与共和党
#DataFrame.sort_values(by, ascending=True, inplace=False)
by是根据哪一列进行排序,可以传入多列;ascending=True是升序排序,False为降序;inplace=Ture则是修改原dataframe,默认为False
df2.groupby('contbr_occupation')['contb_receipt_amt'].sum().sort_values(ascending=False)[:20]
利用函数进行数据转换:职业与雇主信息分析利用了dict.get它允许没有映射关系的职业也能“通过”)
#建立一个职业对应字典,把相同职业的不同表达映射为对应的职业,比如把C.E.O.映射为CEO
occupation_map = {'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED','INFORMATION REQUESTED':'NOT PROVIDED','SELF' : 'SELF-EMPLOYED','SELF EMPLOYED' : 'SELF-EMPLOYED','C.E.O.':'CEO','LAWYER':'ATTORNEY',
}
# 如果不在字典中,返回x
f = lambda x: occupation_map.get(x, x)
df2.contbr_occupation = df2.contbr_occupation.map(f)
对雇主的捐献进行同样处理
emp_mapping = {'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED','INFORMATION REQUESTED' : 'NOT PROVIDED','SELF' : 'SELF-EMPLOYED','SELF EMPLOYED' : 'SELF-EMPLOYED',
}# If no mapping provided, return x
f = lambda x: emp_mapping.get(x, x)
df2.contbr_employer = df2.contbr_employer.map(f)
面元化数据(分桶)
利用cut函数根据出资额大小将数据离散化到多个面元(桶)中
把之前筛选的奥巴马和洛尔尼的子集中的捐赠金额进行处理
bins = np.array([0,1,10,100,1000,10000,100000,1000000,10000000])
labels = pd.cut(df_lmab ['contb_receipt_amt'],bins)
数据聚合与分组运算
Groupby即分组运算,其过程可概括为“split-apply-combine”(拆分-应用-合并)。即分组后对各部分进行运算
拆分的对象为pandas对象(Series、DataFrame等);拆分的依据是分组键,可以是列表、数组(长度与待分组的轴一样)、字典、Series、函数、DataFrame列名
透视表(pivot_table)分析党派和职业
#按照党派、职业对赞助金额进行汇总,类似excel中的透视表操作,聚合函数为sum
by_occupation = data.pivot_table('contb_receipt_amt',index='contbr_occupation',columns='party',aggfunc='sum')
#过滤掉赞助金额小于200W的数据
over_2mm = by_occupation[by_occupation.sum(1)>2000000]
数据聚合(aggregate)
数据聚合,即任何能从数组产生标量值的数据转换过程。如mean、count、min、sum等,此外可以自定义聚合函数,或是已经定义好的任何方法。Groupby方法后的聚合,是在分组对象上调用聚合方法,再进行汇总。
分组级运算及转换(transform和apply)
#来了解一下对Obama和Romney总出资最高的职业和雇主
def groupby_again(group,key, n = 2):totals = group.groupby(key).sum()return totals.sort_values( by ='contb_receipt_amt',ascending=False)[:n]groupbyed = df_lmab.groupby('cand_nm')
groupbyed.apply(groupby_again,'contbr_occupation',n=7)#同样的,使用get_top_amounts()对雇主进行分析处理
grouped.apply(groupby_again,'contbr_employer',n=10)#来了解一下对两位候选人资助频次最高的人
def paixu(group,n=2):top_counts = group["contbr_nm"].value_counts()top_final = top_counts.sort_values(ascending = False)[:n]return top_final
groupeed = df_lmab.groupby("cand_nm")
groupeed.apply(paixu,n=5)
对赞助金额进行分组统计
首先统计各出资区间的赞助笔数,这里用到unstack(),stack()函数是堆叠,unstack()函数就是不要堆叠,即把多层索引变为表格数据但是数据类型仍为DataFrame
df_lmab.groupby(["cand_nm",labels]).size()
#输出
cand_nm contb_receipt_amt
Obama, Barack (0, 1] 493(1, 10] 40070(10, 100] 372280(100, 1000] 153991(1000, 10000] 22284(10000, 100000] 2(100000, 1000000] 3(1000000, 10000000] 4
Romney, Mitt (0, 1] 77(1, 10] 3681(10, 100] 31853(100, 1000] 43357(1000, 10000] 26186(10000, 100000] 1(100000, 1000000] 0(1000000, 10000000] 0
dtype: int64
df_lmab.groupby(["cand_nm",labels]).size().unstack(0)
#输出
cand_nm Obama, Barack Romney, Mitt
contb_receipt_amt
(0, 1] 493 77
(1, 10] 40070 3681
(10, 100] 372280 31853
(100, 1000] 153991 43357
(1000, 10000] 22284 26186
(10000, 100000] 2 1
(100000, 1000000] 3 0
(1000000, 10000000] 4 0统计各区间的赞助金额grouped_bins = df_lmab.groupby(["cand_nm",labels])
bucket_sums = grouped_bins['contb_receipt_amt'].sum().unstack(0)
bucket_sums
cand_nm Obama, Barack Romney, Mitt
contb_receipt_amt
(0, 1] 318.24 77.00
(1, 10] 337267.62 29819.66
(10, 100] 20288981.41 1987783.76
(100, 1000] 54798531.46 22363381.69
(1000, 10000] 51753705.67 63942145.42
(10000, 100000] 59100.00 12700.00
(100000, 1000000] 1490683.08 NaN
(1000000, 10000000] 7148839.76 NaN
对赞助金额进行可视化
bucket_sums.plot(kind='bar')
增加百分比是效果更明显
normed_sums = bucket_sums.div(bucket_sums.sum(axis=1),axis=0)
normed_sums[:-2].plot(kind = "barh)
时间处理
str转datetime(datetime为时间序列数据类型)
df2['time'] = pd.to_datetime(df2['contb_receipt_dt'])
重新设置索引为time
daf2.set_index('time',inplace=True)
重新采样和频率转换
pandas对象都拥有resample方法,该方法是所有频率转换的工具函数。resample拥有类似groupby的API可以调用resample对数据分组,之后再调用聚合函数
vs_time = df2.groupby('cand_nm').resample('M')['cand_nm'].count()
vs_time.unstack(0) #把层索引转变为表格数据
参考链接
2012美国大选数据集
利用python进行数据分析-14.5 2012美国大选数据分析(基础复习)相关推荐
- 2012美国大选献金项目数据分析
文章目录 1.数据载入与预览 1.1 数据加载 1.2 数据合并 1.3 数据预览 1.3.1 查看是否有空值 1.3.2用统计学指标快速描述数值型属性的概要 2.数据的预处理 2.1 数据清洗 2. ...
- 2016美国大选数据分析
2016年美国大选Trump数据分析: 案例题目:分析随时间推移的民意调查趋势,提取特朗普/克林顿的选票比率. 数据来源:https://www.kaggle.com/fivethirtyeight/ ...
- python营业数据分析_利用Python对咖啡馆营业做一个简单的数据分析
准备数据 1.导入python数据分析模块三剑客:pandas\matplotlib\numpy 2.用read_excel()方法导入数据源 .输出结果截图如下(部分): 可以看到有这些数据:订单日 ...
- 利用python爬取微博热搜并进行数据分析
爬取微博热搜 import schedule import pandas as pd from datetime import datetime import requests from bs4 im ...
- 数据分析---2012美国大选献金项目数据分析
需求: 1. 加载数据 df = pd.read_csv('./data/usa_election.txt') 2. 对新数据进行总览,查看是否存在缺失数据: 方法一:isnull.notnull.a ...
- 2012美国大选献金项目(最详细解释)
1. 数据载入和总览 import numpy as npimport pandas as pdfrom pandas import Series,DataFrame 1.1 数据载入 df1 = p ...
- 《利用Python进行数据分析·第2版》第14章 数据分析案例
第 1 章 准备工作第 2 章 Python 语法基础,IPython 和 Jupyter 第 3 章 Python 的数据结构.函数和文件 第 4 章 NumPy 基础:数组和矢量计算 第 5 章 ...
- 利用python进行数据分析——第十四章_数据分析案例
文章目录 本章中的数据文件可从下面的github仓库中下载 利用python进行数据分析(第二版) 一.从Bitli获取 1.USA.gov数据 1.1纯python时区计数 1.2使用pandas进 ...
- 数据基础---《利用Python进行数据分析·第2版》第11章 时间序列
之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 时间序列(time s ...
最新文章
- queuetimer,如何使用CreateTimerQueueTimer建立在C#中高分辨率计时器?
- pytorch 模型下载,郑重推荐
- ngixn+tomcat负载均衡 动静分离配置 (nginx反向代理)
- 使用Maven Failsafe和TestNG分别运行单元测试和集成测试
- POJ——字符串插入
- The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
- ecshop常用二次开发修改
- 前后台交互经常使用的技术汇总(后台:Java技术,前台:Js或者Jquery)
- 2008安装完了找不到_【专业性】关于铸铝热水锅炉安装使用的思考
- JSK-9 元素移除【入门】
- matlab Fsw,个人主页
- 怎么使用SolidPlant3D创建管道?
- C语言2--进制和运算符
- vbs 合并 excel 表格
- 英语构词法软件wordformation发布全新1.0版本
- atl常量暴露的最简便方法
- 如何搭建一套指标体系?
- stata解决内生性问题--样本选择
- Carla 使用神经网络训练自动驾驶车辆---数据采集部分
- c9是什么网络语言,经典的十大网络流行语节选