文章目录
1. 数据维度介绍
该数据集主要以下维度:
- PassengerId => 乘客ID
- Survived=>是否生存下来
- Pclass => 乘客等级(1/2/3等舱位)
- Name => 乘客姓名
- Sex => 性别
- Age => 年龄
- SibSp => 堂兄弟/妹个数
- Parch => 父母与小孩个数
- Ticket => 船票信息
- Fare => 票价
- Cabin => 客舱
- Embarked => 登船港口
2.提出问题
乘客的生存率与哪些因素有关?
大致猜想年龄、性别、乘客等级。
3.数据分析
1.船员生存情况概览
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
path='./data.csv' #导入数据
data = pd.read_csv(path)
data['Survived'].value_counts().plot.pie(autopct='%0.2f%%')
上图中1表示存活下来了。0表示没有存活下来
2.生存情况与性别之间的关系
data[['Sex','Survived']].groupby(['Sex']).mean().plot.bar()
可以看出女性的生存率更高,侧方面反应船上的男性具有绅士风格。
3.生存情况与乘客等级之间的关系
data[['Pclass','Survived']].groupby(['Pclass']).mean().plot.bar()
可以看出乘客等级越高的生存率越高。果然还是有钱好。
4.年龄与乘客生存情况的关系
# 按照年龄,将乘客划分为儿童、少年、成年和老年,分析四个群体的生还情况
bins = [0, 12, 18, 65, 100]
data['Age_group'] = pd.cut(data['Age'], bins)
by_age = data.groupby('Age_group')['Survived'].mean()
by_age.plot.bar()
从图中可以看出来儿童和少年的生存下来的可能性比较高。
5.年龄、性别、乘客等级与生存率之间的关系
fig, ax = plt.subplots(1, 2, figsize = (18, 8))
sns.violinplot("Pclass", "Age", hue="Survived", data=data, split=True, ax=ax[0])
ax[0].set_title('Pclass and Age vs Survived')
# ax[0].set_yticks(range(0, 110, 10))
sns.violinplot("Sex", "Age", hue="Survived", data=data, split=True, ax=ax[1])
ax[1].set_title('Sex and Age vs Survived')
# ax[1].set_yticks(range(0, 110, 10))
plt.show()
从小提琴图可以得知不同等级的乘客的生存下来的年龄分布趋向于年轻化,男性和女性的生存下来年龄比较集中分布在20-40这个区间。
4.建模学习
1.数据清洗
对上船地点的空值采用众数填充。
data.Embarked[data.Embarked.isnull()] = data.Embarked.dropna().mode().values#众数填充
数据中年龄的空值采用算法中预测值进行填充
from sklearn.ensemble import RandomForestRegressor
age_df = data[['Age','Survived','Fare', 'Parch', 'SibSp', 'Pclass']]
age_df_notnull = age_df.loc[(data['Age'].notnull())] #选择age不为空的行
# print(age_df_notnull.head())
age_df_isnull = age_df.loc[(data['Age'].isnull())]
X = age_df_notnull.values[:,1:]
Y = age_df_notnull.values[:,0]
RFR = RandomForestRegressor(n_estimators=1000, n_jobs=-1)
RFR.fit(X,Y)
predictAges = RFR.predict(age_df_isnull.values[:,1:])
# print(data.loc[data['Age'].isnull(), ['Age']])
data.loc[data['Age'].isnull(), ['Age']]= predictAges
2.哑变量处理
把数据中非数字变量转为数字变量
df =pd.get_dummies(data)
3.划分数据,训练模型、模型预测
将数据集划分为测试集和训练集。训练集用于训练模型,测试集主要用于测试模型的训练效果。
- 划分数据集
x=df.drop('Survived',1)
y=df.Survived
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2, random_state=0)# 划分数据集
- 使用逻辑回归模型进行训练预测
lr = LogisticRegressionCV(multi_class='ovr',fit_intercept=True, Cs=np.logspace(-2, 2, 20), cv=2, penalty='l2', solver='lbfgs', tol=0.01)
re=lr.fit(x_train, y_train)
print("准确率:",lr.score(x_test, y_test))
#准确率: 0.8100558659217877
5.总结
影响乘客的生存的因素分布如下:
feature_importance = rf.feature_importances_ #影响模型准确的因素
feature_importance = 100.0*(feature_importance/feature_importance.max())
index = np.argsort(feature_importance)[-10:]
plt.barh(np.arange(10),feature_importance[index],color = 'dodgerblue', alpha = 0.4)
print(np.array(x.columns)[index])
plt. yticks(np.arange(10+0.25), np.array(x.columns)[index])
plt. xlabel( 'Relative importance ')
plt.title( 'Top 10 Importance Variable ')
plt. show( )