泰坦尼克号可视化案例分析

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

以下是一些建议来改进箱线图以使其更加直观:

  1. 添加标题和轴标签以使图像更加易于理解。
  2. 增加图像大小以使其更具可读性。
  3. 修改y轴的范围,以便更好地显示每个票类的票价分布情况。
  4. 添加横线来表示中位数,以及其他统计指标,例如四分位数和异常值。

上面所示这段代码会生成一个更加直观的箱线图,其中每个箱子代表不同的乘客等级,箱子的高度表示每个乘客等级的票价分布情况。图中还包括每个箱子的中位数线和四分位数框,以及异常值。

4. 散点图:显示两个变量之间的关系,例如乘客年龄和票价之间的关系。

以下是一些建议来改进散点图以使其更加直观易读:

  1. 添加标题和轴标签以使图像更加易于理解。
  2. 增加图像大小以使其更具可读性。
  3. 添加颜色映射以显示不同的票价水平。
  4. 添加透明度以减少数据点的重叠。
  5. 修改坐标轴的范围,以便更好地显示年龄和票价的分布情况。
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岁之间的乘客;
  • 票类为一等舱的乘客,或票价高的乘客。

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值