学习
参考
猴子数据分析之泰坦尼克号生存率预测
数据集:https://www.kaggle.com/c/titanic
字段
Age:年龄
Cabin:船舱号
Embarked:登船港口 C为Cherbourg Q为Queenstown S为Southampton
Fare:船票费用
Name:姓名
Parch:在船上的父母/孩子人数
PassengerId:乘客编号
Pclass:船票等级 1为一等舱 2为二等舱 3为三等舱
Sex:性别
Sibsp:在船上的兄弟姐妹人数
Ticket:船票编号
Survived:生存与否 预测值
导入数据
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid',font_scale=1.5)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
print ('训练数据集:',train.shape,'测试数据集:',test.shape)
训练数据集: (891, 12) 测试数据集: (418, 11)
#合并数据集 方便同时对两个数据集进行清洗
full = train.append(test,ignore_index=True)
数据清洗
缺失值统计
full.isnull().sum()
年龄 船舱的缺失数据较多
登船港口 船票价格的缺失数据较少
Survived的缺失是合并后的测试集
缺失值处理
很多机器学习算法为了训练模型,要求传入的特征中不能有空值:
1、如果是数值类型,用平均值代替
2、如果是分类数据,用最常见的类别取代
3、使用KNN等模型预测缺失值
#年龄缺失值处理
full['Age'] = full['Age'].fillna(full['Age'].mean())
#船票缺失值处理
full['Fare'] = full['Fare'].fillna(full['Fare'].mean())
#embarked&cabin为字符串列
#查看最常见的港口类别
full['Embarked'].value_counts()
#用最常见的类别填充
full['Embarked'] = full['Embarked'].fillna('S')
#查看最常见的船舱类别
full['Cabin'].value_counts()
#缺失数据过多,且不同船舱号的数量差距不大
#船舱号(Cabin)缺失值填充为U,表示未知(Uknow)
full['Cabin'] = full['Cabin'].fillna( 'U' )
特征分析
相关系数矩阵
corr = train.corr()
#热度图可视化相关系数矩阵 只显示数字之间的
plt.subplots(figsize=(10,4)) # 可以先试用plt设置画布的大小,然后在作图,修改
sns.heatmap(corr, annot = True) # 使用热度图可视化这个相关系数矩阵
绝对值排序为pclass fare parch age sibsp passengerid
pclass 社会阶层
sns.countplot(x='Pclass',hue='Survived',data=train)
船舱等级为一等舱的乘客生存几率较高 pclass与生存率有关
sex 性别
sns.countplot(x='Sex',hue='Survived',data=train)
女性生存几率较高 女士优先原则 性别与生存率有关
age 年龄
train_age = sns.FacetGrid(train, col='Survived',height=5)
train_age.map(plt.hist, 'Age', bins=40)
fig = plt.figure(figsize=(10, 6))
sns.violinplot( x='Survived',y='Age', data=train,
split=True,palette={0: "r", 1: "g"} )
plt.title('乘客年龄与存活关系')
plt.ylabel('年龄')
年龄较小的乘客生存率较高,年龄较大的次之,20-40岁的青壮年明显生存率较低
符合儿童优先原则 年龄与生存率相关
sibsp 兄弟姐妹数
sns.countplot(x='SibSp',hue='Survived',data=train)
=0生存率低 1-2较高 >3低
parch 父母子女数
sns.countplot(x='Parch',hue='Survived',data=train)
=0生存率低 1-2较高 >3低
家庭成员数
sibsp与parch的分布相似 可结合起来看家庭成员数
家庭人数 = Parch兄弟姐妹数+SibSp父母子女数+自己
train['members'] = train['Parch'] + train['SibSp']
sns.countplot(x='members',hue='Survived',data=train)
=0生存率低 1-3较高 >4低
fare 船票价格
train['Fare'].describe()
train_fare = sns.FacetGrid(train, col='Survived',height=5)
train_fare.map(plt.hist, 'Fare', bins=5)
#train_fare.set(xticks=[0,600])
# 按船舱等级分组
train.groupby('Pclass').agg('mean')['Fare'].plot(k