我是目录
前言
本文以kaggle竞赛中经典的入门案例–泰坦尼克之灾(Titanic Machine Learning from Disaster )为例,直接上手实战。
推荐一篇路易斯安那州立大学的作业报告,其文中对数据特征的分析归纳还是挺有参考价值的。
数据导入
第一步当然是要先获取到我们需要的数据啦,网址如下:
kaggle网址
进入页面后将下图中的training set和test set两个csv文件保存到本地工程文件夹内。
本文代码的运行环境是Anaconda 的 jupyter notebook。个人感觉其无论是下载、管理各类三方库还是做笔记都十分方便好用,强烈推荐!
首先导入数据分析常用的库。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
还需要以下代码在notebook中显示图像以及在图表中做到正常的中文显示。
#图像显示
%matplotlib inline
#中文显示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#图像尺寸大小
plt.rcParams['figure.figsize'] = (15,8)
导入数据集
data_train = pd.read_csv('D:/WDforJupyter/titanic/train.csv')
data_test = pd.read_csv('D:/WDforJupyter/titanic/test.csv')
下面看一下我们的训练集数据:
也可以使用head(n)来只显示训练集的前n行数据:
我们可以初步了解到可供挖掘分析的数据属性有:
- PassengerId(乘客id,目测没啥用)
- Survived (是否存活,本案例中需要预测的对象)
- Pclass (船票等级,可能会影响到结果)
- Name (姓名,有深入挖掘的潜力)
- Sex (性别,应该女士优先)
- Age (年龄,老幼存活概率应该较大)
- SibSp (船上兄弟姐妹以及配偶的数目,可能会有用)
- Parch (船上父母以及子女的数目,或许有影响)
- Ticket (票号,可能没用)
- Fare (票价,可能有关)
- Cabin (船舱编号,或许有影响)
- Embarked (登船的港口,应该和结果关系不大)
接着看一下数据的概况:
如上,可以看到一共有891位乘客,部分数据特征有缺损。其中年龄这项有714个条目,而客舱这项更是只有204条记录。这些缺失项肯定会需要一些手段来处理补足,目前暂时不表。
上表可以看到特征数据更详细的一些信息。其中值得关注的是年龄与票价这两项的标准差较大,分别达到了14.5264与49.69。针对这样分布范围比较广、波动较大的数据,可以像吴恩达老师建议的那样做归一化(Normalization)处理。
可视化分析
Pclass
首先来看一下乘客的船舱等级会不会影响到获救的概率。
plt.subplot2grid((2,1),(0,0))
data_train.Pclass.value_counts().plot(kind='bar')
plt.xticks(rotation=0)
plt.ylabel('乘客数',{
'size':15})
plt.xlabel('船舱等级',{
'size':15})
plt.subplot2grid((2,1),(1,0))
sns.barplot(x='Pclass', y='Survived', data=data_train,order=[3,1,2],ci=0)
plt.ylabel('存活率',{
'size':15})
plt.xlabel('船舱等级',{
'size':15})
咳咳,貌似一二等舱的乘客的获救概率确实高了不少。
Sex
盲猜女性获救比例更高一些。
plt.subplot2grid((2,1),(0,0))
data_train.Sex.value_counts().plot(kind='bar')
plt.xticks(rotation=0)
plt.ylabel('乘客数',{
'size':15})
plt.xlabel('性别',{
'size':15})
plt.subplot2grid((2,1),(1,0))
sns.barplot(x='Sex', y='Survived', data=data_train,ci=0)
plt.ylabel('存活率',{
'size':15})
plt.xlabel('性别',{
'size':15})
可以看到性别因素对生还率有着极为显著的影响。都说在直面生死存亡的关头才能看出一个人的品性。。。这里不得不赞一句:泰坦尼克号上的男同胞们太man了啊!!!
Age
下面一起来看看对老幼的保护怎么样
data_train.Age[data_train.Survived==1].plot(kind='kde')
data_train.Age[data_train.Survived==0].plot(kind='kde')
plt.legend(['Survived==1','Survived==0'])
plt.xlim((0,80))
plt.ylabel('密度',{
'size':15})
plt.xlabel('年龄',{
'size':15})
年龄在15岁以下的乘客其生还的密度曲线还是远高于不幸的密度曲线的,但是长者的获救概率似乎就没有这么高了。可能他们自愿将生存的机会留给了下一代;也可能其本身较差的体质加上受到的关注没有孩童来的多导致总体获救概率与青壮一带堪堪齐平;当然一定还有其他没考虑进来的因素导致了这个现象,后续我们可以再深入挖掘。
SibSp
Sibling and Spouses(我为什么要用s?) 属性代表该名乘客有多少兄弟姐妹以及配偶一同登上了这艘不幸的邮轮。理论上来说人多力量大,多几个同行的人互相照应可以在灾难中提升生还几率,下面来看一下到底是不是这样。
plt.subplot2grid((2,1),(0,0))
data_train.SibSp.value_counts().plot(kind='bar')
plt.xticks(rota