df_train['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'],inplace=True)
此时再计算每一类的平均年龄
df_train.groupby('Initial')['Age'].mean()
Initial
Master 4.574167
Miss 21.860000
Mr 32.739609
Mrs 35.981818
Other 45.888889
Name: Age, dtype: float64
根据这些平均年龄对每一类的缺失值填充
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Mr'),'Age']=33
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Mrs'),'Age']=36
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Master')
,'Age']=5
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Miss'),'Age']=22
df_train.loc[(df_train.Age.isnull())&(df_train.Initial=='Other'),'Age']=46
我们再来看看年龄的缺失值情况
df_train.Age.isnull().sum()
下面我们再来看一下幸存和死亡人员的年龄分布
f,ax=plt.subplots(1,2,figsize=(20,10))
df_train[df_train['Survived']==0].Age.plot.hist(ax=ax[0],bins=20,edgecolor='black',color='red')
ax[0].set_title('Survived= 0')
x1=list(range(0,85,5))
ax[0].set_xticks(x1)
df_train[df_train['Survived']==1].Age.plot.hist(ax=ax[1],color='green',bins=20,edgecolor='black')
ax[1].set_title('Survived= 1')
x2=list(range(0,85,5))
ax[1].set_xticks(x2)
plt.show()
- 儿童(年龄<5岁)被大量拯救(妇女和儿童优先策略)。
- 最年长的乘客获救(80岁)。
- 死亡人数最多的是30-40岁的年龄组。
sns.factorplot('Pclass','Survived',col='Initial',data=df_train)
plt.show()
可以看出,无论在哪一类阶级如何,妇女和儿童优先政策都是正确的。
下面对票价分析,首先看一下票价的整体分布情况
df_train.Fare.describe()
count 891.000000
mean 32.204208
std 49.693429
min 0.000000
25% 7.910400
50% 14.454200
75% 31.000000
max 512.329200
Name: Fare, dtype: float64
发现最低的居然是0元,可能是用积分或者其他方式兑换的,下面我们看一下每种票类型下的价格分布
f,ax=plt.subplots(1,3,figsize=(20,8))
sns.distplot(df_train[df_train['Pclass']==1].Fare,ax=ax[0])
ax[0].set_title('Fares in Pclass 1')
sns.distplot(df_train[df_train['Pclass']==2].Fare,ax=ax[1])
ax[1].set_title('Fares in Pclass 2')
sns.distplot(df_train[df_train['Pclass']==3].Fare,ax=ax[2])
ax[2].set_title('Fares in Pclass 3')
plt.show()
离散型变量是指数值型变量但是取值不是连续的,例如sipsip和parch。这两个变量表示一个人是独自一人还是与家人在一起。
表示配偶和兄弟姐妹的陪同人数
pd.crosstab([df_train.SibSp],df_train.Survived).style.background_gradient()
Survived | 0 | 1 |
---|
SibSp | | |
---|
0 | 398 | 210 |
---|
1 | 97 | 112 |
---|
2 | 15 | 13 |
---|
3 | 12 | 4 |
---|
4 | 15 | 3 |
---|
5 | 5 | 0 |
---|
8 | 7 | 0 |
---|
df_train.head()
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Initial |
---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S | Mr |
---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | Mrs |
---|
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S | Miss |
---|
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S | Mrs |
---|
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S | Mr |
---|
f,ax=plt.subplots(1,2,figsize=(12,8))
sns.barplot('SibSp','Survived',data=df_train,ax=ax[0])
ax[0].set_title('SibSp vs Survived')
sns.factorplot('SibSp','Survived',data=df_train,ax=ax[1])
ax[1].set_title('SibSp vs Survived')
plt.show()
pd.crosstab(df_train.SibSp,df_train.Pclass).style.background_gradient()
Pclass | 1 | 2 | 3 |
---|
SibSp | | | |
---|
0 | 137 | 120 | 351 |
---|
1 | 71 | 55 | 83 |
---|
2 | 5 | 8 | 15 |
---|
3 | 3 | 1 | 12 |
---|
4 | 0 | 0 | 18 |
---|
5 | 0 | 0 | 5 |
---|
8 | 0 | 0 | 7 |
---|
条形图和折线图显示,如果一名乘客独自一人在船上,没有兄弟姐妹,他有34.5%
的存活率。如果兄弟姐妹的数量在1-2个,存活率会上升,但当人太多时,存活率又会下降。这是有道理的。也就是说,如果我有家人在船上,可以相互帮助,但当太多的家人在床上,我会尽力拯救他们,而不是首先拯救自己。5-8人家庭的存活率为0%。 原因可能是Pclass全是3。交叉表显示SibSp>3的人都在Pclass3中。Pclass3中所有大家庭(sibsp>3)的死亡迫在眉睫。
parch表示同行的孩子或者父母
pd.crosstab(df_train.Parch,df_train.Pclass).style.background_gradient()
Pclass | 1 | 2 | 3 |
---|
Parch | | | |
---|
0 | 163 | 134 | 381 |
---|
1 | 31 | 32 | 55 |
---|
2 | 21 | 16 | 43 |
---|
3 | 0 | 2 | 3 |
---|
4 | 1 | 0 | 3 |
---|
5 | 0 | 0 | 5 |
---|
6 | 0 | 0 | 1 |
---|
同样说明当同行人数太多,大部分都在Pclass3中
f,ax=plt.subplots(1,2,figsize=(20,8))
sns.barplot('Parch','Survived',data=df_train,ax=ax[0])
ax[1].set_title('Parch vs Survived')
sns.factorplot('Parch','Survived',data=df_train,ax=ax[1])
ax[1].set_title('Parch vs Survived')
plt.show()
这里的结果也非常相似。父母或孩子在船上的乘客生存的机会更大。然而,随着数量的增加,它会减少。
对于船上有1-3个父母或者孩子的人来说,生存的机会是好的。当船上有超过4个父母时,存活的机会会降低。
性别:
与男性相比,女性的生存几率较高。船票类型
:有一个明显的趋势是,成为头等舱的乘客会有更好的生存机会。Pclass3的存活率非常低。对于女性来说,Pclass1的存活几率几乎为1,而对于Pclass2的女性来说,存活几率也很高。年龄
:5-10岁以下的儿童存活率很高。15岁至35岁的乘客大量死亡。上船港口
:尽管大多数Pclass1乘客在S站出发,但在C站的存活几率比在S站更好。在Q站的乘客都来自Pclass3。Parch+SibSp(家人同行数)
:船上有1-2个兄弟姐妹、配偶或1-3个父母生存的可能性更高。
sns.heatmap(df_train.corr(),annot=True,cmap='RdYlGn',linewidths=0.5)
fig=plt.gcf()
fig.set_size_inches(10,8)
plt.show()
注意,我们只比较数值型变量的相关性。现在让我们假设两个特征高度或完全相关,因此一个特征的增加导致另一个特征的增加。这意味着这两个特征都包含高度相似的信息,并且信息几乎没有差异。此时称为具有多重共线性,因为两者包含几乎相同的信息。此时,我们在训练模型时,应该尽量消除多重共线性的影响。
现在,从上面的相关系数热力图中,我们可以看到这些特征变量没有太大的相关性。SibSp和Parch之间的相关性最高,即0.41。 所以我们可以使用所有的特征变量进行后续分析。
数据下载地址
在后续我还会介绍一些如何使用python进行特征工程、数据清洗、模型构建以及一些集成学习方法。你们的支持是我写作最大的动力!!!