1880-2010年间全美婴儿姓名数据来源与数据集的使用1.数据的来源美国社会保障总署(SSA)提供了一份从1880年到2010年的婴儿名字频率数据。你可以用这个数据集做很多事,例如: 计算指定名字(可以是你自己的,也可以是别人的)的年度比例。 计算某个名字的相对排名。 计算各个年度最流行的名字,以及增长最快的名字 分析名字趋势: 元音, 辅音, 长度,总体多样性, 拼写变化, 首尾字母等。 分析外源性趋势,圣经中的名字,名人, 人口结构变化等。
美国社会保障总署将该数据库按照年度制成了多个数据文件,其中给出了每个性别/名字组合的出生总数。这些文件的原始档案可以在下面链接中获得: 下载“National data” 文件names.zip,解压后的目录中含有一组文件(如yob1880.txt),我们用Unix的head命令查看其中一个文件的前十行(在windows上,你可以用more命令或直接在文本编辑器中打开): 由于这是一个非常标准的以逗号隔开的格式,所以可以用pandas.read_csv将其加载到DataFrame中: 这些文件中仅含有当年出现超过5次的名字。为了简单起见,我们可以用births列的sex分组小计表示该年度的births总计: 由于该数据集按年度被分隔成了多个文件,所以第一件事情就是要将所有的数据都组装到一个DataFrame里面,并加上一个year字段。使用pandas.concat即可达到这个目的: - 这里要注意的几件事情
- concat默认是按行将多个DataFrame组合到一起的
- 必须指定ignoreindex=True,因为我们不希望保留readcsv所返回的原始行号。现在我们得到了一个非常大的DataFrame,它含有全部的名字数据。
现在names在这个DataFrame对象看上去应该是如上图names结果显示的样子 有了这些数据之后,我们就可以利用groupby或pivot_table在year和sex级别上对其进行聚合了 下面我们来插入一个prop列,用于存放指定名字的婴儿数对于总出生数的比例,prop值为0.02表示每100名婴儿中有2名取了当前这个名字。因此,我们先按year和sex分组,然后再将新列加到每个分组上: 完整的数据集就有了names这些列 在执行这样的分组处理时,一般都应该做一些有效性检查,比如验证所有分组的prop的总和是否为1。由于这是一个浮点型数据,所以我们应该用np.allclose来检查这个分组总计值是否足够近似于(可能不会精确等于)1: 这样就算完活了,为了便于实现更近一步的分析,我需要取出该数据的一个子集:每对sex/year组合的前1000个名字。这又是一个分组操作: 现在的结果数据集就小多了
|