以泰坦尼克数据集为例,可视化分析不同年龄段的生存率
发布于 作者:苏南大叔 来源:程序如此灵动~本文仅仅是个数据分析,具体来说是个数据可视化的过程,不存在机器学习的数据预测部分。主要的思路就是,把数据集的age
字段进行加工,然后按年龄段分组,最终列柱状图进行可视化对比。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
,xlrd@2.0.1
,openpyxl@3.1.2
,matplotlib@3.9.0
。
前置阅读
主要涉及:
- 泰坦尼克数据集的字段:https://newsn.net/say/titanic.html
- 泰坦数据集的加工处理:https://newsn.net/say/titanic-fillna.html
加载数据集
import pandas as pd
file = "titanic3.xls" # http://hbiostat.org/data/repo/titanic3.xls
df = pd.read_excel(file, "titanic3", index_col=None, na_values=['NA'])
处理空值
其它网上的相关教程里面,对于age
空值的处理方式都是fillna()
,那可能是基于数据预测的目的所考虑的。本文中,由于目的并非是数据预测,而是数据可视化展示。这里对于age
空值的处理方式采用的是dropna()
。
df = df[["survived", "age"]]
df = df.drop_duplicates()
df = df.dropna()
经过处理后,正常的数据仅仅剩到了159条数据。
分组及求均值
数据分组这个比较好理解,主要是根据age
分组为“小孩, 少年, 青年, 中年, 老年”这几个范围。
labels = ['小孩', '少年', '青年', '中年', '老年']
df['age2'] = pd.cut(df.age, [0, 12, 18, 30, 60, 80], labels=labels)
group = df.groupby(df['age2'], observed=False).mean(numeric_only=True).reset_index()
group['age'] = group['age'].round(1)
group['survived'] = group['survived'].round(2)
# print(group)
输出:
age2 survived age
0 小孩 0.55 4.8
1 少年 0.46 15.4
2 青年 0.39 24.3
3 中年 0.45 44.1
4 老年 0.29 67.0
数据分组,可以参考文章:
关于平均数/中位数的讨论,参考文章:
这里的平均数的结果,正好是需要的生存率的结果。所以,使用其中的mean()
方法。
为了后续的展示效果,这里可以对分组结果进行升序或降序的处理。
group = group.sort_values(by='age', axis=0, ascending=False)
# print(group)
输出:
age2 survived age
4 老年 0.29 67.0
3 中年 0.45 44.1
2 青年 0.39 24.3
1 少年 0.46 15.4
0 小孩 0.55 4.8
画图
plot
画图的问题,都可能会遇到中文显示的问题,以及横纵坐标值的问题。参考文章:
画图的基本准备代码,显示中文:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rc('axes', unicode_minus=False)
柱状图代码一
第一个画图代码,个人认为不是太好。因为它默认展示的是当前字段和索引之间的关系。有点偏离主题。
group['survived'].plot.bar(figsize=(6, 3.5), fontsize=12, rot=-45)
plt.tight_layout()
plt.show()
柱状图代码二
第二个代码,指定了横纵坐标,解决了关系不明确的问题。但是依然是plot
里面相对不常见的代码实现的。
group.plot.bar(x='age2', y='survived', rot=0, figsize=(6, 3.5), fontsize=12)
plt.tight_layout()
plt.show()
柱状图代码三【推荐】
第三个代码也能解决横纵坐标的问题,还可以解决百分数的问题。
from matplotlib.ticker import FuncFormatter
def to_percent(temp, position):
return '%1.0f'%(100*temp) + '%'
plt.figure("", figsize=(6, 3.5))
plt.bar(group['age2'], group['survived'])
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
plt.title('泰坦尼克数据集生存率分析')
plt.ylabel('生存率')
# plt.xlabel('年龄分组')
plt.show()
结束语
本文中,主要的研究对象是:泰坦尼克数据集中的age
字段,同时对survived
字段取平均数处理。最后对于plot
画图问题做了简单的讨论。更多苏南大叔的数据分析文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。