基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程

基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程

*
0.项目介绍
1.使用数据集
2.数据的基本统计分析
3.数据的属性探查
4.数据预处理
5.数据的相关性分析
6.特征工程
7.数据模型构建
8.交叉检验
9.特征选择
10.模型过拟合分析
11.项目总结
12.参考文献

0.项目介绍

kaggle比赛中有一经典Titanic泰坦尼克号数据集,本数据集非常适合新手作为数据分析入门研究例程,本项目主要对Titanic数据集整个分析建模过程进行详细描述,帮助数据分析入门的同学快速了解整个数据分析建模的全流程解决方案和思考的过程。数据集要使用我提供的,网上很多的数据集经过了一些处理,可能无法复现整个流程。

1.使用数据集

数据集下载地址:
我用夸克网盘分享了「Kaggle_Titanic」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/ab45007990ba
提取码:14Kn

2.数据的基本统计分析

数据分析的第一步便是了解数据集属性,查看数据的基本情况(数据量、缺失值、异常值等)。

import pandas as pd
import numpy as np

data_train=pd.read_csv("datasets/Kaggle_Titanic/train.csv")

data_test = pd.read_csv("datasets/Kaggle_Titanic/test.csv")

print(data_train.info())
print(data_test.info())

print(data_train.describe())
print(data_test.describe())

训练数据集的基本情况:有11列属性,分别是乘客的ID、获救情况,乘客等级、姓名、性别、年龄、堂兄弟妹个数、父母与小孩的个数、船票信息、票价、船舱、登船的港口;从其中我们获取到几点认知:

PassengerId(乘客ID),Name(姓名),Ticket(船票信息)存在唯一性,三类意义不大,可以考虑不加入后续的分析;
Survived(获救情况)变量为因变量,其值只有两类1或0,代表着获救或未获救;
Pclass(乘客等级),Sex(性别),Embarked(登船港口)是明显的类别型数据,而Age(年龄),SibSp(堂兄弟妹个数),Parch(父母与小孩的个数)则是隐性的类别型数据;Fare(票价)是数值型数据;Cabin(船舱)则为文本型数据;
Age(年龄),Cabin(船舱)和Embarked(登船港口)信息存在缺失数据。

而在测试数据集中,年龄、票价和船舱三类属性存在缺失值。
在对训练数据集和测试数据集进行基本统计分析时,我们重点关注标准差,最小值和最大值三个指标,标准差反映了数据的离散程度,最大和最小值一般可以看出数据是否有异常值。在这两组数据上,其它数据均无异常,而两组数据均存在票价为0的船票,考虑该类船票可能是优惠船票,且该属性上标准差也较大,数据属性探测时,需要通过箱线图查看一下异常值情况。

3.数据的属性探查

数据的属性探测是针对单个的属性探测其分布情况,一般可以通过绘制单个属性的分布图进行探查。

查看获救情况的分布:


import matplotlib.pyplot as plt
import seaborn

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

print(data_train['Survived'].value_counts())

输出:
0 549
1 342
Name: Survived, dtype: int64

分别看一下各属性的基本分布情况,首先我们对适合利用图形展示的属性,通过绘图的方式探查属性的分布,分类型和数值型数据非常适合绘图,所以这部分我们选择乘客等级、性别、年龄、票价和登船港口五类属性。


fig = plt.figure()

plt.subplot2grid((2, 3), (0, 0))
data_train['Pclass'].value_counts().plot(kind='bar')
plt.ylabel(u"人数")
plt.xlabel(u'乘客等级')
plt.title(u'乘客等级分布')

plt.subplot2grid((2, 3), (0, 1))
data_train['Sex'].value_counts().plot(kind='bar')
plt.ylabel(u"人数")
plt.xlabel(u'性别')
plt.title(u'乘客性别分布')

plt.subplot2grid((2, 3), (0, 2))
data_train['Age'].hist()
plt.xlabel(u'年龄')
plt.title(u'乘客年龄分布')

plt.subplot2grid((2, 3), (1, 0))
data_train['Fare'].hist()
plt.xlabel(u'票价')
plt.title(u'船票票价分布')

plt.subplot2grid((2, 3), (1, 1))
data_train['Fare'].plot(kind='box')
plt.title(u'票价箱线图')

plt.subplot2grid((2, 3), (1, 2))
data_train['Embarked'].value_counts().plot(kind='bar')
plt.xlabel(u'登船口')
plt.title(u'登船口乘客量分布')
plt.show()

基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程
对于乘客等级、性别、登船口这类类别型的属性,从柱状图上探查各类的分布情况,而对于年龄和票价这类连续型的属性,我们可以选择利用直方图查看属性的分布。从乘客等级分布的柱状图上,我们得到三等乘客人数最多,1等和2等的乘客相对较少(等级顺序:1>2>3);在性别上,男性多于女性;在登船港口上,发现人数从高到低的港口分别是S>C>Q;看一下年龄的分布情况,我们发现20~30岁区间的乘客人数最多。
print(data_train[data_train['Fare'] == min(data_train['Fare'])]['Fare'].value_counts())
print(data_train[data_train['Fare'] == max(data_train['Fare'])]['Fare'].value_counts())

输出:
0.0 15
Name: Fare, dtype: int64
512.3292 3
Name: Fare, dtype: int64

在第一部分,我们怀疑票价属性存在异常值,并且从该属性的直方图和箱线图分布上,我们也发现数据存在极大和极小值,最小值为0的有15个记录,而最大值为512.3292的有3条记录。从绘制箱线图的结果发现,确实是很多数据存在异常,但是考虑到该数据反映的是票价,极端值确实存在可理解的情况,0可能是员工票或优惠票,极大值可能是VIP船舱的票价,所以数理层面上的异常并不能代表错误。

探查剩余属性的分布 首先是SibSp(堂兄弟妹个数)和Parch(父母与小孩的个数)两个属性,这两类属性也是类别型属性,只是类别较多,我们统计各类的乘客数量。

print(data_train['SibSp'].value_counts())
print(data_train['Parch'].value_counts())

0 608
1 209
2 28
4 18
3 16
8 7
5 5
Name: SibSp, dtype: int64
0 678
1 118
2 80
5 5
3 5
4 4
6 1
Name: Parch, dtype: int64

我们发现这两类属性在值为0和1时,乘客量较多。

其次是缺失值最严重的Cabin(船舱)属性,在上面的分析中我们已经发现这列属性仅有两百多条记录,只占总数据的1/4,而且这类属性为文本型数据,很难进行缺失值填充,在后续的建模分析中,我们暂时不考虑这列属性,但是我们依然可以探查这仅有的数据呈现怎样的分布。观察数据发现这些文本类似于我们的高铁票座位号信息,是有字母+数字构成,而字母代表了作为的位置,所以我们可以将字母取出,然后统计这些字母的分布。

data_train['level'] = data_train['Cabin'].str.extract(r'([A-Za-z])')
print(data_train['level'].value_counts())

C 59
B 47
D 33
E 32
A 15
F 13
G 4
T 1
Name: level, dtype: int64

从结果上,我们发现B/C/D/E区的乘客量较多,这必须结合泰坦尼克号船舱座位分布去查看,此处我们不做深究。

4.数据预处理

在第二部分的属性探查阶段,我们并未对数据做任何处理,而是从原始数据中探查数据本来的样子和问题,接下来,我们需要对数据中存在问题(缺失值,异常值)的数据做预处理。

因为我们在前面的分析中认为票价存在的异常值还是符合常规认知的,所以此处我们并不对票价异常值进行处理,而船舱数据缺失严重,不作为我们后续建模的考虑因素。所以我们将会对年龄和登录港口两属性的缺失值进行填充。

年龄缺失值填充 一般对缺失数据的填充有删除、固定值填充、均值/众数/中位数填充等方法,本项目数据集数据量较小,直接利用固定值填充的方式不合适,也无法反映这部分缺失数据的特性,所以我们也参考博客中的方法,利用随机森林算法,借助其他属性值,来预测缺失数据值。

from sklearn.ensemble import RandomForestRegressor

def set_missing_age(df):

    age_df = df[['Age','Fare','Parch','SibSp','Pclass']]

    known_age = age_df[age_df.Age.notnull()].values
    unknown_age = age_df[age_df.Age.isnull()].values

    y = known_age[:,0]

    x = known_age[:,1:]

    rfr = RandomForestRegressor(random_state=0,n_estimators=2000,n_jobs=-1)
    rfr.fit(x,y)

    predictedAges = rfr.predict(unknown_age[:,1::])

    df.loc[(df.Age.isnull()),'Age'] = predictedAges

    return df

data_train = set_missing_age(data_train)

print(data_train)

SibSp Parch Ticket Fare Cabin Embarked level
0 1 0 A/5 21171 7.2500 NaN S NaN
1 1 0 PC 17599 71.2833 C85 C C
2 0 0 STON/O2. 3101282 7.9250 NaN S NaN
3 1 0 113803 53.1000 C123 S C
4 0 0 373450 8.0500 NaN S NaN
… … … … … … … …

886 0 0 211536 13.0000 NaN S NaN
887 0 0 112053 30.0000 B42 S B
888 1 2 W./C. 6607 23.4500 NaN S NaN
889 0 0 111369 30.0000 C148 C C
890 0 0 370376 7.7500 NaN Q NaN
[891 rows x 13 columns]

登陆港口缺失值填充
登陆港口属性缺失值仅有两条记录,数据量小,我们直接删除这两条记录。

data = data_train.drop(data_train[data_train.Embarked.isnull()].index)
print(data)

5.数据的相关性分析

数据的相关性分析可以探查属性间的相关性,查看属性是否存在冗余;另外通过探寻各属性和结果属性的关系,进而选择和结果相关性较大的属性,作为建模的重要特征,所以这一部分我们首先探测各属性间关系,然后再探测单个属性和结果之间的关系。

属性间相关性探测:

import seaborn
df = data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Survived']]

cor = df.corr()
print(cor)

seaborn.heatmap(cor)
plt.show()

基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程
从相关系数方面,我们发现各属性和结果相关性都不大,而属性间也只有SibSp和Parch属性的相关性较高,其它属性间的相关性较低。我们认为相关性系数更适合分析数值型数据,而针对分类型数据,则不适合。所以,我们单独分析每一个属性和结果质检的关系。

单个属性和结果之间的相关性 首先,我们先对类别型属性进行分析(这里的类别型数据有等级、性别、登陆港口,还包括了年龄,SibSp和Parch这些隐型的数据


plt.figure(figsize=(10, 8), dpi=100)

p1 = plt.subplot(221)
Pclass_0 = data.loc[data['Survived'] == 0, 'Pclass'].value_counts()
Pclass_1 = data.loc[data['Survived'] == 1, 'Pclass'].value_counts()
df_pclass = pd.DataFrame({u'获救':Pclass_1,u'未获救':Pclass_0})
df_pclass.plot(kind='bar', ax=p1)
plt.title(u'不同等级乘客的获救情况')

p2 = plt.subplot(222)
Survived_m = data.loc[data['Sex'] == 'male', 'Survived'].value_counts()
Survived_f = data.loc[data['Sex'] == 'female', 'Survived'].value_counts()
df_sex = pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
df_sex.plot(kind='bar', stacked=True, ax=p2)
plt.title(u'不同性别乘客的获救情况')

p3 = plt.subplot(223)
bins = [min(data['Age']), 10, 60, max(data['Age'])]
bins_label = ['10岁及以下', '10-60岁', '60岁以上']
data['Age_cut'] = pd.cut(data['Age'], bins=bins, labels=bins_label)
print(data['Age_cut'].value_counts())

Age_0 = data.loc[data['Survived'] == 0, 'Age_cut'].value_counts()
Age_1 = data.loc[data['Survived'] == 1, 'Age_cut'].value_counts()
df_age = pd.DataFrame({u'获救':Age_1, u'未获救':Age_0})
df_age.plot(kind='bar', ax=p3)
plt.title(u'不同年龄阶段乘客的获救情况')

p4 = plt.subplot(224)
Embarked_0 = data.Embarked[data.Survived == 0].value_counts()
Embarked_1 = data.Embarked[data.Survived == 1].value_counts()
df_Embarked = pd.DataFrame({u'获救': Embarked_1, u'未获救': Embarked_0})
df_Embarked.plot(kind='bar', stacked=True, ax=p4)
plt.title(u'不同登陆港口乘客的获救情况')

plt.show()

基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程
因为年龄是一个隐型的类别型属性,属性类别多,我们需要对其进行等级划分,这里划分了三个阶段,10岁以下代表儿童,10~60岁代表成年人,60岁以上代表老年人,进而转换成类别型数据。统计这四类类别型数据是否获救的数量,并绘制柱状图,从图中得的以下结论:等级高的乘客获救率高(1>2>3);女性获救率远大于男性;儿童的获救率高于成年人和老年人;C港的获救率大一些,而S港登船人数最多,这说明了这些属性对是否获救存在影响,是后续建模需要考虑的属性。

其次,针对类别较多的SibSp和Parch属性,我们直接统计各类的是否获救情况。


g1 = data.groupby(['SibSp', 'Survived'])
df_SibSp = pd.DataFrame(g1.count()['PassengerId'])
df_SibSp.rename(columns={'PassengerId':'count'}, inplace=True)
print(df_SibSp)

g2 = data.groupby(['Parch', 'Survived'])
df_Parch = pd.DataFrame(g2.count()['PassengerId'])
df_Parch.rename(columns={'PassengerId': 'count'}, inplace=True)
print(df_Parch)

count
SibSp Survived
0 0 398
1 208
1 0 97
1 112
2 0 15
1 13
3 0 12
1 4
4 0 15
1 3
5 0 5
8 0 7
count
Parch Survived
0 0 445
1 231
1 0 53
1 65
2 0 40
1 40
3 0 2
1 3
4 0 4
5 0 4
1 1
6 0 1

从结果中,我们发现,SibSp

Original: https://blog.csdn.net/jiangxinufo00/article/details/127902136
Author: AI算法蒋同学
Title: 基于Titanic数据集的数据分析处理及乘客生还率预测全流程教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/795624/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球