ch02-1880-2010年间全美婴儿姓名
美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿姓名频率数据。Hadley Wickham(许多流行R包的作者)经常用这份数据来演示R的数据处理功能。
内容提要
- 了解数据
- 载入数据
- 婴儿出生数变化
- 分析命名趋势
- 评估命名多样性的增长
- “最后一个字母”的变革
了解数据
可能是考虑到数据量比较大,本文中采用的数据是分别保存在名为“yob***.txt”的众多文档中,每一个文件格式是txt,但实际上是csv的表格模式
这里的文件同样可以从Git上获得,路径与前面两篇文章路径相同
载入数据
我们先试着打开一个文件
import pandas as pd
import numpy as np
import os
path = 'C:/.../pydata-book-1st-edition/ch02/names/yob1880.txt'
os.chdir(os.path.dirname(path))
columns = ['names', 'sex', 'births']
names1880 = pd.read_csv(os.path.basename(path), names = columns)
得到如下结果
names1880[:5]
Out[105]:
names sex births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
考虑到需要整合文件,编写了一个小的循环
years = range(1880, 2011)
pieces = []
for year in years:
path = 'C:/.../pydata-book-1st-edition/ch02/names/yob%d.txt'%year
os.chdir(os.path.dirname(path))
frame = pd.read_csv(os.path.basename(path), names = columns)
frame['year'] = year#swift
pieces.append(frame)
names = pd.concat(pieces, ignore_index=True)
婴儿出生数变化
基于以上的数据,通过groupby或者pivot_table可以在year和sex级别上对数据进行聚合
total_births = names.pivot_table(values = 'births', index = ['year'],
columns = ['sex'], aggfunc = sum)
total_births.plot(title='Total births by sex and year')
分析命名趋势
之后如果希望知道研究各种名字之间的变化趋势,那么就必须得获取每一种名字占所有名字的比例
def add_prop(group):
births = group.births.astype(float)
group['prop'] = births/births.sum()
return group
names = names.groupby(['year',