泰坦尼克号数据_泰坦尼克号数据可视化分析

泰坦尼克号数据可视化分析

之前做过了泰坦尼克生存率预测练习,这次利用之前的数据对泰坦尼克号项目进行数据可视化分析。

1.理解数据

1.1导入数据

# 忽略警告提示
import warnings
warnings.filterwarnings('ignore')

#导入处理数据包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据
#训练数据集
train = pd.read_csv(r'F:数据分析利用python进行数据分析titanictrain.csv')
train

e58bd7561683b4c915aa3c060647262f.png

1.2查看数据集信息

#获取数据类型列的描述统计信息
train.describe()

74af87ba96c34a50c5b502e629f42c38.png
# 查看每一列的数据类型,和数据总数
train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

2.数据可视化

数据有所缺失,可以根据现有数据进行数据可视化。

2.1泰坦尼克号乘客生还几率

n = train['Survived'].value_counts()
train['Survived'].value_counts()
0    549
1    342
Name: Survived, dtype: int64

a.总体生还几率:

plt.figure(figsize=(6,6))
plt.pie(n,autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15))
plt.title('总体生还率')
Text(0.5, 1.0, '总体生还率')

70f3b7ca5135afd3bd0c70b8bfa38fca.png

统计的数据中,将近62%的乘客都未能幸免,泰坦尼克号沉船事故可以说是和平时期死伤人数最惨重的海难之一。

b.不同性别乘客生还几率:

# 不同性别乘客的生还情况
sex_count = train.groupby(by='Sex')['Survived'].value_counts()
sex_count
Sex     Survived
female  1           233
        0            81
male    0           468
        1           109
Name: Survived, dtype: int64
# 两张饼图画在同一张图纸上
plt.figure(figsize=(2*5,5))

axes1=plt.subplot(1,2,1)
axes1.pie(sex_count.loc['female'][::-1],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#9400D3','#FFB6C1'],startangle=90)
axes1.set_title('女性生还率')

axes2=plt.subplot(1,2,2)
axes2.pie(sex_count.loc['male'],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#2E8B57','#AFEEEE'])
axes2.set_title('男性生还率')
Text(0.5, 1.0, '男性生还率')

8266419dd775796da9fca246b930bcc0.png

统计的数据中,女性将近3/4都存活了下来,而男性只有不到19%生还。可能确实如电影中所演的那样,绝大部分的救生筏都让给了女性。

c.不同年龄段乘客生还几率:

# 船上年龄范围
age_range = train['Age'] 
display(age_range.min(),age_range.max())
0.42



80.0
# 各年龄阶段人数
age_num,_ = np.histogram(age_range,range=[0,80],bins=16 )
age_num
array([ 40,  22,  16,  86, 114, 106,  95,  72,  48,  41,  32,  16,  15,
         4,   6,   1], dtype=int64)
# 各年龄阶段生还人数
age_survived = []
for age in range(5,81,5):
    survived_num = train.loc[(age_range>=age-5) & (age_range<=age)]['Survived'].sum()
    age_survived.append(survived_num)
age_survived
[31, 11, 11, 37, 45, 48, 51, 39, 23, 21, 15, 8, 6, 0, 0, 1]
# 绘制条形图
plt.figure(figsize=(12,6))
plt.bar(np.arange(2,78,5)+0.5,age_num,width=5,label='总人数',alpha=0.8)
plt.bar(np.arange(2,78,5)+0.5,age_survived,width=5,label='生还人数')
plt.xticks(range(0,81,5))
plt.yticks(range(0,121,10))
plt.xlabel('年龄',position=(0.95,0),fontsize=15)
plt.ylabel('人数',position=(0,0.95),fontsize=15)
plt.title('各年龄阶段人数和生还人数条形图')
plt.grid(True,linestyle=':',alpha=0.6)

141b57830f1fbcd17d5b00eddfd1cabb.png

从各年龄阶段生还人数条形图可以看出,在0-15岁年龄段的绝大部分孩子都得以生还,而在15-80岁的年龄段都有近一半或超过一半的人不幸身亡。

d.不同登入港口乘客的生还几率:

# 不同登入港口乘客的生还情况
embarked_count = train.groupby(by='Embarked')['Survived'].value_counts()
embarked_count
Embarked  Survived
C         1            93
          0            75
Q         0            47
          1            30
S         0           427
          1           217
Name: Survived, dtype: int64
# 三张饼图画在同一张图纸上
plt.figure(figsize=(3*5,5))

axes1=plt.subplot(1,3,1)
axes1.pie(embarked_count.loc['C'][::-1],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#9400D3','#FFB6C1'],startangle=45)
axes1.set_title('法国瑟堡市乘客生还率')

axes2=plt.subplot(1,3,2)
axes2.pie(embarked_count.loc['Q'],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#4169E1','#AFEEEE'])
axes2.set_title('爱尔兰昆士敦乘客生还率')

axes3=plt.subplot(1,3,3)
axes3.pie(embarked_count.loc['S'],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#698B69','#76EE00'])
axes3.set_title('英国南安普顿乘客生还率')
Text(0.5, 1.0, '英国南安普顿乘客生还率')

142d5e4d6940c93570c0a218906c2fed.png

从以上饼图可以看出,从爱尔兰和英国登船的乘客存活率都不足40%,而从法国登船的乘客存活率则超过了55%,造成这种情况的原因是什么可以继续往后分析。

e.不同船舱等级乘客生还几率:

# 不同登入港口乘客的生还情况
pclass_count = train.groupby(by='Pclass')['Survived'].value_counts()
pclass_count
Pclass  Survived
1       1           136
        0            80
2       0            97
        1            87
3       0           372
        1           119
Name: Survived, dtype: int64
# 三张饼图画在同一张图纸上
plt.figure(figsize=(3*5,5))

axes1=plt.subplot(1,3,1)
axes1.pie(pclass_count.loc[1][::-1],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#9400D3','#FFB6C1'],startangle=45)
axes1.set_title('一等舱乘客生还率')

axes2=plt.subplot(1,3,2)
axes2.pie(pclass_count.loc[2],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#4169E1','#AFEEEE'])
axes2.set_title('二等舱乘客生还率')

axes3=plt.subplot(1,3,3)
axes3.pie(pclass_count.loc[3],autopct='%.2f%%',labels=['死亡','存活'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1],textprops=dict(size=15),colors=['#698B69','#76EE00'])
axes3.set_title('三等舱乘客生还率')
Text(0.5, 1.0, '三等舱乘客生还率')

4e6b7975842ba7cb1ecb2bb704cf1adb.png

从图中不难看出,一等舱乘客生还几率最高,超过60%; 二等舱乘客生还几率次之,接近50%; 而三等舱只有不到25%的乘客能够生还,电影中可以看到三等舱都在船体的中下部,而且轮船撞到冰山后船体内的舱门为了防止进水而关闭导致很多乘客无法逃出船舱到达甲板。

结合刚才不同登船港口的生还几率差异,我们可以猜测一下法国登船的乘客分布在一、二等舱的人所占比例要比爱尔兰和英格兰登船的乘客多,下面可以验证一下我们的猜测。

# 不同登入港口乘客的船舱分布情况情况
embarked_pclass = train.groupby(by='Embarked')['Pclass'].value_counts()
embarked_pclass
Embarked  Pclass
C         1          85
          3          66
          2          17
Q         3          72
          2           3
          1           2
S         3         353
          2         164
          1         127
Name: Pclass, dtype: int64
# 三张饼图画在同一张图纸上
plt.figure(figsize=(3*5,5))

axes1=plt.subplot(1,3,1)
axes1.pie(embarked_pclass.loc['C'],autopct='%.2f%%',labels=['一等舱','三等舱','二等舱'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1,0.1],textprops=dict(size=15),colors=['#9400D3','#FFB6C1','#FF6347'])
axes1.set_title('法国瑟堡市乘客生还率')

axes2=plt.subplot(1,3,2)
axes2.pie(embarked_pclass.loc['Q'],autopct='%.2f%%',labels=['三等舱','二等舱','一等舱'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1,0.1],textprops=dict(size=10),colors=['#4169E1','#AFEEEE','#66CDAA'],startangle=10)
axes2.set_title('爱尔兰昆士敦乘客生还率')

axes3=plt.subplot(1,3,3)
axes3.pie(embarked_pclass.loc['S'],autopct='%.2f%%',labels=['三等舱','二等舱','一等舱'],pctdistance=0.4,labeldistance=0.6,
       shadow=True,explode=[0,0.1,0.1],textprops=dict(size=15),colors=['#698B69','#76EE00','#76EEC6'],startangle=180)
axes3.set_title('英国南安普顿乘客生还率')
Text(0.5, 1.0, '英国南安普顿乘客生还率')

c6c942459df4051a91c0b68820d14037.png

可以看出,从法国登船的乘客有超过60%分布在一、二等舱,英国登船的乘客有45%的乘客分布在一、二等舱,而爱尔兰登船的乘客只有6%分布在一、二等舱。和当时的世界形势有关,法国英国相对富裕,所以乘客大部分都购买了相对较好的船舱。而在相对落后的爱尔兰,大部分乘客都购买了环境较差的三等舱。

f.不同票价乘客的生还率

# 不同票价乘客的生还情况
fare_count = train.groupby(by='Fare')['Survived'].value_counts()
fare_count = pd.DataFrame(fare_count)
fare_count.rename(columns={'Survived':'Number'},inplace=True)
fare_count.reset_index(inplace=True)
fare_count

a0ddda06ffe7e43c6d26ddcb3fc29edb.png
# 统计出的各票价乘客总人数
fare_num = fare_count.groupby(by='Fare')['Number'].sum()
fare_num = pd.DataFrame(fare_num)
fare_num.rename(columns={'Number':'Total'},inplace=True)
fare_num

eceaaf94a8aeb884d159e57eeb61964b.png
fare_survived = fare_count.loc[fare_count['Survived']==1]
fare_survived = fare_survived.merge(fare_num,left_on='Fare',right_index=True,how='inner')
fare_survived

37a223741a62ece32258f3fe7e70c6da.png
# 各票价乘客的生还率
survived_rate = fare_survived['Number'].div(fare_survived['Total'])
survived_rate.index = fare_survived['Fare']
survived_rate
Fare
0.0000      0.066667
6.9750      0.500000
7.1417      1.000000
7.2250      0.250000
7.2292      0.266667
              ...   
227.5250    0.750000
247.5208    0.500000
262.3750    1.000000
263.0000    0.500000
512.3292    1.000000
Length: 153, dtype: float64
fare_death = fare_count.loc[fare_count['Survived']==0]
fare_death = fare_death.merge(fare_num,left_on='Fare',right_index=True,how='inner')
fare_death

c13bc2f1fb5f0ac2b83c71eb40ddf711.png
# 各票价乘客的死亡率
death_rate = fare_death['Number'].div(fare_death['Total'])
death_rate.index = fare_death['Fare']
death_rate
Fare
0.0000      0.933333
4.0125      1.000000
5.0000      1.000000
6.2375      1.000000
6.4375      1.000000
              ...   
211.5000    1.000000
221.7792    1.000000
227.5250    0.250000
247.5208    0.500000
263.0000    0.500000
Length: 177, dtype: float64
# 两张散点图画在同一张图纸上
plt.figure(figsize=(2*10,5))

# 乘客的生还率和票价关系散点图
axes1=plt.subplot(1,2,1)
axes1.scatter(survived_rate.index,survived_rate,marker='o',color='r')
axes1.set_title('乘客生还率和票价关系散点图')

# 乘客的死亡率和票价关系散点图
axes2=plt.subplot(1,2,2)
axes2.scatter(death_rate.index,death_rate,marker='^',color='b')
axes2.set_title('乘客死亡率和票价关系散点图')
Text(0.5, 1.0, '乘客死亡率和票价关系散点图')

89ecc77d118487a0b1f09aa5e56ead25.png

由上图可看出,购买低于100美元船票的乘客有很多生还几率不足50%,而购买高于100美元船票的乘客的生还几率更高,且随着票价的升高生还几率也有随之增大的趋势。和乘客船舱等级对生还几率的影响一致,毕竟船舱条件越好,票价越贵。

“一个人的死是个悲剧,一百万人的死只是个统计数字”,这是个令人遗憾的偏见与误读 。在分析不同数据的过程中,我仿佛看到当时男人们选择留在船上让妇女和儿童先登上救生艇的画面,仿佛看到在船的中下层因为船舱被封锁而无法逃到甲板上的三等舱乘客绝望的眼神。而数据分析的结果都印证了电影里的一些桥段并非虚构,而是真实发生过的事情。如果再提起《泰坦尼克号》我想到的不只是感人至深的爱情故事,还有危难之中闪烁的人性光辉。

  • 10
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值