二.EDA分析
2.1 缺失值处理
为方便整合数据,将训练集和数据集合并。
all_data = [train_data, test_data]由于该数据集样本量偏少,因此考虑使用众数,均值,中位数插补等方法,或构造新变量来建模。船舱编码变量缺失较严重,考虑将“是否有船舱编码”作为新特征,检查该特征对生存率的影响。
train_data["has_cabin"] = train_data.Cabin.map(lambda x:1 if type(x)==str else 0)
sns.barplot(x="has_cabin",y="Survived",data=train_data,,palette=["#FF9999", "#B0E0E6"])
由图可知,有船舱编码的乘客生存率接近0.7,而没有船舱编码的乘客生存率仅为0.3。因此我们将该特征用于后续的生存分析,将测试集中的Cabin变量转换为新变量。
test_data["has_cabin"] = test_data.Cabin.map(lambda x :1 if type(x)==str else 0)接着我们探索登船港口(Embarked)对生存率的影响。
count_embarked=train_data[["Embarked","Survived"]].groupby("Embarked",as_index=False)
.count().rename(columns={"Survived": "PassengerCount"})
mean_embarked=train_data[["Embarked","Survived"]].groupby("Embarked",as_index=False)
.mean().rename(columns={"Survived": "SurvivalRate"})
merged_data = pd.merge(count_embarked, mean_embarked, on="Embarked")
merged_data["SurvivalRate"] = merged_data["SurvivalRate"] * 100 print(merged_data)
我们发现登船港口在S港的存活人数最多,其次是C港,Q港存活人数最少。而C港存活率最高,Q港次之,S港存活率最低。由此可知S港登陆人数最多,接着是C,Q港。可见在不同港口登陆也会影响生存率。
训练集中缺失2个值,利用众数填补。
train_data['Embarked'] = train_data['Embarked'].fillna('S')对Fare(船票)变量进行探索。
sns.violinplot(y="Fare",data=train_data)
由图可知Fare变量分布较散,因此采用中位数来进行填补。
test_data['Fare'] = test_data['Fare'].fillna(train_data['Fare'].median())对Age(年龄)进行探索。
sns.violinplot(y="Age",data=train_data)
由图可知,平均值和中位数较接近,采用均值进行填补。
age_mean = train_data['Age'].mean() train_data['Age'] = train_data['Age'].fillna(age_mean)缺失值处理结束。
2.2 数据探索
考虑性别(Sex)对生存率的影响。
survived_data = train_data[train_data['Survived'] == 1]
gender_survival_count = survived_data['Sex'].value_counts().reset_index()
gender_survival_count.columns = ['Sex', 'Survived']
print(gender_survival_count)
sns.barplot(x="Sex", y="Survived", data=gender_survival_count,palette=["#FF9999", "#B0E0E6"])
由图可知,存活下来的女性人数大概是男性的两倍。其中女性存活233人,男性存活109人。
women = train_data.loc[train_data.Sex =='female']['Survived']
rate_women = sum(women)/len(women)
print("% of women who survived:",rate_women)女性存活率约为74.2%
考虑船舱等级(Pclass)对生存率的影响。
train_data[["Pclass","Survived"]].groupby("Pclass",as_index=False)
.mean().sort_values(by="Survived",ascending=False)
sns.barplot(x="Pclass",y="Survived",data=train_data,palette=["#FF9999", "#DDA0DD","#B0E0E6"])
由图可知,超过60%的一等舱乘客存活,三等舱存活率仅24%。由此可以看出船舱等级对存活率有影响。
接着我们分别探索SibSp变量和Parch变量对生存率的影响。
train_data[["SibSp","Survived"]].groupby("SibSp",as_index=False)
.mean().sort_values(by="Survived",ascending=False) train_data[["Parch","Survived"]].groupby("Parch",as_index=False)
.mean().sort_values(by="Survived",ascending=False)考虑将两特征结合并构建家庭成员(Family)变量。
for data in all_data:
data["Family"] = data["SibSp"] + data["Parch"] + 1
由图可知,家庭规模在五人以上时,死亡率高于生存率。
考虑将是否有家庭成员陪同作为新特征进行探索。
for data in all_data:
data["Alone"] = data["Family"].map(lambda x : 1 if x==1 else 0) train_data[["Alone","Survived"]].groupby("Alone",as_index=False)
.mean().sort_values("Survived",ascending=False)
sns.barplot(x="Alone",y="Survived",data=train_data,palette=["#FF9999", "#B0E0E6"])
由图可知,有家庭成员陪同时生存率高于没有家庭成员陪同时。
考虑年龄(Age)对生存率的影响。
观察年龄(Age)分布情况。
sns.violinplot(y="Age",x="Survived",data=train_data)
可以发现观察数据较为松散,其中20-30岁的人数较多。将其划分为5组,观察不同年龄段乘客生存率。
train_data["Age_group"] = pd.cut(train_data.Age,5)
train_data[["Age_group","Survived"]].groupby("Age_group",as_index=False)
.mean().sort_values("Survived",ascending=False)
可以发现,60-80年龄段的老人生存率最低。说明年龄影响生存率。
考虑票价(Fare)对生存率的影响。
sns.violinplot(y="Fare",x="Survived",data=train_data,palette=["#FF9999", "#B0E0E6"])
可以发现存活乘客票价的中位数高于死亡乘客,即票价较低的群体死亡率更高。同年龄(Age)一样进行分组处理。
train_data["Fare_group"] =pd.qcut(train_data["Fare"],4)
train_data[["Fare_group","Survived"]].groupby("Fare_group",as_index=False).mean()
可以发现随着票价的升高,乘客的生存率也是逐渐升高。
hello!我是Linsur!欢迎找我玩!
后续将会在下一篇发布。