用Python和Seaborn可视化Titanic数据集:5个图表讲透生还率背后的故事
用Python和Seaborn可视化Titanic数据集:5个图表讲透生还率背后的故事
泰坦尼克号的故事已经过去了一个多世纪,但这场悲剧留下的数据依然在向我们诉说着那些不为人知的细节。作为数据分析师,我们手中的工具可以让这些沉默的数字开口说话。本文将带你用Python的Seaborn库,通过5个精心设计的可视化图表,揭示隐藏在Titanic数据集中的生存密码。不同于传统的机器学习建模流程,我们将专注于如何用图表讲故事——就像一位侦探通过蛛丝马迹还原案发现场那样,从数据可视化中发现那些影响生还率的关键因素。
1. 准备工作与环境配置
在开始我们的数据探索之旅前,需要确保工作环境准备就绪。推荐使用Jupyter Notebook进行交互式数据分析,这是数据科学家们最钟爱的工具之一。以下是需要安装的核心Python库:
# 基础数据处理三件套 import pandas as pd import numpy as np # 可视化双雄 import matplotlib.pyplot as plt import seaborn as sns # 设置可视化风格 sns.set_theme(style="whitegrid", palette="pastel")提示:使用
sns.set_theme()可以一键设置Seaborn的全局样式,避免每次绘图都重复配置样式参数。
数据集可以从Kaggle官网获取,也可以直接通过Seaborn内置函数加载:
# 加载数据集 titanic = sns.load_dataset('titanic') # 快速浏览数据结构 print(titanic.info())数据集包含以下关键特征:
survived: 是否生还(0=否,1=是)pclass: 船舱等级(1/2/3等舱)sex: 性别age: 年龄fare: 票价embarked: 登船港口alone: 是否独自乘船
2. 生存率基础分析:性别与船舱的生死博弈
2.1 性别与生存率:妇女优先原则的数据印证
让我们首先验证那个广为人知的"妇女儿童优先"原则是否真实反映在数据中。使用Seaborn的barplot可以直观展示不同性别的生存率差异:
plt.figure(figsize=(8,5)) gender_survival = sns.barplot( x='sex', y='survived', data=titanic, estimator=lambda x: sum(x)/len(x)*100 ) gender_survival.set( title='生存率按性别分布', xlabel='性别', ylabel='生存率(%)' ) plt.show()这个简单的柱状图揭示了一个残酷的事实:女性生存率高达74%,而男性仅有18%。这种巨大差异完美印证了当时的救援原则。
2.2 船舱等级:金钱买来的生机
三等舱的乘客是否真的面临更高的死亡风险?让我们用分组柱状图来揭示这一关系:
plt.figure(figsize=(10,6)) class_survival = sns.barplot( x='pclass', y='survived', hue='sex', data=titanic, estimator=np.mean ) class_survival.set( title='不同舱位与性别的生存率对比', xlabel='船舱等级', ylabel='生存比例' ) plt.legend(title='性别') plt.show()图表显示了一个双重分层现象:
- 无论性别,一等舱乘客的生存率都显著高于其他舱位
- 在每个舱位内部,女性生存率都远高于男性
三等舱男性的生存率仅有13%,而一等舱女性则高达96%,这可能是数据中最令人震撼的差距。
3. 年龄因素:被遗忘的儿童优先原则
3.1 年龄分布与生存率
年龄对生存机会的影响往往被忽视。使用核密度估计图可以同时展示年龄分布和生存情况:
plt.figure(figsize=(12,6)) age_dist = sns.kdeplot( data=titanic, x='age', hue='survived', fill=True, alpha=0.5, palette=['#ff7f0e','#1f77b4'] ) age_dist.set( title='生还者与遇难者年龄分布对比', xlabel='年龄', ylabel='密度' ) plt.legend(['遇难','生还']) plt.show()图表揭示了几点关键发现:
- 儿童(<10岁)的生还概率明显高于其他年龄段
- 20-30岁的青年男性遇难比例特别高
- 老年人的生存率整体偏低
3.2 年龄与舱位的交互影响
为了更深入理解年龄因素,我们可以使用分面网格图:
g = sns.FacetGrid( titanic, row='pclass', col='survived', height=4, aspect=1.5 ) g.map(sns.histplot, 'age', bins=20) g.set_axis_labels('年龄', '人数') plt.show()这个分面图清晰地展示了:
- 一等舱儿童几乎全部生还
- 三等舱遇难者中20-40岁人群占比最高
- 老年人在各舱位的生存率都较低
4. 家庭因素:结伴而行的优势
4.1 家庭规模与生存率
Titanic数据集中SibSp(兄弟姐妹/配偶数量)和Parch(父母/子女数量)可以组合成家庭规模指标:
# 创建家庭规模特征 titanic['family_size'] = titanic['sibsp'] + titanic['parch'] + 1 plt.figure(figsize=(12,6)) family_impact = sns.pointplot( x='family_size', y='survived', hue='pclass', data=titanic, palette='Set2', ci=None ) family_impact.set( title='家庭规模对生存率的影响(按舱位)', xlabel='家庭规模', ylabel='生存率' ) plt.legend(title='舱位等级') plt.show()分析结果显示:
- 中等规模家庭(2-4人)生存率最高
- 独自旅行者生存率最低
- 大家庭(>4人)生存优势下降
4.2 登船港口:起点决定终点?
不同登船港口(Embarked)的乘客是否面临不同的生存概率?使用箱线图可以揭示这一关系:
plt.figure(figsize=(10,6)) embark_effect = sns.boxplot( x='embarked', y='fare', hue='survived', data=titanic, showfliers=False ) embark_effect.set( title='不同登船港口的票价分布与生存关系', xlabel='登船港口', ylabel='票价' ) plt.legend(title='是否生还') plt.show()有趣的是:
- Cherbourg港登船的乘客票价中位数最高,生存率也最高
- Southampton港登船的乘客数量最多但生存率最低
- Queenstown港登船的乘客多为低价票
5. 综合因素:生存机会的多维分析
5.1 热力图:特征相关性分析
要理解各因素之间的相互关系,相关矩阵热力图是最佳选择:
# 计算相关系数矩阵 corr = titanic[['survived','pclass','age','fare','family_size']].corr() plt.figure(figsize=(10,8)) sns.heatmap( corr, annot=True, cmap='coolwarm', center=0, square=True ) plt.title('特征相关性热力图') plt.show()热力图清晰地显示:
- 票价与舱位等级高度负相关(-0.55)
- 票价与生存率正相关(0.26)
- 舱位等级与生存率负相关(-0.34)
5.2 小提琴图:多维度综合分析
最后,让我们用Seaborn最强大的可视化之一——小提琴图,来展示年龄、舱位和性别的综合影响:
plt.figure(figsize=(14,8)) sns.violinplot( x='pclass', y='age', hue='survived', split=True, data=titanic, palette='muted' ) plt.title('舱位等级与年龄分布的生存情况') plt.xlabel('舱位等级') plt.ylabel('年龄') plt.legend(title='是否生还') plt.show()这个复合图表揭示了几个关键洞察:
- 一等舱生还者的年龄分布最为均匀
- 三等舱遇难者集中在20-40岁区间
- 儿童(<10岁)在各舱位的生存优势明显
在完成这5个核心可视化后,我们可以清晰地看到泰坦尼克号悲剧背后的生存逻辑:舱位等级和性别是最强的预测因素,而年龄和家庭规模也扮演着重要角色。这些图表不仅验证了历史记载中的"妇女儿童优先"原则,还揭示了社会经济地位对生存机会的巨大影响。
