当前位置:   article > 正文

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

泰坦尼克号数据集

一、分析目的:

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

四、相关性分析

1. 年龄与生存情况

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

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

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

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

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

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

 2. 性别与生存情况

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

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

实现可视化的代码如下:

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

 3. 社会地位与生存情况

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

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

实现可视化的代码如下:

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

 4. 票价高低

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

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

热力图结果如下:

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

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

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

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

  1. 1. import seaborn as sns
  2. 2.
  3. 3. df_encoded = pd.get_dummies(data_train, columns=['Sex', 'Embarked'], drop_first=False)
  4. 4. print(df_encoded)
  5. 5. df_encoded = df_encoded[['Pclass', 'Age', 'SibSp', 'Parch', 'Sex_male', 'Embarked_C', 'Embarked_Q', 'Embarked_S', 'Fare', 'Survived']]
  6. 6. # 属性间相关系数
  7. 7. cor = df_encoded.corr()
  8. 8. print(cor)
  9. 9. # 属性间相关系数热力图
  10. 10. sns.heatmap(cor)
  11. 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. 船票价格与社会地位相关性最大,与年龄相关性最小,与其他属性相关性都不算大。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/718089
推荐阅读
相关标签
  

闽ICP备14008679号