数据概览
数据基础概览
我们首先使用pandas内置的统计函数来对其做一个基本的概览
1 2
| data = pd.read_csv('train.csv') print(data.info())
|
由此得到输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float64 6 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float64 10 Cabin 204 non-null object 11 Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB
|
由这些信息我们可以看出的是,乘客一共有891名,并且年龄和客舱字段存在着非常明显的缺失
数据可视化概览
由于我们对图形更为敏感,所以我们这里尝试将其进行可视化分析
获救情况
我们画图来看看获救和不获救的情况如何
1 2 3 4
| fig = plt.figure() data.Survived.value_counts().plot(kind='bar') plt.title('Suvive overview') plt.ylabel(u'number of people')
|
这里面的kind=’bar’表示的是柱状图,value_counts方法是对其中的每个值的数量进行统计,横坐标根据值的不同自动生成。下面分别是对标题和纵坐标标签的设置,具体的图如下

我们从图上看出:被救出的人较少,不到半数
乘客等级分布
1 2 3 4
| fig = plt.figure() data.Pclass.value_counts().plot(kind='bar') plt.title('class overview') plt.ylabel('number of people')
|
方法和上相同
我们从图上看出来,大部分人的等级为第三等级,一二相仿
各个登船口上岸人数
1 2 3 4
| fig = plt.figure() data.Embarked.value_counts().plot(kind='bar') plt.title('Embarked overview') plt.ylabel('number of people')
|
方法相同
从图中我们可以看出,大部分人从S港口上岸
各等级乘客年龄分布
1 2 3 4 5 6 7 8
| fig = plt.figure() data.Age[data.Pclass == 1].plot(kind='kde') data.Age[data.Pclass == 2].plot(kind='kde') data.Age[data.Pclass == 3].plot(kind='kde') plt.xlabel('age') plt.ylabel('number') plt.title('age information in every class') plt.legend(('first class','second class','third class'), loc='best')
|
在这里我们一定使用到了经典的python用法,也是在数据处理过程中非常常见的一种方法。对于里面的索引内容,我们可以使用条件判断语句来判断。kind的kde指的是一种曲线图,一条曲线的积分为1,每一个小段的值表示其出现的概率。这里的legend方法是显示图例。所得图见下
这里可以得出的有用信息不多,因为曲线趋势一致。主要还是说一等舱的年纪偏大一点
与生存情况相关联的可视化分析
性别与生存情况的关系
我们知道电影中说让女人和小孩先走,我们就来看看和性别的关系
1 2 3 4 5
| sur_sex = data[data.Survived == 1].Sex.value_counts() ded_sex = data[data.Survived == 0].Sex.value_counts() df = pd.DataFrame([sur_sex, ded_sex]) df.index = ['Survived','Dead'] df.plot(kind='bar', stacked=True, figsize=(10,8))
|
这里解释一下代码,索引部分还是和刚才说过的一样,用条件判断语句直接选出所有满足条件的,value_counts返回的是一个pandas下的Series类型,表示每种不同值的个数。而下面的操作是把返回的这两个Series整合成一个dataframe,并给这个dataframe设置索引值,最后绘图,我们使用栈图更明显地来看出他们之间的关系
非常明显我们可以看出,女性的生存概率明显多于男性,所以我们认识到性别是一个非常重要的影响因素
年龄与生存情况的关系
我们刚才说了妇女和儿童先走,现在前者被证明正确,那么后者如何呢?
1 2 3 4 5
| fig = plt.figure(figsize=(10,8)) plt.hist([data[data.Survived==1].Age, data[data.Survived==0].Age], stacked=True, color=['g','r'], bins=30, label=['Survived','Dead']) plt.xlabel('Age') plt.ylabel('Number of passengers') plt.legend()
|
再来解释一下代码。第一个fig是用来控制绘图的整体的参数的,比如这里设置了10,8。第二个我们使用到了hist方法,这是matplotlib里面一个绘制直方图的方法。这里为什么用直方图?因为年龄取值范围较广,不像上面那个只能取二值。这个方法中,第一个参数表示的是数组,也就是每个柱子所对应的数据(这里的柱子称为bin),对应着x轴。第二个参数是bins,对应柱子的条数。其他还有一些参数,比如归一化,颜色,透明度设置等,这个等有空专门再讨论。下面看图
从图中我们看出,确实小孩更容易获救,由此,妇女和儿童优先得到践行
票价与生存情况的关系
我们知道票价能够反应这个人的社会地位等信息,我们来看一下票价与获救之间的关系
1 2 3 4 5
| fig = plt.figure(figsize=(10,8)) plt.hist([data[data.Survived==1].Fare, data[data.Survived==0].Fare], stacked=True, color=['g','r'], bins=30, label=['Survived','Dead']) plt.xlabel('Fare') plt.ylabel('Number of passengers') plt.legend()
|
代码与上面比的只是换了一下参数而已,直接来看图
从图中我们可以明显看出生存机会和票价息息相关,票价较低的乘客更有可能死亡。
年龄,票价与生存情况的关系
我们这里结合来看一下,显得更加清晰一点
1 2 3 4 5 6
| fig = plt.figure(figsize=(10,8)) plt.scatter(data[data.Survived==1].Age, data[data.Survived==1].Fare, c='green', s=20) plt.scatter(data[data.Survived==0].Age, data[data.Survived==0].Fare, c='red', s=20) plt.xlabel('Age') plt.ylabel('Fare') plt.legend(('survived','dead'), scatterpoints=1,loc='best')
|
我们这里用了当下很流行的散点图的方法。matplotlib里面有scatter方法专门用来实现这个。在使用时需要传入两组数据,也就是横坐标与纵坐标。如果要画多组图也可以重复添加并设置不同颜色以示区分。
从图中我们看出,明显下面有一块是红色特别集中的地方,这些人是低票价的青壮年成年人
登船港口与生存情况的关系
1 2 3 4 5 6 7 8
| fig = plt.figure(figsize=(10,8))
sur0 = data.Embarked[data.Survived==0].value_counts() sur1 = data.Embarked[data.Survived==1].value_counts() df = pd.DataFrame({'Survived':sur1, 'dead':sur0}) df.plot(kind='bar',stacked=True) plt.xlabel('Embarked') plt.ylabel('number of people')
|
这里是用的和之前一样的柱状图统计方法,来看图
可能S港上船的死亡率高?不确定,选做备用特征