泰坦尼克号数据可视化分析
之前做过了泰坦尼克生存率预测练习,这次利用之前的数据对泰坦尼克号项目进行数据可视化分析。
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](https://i-blog.csdnimg.cn/blog_migrate/badb1fa00183102799a8c91713e2185b.jpeg)
1.2查看数据集信息
#获取数据类型列的描述统计信息
train.describe()
![74af87ba96c34a50c5b502e629f42c38.png](https://i-blog.csdnimg.cn/blog_migrate/ebddec5117db25715a0e37b4999e2572.jpeg)
# 查看每一列的数据类型,和数据总数
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](https://i-blog.csdnimg.cn/blog_migrate/6d519c1d7c9bad48ab9fdc77a8d67785.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](https://i-blog.csdnimg.cn/blog_migrate/842aab345ba1bf41a05241bd1b9239bc.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](https://i-blog.csdnimg.cn/blog_migrate/6a592551ea665b2b957868941f96c6b7.jpeg)
从各年龄阶段生还人数条形图可以看出,在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](https://i-blog.csdnimg.cn/blog_migrate/f6da10438f9bac48c7bc521909a4e4d7.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](https://i-blog.csdnimg.cn/blog_migrate/da95598bf77a02c5e4796e6ebca12c06.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](https://i-blog.csdnimg.cn/blog_migrate/2b236a7f78f065c72eb4eaccb8faaa59.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](https://i-blog.csdnimg.cn/blog_migrate/ae477ecec37a6d05cd4439a9b5b2cf84.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](https://i-blog.csdnimg.cn/blog_migrate/5ffcaf9d1cec8a9e5cf6ed3ed1af2a43.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](https://i-blog.csdnimg.cn/blog_migrate/ad083c88a85e7b85065d0fc823f2a69c.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](https://i-blog.csdnimg.cn/blog_migrate/ad9942ffc23ed6b2729c3873920b80a8.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](https://i-blog.csdnimg.cn/blog_migrate/8f4462e548e62ce744ca33430d727a3d.png)
由上图可看出,购买低于100美元船票的乘客有很多生还几率不足50%,而购买高于100美元船票的乘客的生还几率更高,且随着票价的升高生还几率也有随之增大的趋势。和乘客船舱等级对生还几率的影响一致,毕竟船舱条件越好,票价越贵。
“一个人的死是个悲剧,一百万人的死只是个统计数字”,这是个令人遗憾的偏见与误读 。在分析不同数据的过程中,我仿佛看到当时男人们选择留在船上让妇女和儿童先登上救生艇的画面,仿佛看到在船的中下层因为船舱被封锁而无法逃到甲板上的三等舱乘客绝望的眼神。而数据分析的结果都印证了电影里的一些桥段并非虚构,而是真实发生过的事情。如果再提起《泰坦尼克号》我想到的不只是感人至深的爱情故事,还有危难之中闪烁的人性光辉。