泰坦尼克号可视化案例分析
1.问题描述
泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在首次航行期间,泰坦尼克号撞上冰山后沉没,2224名乘客和机组人员中有1502人遇难。这场轰动的悲剧震撼了国际社会,并导致了更好的船舶安全条例。
海难导致生命损失的原因之一是没有足够的救生艇给乘客和机组人员。虽然幸存下来的运气有一些因素,但一些人比其他人更有可能生存。在本次实验中,请利用所学方法对历史数据进行全面地可视化分析操作,以便能对哪些人可能生存进行比较和初步分析。
2.数据集描述
训练数据集包含15个特征,分别是:
survived:0代表死亡,1代表存活
pclass:乘客所持票类,有三种值(1,2,3)
sex:乘客性别
age:乘客年龄(有缺失)
sibsp:乘客兄弟姐妹/配偶的个数(整数值)
parch:乘客父母/孩子的个数(整数值)
fare:乘客所持票的价格(浮点数,0-500不等)
embarked:乘客登船港口字母缩写,S、C、Q(有缺失)
class: 乘客所持票类的字符串表示,有三种值(‘First’,’Second’,’Third’)
who: 人群分组,有三种值(‘man’,’woman’,’child’)
adult_male: 是否是成年男性(TRUE/FALSE)
deck: 乘客所在船舱(有缺失)
embark_town:乘客登船港口(有缺失)
alive: 是否幸存,no代表死亡,yes代表存活
alone: 是否结伴同行,FALSE代表结伴同行,TRUE代表独自旅行。
3.思路分析
首先,我们需要导入一些常用的数据科学库,例如Pandas, Matplotlib和Seaborn。使用Pandas库,可以轻松地将CSV文件读入DataFrame对象。DataFrame是一个表格数据结构,可以存储和操作表格数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
接下来,我们可以使用Pandas的一些函数,例如.head()和.describe(),来查看数据的前几行和统计概要。
由于题目中所给数据集中有明显缺失值,所以我们需要对缺失值进行处理:
data = pd.read_csv(r'C:\titanic.csv')
print(data.shape)
data.sample(5)# 处理缺失值
data.isnull().sum()data['age']=data['age'].fillna(data['age'].median())
del data['deck']
data['embarked']=data['embarked'].fillna('S')
data['embark_town']=data['embark_town'].fillna('Southampton')data.isnull().sum()
然后,我们可以使用Matplotlib和Seaborn库,创建各种图表和可视化分析。以下是一些可能有用的图表类型:
用于绘制年龄的分布密度图:
# 绘制乘客的年龄密度分布图
plt.figure(figsize=(8, 6))
sns.kdeplot(data['age'], shade=True, color='skyblue')
plt.xlabel('Age', fontsize=12)
plt.ylabel('Density', fontsize=12)
plt.title('Age distribution on Titanic', fontsize=14)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.grid(alpha=0.3)
plt.show()
2. 条形图
绘制年龄和存活率的条形图:
# 绘制年龄和存活率的条形图
age_bins = pd.cut(data['age'], bins=[0, 18, 35, 50, 65, 100])
age_survived = data.groupby(age_bins)['survived'].mean()# 绘制条形图
plt.figure(figsize=(8, 6))
plt.bar(age_survived.index.astype(str), age_survived.values, width=0.5, color='skyblue', edgecolor='black', alpha=0.7)
plt.xlabel('Age group', fontsize=12)
plt.ylabel('Survival rate', fontsize=12)
plt.title('Survival rate by age group on Titanic', fontsize=14)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.ylim(0, 1)
for i, val in enumerate(age_survived.values):plt.text(i, val+0.02, f'{val*100:.2f}%', ha='center', fontsize=10)
plt.show()
用于绘制不同性别的乘客的存活率统计图:
# 绘制不同性别乘客的存活率统计图
data['sex'] = data['sex'].replace({'male': 0, 'female': 1})
survived = data['survived'].value_counts().to_frame().reset_index().rename(columns={'index': 'label', 'survived': 'counts'})plt.figure(figsize=(8, 6))
sns.barplot(x='sex', y='survived', data=data, palette='Pastel1')
plt.title('Survival Rate by Gender', fontsize=16)
plt.xlabel('Gender (0 = Male, 1 = Female)', fontsize=14)
plt.ylabel('Survival Rate', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.ylim(0, 1)
plt.text(0.5, 0.85, f"Survived: {survived.iloc[1]['counts']} ({round(survived.iloc[1]['counts'] / sum(survived['counts']) * 100, 2)}%)", fontsize=12, ha='center', transform=plt.gca().transAxes)
plt.text(1.5, 0.85, f"Survived: {survived.iloc[0]['counts']} ({round(survived.iloc[0]['counts'] / sum(survived['counts']) * 100, 2)}%)", fontsize=12, ha='center', transform=plt.gca().transAxes)
plt.show()
这里由于性别是字符串类型,所以我们首先要将字符串类型替换为int类型,使用replace函数完成。
3. 箱线图:显示变量的分布情况和离群值,例如不同票类乘客的票价分布。
# 绘制不同票类乘客的票价分布箱线图
sns.boxplot(x='pclass', y='fare', data=data)
plt.show()
对图像进行调整和美化:
sns.set_style("whitegrid")
plt.figure(figsize=(10, 8))
ax = sns.boxplot(x='pclass', y='fare', data=data)
ax.set_title("Fare Distribution by Passenger Class", fontsize=16)
ax.set_xlabel("Passenger Class", fontsize=14)
ax.set_ylabel("Fare", fontsize=14)
ax.set_ylim(0, 200) # 修改y轴范围以更好地显示票价分布
ax.yaxis.grid(True)
ax.axhline(data['fare'].median(), color='red', linewidth=2, linestyle='--') # 添加中位数横线
ax.annotate('Median', xy=(0.5, data['fare'].median()), xytext=(0.5, 175), arrowprops=dict(facecolor='red', shrink=0.05), color='red', fontsize=14) # 添加中位数标签
plt.show()
以下是一些建议来改进箱线图以使其更加直观:
- 添加标题和轴标签以使图像更加易于理解。
- 增加图像大小以使其更具可读性。
- 修改y轴的范围,以便更好地显示每个票类的票价分布情况。
- 添加横线来表示中位数,以及其他统计指标,例如四分位数和异常值。
上面所示这段代码会生成一个更加直观的箱线图,其中每个箱子代表不同的乘客等级,箱子的高度表示每个乘客等级的票价分布情况。图中还包括每个箱子的中位数线和四分位数框,以及异常值。
4. 散点图:显示两个变量之间的关系,例如乘客年龄和票价之间的关系。
以下是一些建议来改进散点图以使其更加直观易读:
- 添加标题和轴标签以使图像更加易于理解。
- 增加图像大小以使其更具可读性。
- 添加颜色映射以显示不同的票价水平。
- 添加透明度以减少数据点的重叠。
- 修改坐标轴的范围,以便更好地显示年龄和票价的分布情况。
plt.figure(figsize=(10, 8))
ax = sns.scatterplot(x='age', y='fare', data=data, hue='fare', alpha=0.5, palette='Blues')
ax.set_title("Age and Fare Relationship", fontsize=16)
ax.set_xlabel("Age", fontsize=14)
ax.set_ylabel("Fare", fontsize=14)
ax.set_xlim(0, 80) # 修改x轴范围以更好地显示年龄分布
ax.set_ylim(0, 300) # 修改y轴范围以更好地显示票价分布
ax.legend(title="Fare", loc='upper right', bbox_to_anchor=(1.3, 1))
plt.show()
5:热力图:
# 显示变量之间的相关性,例如各个特征之间的相关性
sns.heatmap(data.corr(), annot=True, cmap='coolwarm', linewidths=0.5, fmt=".2f", annot_kws={'size':10})
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=0)
plt.title('Correlation Matrix', fontsize=14)
plt.show()
从上述图像中可以得出以下初步结论:
- 年龄在20岁至40岁之间的乘客人数最多;
- 女性的幸存率显著高于男性;
- 票类为一等舱的乘客的票价分布最广,票价中位数最高;
- 年龄和票价之间没有明显的线性关系;
- 幸存率和票价、票类之间有一定的相关性。
综合考虑这些因素,可以初步推断出以下人群可能生存的概率更高:
- 女性;
- 年龄在20岁至40岁之间的乘客;
- 票类为一等舱的乘客,或票价高的乘客。
泰坦尼克号可视化案例分析相关推荐
- python泰坦尼克号案例分析课程设计_让课堂充满人文关怀--《泰坦尼克号》案例分析(网友来稿)...
山东威海市国际中学 王瑞芹 人教社将<泰坦尼克号>选入了初中语文课本.入选语文课本的是,泰坦尼克沉没后,杰克与罗斯在冰海上漂浮的情景(分镜头剧本)-- 老师.学生好像都喜欢这一课文.在公开 ...
- 泰坦尼克号python数据分析统计服_Python-数据可视化案例分析之泰坦尼克号(二)...
在第一节"Python-数据清洗与分析案例之泰坦尼克号(一)"网址:https://www.lixdx.cn/archives/93 中进行了数据清洗与缺失值填充,接下来进行数据可 ...
- 大数据可视化案例分析_Tableau数据可视化分析案例
0x00 Tableau简介 Tableau是一款定位于数据可视化敏捷开发和实现的商务智能展现工具,可用来实现交互的.可视化的分析和仪表盘应用. Tableau提供了体验感良好且易用的使用界面,在处理 ...
- 今晚直播 | 泰坦尼克号经典案例分析
我是猴子数据分析社群会员 王承顺,上周我和猴子发起了<知识众筹第9期:一个案例学会数据分析 | 开始分红报名>,有1086人参与提问.根据用户投票我选出了大家最关心的5个问题进行了回答. ...
- python数据分析及可视化(十四)数据分析可视化练习-上市公司可视化数据分析、黑色星期五案例分析
上市公司数据分析 从中商情报网下载的数据,表格中会存在很多的问题,查看数据的信息有无缺失,然后做数据的清晰,有无重复值,异常数据,省份和城市的列名称和数据是不对照的,删除掉一些不需要的数据,省份不完整 ...
- 单样本KS检验,案例分析及Matlab可视化
Kolmogorov-Smirnov是比较一个经验分布与理论分布或者两个观测值分布的检验方法.其原假设H0:两个数据分布一致或者数据符合理论分布. 对于单样本KS检验,检验统计量为,当根据观测值计算出 ...
- 泰坦尼克号Titanic生存分析(SPSS、R)
目录 泰坦尼克号Titanic生存分析 查看数据基本信息 分析查看其它因子下的存活率情况: 缺失值处理 相关性分析 建立Logistic模型 模型改进 在上述分析的基础上使用其他模型(SVM.随机森林 ...
- 案例分析 | SAP如何帮助企业实现端到端的数字化供应链管理
https://www.toutiao.com/a6687387597922107916/ 在我之前的一篇 <收藏 | 供应链管理最佳实践之S&OP> 文章中,为大家介绍了关于S& ...
- 案例分析:机场运作系统
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
最新文章
- trunc 文字与格式与字符串不符_EXCEL字符串中间数字提取进阶
- linux usb init,复制Linux liveUSB导致init.d脚本出错 - 不可能..?
- 如何删除java里的类_java File类创建和删除目录详解
- java无效字符 怎么解决_java.sql.SQLException: ORA-00911: 无效字符 解决方法
- leetcode 729, 731, 732. My Calendar I, II, III | 729. 我的日程安排表 I, II, III(线段树)
- 新闻网大数据实时分析可视化系统项目——7、Kafka分布式集群部署
- 50个直击灵魂的问题_直击灵魂的问题:“妈妈,我还能要个哥哥不!”
- 英特尔世界公开赛总决赛落幕 三只优胜战队分享30万美元奖金
- 裁员下老公老婆的对话
- 关于用友凭证打印模板
- 天线方向图的基本概念
- 项目管理笔记-第十章 项目沟通管理
- 数据库-英语单词基础笔记-1
- Go基础:延迟调用defer、异常处理
- iOS-纯代码,10天高仿内涵段子
- 纪念feedsky彻底成为广告公司
- 转:标准差(Standard Deviation) 和 标准误差(Standard Error)
- Jenkins用户权限
- 最新uniapp打包IOS详细步骤
- java 保存文件在服务器_Java中如何将数据保存到服务器端
热门文章
- 50 行 Python 代码绘制数据大屏,这个可视化框架真的太神了
- MPB:上海交大王风平组-​海洋沉积物样品细胞提取及荧光显微镜计数法
- Golang 实战——微信公众号课程提醒系统
- Radware负载均衡项目配置实战解析之一初识RADWARE(VIP与FARM配置)
- 一文看懂Chrome浏览器工作原理
- magicwatch2 鸿蒙,对话表盘设计师:荣耀MagicWatch2的美学魔法
- odoo pdf 数字签名问题
- (8)UVM Sequencer和Driver
- python 复制粘贴excel_关于python:对于excel粘贴到新单元格
- Win10 下,利用 AutoHotKey v2 恢复任务栏图标的右键菜单关闭之快捷键 c