数据挖掘 泰坦尼克号数据集分析

一、分析目的:

(1) 可视化数据集中的Pclass属性,Sex属性,Age属性,SibSp属性,Fare属性和Embarked属性;

(2)考虑以下问题 , 可使用中心趋势度量和离散度度量进行分析:

1)年龄与生存情况之间的关系是什么?

2)性别与生存情况之间的关系是什么?

3)社会地位与生存情况之间的关系是什么?

4)为什么有些票的价格很高?票价的高低与哪些属性有关?

二、导入数据集

使用pd.read_csv()读入数据集,使用print(data_train.info())打印数据集基本信息,结果如下图所示:

 

从中可以看出Age, Cabin, Embarked属性存在缺失值。但本次实验只是为了数据分析,故不进行缺失值处理。

其中,PassengerId, Name, Ticket, Cabin, Embarked为标称属性;Survived, Sex为 二元属性;Pclass为序数属性;Age, SibSp, Parch, Fare为数值属性。

 三、可视化相关属性

1. 可视化Pclass属性

Pclass一共有三个可能取值,分别为1, 2, 3。使用柱状图进行可视化。

2. 可视化Sex属性

Sex一共有两个可能取值,分别为male和female。使用柱状图进行可视化。

3. 可视化Age属性

Age属于连续型属性,使用直方图进行可视化。

4. 可视化SibSp属性

SibSp属于连续型属性,使用直方图进行可视化。

5. 可视化Fare属性

Fare属性最大值最小值差别很大,怀疑存在异常值,使用箱线图进行可视化。

6. 可视化Embarked属性

Embarked一共有三个可能取值,分别为C, P, Q。使用柱状图进行可视化。

对六个属性可视化结果如下图所示:

 

由图可知,1)乘客中来自3阶级的人数大于来自1阶级的人数大于来自2阶级的人数,2)乘客中男性人数明显高于女性人数,3)大部分乘客为年轻人,4)绝大多数乘客只有0或1位的兄弟姐妹或配偶在船上,5)船票平均价格在50以下,但仍有500左右的船票价格存在,6)上船地点人数S>C>Q。

实现可视化的代码如下:

1.	plt.figure(constrained_layout=True)  
2.	  
3.	plt.subplot2grid((2, 3), (0, 0))  
4.	data_train['Pclass'].value_counts().plot(kind='bar')  
5.	  
6.	plt.subplot2grid((2, 3), (0, 1))  
7.	data_train['Sex'].value_counts().plot(kind='bar')  
8.	  
9.	plt.subplot2grid((2, 3), (0, 2))  
10.	data_train['Age'].hist()  
11.	plt.xlabel('Age')  
12.	  
13.	plt.subplot2grid((2, 3), (1, 0))  
14.	data_train['SibSp'].hist()  
15.	plt.xlabel('SibSp')  
16.	  
17.	plt.subplot2grid((2, 3), (1, 1))  
18.	data_train['Fare'].plot(kind='box')  
19.	  
20.	plt.subplot2grid((2, 3), (1, 2))  
21.	data_train['Embarked'].value_counts().plot(kind='bar')  
22.	  
23.	plt.show()  

四、相关性分析

1. 年龄与生存情况

计算年龄的均值、中位数和众数并打印,发现年龄均值约为30,中位数为28,众数为24。

由于年龄均值为30,所以根据年龄划分为10岁以下、10-30岁、30-50岁、大于50岁四组,使用柱状图展示各年龄段中获救与未获救人数之间的关系,可视化结果如下图所示:

计算各年龄层生存率并打印结果:

由此可以发现,10岁以下的乘客存活率最高,50岁以上的乘客存活率最低;小于平均年龄的乘客存活率高于大于平均年龄乘客的存活率。

实现可视化及相关数据打印的代码如下:

1.	bins = [min(data_train['Age']), 10, 30, 50, max(data_train['Age'])]  
2.	bins_label = ['Under 10', '10-30', '30-50', 'Above 50']  
3.	#bins = [min(data_train['Age']), mean_age, max(data_train['Age'])]  
4.	#bins_label = ['Under mean_age', 'Above mean_age']  
5.	data_train['Age_cut'] = pd.cut(data_train['Age'], bins=bins, labels=bins_label)  
6.	# print(data_train['Age_cut'].value_counts())  
7.	  
8.	Age_0 = data_train.loc[data_train['Survived'] == 0, 'Age_cut'].value_counts()  
9.	Age_1 = data_train.loc[data_train['Survived'] == 1, 'Age_cut'].value_counts()  
10.	df_age = pd.DataFrame({'Survived':Age_1, 'Not Survived':Age_0})  
11.	df_age.plot(kind='bar')  
12.	for index, row in df_age.iterrows():  
13.	    survived = row['Survived']  
14.	    not_survived = row['Not Survived']  
15.	    survival_rate = survived / (survived + not_survived)  
16.	    print(f"Age group {index}: {survival_rate}")  
17.	  
18.	plt.tight_layout()  
19.	plt.show()  

 2. 性别与生存情况

使用柱状图绘制存活/非存活乘客中男性和女性的数量,可视化结果如下图所示:

由此可看出,未获救乘客中男性占比较大,而获救乘客中女性占比较大。

实现可视化的代码如下:

1.	Survived_m = data_train.loc[data_train['Sex'] == 'male', 'Survived'].value_counts()  
2.	Survived_f = data_train.loc[data_train['Sex'] == 'female', 'Survived'].value_counts()  
3.	df_sex = pd.DataFrame({'Male':Survived_m, 'Female':Survived_f})  
4.	df_sex.plot(kind='bar', stacked=True)  
5.	plt.show()  

 3. 社会地位与生存情况

使用柱状图绘制不同阶级中存活/非存活乘客的数量,可视化结果如下图所示:

由此可看出,阶级1乘客获救率最高,甚至获救人数超过了未获救人数;阶级2乘客中未获救人数略高于获救人数;阶级3乘客中未获救人数远高于获救人数。

实现可视化的代码如下:

1.	Pclass_0 = data_train.loc[data_train['Survived'] == 0, 'Pclass'].value_counts()  
2.	Pclass_1 = data_train.loc[data_train['Survived'] == 1, 'Pclass'].value_counts()  
3.	df_pclass = pd.DataFrame({'Survived':Pclass_1,'Not survived':Pclass_0})  
4.	df_pclass.plot(kind='bar')  
5.	plt.show()  

 4. 票价高低

由2.中箱线图结果发现,票价有高达500的异常值,也有低到0的值存在。推测极端值中,0可能是员工票或优惠票,极大值可能是最上等船舱的票价。

计算各属性之间的相关系数并使用热力图显示各属性之间的相关性。其中,PassengerId, Name, Ticket唯一确定,不进行相关性分析;Cabin属性缺失过多,不作考虑;在进行计算之前需要对Sex和Embarked属性进行One-Hot编码。

热力图结果如下:

打印相关系数矩阵,结果如下:

 关察热力图最后一列及矩阵最后一列可发现,是否存活与性别相关性最大,其次与社会地位相关性也较大。

观察热力图倒数第二列及矩阵倒数第二列可发现,船票价格与社会地位相关性最大,与年龄相关性最小,与其他属性相关性都不算大。

实现可视化相关代码如下:

1.	import seaborn as sns  
2.	  
3.	df_encoded = pd.get_dummies(data_train, columns=['Sex', 'Embarked'], drop_first=False)  
4.	print(df_encoded)  
5.	df_encoded = df_encoded[['Pclass', 'Age', 'SibSp', 'Parch', 'Sex_male', 'Embarked_C', 'Embarked_Q', 'Embarked_S', 'Fare', 'Survived']]  
6.	# 属性间相关系数  
7.	cor = df_encoded.corr()  
8.	print(cor)  
9.	# 属性间相关系数热力图  
10.	sns.heatmap(cor)  
11.	plt.show()  

五、总结与结论

  1. 乘客中来自3阶级的人数大于来自1阶级的人数大于来自2阶级的人数;乘客中男性人数明显高于女性人数;大部分乘客为年轻人,平均年龄为30;绝大多数乘客只有0或1位的兄弟姐妹或配偶在船上;船票平均价格在50以下,但仍有500左右的船票价格存在;上船地点人数S>C>Q。
  2. 10岁以下的乘客存活率最高,50岁以上的乘客存活率最低;小于平均年龄的乘客存活率高于大于平均年龄乘客的存活率。
  3. 未获救乘客中男性占比较大,而获救乘客中女性占比较大。
  4. 阶级1乘客获救率最高,甚至获救人数超过了未获救人数;阶级2乘客中未获救人数略高于获救人数;阶级3乘客中未获救人数远高于获救人数。
  5. 船票价格极端值中,0可能是员工票或优惠票,极大值可能是最上等船舱的票价。
  6. 是否存活与性别相关性最大,其次与社会地位相关性也较大。
  7. 船票价格与社会地位相关性最大,与年龄相关性最小,与其他属性相关性都不算大。
  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值