数据分析实战(三):美国1800~2010年婴儿名字
美国社会保障局提供了从 1880 年至现在的婴儿姓名频率的数据. 其中数据集按
照年份分为多个文件.
1. 查看出生总数的变化(按照性别)
2. 增添新列: 每个名字相对于出生总数的比例.(按照年份和性别分组)
3. 分析名字趋势, 指定名字的数量变化
4. 分析名字的多样性,并且进一步探究是什么导致了男女多样性差异
5. 分析 男孩名字最后一个字母的分布在过去的 100 年里发生了重大的变化.
6. 男孩名字变成女孩名字以及反向.
任务1:查看出生总数的变化(按照性别)
import pandas as pd
import matplotlib.pyplot as plt
# 数据准备
years = range(1880, 2011)pieces = []
columns = ['name', 'sex', 'births'] # 用作结果的列名列表for year in years:path = 'datasets/babynames/yob%d.txt' % yearframe = pd.read_csv(path, header=None, names=columns)frame['year'] = yearpieces.append(frame)# Concatenate everything into a single DataFrame
names = pd.concat(pieces, ignore_index=True)#%%
total_births = names.pivot_table('births', index='year',columns='sex', aggfunc=sum)total_births.plot(title='Total births by sex and year')
plt.show()
数据规整
# 增加新列:分组内的百分比
def add_prop(group):group['prop'] = group.births / group.births.sum()return group
names = names.groupby(['year', 'sex']).apply(add_prop)# 可以验证分组内的和是否为1
print(names.groupby(['year', 'sex']).prop.sum())# 得到分组内的前1000名数据,作为子数据集
def get_top1000(group):return group.sort_values(by='births', ascending=False)[:1000]grouped = names.groupby(['year', 'sex'])
top1000 = grouped.apply(get_top1000) # 后续使用
top1000.reset_index(inplace=True, drop=True) # drop为False则索引列会被还原为普通列,否则会丢失
任务2: 分析名字趋势, 指定名字的数量变化
boys = top1000[top1000.sex == 'M']
girls = top1000[top1000.sex == 'F']total_births = top1000.pivot_table('births', index='year',columns='name',aggfunc=sum)total_births.info()
subset = total_births[['John', 'Harry', 'Mary', 'Marilyn']] # 注意这里索引的方式subset.plot(subplots=True, figsize=(12, 10), grid=False,title="Number of births per year")
plt.show()
由图中,我们或许可以认为:这些名字已经不适合与美国人了,但是事实可能会更复杂。
任务3:分析名字的多样性,并且进一步探究是什么导致了男女多样性差异
table = top1000.pivot_table('prop', index='year',columns='sex', aggfunc=sum)
table.plot(title='Sum of table1000.prop by year and sex',yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))
plt.show()
我们可以看到top1000名字所占比例正在下降,说明整体多样性正在提升。。
# 多样性的增加
# 注意这个函数的功能:找到0.5的索引位置
def get_quantile_count(group, q=0.5):group = group.sort_values(by='prop', ascending=False)return group.prop.cumsum().values.searchsorted(q) + 1diversity = top1000.groupby(['year', 'sex']).apply(get_quantile_count)
diversity = diversity.unstack('sex')
diversity.plot(title="Number of popular names in top 50%")
plt.show()
任务4:最后一个字母的革命
研究员发现,男孩名字的最后一个字母在过去100年发生了重大变化。
# 取到最后一个字母
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)
last_letters.name = 'last_letter' # 给name属性命名,否则就是“name”有歧义table = names.pivot_table('births', index=last_letters,columns=['sex', 'year'], aggfunc=sum)subtable = table.reindex(columns=[1910, 1960, 2010], level='year')
print(subtable.head())# 得到百分比(每个组内每个字母占总各自总出生人数)
letter_prop = subtable / subtable.sum() # 分组默认对行求和,正是我们想要的fig, axes = plt.subplots(2, 1, figsize=(10, 8))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='Female', legend=False)
plt.show()
可知:以n结尾的男孩得到了显著的增长
再次按性别和年份标准化,并给定字母集。
# 取到最后一个字母
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)
last_letters.name = 'last_letter' # 给name属性命名,否则就是“name”有歧义table = names.pivot_table('births', index=last_letters,columns=['sex', 'year'], aggfunc=sum)letter_prop = table / table.sum()
dny_ts = letter_prop.loc[['d', 'n', 'y'], 'M'].T
print(dny_ts.head())
dny_ts.plot()
plt.show()
在上图中,我们能够清楚的看到男孩“d n y”三个结尾字母的变化趋势。
任务5:男孩名字变成女孩名字以及反向.(观察指定名字的男女趋势变化)
# 取出包含“lesl”的名字 从top1000开始操作
all_names = pd.Series(top1000.name.unique())
lesley_like = all_names[all_names.str.lower().str.contains('lesl')]
filtered = top1000[top1000.name.isin(lesley_like)]table = filtered.pivot_table('births', index='year',columns='sex', aggfunc='sum')table = table.div(table.sum(1), axis=0)table.plot(style={'M': 'k-', 'F': 'k--'})
plt.show()
数据分析实战(三):美国1800~2010年婴儿名字相关推荐
- Python数据分析实战,,美国总统大选数据可视化分析[基于pandas]
目录 前言 一.任务详情 二.数据集来源 三.实现过程 四.运行代码 前言 在学习Python数据分析的过程中,是离不开实战的. 今天跟大家带来数据分析可视化经典项目,美国总统大选数据可视化分析,希望 ...
- 三十四、R语言数据分析实战
@Author : By Runsen @Date : 2020/5/14 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘 ...
- 大数据分析实战-信用卡欺诈检测(三)- 模型评估
大数据分析实战-信用卡欺诈检测(二)-下采样方案和交叉验证 大数据分析实战-信用卡欺诈检测(一) 文章目录 模型评估方法 模型评估方法 接下来,没错,还没到实际建模任务,还需要考虑模型的评估方法,为什 ...
- Python数据分析实战(2)使用Pandas进行数据分析
文章目录 一.Pandas的使用 1.Pandas介绍 2.Pandas基本操作 Series的操作 创建DataFrame 常见列操作 常见行操作 DateFrame的基本操作 时间操作 3.Pan ...
- 万字长文,Python数据分析实战,使用Pandas进行数据分析
文章目录 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我 ...
- 【天池龙珠计划】Python训练营 Task04 Python数据分析:从0完成一个数据分析实战
[天池龙珠计划]Python训练营 Task04 Python数据分析:从0完成一个数据分析实战(利用Pandas分析美国选民总统喜好度) 文章目录 [天池龙珠计划]Python训练营 Task04 ...
- 【R语言与数据分析实战】数据操作(一):基于向量的处理与外部数据处理
目录 1.R中的常用数据集 2.读写CSV文件 (1) 读写CSV文件 (2) 读写对象文件 3.合并数据框的行与列 4.apply系数函数 (1) apply (2) lapply (3) sapp ...
- 临床基因组学数据分析实战助力解析Case,快速发表文章
福利公告:首期<临床基因组学数据分析实战>线上/线下课程已圆满结束.现于2022年春节前,安排第二期和第三期课程,分别为:北京,2021年12月24-26:广州,2022年1月7-9.(线 ...
- 北京、广州同时开课 | 临床基因组学数据分析实战助力解析Case,快速发表文章...
福利公告:首期<临床基因组学数据分析实战>线上/线下课程已圆满结束.现于2022年春节前,安排第二期和第三期课程,分别为:北京,2021年12月24-26:广州,2022年1月7-9.(线 ...
- 临床基因组学数据分析实战开课啦!!!
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现安排<临床基因组学数据分析实战>于2021年11月12-14 线上/线下课程 (线上课是通过腾讯会议实时直播线下课,实时互 ...
最新文章
- 【Android 应用开发】Android 组件 位置坐标 属性 ( 组件位置属性 | 父容器坐标系坐标 | 窗口坐标系坐标 | 屏幕坐标系坐标 | 触摸坐标 )
- java处理最后一周_Java获取某年某周的最后一天
- JUC原子类-引用类型(四)
- 解决Maven打包(编译)慢的问题
- [安卓】Error和Exception的区别
- 百度2017春招笔试
- 2019windows上安装Mac OS 10.14过程详细截图
- App客户端性能测试点总结
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解...
- 目前数据可视化工具软件的排名
- 厘米换算英尺英寸java
- C语言(静态链接库和动态链接库)
- NepCTF2022
- IE被劫持多一个IE图标,无法删除主页也被篡改
- Android数据库更新并保留原来数据的实现
- 新型穿墙监控雷达Range-R:让你的隐私无所遁形(转)
- 用CSS 实现水波扩散的特效
- Python就业都有哪些岗位?
- 镜头分辨率的计算和理解
- Android 培训课程V1.0