泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第四集(特征与标签的关系)

此次目的:
hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。(所学主要的内容来自与b站大学恩师“编程教学-Python“的教学视频内容)

 这一集的内容比前几集的内容多且难一些,大家可以耐心琢磨一下哈,还是比较有趣的,加油加油!!!

0.闲扯环节哈哈哈哈哈

这一集有点可能,所以介绍前我给你们分享一些最近开心的事情吧!最近最开心的一天就是上午学习学习,中午去拜访爷爷奶奶,一起吃饭聊天,下午出去和朋友去网吧打游戏,然后晚上和朋友们在路边小吃店吃点便宜的东西,再来几局激情王者3v3,之后6个人骑着小车吹着晚风在小县城的路上边骑边聊,聊人生聊理想聊从前聊未来也聊八卦聊游戏hhhhh......,惬意自在,回家前给老爸老妈带点小吃,回家在洗个澡,剪辑一下游戏视频(俺的小爱好),和朋友聊聊天就睡觉了。感觉很爽!所以大家在学习之余也要去感受生活,多去陪伴身边的人哈,生活美好未来可期,记得快乐才是第一位哦!

好了闲扯了这么多,也要转入正题了,要好好学哦!!!

1. 港口与生还率之间的关系

首先,我们分析了乘客的登船港口(Embarked)与生还率(Survived)之间的关系。通过绘制条形图,我们可以直观地看到不同港口登船的乘客生还率。

sns.barplot(data=train, x='Embarked', y='Survived')
  • sns.barplotseabornbarplot 函数用于绘制类别数据的条形图。条形图展示了类别变量的平均值及其置信区间。

  • data=train:指定了数据源 train,这个 DataFrame 包含了登船港口(Embarked)和生还情况(Survived)等数据。

  • x='Embarked':指定了横轴(x 轴)上的变量为 Embarked,即乘客的登船港口。Embarked 通常有三个类别:

    • C:Cherbourg(瑟堡)
    • Q:Queenstown(皇后镇)
    • S:Southampton(南安普顿)
  • y='Survived':指定了纵轴(y 轴)上的变量为 Survived,即乘客是否生还。Survived 是一个二元变量,通常为 0(未生还)或 1(生还)。

接下来,我们计算了不同港口的乘客生还率,并进一步研究了法国港口(C港口)生还率较高的原因。初步分析表明,这可能与该港口头等舱乘客比例较高有关。因此,我们进一步查看了不同港口的乘客舱位分布情况。

s = full.groupby('Embarked')['Survived'].value_counts().to_frame()
display(s)
s2 = s/s.sum(level=0)
display(s2)
pd.merge(s, s2, left_index=True, right_index=True, suffixes=['_num', '_rate'])

sns.catplot('Pclass', col='Embarked', data=train, kind='count', size=3)
  • full.groupby('Embarked')['Survived'].value_counts():首先,这行代码对数据集 fullEmbarked(登船港口)进行分组,然后对每个组中 Survived(生还情况)的值进行计数(.value_counts())。Survived 的值通常是 0(未生还)或 1(生还)。
  • .to_frame():将结果转换为一个 DataFrame 格式。
  • display(s):显示结果,s 是一个 DataFrame,其中每一行显示某个港口的乘客在生还和未生还的数量。
  • s.sum(level=0):计算每个港口(Embarked)的总乘客数(生还和未生还的总和)。注意:level=0pandas 中的 sum() 函数中用于指定沿着哪个层级的索引进行操作。
  • s / s.sum(level=0):用每个港口的生还和未生还人数分别除以该港口的总人数,得到生还率和未生还率。
  • display(s2):显示生还率和未生还率的结果 s2
  • pd.merge(s, s2, left_index=True, right_index=True, suffixes=['_num', '_rate']):将之前的两个 DataFrame ss2 合并在一起,合并的依据是索引(即 EmbarkedSurvived)。suffixes 参数为合并后的列名添加后缀,分别表示数量(_num)和比例(_rate)。

2. 家长和孩子数量与生还率的关系

接下来,分析了乘客随行家长或孩子数量(Parch)与生还率之间的关系。可以看出,家庭成员较

多的乘客其生还率相对较高。 

sns.barplot(data=train, x='Parch', y='Survived')

3. 兄弟姐妹与生还率的关系

与家长和孩子类似,兄弟姐妹数量(SibSp)也对生还率产生了影响。数据显示,兄弟姐妹较多的乘客生还率相对较低。

sns.barplot(data=train, x='SibSp', y='Survived')

4. 舱位等级与生还率的关系

乘客舱位等级(Pclass)对生还率有显著影响。头等舱乘客的生还率显著高于二等舱和三等舱的乘客。

sns.barplot(data=train, x='Pclass', y='Survived')

5. 性别与生还率的关系

性别(Sex)是生还率的重要影响因素。女性乘客的生还率显著高于男性乘客。

sns.barplot(data=train, x='Sex', y='Survived')

6. 年龄与生还率的关系

为了更详细地分析乘客年龄(Age)与生还率之间的关系,我们使用了概率密度图(kdeplot)进行可视化。结果显示,年龄较小的乘客生还率相对较高。

#创建坐标轴
ageFacet=sns.FacetGrid(train,hue='Survived',aspect=3)
#作图,选择图形类型
ageFacet.map(sns.kdeplot,'Age',shade=True)
#其他信息:坐标轴范围,标签等
ageFacet.set(xlim=(0,train['Age'].max()))
ageFacet.add_legend()

7. 费用与生还率的关系

票价(Fare)是另一个影响生还率的重要因素。票价较高的乘客通常有更高的生还率。我们通过绘制票价的概率密度图,观察了票价与生还率之间的关系。

#创建坐标轴
ageFacet=sns.FacetGrid(train,hue='Survived',aspect=3)#aspect每个图片的纵横比
ageFacet.map(sns.kdeplot,'Fare',shade=True)
#概率密度函数kdeplot,shade是否加阴影
ageFacet.set(xlim=(0,150))#设置横坐标(0-150)
ageFacet.add_legend()

 此外,我们还探讨了票价分布情况。为了让数据更加符合正态分布,我们对票价进行了对数化处理,并再次绘制了票价分布图。

#查看fare分布
farePlot=sns.distplot(full['Fare'][full['Fare'].notnull()],
                     label='skewness:%.2f'%(full['Fare'].skew()))
#skewnes正态分布里的偏态
farePlot.legend(loc='best')
  • sns.distplot()distplotseaborn 的一个函数,用于绘制数据分布的直方图和核密度估计(KDE)。它可以帮助我们了解数据的分布形态,比如是否接近正态分布,是否存在偏斜等。

  • full['Fare'][full['Fare'].notnull()]:选择 full 数据集中 Fare 列的非空(notnull())值,确保只绘制有效的票价数据。

  • label='skewness:%.2f' % (full['Fare'].skew()):这里计算了 Fare 列的偏态系数(skewness),并将其格式化为小数点后两位,作为图例的标签显示。

    • full['Fare'].skew():计算票价数据的偏态系数。偏态系数衡量数据分布的对称性:
      • Skewness > 0:数据右偏,长尾在右侧(大多数值集中在较小的范围内,少数值较大)。
      • Skewness < 0:数据左偏,长尾在左侧(大多数值集中在较大范围内,少数值较小)。
      • Skewness ≈ 0:数据大致对称,接近正态分布。
  • farePlot.legend(loc='best'):为图形添加图例,并将图例放置在最佳位置(loc='best')。图例显示了票价分布的偏态系数,使得读者能够一目了然地了解票价分布的对称性。

 

#对数化处理fare值
full['Fare']=full['Fare'].map(lambda x:np.log(x) if x>0 else x)

#处理后的票价Fare分布
farePlot=sns.distplot(full['Fare'][full['Fare'].notnull()],
                     label='skewness:%.2f'%(full['Fare'].skew()))
farePlot.legend(loc='best')
plt.savefig('./10-Fare票价分布.png',dpi=200)

 1.full['Fare'].map(lambda x: np.log(x) if x > 0 else x):对 Fare 列的每个元素应用 lambda 函数。对于每个票价 x

  • 如果 x > 0,则计算该票价的自然对数(np.log(x))。
  • 如果 x <= 0,则保持原值(防止对零或负值计算对数会导致数学错误)。
  • 对数变换是一种常用的处理方法,可以减小数据的偏态,使数据更接近正态分布,尤其是在数据存在极端大值的情况下。

2.sns.distplot():再次使用 distplot 函数绘制变换后票价的分布图。

  • full['Fare'][full['Fare'].notnull()]:选取 Fare 列中非空的值进行绘图。
  • label='skewness:%.2f' % (full['Fare'].skew()):计算并展示变换后票价分布的偏态系数。由于进行了对数变换,预期偏态系数将减小,表明数据分布更对称。

3.legend(loc='best'):添加图例并将其放置在最佳位置,显示变换后票价分布的偏态系数。

4.plt.savefig():将绘制的图像保存为文件。

  • './10-Fare票价分布.png':文件路径和名称。
  • dpi=200:图像分辨率,200 dpi 表示较高的清晰度。

 8.总结与鼓励哈

1. 数据分布与偏态系数定义:

偏态系数:衡量数据分布的对称性,偏态系数(skewness)大于 0 表示数据右偏,偏态系数小于 0 表示数据左偏,偏态系数接近 0 表示数据对称。

2. 数据变换:对数化处理

对数变换:通过对数变换(log transformation),可以减少数据的偏态,尤其适用于处理具有极端大值的右偏数据,使数据分布更接近正态分布。对数变换后的数据更适合用于一些要求数据对称性的统计方法和机器学习模型。

3. 数据分组与聚合

  • groupbyvalue_counts:通过对数据进行分组聚合,可以分析不同类别之间的关系。例如,通过 groupby 按照登船港口分组,再计算生还情况的计数,可以分析登船地点与生还率之间的关系。
  • sum(level=0):在多级索引中,level 参数用于指定在某一级别进行聚合计算,有助于处理复杂的数据结构。

4. 数据可视化

  • 条形图(Bar Plot):用于展示类别数据的平均值或总和,通过对比不同类别的条形高度,可以分析类别与目标变量之间的关系。
  • 分布图(Distribution Plot):用于展示单个变量的分布情况,通过直方图和 KDE 曲线,可以观察数据的集中趋势、分散程度和偏态情况。

5. 保存与展示图像

  • 图像保存:使用 plt.savefig() 可以将绘制的图像保存为文件,指定文件路径、名称和分辨率(dpi),便于在报告或展示中使用。

6. 数据清理与预处理

  • 空值处理:在数据分析中,通常需要对空值进行处理,如去除空值或者进行填补,以确保后续分析的准确性。
  • lambda 函数:在数据预处理中,lambda 函数常用于对数据进行简单的逐元素操作,例如对数据进行对数变换。

屏幕前的老弟加油加油哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值