数据分析与数据可视化

数据概览

数据基础概览

我们首先使用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港上船的死亡率高?不确定,选做备用特征

Author: YihangBao
Link: https://roarboil.github.io/2020/04/17/Datapretitanic/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.