sns.heatmap(train.isnull(), yticklabels=False, cbar=False, cmap='viridis')
tip:对于有些数据集中可能不是显式的存在缺失值,而是把缺失值替换成了特殊的字符,这种情况的话可以先将特殊字符替换为np.nan,再用isnull()函数。
# 统计离散变量的属性:离散变量为字符串,属性为'object'
train.describe(include=['O'])
# 统计连续变量的属性
train.describe()
# 设置白色网格为主题
# 使用countplot 对'存活'的一个标签进行计数绘图,使用x表示横轴上的图,y表示纵轴 上的图
sns.set_style('whitegrid')
sns.countplot(x='Survived',data=train)
# 设置白色网格为主题
# 使用countplot 对'存活'和'性别'两个标签进行计数绘图
sns.set_style('whitegrid')
sns.countplot(x='Survived',hue='Sex',data=train)
train[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)
sns.set_style('whitegrid')
sns.countplot(x='Survived', hue='Pclass', data=train)
train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
# 根据开始的空值判断中,可以得出age中有空值,所以需要进行drop
# 通过displot绘制直方图的观测值的单变量分布:纵坐标表示的是比率
# kde为高斯核函数,bins为直方图的宽
sns.distplot(train['Age'].dropna(), kde=False, bins=30)
sns.countplot(x='SibSp', data=train)
train[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
# 当然这里也可以用seaborn的displot进行绘制,但是displot的纵坐标是比率,hist的纵坐标是实际个数count;
# figsize调整画布大小
train['Fare'].hist(color='green', bins=30, figsize=(8,4))
对比,hist和distplot直方图分布的区别
使用hist的直方图分布,纵坐标是count值;
使用displot的直方图分布,纵坐标是比率radio;
箱型图不仅可以来找出异常值,也可以用来说明样本分布的情况:
plt.figure(figsize=(12,7))
sns.boxplot(x='Pclass', y='Age', data=train)
通过箱型图大致可以判断出:三等舱的乘客年龄分布都比较小,一等舱的乘客年龄分布都比较大。
填补缺失值有很多种方法,这里是根据之前的箱型图:三等舱的乘客年龄分布比较小,一等舱的乘客年龄分布比较大。于是来根据船舱的类别填入该类别年龄的平均值。
# 首先得出各个船舱年龄的平均值
[train[train['Pclass'] == i]['Age'].mean() for i in range(1,4)]
def infer_age(cols):
Age = cols[0]
Pclass = cols[1]
if pd.isnull(Age):
if Pclass == 1:
return 37
elif Pclass == 2:
return 29
else:
return 24
else:
return Age
# 使用apply方法应用函数
train['Age'] = train[['Age', 'Pclass']].apply(infer_age, axis=0)
# 票号和船舱号是无关的特征,将它们去除掉
# axis的0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算
train.drop(['Ticket', 'Cabin'], axis=1, inplace=True)
# 通过正则表达式留下.之前的形式
train['Title'] = train.Name.str.extract('([A-Za-z]+)\.', expand=False)
pd.crosstab(train['Title'], train['Sex'])
for dataname in [train, test]:
dataname['Title'] = dataname['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', \
'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
dataname['Title'] = dataname['Title'].replace(['Mlle', 'Ms'], 'Miss')
dataname['Title'] = dataname['Title'].replace('Mme', 'Mrs')
train[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()
title_mapping = {'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Rare': 5}
train['Title'] = train['Title'].map(title_mapping)
# inplace表示在原地操作,不返回对象
train.dropna(inplace=True)
# drop_first = True的含义是使用k-1个哑变量来表示k个特征
sex = pd.get_dummies(train['Sex'], drop_first=True)
embark = pd.get_dummies(train['Embarked'], drop_first=True)
# 删除原来的离散变量,并将新的哑变量的dataframe与原来的连接
train.drop(['Sex','Embarked','Name', 'PassengerId'], axis=1, inplace=True)
train = pd.concat([train, sex, embark], axis=1)
拆分数据集进行训练主要是为了防止过拟合的情况。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived', axis=1), train['Survived'], test_size=0.2, random_state=2019)