经典又兼具备趣味性的Kaggle案例泰坦尼克号问题
kaggle入门——逻辑回归应用之kaggle泰坦尼克之灾 原文连接:https://blog.csdn.net/han_xiaoyang/article/details/49797143#commentBox
https://www.kesci.com/home/project/5bfe39b3954d6e0010681cd1
背景
关于Kaggle
- 我是kaggle地址,翻我牌子
- 这就是哪个无数【数据挖掘先驱】们,在回答”枪我有了,哪能找到靶子练练手啊?“时候的答案
Kaggel是一个要数据有数据,要实际应用场景有场景,要一起在数据挖掘领域high得不要不要的小伙伴就有小伙伴的地方啊!!!
据挖掘竞赛),企业或者研究者可以将问题背景、数据、期望指标等发布到Kaggle上,以竞赛的形式向广大的数据科学家征集解决方案。而热爱数(dong)据(shou)挖(zhe)掘(teng)的小伙伴们可以下载/分析数据,使用统计/机器学习/数据挖掘等知识,建立算法模型,得出结果并提交,排名top的可能会有奖金哦!
关于泰坦尼克号之灾
-
下面是问题的背景页
-
可下载Data的页面
-
下面是小伙伴们最爱的forum页面,你会看到各种神级人物厉(qi)害(pa)的数据处理/建模想法,你会直视『世界真奇妙』。
-
泰坦尼克号问题背景
- 就是那个大家都熟悉的『Jack and Rose』的故事,豪华游艇倒了,大家都惊恐逃生,可是救生艇的数量有限,无法人人都有,副船长发话了『lady and kid first!』,所以是否获救其实并非随机,而是基于一些背景有rank先后的。
- 训练和测试数据是一些乘客的个人信息以及存活状况,要尝试根据它生成合适的模型并预测其他人的存活状况。
- 对,这是一个二分类问题,是我们之前讨论的logistic regression所能处理的范畴。
初探数据
先看看数据长什么样,在Date下我们的train.csv和test.csv两个文件分别存着官方给的训练和测试数据。
import pandas as pd #数据分析
import numpy as np #科学计算
from pandas import Series,DataFrame
data_train = pd.read_csv("e:/data/Titanic_data/train.csv")
data_train.columns
输出
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
看到大概有以下这些字段
PassengerId =>乘客ID
Pclass => 乘客登记(1/2/3等舱位)
Name => 乘客姓名
Sex =>性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked =>登船港口
查看数据集信息
data_train.info()
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
上面的数据可以看出来,训练数据总共又891名乘客,但是有些属性数据不全,比如说:
- Age(年龄) 属性只有714名乘客是有记录
- Cabin(客舱) 更是只有204名乘客是已知的
再查看一下数值的具体情况
data_train.describe()
由mean字段的值,大概0.383838的人最后获救了,2/3等舱人数要比1等舱多,平均乘客年龄大概是29.7岁…
上面的简单描述性信息并没有什么用,需要更细力度的分析数据
数据初步分析
仅仅上面的对数据的了解,依旧无法提供给我们想法和思路。再深入一点看看数据
查看每个/多个 属性和最后的Survived之间有什么样的关系
乘客各属性分布
import matplotlib.pyplot as plt
%matplotlib inline
fig = plt.figure()
fig.set(alpha=0.2) #设定图表颜色alpha参数
plt.subplot2grid((2,3),(0,0)) #在一张大图里分列几个小图
plt.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体
plt.rcParams['axes.unicode_minus'] = False #解决中文显示为方框的问题
data_train.Survived.value_counts().plot(kind='bar') #柱状图
plt.title("获救情况 (1为获救)") #标题
plt.ylabel("人数")
plt.subplot2grid((2,3),(0,1))
data_train.Pclass.value_counts().plot(kind='bar')
plt.ylabel("人数")
plt.title("乘客等级分布")
plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived,data_train.Age) #散点图
plt.ylabel("年龄")
plt.grid(b=True,which='major',axis='y') #显示y轴网格
plt.title("按年龄看获救分布 (1为获救)")
plt.subplot2grid((2,3),(1,0),colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel("年龄")
plt.ylabel("密度")
plt.title("各等级的乘客年龄分布")
plt.legend(('头等舱','2等舱','3等舱'),loc='best') #显示图例
plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title("各登船口岸上船人数")
plt.ylabel("人数")
plt.show()
在图上可以看出来,被救的人300多点,不到半数;3等舱人数非常多,遇难和获救的人年龄跨度似乎都很广;3个不同舱年龄总体趋势似乎也一致,2/3等舱乘客20多岁的人最多,1等舱40岁左右的最多(似乎符合财富和年龄的分配);登船港口人数按照S、C、Q递减,而且s远对于另外两个港口。
现在可能会有一些想法了:
- 不同仓位/乘客等级了能和财富/地位有关系,最后获救的概率可能会不一样
- 年龄对获救概率也一定是有影响的,副船长说 小孩和女士先走
- 和登船港口是不是也有关系呢?也许登船港口不同,人的身份地位不同?
口说无凭,空想无益,老老实实再来统计统计,看看这些属性值的统计分布。
属性与获救结果的关联统计
查看各乘客等级的获救情况
fig = plt.figure()
fig.set(alpha=0.2) #设定图表颜色alpha参数
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()