我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文仅仅是个数据分析,具体来说是个数据可视化的过程,不存在机器学习的数据预测部分。主要的思路就是,把数据集的age字段进行加工,然后按年龄段分组,最终列柱状图进行可视化对比。

苏南大叔:以泰坦尼克数据集为例,可视化分析不同年龄段的生存率 - 年龄段与生存率的可视化分析
以泰坦尼克数据集为例,可视化分析不同年龄段的生存率(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:python@3.12.3pandas@2.2.2numpy@1.26.4xlrd@2.0.1openpyxl@3.1.2matplotlib@3.9.0

前置阅读

主要涉及:

加载数据集

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()

苏南大叔:以泰坦尼克数据集为例,可视化分析不同年龄段的生存率 - 第一张图
以泰坦尼克数据集为例,可视化分析不同年龄段的生存率(图4-2)

柱状图代码二

第二个代码,指定了横纵坐标,解决了关系不明确的问题。但是依然是plot里面相对不常见的代码实现的。

group.plot.bar(x='age2', y='survived', rot=0, figsize=(6, 3.5), fontsize=12)
plt.tight_layout()
plt.show()

苏南大叔:以泰坦尼克数据集为例,可视化分析不同年龄段的生存率 - 第二张图
以泰坦尼克数据集为例,可视化分析不同年龄段的生存率(图4-3)

柱状图代码三【推荐】

第三个代码也能解决横纵坐标的问题,还可以解决百分数的问题。

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()

苏南大叔:以泰坦尼克数据集为例,可视化分析不同年龄段的生存率 - 第三张图
以泰坦尼克数据集为例,可视化分析不同年龄段的生存率(图4-4)

结束语

本文中,主要的研究对象是:泰坦尼克数据集中的age字段,同时对survived字段取平均数处理。最后对于plot画图问题做了简单的讨论。更多苏南大叔的数据分析文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python