机器学习——画图方法

本篇博客与Titanic博客相关联,是其第2部分内容,由于涉及大量通过可视化图形 进行数据预览、分析的地方,因此独立成篇,作为画图方法的笔记。

-

数据分析阶段,我们要概览数据,观察每个特征与标签的关系,特征需不要处理,比如多个特征组合一个新特征,无价值特征舍弃,选择有用特征等等,这些前期工作比较繁琐,但确是必须的。它让我们更好的认识数据,对数据更加敏感。

1、预览数据集

加载数据集

#  -*-  coding:utf-8  -*-
import numpy as np #科学计算
import pandas as pd #数据分析
from pandas import Series, DataFrame

data_train = pd.read_csv("all/train.csv")
data_test = pd.read_csv('all/test.csv')

首先预览下训练集和测试集
先看训练集

data_train.head(10)

这里写图片描述
我们可以看到有一些特征列,以及特征的相应取值。
接着,总览一下数据

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、Cabin、Embarked三个特征存在缺失值,这个数据处理阶段要解读此问题。 处理完缺失值后,可以再次使用data_train.info() 查看一下进行确认。

data_train.describe()
#输出

这里写图片描述
可以看到各个样本个数、平均值、标准差、最小值、最大值等信息,
也可以

data_train['Age'].describe()

看到Age特征,样本有714个,平均年龄约为29.699岁,标准差14.52岁,最小年龄为0.42,最大年龄80。

data_train.Cabin.value_counts()
#输出
C23 C25 C27    4
B96 B98        4
G6             4
F33            3
D              3
C22 C26        3
F2             3
E101           3
E8             2
B28            2
C83            2
C124           2
D36            2
....

可以看到Cabin特征的一些内容信息。

2、对每个特征与生存率survivaled之间的关系进行分析

(1)分析Age与生存率survivaled的关系

import matplotlib.pyplot as plt
import matplotlib
# 显示中文
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] 


fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

plt.subplot2grid((2,3),(0,0))             # 在一张大图里分列几个小图
data_train.Survived.value_counts().plot(kind='bar')# 柱状图 
plt.title(u"获救情况 (1为获救)") # 标题
plt.ylabel(u"人数")  

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

plt.subplot2grid((2,3),(0,2))
plt.scatter(data_train.Survived, data_train.Age)
plt.ylabel(u"年龄")                         # 设定纵坐标名称
plt.grid(b=True, which='major', axis='y') 
plt.title(u"按年龄看获救分布 (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(u"年龄")# plots an axis lable
plt.ylabel(u"密度") 
plt.title(u"各等级的乘客年龄分布")
plt.legend((u'头等舱', u'2等舱',u'3等舱'),loc='best') # sets our legend for our graph.

plt.subplot2grid((2,3),(1,2))
data_train.Embarked.value_counts().plot(kind='bar')
plt.title(u"各登船口岸上船人数")
plt.ylabel(u"人数")  

plt.show()

这里写图片描述

注意,详细可以参考这篇博客,[ matplotlib常用画图方法—plot ]

data_train.Survived.value_counts().plot(kind='bar')# 柱状图 

kind =’bar’ 是柱状图
kind= ‘kde’ 是密度图
我们看到了获救人数的情况,乘客等级分布情况、各个等级乘客年龄分布情况、各个登船口岸登船人数的情况、年龄与生存率的关系

我们看到各个年龄段的人都有获救和不获救的情况存在。

(2)各个等级Pclass乘客获救情况

#  -*-  coding:utf-8  -*-
fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({u'获救':Survived_1, u'未获救':Survived_0})
df.plot(kind='bar', stacked=True)
plt.title(u"各乘客等级的获救情况")
plt.xlabel(u"乘客等级") 
plt.ylabel(u"人数") 
plt.show()
fig = plt.figure()

这里写图片描述

明显等级为1的乘客,获救的概率高很多

(3)Sex与生存率的关系

#看看各性别的获救情况
fig = plt.figure()
fig.set(alpha=0.2)  # 设定图表颜色alpha参数

Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_f = data_train.Survived[data_train.Sex == 'female'].value_counts()
df=pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
df.plot(kind='bar', stacked=True)
plt.title(u"按性别看获救情况")
plt.xlabel(u"性别") 
plt.ylabel(u"人数")
plt.show()

这里写图片描述
可以明显看出,女性的获救率远高于男性,可以说是与生存率标签联系非常紧密了。

#上面代码的部分解释
Survived_m = data_train.Survived[data_train.Sex == 'male'].value_counts()
Survived_m
#输出
0    468
1    109
Name: Survived, dtype: int64

(4)姓名与生存率的关系

其实在baseline的时候,我是没有考虑姓名的,因为通常上来讲,你叫什么名字和你的生存率有个鬼关系。。如果想要看看其分析可以本篇博文最后所附的参考文献。

但是最终,我还是选取了姓名这个特征,并且该特征起到了很重要的作用,
这是因为Name特征中,如果你仔细观察,会发现其包括对乘客的称呼,如:Mr、Miss、Mrs等,称呼信息包含了乘客的年龄、性别,同时也包含了如社会地位等的称呼,如:Dr,、Lady、Major、Master等的称呼。
因此可以说姓名这个属性包含极大的信息量,不能舍弃。
其具体处理过程,在titanic这篇博文中进行了说明。 [ Kaggle——高分泰坦尼克灾难生存预测详细讲解(LR、Bagging) ]

至于其他博文中说,研究名字长度与生存率的关系,emmm,怎么说呢,从画图分析好像确实有影响,实际情况时,当灾难发生,短名字可能更容易被别人叫? 或者短名字在灾后记录生存者的时候,更方便清点人员记录,因此容易被记录下来,emmm,总之,我感觉不是靠谱,因此最终模型也并未加入名字长短这个特征,有兴趣的可以点开本篇博文最后所附的参考文献进行查看。

(5)有无兄弟姐妹和存活与否的关系—SibSp

sibsp_df = data_train[data_train['SibSp'] != 0]
no_sibsp_df = data_train[data_train['SibSp'] == 0]
plt.figure(figsize=(10,5))
plt.subplot(121)
sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('sibsp')

plt.subplot(122)
no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('no_sibsp')

plt.show()

这里写图片描述

可以看到,有兄弟姐妹的,生存率确实高一些。

(6)有无父母子女和存活与否的关系 Parch

parch_df = data_train[data_train['Parch'] != 0]
no_parch_df = data_train[data_train['Parch'] == 0]

plt.figure(figsize=(10,5))
plt.subplot(121)
parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('parch')

plt.subplot(122)
no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%')
plt.xlabel('no_parch')

plt.show()

这里写图片描述
通用我们可以看到,有父母的生存率稍稍比无父母的生存率高出一些。
我在实践过程中,也将SibSp 和 Parch特征 组合成了新特征 Family_size,(Family_size=SibSp + Parch +1),但是结果评分反而下降了,其实通过观察我们也能发现,有1-2个家人的,生存率会高,无家人的 和 家人过多的,生存率会低。

(7)票价分布和存活与否的关系 Fare

首先绘制票价的分布情况:

plt.figure(figsize=(10,5))
data_train['Fare'].hist(bins = 70)

data_train.boxplot(column='Fare', by='Pclass', showfliers=False)
plt.show()

.hist() 方法在这篇博文中又说 [ matplotlib常用画图方法—plot ]

这里写图片描述
这里写图片描述

绘制生存与否与票价均值和方差的关系:
这里写图片描述

由上图标可知,票价与是否生还有一定的相关性,生还者的平均票价要大于未生还者的平均票价。

(8)船舱类型和存活与否的关系 Cabin

由于Cabin的缺失值较多,因此我们取有Cabin值和无Cabin值作为特这,通过画图分析,我们可以看到,有Cabin值的乘客生存率要大于没有的乘客。
虽然我觉得这么做有点扯,但也不是完全没有道理,清点人员在灾难后记录Cabin值的时候,往往只有存活者才可以提供Cabin,死亡者Cabin随着票一起丢失了。

(9)港口和存活与否的关系 Embarked

import seaborn as sns
sns.countplot('Embarked', hue='Survived', data=data_train)
plt.title('Embarked and Survived')
Text(0.5,1,'Embarked and Survived')

这里写图片描述

sns.factorplot('Embarked', 'Survived', data=data_train, size=3, aspect=2)
plt.title('Embarked and Survived rate')
plt.show()

这里写图片描述

由上可以看出,在不同的港口上船,生还率不同,C最高,Q次之,S最低。

(10)Ticket、PassengerID特征

PassengerID 是乘客身份的唯一标识,Ticket特征也差不多,因此,其与生存率可以说是没有任何关系了。


至此,11个特征分析完毕,survival特征作为标签。


  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值