数据来源:https://pan.baidu.com/s/1MUqs391emlIUsf_wyX2GAg#list/path=%2F
密码:utbp
第一部分 按性别/年份统计出生数
思路:加载所有txt文件并进行整合,创建数据透视表,运用DataFrame内置绘图
step1
import pandas as pd
years=range(1880, 2011)
babynames = []
#建立列表,以存放多个DataFrame
for year in years:
frame = pd.read_csv(r'C:UsersAdministratorDownloadspydata-book-2nd-editiondatasetsbabynamesyob%d.txt'% year, names=['name','gender','births'])
frame['year'] = year
#新增year列
babynames.append(frame)
names = pd.concat(babynames, ignore_index=True)
#去除原DataFrame中的索引
step2
table=names.pivot_table('births',index='year',columns='gender',aggfunc='sum')
#需要指定具体对象——names,创建按性别/年度统计的出生数
table.head()
gender F M
year
1880 90993 110493
1881 91955 100748
1882 107851 113687
1883 112322 104632
1884 129021 114445
#观测前五行数据
step3
table.plot()
#使用DataFrame内置绘图
第二部分 按性别/年份统计各名字使用数占比
思路:定义函数,新增占比列,进行有效性检查
step1
def add_prop(group):
group['prop'] = group['births'] / group['births'].sum()
return group
#定义函数add_prop
data=names.groupby(['year', 'gender']).apply(add_prop)
#根据names中的year和gender为分组键,调用函数
data.tail()
name gender birth year prop
1690779 Zymaire M 5 2010 0.000003
1690780 Zyonne M 5 2010 0.000003
1690781 Zyquarius M 5 2010 0.000003
1690782 Zyran M 5 2010 0.000003
1690783 Zzyzx M 5 2010 0.000003
step2
data.groupby(['year', 'gender'])['prop'].sum()[:5]
year gender
1880 F 1.0
M 1.0
1881 F 1.0
M 1.0
1882 F 1.0
#检查分类后的prop列总和是否为1
第三部分 各个名字流行度分析
思路:在names基础上,按年份/性别进行分组处理保留每组出生数为前1000名的数据行,以此创建数据透视表,分析每个名字在每一年的使用数量及男女出生数
step1
def get_top1000(group):
return group.sort_values(by='births', ascending=False)[:1000]
#如果直接使用sort_values,只会获得一个series,所有数据中的前1000个
grouped = data.groupby(['year', 'gender'])
#data为names加上'prop'列
top1000 = grouped.apply(get_top1000)
#取分组后的每组前1000个名字
top1000.reset_index(inplace=True, drop=True)
step2
table1=top1000.pivot_table('births', index='year',columns='name',aggfunc='sum')
#针对按性别/年份分组后的每组的前1000个名字创建数据透视表,得到每年各个名字的取名数
step3
name1=table1[['Peter','Mike','Tom','Nancy']]
name1.plot()
#取几个名字,绘制线图,观察取名数随时间的变化趋势
第四部分 名字的多样性分析
思路:分析每年前1000个流行名字男/女在总人数中的占比趋势
step1
table2=top1000.pivot_table('prop',index='year',columns='gender',aggfunc='sum')
#针对按性别/年份分组后的每组的前1000个名字创建数据透视表,分别计算每年男/女名字数占比总和
step2
table2.plot
#根据时间变化,前1000个取名数最多的占比数量明显下降,可以看出名字的多样性出现了增长
第五部分 所有名字末字母的分布变化
思路:定义函数获得名字的末字母,创建数据透视表,并将末字母作为索引行
step1 数据映射
get_last_letter = lambda x: x[-1]
#定义函数,可获得字段的末字母
last_letters = data['name'].map(get_last_letter)
last_letters[:5]
0 y
1 a
2 a
3 h
4 e
step2
table3=names.pivot_table('births',index=last_letters,columns=['gender', 'year'], aggfunc='sum')
#每一年男/女末字母对应取名数
table4=data3 / data3.sum()
#每一年男/女对应字母取名数/每一年男/女总出生数
table4['F'].loc[['n','t','e']].T.head()
name n t e
year
1880 0.033057 0.023650 0.366819
1881 0.032179 0.023544 0.370616
1882 0.033157 0.022244 0.374582
1883 0.034161 0.022738 0.373159
1884 0.034932 0.021896 0.372722
#取前五行['n','t''e']末字母取名情况,并进行转置
step3
table4['F'].loc[['n','t','e']].T.plot()
#女孩末字母取名趋势
table4['M'].loc[['n','t','e']].T.plot()
#男孩末字母取名趋势
Original: https://blog.csdn.net/weixin_29476767/article/details/112453360
Author: 游龙浴火
Title: python 计量经济学案例分析_python数据分析案例(三)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/677995/
转载文章受原作者版权保护。转载请注明原作者出处!