泰坦尼克号预测生还案例的分析(一)

最近在学习机器学习,有幸可以研究一下Kaggle竞赛的“泰坦尼克号预测生还”的案例。首先说明这里面的代码并非全部为本人所打,只是在从中学习到了很多东西,一和大家分享,二来整理知识。

先分享下的数据文件:百度网盘链接:http://pan.baidu.com/s/1i4OtRaX 密码:rqcx

1. 导入数据:

import os
import pandas as pd #导入数据分析的利器pandas
import numpy as np
import matplotlib.pyplot as plt
#设置画图时的文字格式为微软雅黑,显示中文字体
mpl.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.style.use("ggplot")

#从文件夹中读取数据.csv文件
os.chdir("E:\机器学习\机器学习数据集\Titanic") #切换路径
data=pd.read_csv("train.csv") 
data.head(10)                               #查看前10行数据

我们来看看读取结果吧:

这里写图片描述
我们先看看各个特征代表的是什么意思:
PassengerId => 乘客ID
Pclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口

2.分析统计数据
我们看到这些数据,不知从何处分析,首先我们还是从统计学最基本的概念上去分析,比如百分比,平均值、方差、标准差、分布曲线、频率直方图,这里有篇写的非常好的博文,数据到手了,第一件事先干啥?| 说人话的统计学,大家可以去看看。
在python3中怎么去显示这些数据呢?

 #用pandas里面的describe()就看可以查看最基本的统计信息了
print("data's mathmathic describtion:\t")
data.describe()

结果为
统计图,在表中我们看到了Survived的平均值为0.3838,即大约有38%的乘客获救;Age的平均值为29.69岁,同时Age有NaN数据,这个就是numpy 中的一种数据格式,就是缺省值,也就是遗漏信息。
我们来看看各个特征遗漏数据的情况:

 #data.isnull().sum()将缺失项的数据全部加起来
print("缺少数据:\n",data.isnull().sum())

结果为:
这里写图片描述
从图中可以得到这样的信息,Age有177个遗漏信息,Cabin有687个遗漏信息,这数据表。。。。。。。。。。。。

3.数据可视化
仅从单单一系列数据,好像还不能直观反映出数据的大概情况,所以有必要通过python3中的pandas的plot函数,以及maplotlib的pyplot的模块,可以画出饼状图、密度分布曲线、柱状图对数据进行可视化分析。

#首先设定一个画布或者叫图纸,尺寸为10X10
fig = plt.figure(figsize=(10,10))
fig.set(alpha=0.5)  # 设定图表颜色alpha参数

#其次,统计生还者与遇难者的比例
#用pandas的value_count()函数就可以统计处suvived取不同值的总数
plt.subplot2grid((2,3),(0,0))  # 在一张大图里,(2,3)表示图像分布为2行3列,(0,0)指的是第一行第一列
data_train.Survived.value_counts().plot(kind='bar')#bar表示的画条形图
plt.title("获救情况 (1为获救)") # puts a title on our graph
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("年龄")                         # sets the y axis lable
plt.grid(b=True, which='major', axis='y') # formats the grid line style of our graphs
plt.title("按年龄看获救分布 (1为获救)")

仅仅知道这些还是不够的,我们想看看一等舱、二等舱、三等舱的各年龄分布情况,但是python3如何将如何从年龄表中抽出一等舱、二等舱三等舱的乘客出来?这时你就需要布尔过滤的方法了。

plt.subplot2grid((2,3),(1,0), colspan=2)
data_train.Age[data_train.Pclass == 1].plot(kind='kde') #从年龄表中抽出乘客等级为1的名单,作出密度曲线  
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel("年龄")# plots an axis lable   #横轴标签设为年龄
plt.ylabel("密度")                        #纵轴标签设为密度
plt.title("各等级的乘客年龄分布")
plt.legend(('1等舱', '2等舱','3等舱'),loc='best')  

最后我们也可以看下在各个港口登陆的分布情况

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

运行代码后的结果为:
这里写图片描述
这里写图片描述

4.统计各个特征下的生还者和遇难者分布情况
统计下乘客等级和生还者的分布情况

#看看各乘客等级的获救情况
fig = plt.figure(figsize=(5,5))
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({'获救':Survived_1, '未获救':Survived_0}) 
df.plot(kind='bar', stacked=True)
plt.title("各乘客等级的获救情况")
plt.xlabel("乘客等级") 
plt.ylabel("人数") 
plt.show()

结果为这里写图片描述

统计各登录港口的获救情况

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

Survived_0 = data_train.Embarked[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Embarked[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()
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()

结果:这里写图片描述

5.总结
1.对于数据形式为DataFrame的数据,用pandas.DataFrame自带的plot函数更加方便,而matplotlib.pyplot的参数设置比较复杂。pandas.DataFram.plot在线文档
2.对于统计某个特征向量的各个取值的数量,可以用pandas的value_counts()函数.
3.对于离散值,通过上面的value_counts()可以统计出某个特征各个取值的数量,我们就可以通过画图的方式将其展示出来,画出柱状图最为直观,而对于可以取值较多的离散值比如年龄,我们将其看成连续值,就可以画出其密度曲线。

最后,数据的可视化就先讲到这里了。

猜你喜欢

转载自blog.csdn.net/ZengHaihong/article/details/53199559