kaggle上经典泰坦尼克项目数据分析探索

瑞星  金牌会员 | 2025-3-24 21:47:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 951|帖子 951|积分 2853

        之前相识在kaggle上这个项目很火,最近想要加强一下python数据分析,所以在kaggle上找到这个项目进行学习探索,下面是将一些学习资料以及过程整理出来。
一、首先我们相识一下项目背景以及如何找到这个项目。
kaggle项目地址:
https://www.kaggle.com/code/alexisbcook/titanic-tutorial?scriptVersionId=99170538&cellId=5
进入页面后会有背景介绍以及项目
我们先大概相识一下项目背景以及流程,找到项目所需要的数据源。


二、准备停当,下面进入项目一起学习探索
  1. import pandas as pd
  2. train_data = pd.read_csv(r'E:/train.csv')
  3. test_data = pd.read_csv(r'E:/test.csv')
  4. train_data.head(10)
  5. # 数据集概述
  6. # 泰坦尼克号数据集是机器学习入门中一个非常著名的数据集,包含了乘客的个人信息以及他们的生死状态。数据集主要包含以下字段:
  7. # PassengerI:乘客编号
  8. # Survive:生存状态(0代表未存活,1代表存活)
  9. # Pclas:舱位等级
  10. # Nam:乘客姓名
  11. # Se:性别
  12. # Ag:年龄
  13. # SibS:同舱兄弟姐妹或配偶的数量
  14. # Parc:同行父母或子女的数量
  15. # Ticke:票号
  16. # Far:票价
  17. # Cabi:舱位
  18. # Embarke:登船港口
复制代码
查看导入train数据效果:

查看导入的test数据效果:
  1. test_data.head(10)
复制代码

查看数据根本信息
  1. # 查看数据基本信息
  2. train_data.info()
复制代码


  1. test_data.info()
复制代码

查看数据空值情况
  1. # 检查各个字段的空值情况
  2. train_data.isnull().sum()
复制代码
说明:从效果看到Age、Cabin和Embarked显着有空值
  1. test_data.isnull().sum()
复制代码

查看一下数据形貌
  1. train_data.describe()
复制代码

  1. test_data.describe()
复制代码
 
  1. # 计算女性获救的概率
  2. women = train_data.loc[train_data.Sex == 'female']["Survived"]
  3. rate_women = sum(women)/len(women)
  4. print("% of women who survived:", rate_women)
复制代码
 
  1. # 计算男性获救的概率
  2. men = train_data.loc[train_data.Sex == 'male']["Survived"]
  3. rate_men = sum(men)/len(men)
  4. print("% of men who survived:", rate_men)
复制代码
 

  1. # 学习第一个机器学习模型随机森林来预测乘客的获救可能
  2. from sklearn.ensemble import RandomForestClassifier
  3. y = train_data["Survived"]
  4. # 指定相关的特性列
  5. features = ["Pclass", "Sex", "SibSp", "Parch"]
  6. # 将features转换为哑变量
  7. X = pd.get_dummies(train_data[features])
  8. X_test = pd.get_dummies(test_data[features])
  9. model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
  10. model.fit(X, y)
  11. predictions = model.predict(X_test)
  12. output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
  13. output.to_csv('submission.csv', index=False)
  14. print(output.head(10))
  15. print("Your submission was successfully saved!")
复制代码
 

  1. # 上面部分是根据实例kaggle上面的例子,下面我们再对数据做一些探索
  2. # 需求:引入seaborn来研究已知存活的数据中存活比例
  3. # 结论:在891名乘客中,其中存活的比例为36.38%,溺水的比例为61.62%
  4. import seaborn as sns
  5. import matplotlib.pyplot as plt
  6. sns.set()
  7. sns.set_style('ticks')
  8. train_data['Survived'].value_counts().plot.pie(labels = ['downed','survived'],
  9. explode=(0,0.05),shadow = True,autopct = '%.2f%%',fontsize=15)
  10. plt.show()
复制代码
 
  1. #年龄分布情况
  2. # 需求:
  3. # 1、年龄的分布情况
  4. # 2、男性和女性的存活情况
  5. # 3、大人和小孩的存活情况
  6. # 结论
  7. # 年龄分布呈现右偏,大部分数据集中在20岁到40岁之间,最小年龄是0.42,最大年龄是80
  8. fig,ax = plt.subplots(1,2,figsize=(15,7))
  9. age = train_data[train_data['Age'].notnull()]
  10. age['Age'].hist(bins=50,histtype='bar',edgecolor='k',ax=ax[0])
  11. age['Age'].plot.box(showfliers=False,
  12.                     color = {'boxes':'DarkGreen', 'whiskers':'DarkOrange', 'medians':'DarkBlue', 'caps':'Gray'},
  13.                     grid=True,
  14.                     ax=ax[1])
  15. pd.DataFrame(age['Age'].describe()).transpose()
复制代码
 

  1. # 需求:按照存活状态分布的年龄情况
  2. # 结论:幸存者的年龄整体比溺水的年龄小,幸存者数据有一个明显的异常值,80岁的幸存者,需要检查一下。
  3. import numpy as np
  4. plt.figure(figsize=(15, 3))
  5. #显示汉字
  6. plt.rcParams['font.sans-serif'] = ['SimHei']
  7. sns.boxplot(y = 'Survived', x = 'Age', data = train_data,
  8.      palette=["#3f3e6fd1", "#85c6a9"], fliersize = 0, orient = 'h')
  9. #orient:"v"|"h" 用于控制图像使水平还是竖直显示
  10. #fliersize:异常值大小
  11. sns.stripplot(y = 'Survived', x = 'Age', data = train_data,
  12.      linewidth = 0.6, palette=["#3f3e6fd1", "#85c6a9"], orient = 'h')
  13. plt.yticks( np.arange(2), ['drowned', 'survived'],fontsize= 15)
  14. plt.title('乘客的年龄分布情况',fontsize= 15)
  15. plt.ylabel('存活状态')
  16. plt.tight_layout()
  17. pd.DataFrame(train_data.groupby('Survived').Age.describe())
复制代码
 

  1. # 需求:由于有一个异常数据,这里简单修正数据
  2. # 结论:异常值的影响不大,结论仍然是年龄偏小的获救概率较大
  3. train_data.loc[train_data['Age']==80,'Age'] = 48
  4. train_data[train_data['Name']=='Barkworth, Mr. Algernon Henry Wilson']
  5. pd.DataFrame(train_data.groupby('Survived').Age.describe())
复制代码
 

 
  1. #男性和女性存活情况
  2. s_sex = train_data[train_data['Survived']==1][['Sex','Survived']].groupby('Sex').count()
  3. s_sex.plot.bar(rot=0)
  4. print(
  5. '女性存活率为%0.2f%%,男性存活率为%0.2f%%'
  6. %(s_sex.loc['female']/s_sex.sum()*100,s_sex.loc['male']/s_sex.sum()*100))
复制代码
 
  1. # 按照不同船舱等级划分: 船舱等级越高,存活者年龄越大,船舱等级1存活年龄集中在20-40岁,船舱等级2/3中有较多低龄乘客存活
  2. # 按照性别划分 : 男性女性存活者年龄主要分布在20-40岁,且均有较多低龄乘客,其中女性存活更多
  3. # 按照不同船舱等级看存活的男女比例: 1、3等舱存活的男性大部分为20到50,2等舱幸存男性年龄偏低
  4. # 年龄与存活的关系
  5. age = train_data[train_data['Age'].notnull()]
  6. s_age = age[age['Survived']==1]
  7. fig,ax = plt.subplots(1,3,figsize=(15,5))
  8. sns.violinplot(x='Pclass',y='Age',hue='Survived',data = age,split=True,ax=ax[0],grid=True)
  9. ax[0].set_yticks(range(0,110,10))
  10. sns.violinplot('Sex','Age',hue='Survived',data=age,split=True,ax=ax[1])
  11. ax[1].set_yticks(range(0,110,10))
  12. sns.violinplot('Pclass','Age',hue='Sex',data=s_age,split=True,ax=ax[2])
  13. ax[2].set_yticks(range(0,110,10))
  14. plt.tight_layout()
复制代码
 

  1. age = train_data[train_data['Age'].notnull()]
  2. age['age_int']=age['Age'].astype(int)
  3. a = age[['Survived','age_int']].groupby('age_int',as_index=False).mean()
  4. #计算均值相当于计算存活率
  5. plt.figure(figsize=(15,4))
  6. sns.barplot(x ='age_int',y='Survived',data=a, palette = 'BrBG')
复制代码
 
  1. # 结合 SibSp、Parch字段,研究亲人多少与存活的关系
  2. # 要求:
  3. # 1、有无兄弟姐妹/父母子女和存活与否的关系
  4. # 2、亲戚多少与存活与否的关系
  5. #计算家庭大小
  6. train_data['family_size']=train_data['SibSp']+train_data['Parch']+1
  7. train_data['family_size'].value_counts()
复制代码
 

  1. # 家庭大小与存活的关系
  2. # 有两个大小分别为8和11的大家族,其训练数据集中的所有成员均被淹死。
  3. # 大多数乘客独自旅行,生存率不是很高。
  4. # 在船上有4位家庭成员的人群中,幸存的乘客比例最大。
  5. fig = plt.figure(figsize=(12,5))
  6. ax1 = fig.add_subplot(121)
  7. ax = sns.countplot(train_data['family_size'])
  8. labels = (train_data['family_size'].value_counts())
  9. for i, v in enumerate(labels):
  10.     ax.text(i, v+6, str(v), horizontalalignment = 'center', size = 10, color = 'black')
  11. plt.ylabel('乘客数')  
  12. plt.title('按照家庭数量分布的乘客情况')
  13. ax2 = fig.add_subplot(122)
  14. a = train_data.groupby('family_size')['Survived'].value_counts(normalize=True).unstack()
  15. a.plot(kind='bar',stacked='True',color=["#3f3e6fd1", "#85c6a9"],rot=0,ax =ax2)
  16. plt.legend(( 'Drowned', 'Survived'), loc=(1.04,0))
  17. plt.title('按照家庭数量分布的存活情况')
  18. plt.tight_layout()
复制代码
 

  1. # 结合票的费用情况,研究票价和存活与否的关系
  2. # 要求:
  3. # 1、 票价分布和存活与否的关系
  4. # 2、比较研究生还者和未生还者的票价情况
  5. # 票价分布和存活与否的关系
  6. # 结论:生还者的平均票价要大于未生还者的平均票价
  7. fig, ax=plt.subplots(1,2,figsize=(15,4))
  8. train_data['Fare'].hist(bins=70, ax = ax[0])
  9. train_data.boxplot(column='Fare', by='Pclass', showfliers=False,ax = ax[1])
  10. # 查看票价分布情况
  11. fare_not_survived = train_data['Fare'][train_data['Survived'] == 0]
  12. fare_survived = train_data['Fare'][train_data['Survived'] == 1]
  13. # 基于票价,筛选出生存与否的数据
  14. average_fare = pd.DataFrame([fare_not_survived.mean(),fare_survived.mean()])
  15. std_fare = pd.DataFrame([fare_not_survived.std(),fare_survived.std()])
  16. average_fare.plot(yerr=std_fare,kind='bar',legend=False,figsize = (15,4),grid = True)
  17. # 查看票价与是否生还的关系
  18. plt.tight_layout()
复制代码
 

  1. # 结合出发地的情况,研究出发地点与存活的关系
  2. #大多数乘客登上南安普敦。 南安普敦的溺水乘客比例最大。
  3. #从瑟堡出发的乘客,其中50%以上存活(在训练数据集中)。
  4. #皇后镇出发的乘客中,绝大多数是三等舱乘客。
  5. fig = plt.figure(figsize = (15,4))
  6. ax1 = fig.add_subplot(131)
  7. palette = sns.cubehelix_palette(5, start = 2)
  8. ax = sns.countplot(train_data['Embarked'], palette = palette, order = ['C', 'Q', 'S'], ax = ax1)
  9. plt.title('不同港口出发的乘客分布情况')
  10. plt.ylabel('乘客数')
  11. labels = (train_data['Embarked'].value_counts())
  12. labels = labels.sort_index()
  13. for i, v in enumerate(labels):
  14.     ax.text(i, v+10, str(v), horizontalalignment = 'center', size = 10, color = 'black')
  15.    
  16. ax2 = fig.add_subplot(132)
  17. surv_by_emb = train_data.groupby('Embarked')['Survived'].value_counts(normalize = True)
  18. surv_by_emb = surv_by_emb.unstack().sort_index()
  19. surv_by_emb.plot(kind='bar', stacked='True', color=["#3f3e6fd1", "#85c6a9"], ax = ax2)
  20. plt.title('不同港口出发的乘客存活情况')
  21. plt.legend(( 'Drowned', 'Survived'), loc=(1.04,0))
  22. _ = plt.xticks(rotation=False)
  23. ax3 = fig.add_subplot(133)
  24. class_by_emb = train_data.groupby('Embarked')['Pclass'].value_counts(normalize = True)
  25. class_by_emb = class_by_emb.unstack().sort_index()
  26. class_by_emb.plot(kind='bar', stacked='True', color = ['#eed4d0', '#cda0aa', '#a2708e'], ax = ax3)
  27. plt.legend(('1st class', '2nd class', '3rd class'), loc=(1.04,0))
  28. plt.title('不同港口出发的乘客的船舱等级分布')
  29. _ = plt.xticks(rotation=False)
  30. plt.tight_layout()
复制代码
 



总结:
我们知道泰坦尼克号上没有足够的船只可供所有搭客撤离。 在研究了有关搭客的信息之后,我们可以对谁在沉船变乱中有更好的生存时机以及对搭客的
一般观察做出一些假设。
1、数据集中有891名搭客,其中有549名(61.6%)被淹,只有342名(38.4%)幸存。 但是我们知道,救生艇(16艘木质救生艇和4辆可折叠救生艇)
可以载运总搭客的53%。

2、所有搭客的年龄从0.17年到80岁不等,平均为29.88岁。 幸存搭客的平均年龄为28.23,比溺水搭客的平均年龄(仅我们知道幸存者的年龄)小2.39。
看起来年轻人有更大的生存时机。

3、船上的家庭人数似乎也对生存时机有影响:有两个大家庭,分别为8和11,他们来自练习数据集的所有成员都被淹死了。 我们可以观察到,拥有2人,
3人,4人家庭的幸存者所占百分比大于单身人士,然后,随着家庭规模的增加,幸存者所占的百分比会降低。

4、泰坦尼克号的大部门搭客都是三等舱。 就搭客人数而言,第二类是最小的。 尽管有先前确定的先决条件(平均而言,老年人殒命的大概性更高,
并且头等舱的平均年龄比其他舱位更高。而且,由100%头等舱组成的A层搭客的 溺水搭客的比例很高),头等舱的幸存者人数最多,而舱内幸存者的
比例最大。

5、三等舱机票的溺水搭客人数最多。但是,大多数头等舱的男性搭客被淹死,而女性险些全部幸存下来。 三等舱,一半的女性得以幸存。

6、船上的男性总体上比女性多,这对每个舱位来说都是公平的,但是在三等舱中,男性的数量是女性的两倍多。

7、险些有600名男性游客没有家庭成员,只有200名女性,但是在普通家庭和大家庭中,女性游客略多。

8、大多数搭客(914)登上南安普敦。 此外,南安普敦的溺水搭客比例最大。 270名搭客登上瑟堡,其中50%以上幸存下来(在培训数据集中)。 
皇后镇(Queenstown)出发的游客有123人,其中绝大多数是三等舱游客。

9、泰坦尼克号幸存者分析是机器学习的入门案例,我做了一点资料的查询发现有一些是数据无法表现的,不得不说单从数据的角度还原其时情况
着实有很多不妥的地方,原因有以下几点:

(1)三等舱搭客中相当一部门是不懂英语的,看不懂路标指示,听不懂海员的指令。这一因素与社会职位无关。
(2)爱德华·约翰·史密斯船长在最后时候下令“妇孺优先”,但是大副、二副对该命令的实行是不一致的,右舷大副默多克认为假如甲板上没有
密斯儿童了,只要另有空位,男性搭客也可以登艇。所以从右舷放下的九艘救生艇上都有男性搭客,救生艇的乘坐率也比力高,其中有三艘满员。
而在左舷的二副莱托勒则把“密斯和儿童优先”明确为“全船的密斯和儿童都应当先于男性搭客登艇”。所以,左舷的救生艇实在是
“仅限密斯和儿童”。从左舷放下的九艘救生艇中,只有三艘乘坐率略高出六成。
(3)考察头等舱幸存男性,他们主要集中右舷最早放下的三艘救生艇中,第一艘救生艇,一半座位是空的,一半搭客是男性,主要原因是一开始多数人
都没有认识到被认为“永不沉没”的铁达尼所面临的的危险。第二艘、第三艘救生艇男性搭客也占了近三分之一。另有一个原因是,右舷的救生艇位置
距离头等舱近。
(4)有少部门人主动放弃等艇时机,这样行为无疑闪耀着人性光辉。
所以单从数据的角度得出的结论显然不敷以说明其时的情况。电影《萨利机长》中,计算机的模拟还原的情况是飞机完全可以不必迫降在河面,
也是数字还原效果与现实的不符。所以只知道分析数据的分析师不是好的分析师,结合对业务的明确才是关键,数据是辅助。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表