【入门系列】Titanic-1 数据处理

Titanic-1 数据处理

数据分析、数据清洗



前言

Titanic是Kaggle比赛入门的经典案例,其背景就是历史上有名的泰坦尼克时间,比赛需要通过使用历史信息来预测测试集中的人能否在灾难中存活。


一、背景交代

泰坦尼克号沉没事故(Sinking of the RMS Titanic)是1912年4月14日深夜至15日凌晨在北大西洋发生的著名船难,事发时是泰坦尼克号从英国南安普敦港至美国纽约港首航的第5天,该船当时是世界最大的邮轮。1912年4月14日星期天23时40分与一座冰山擦撞前,已经收到6次海冰警告,但当瞭望员看到冰山时,该船的行驶速度正接近最高速。由于无法快速转向,该船右舷侧面遭受了一次撞击,部分船体出现缝隙,使16个水密隔舱中的5个进水。泰坦尼克号的设计仅能够承受4个水密隔舱进水,因此沉没。

二、数据分析

打开train.csv文件,我们可以看到包含如下几个特征:
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
其中,PassengerId为乘客编号;
survived为是否存活,也是我们需要对test.csv进行预测的输出;
Pclass为船舱的等级,1、2、3等仓;
Name为头衔+姓名;
Sex性别;
Age年龄;
SibSp是sibship的缩写,即兄弟姐妹关系,兄弟姐妹的数量;
Parch为parent和child的缩写,父母和孩子的数量;
Ticket为票号;
Fare为船票费;
Cabin为船舱号;
Embarked为登船的港口,其中S为首发港Southampton(英国南安普顿)、C为Cherbourg(法国瑟堡港)、Q为Queenstown(爱尔兰昆士敦)。下面对数据进行定量分析一下。

1.数据分析

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
d_train=pd.read_csv("train_csv")
d_test=pd.read_csv("test_csv")
print(d_train.info())
print(d_train.describe())
print(d_train.head())
print(d_test.info)
print(d_test.describe())
print(d_test.head())

在这里插入图片描述
这里可以看到特征Cabin有较多的缺失值,因此在处理数据时可以直接将Cabin丢弃。此外,Ticket中包含的信息和是否生存关联性不大,因此也可以直接丢弃。

print("----------获救人数----------")
print(d_train.groupby(["Survived"])['Pclass'].count())

在这里插入图片描述

print('\n---------- 2、性别分布 ----------')
print(d_train.groupby(['Sex'])['PassengerId'].count())

在这里插入图片描述

print('\n---------- 3、船舱等级分布 ----------')
print(d_train.groupby(['Pclass'])['PassengerId'].count())

print('\n---------- 4、父母/子女数量分布 ----------')
print(d_train.groupby(['Parch'])['PassengerId'].count())

print('\n---------- 5、兄弟姐妹数量分布 ----------')
print(d_train.groupby(['SibSp'])['PassengerId'].count())

print('\n---------- 6、登船港口分布 ----------')
print(d_train.groupby(['Embarked'])['PassengerId'].count())

print('\n---------- 7、称呼的分布 ----------')
d_train['Title'] = d_train['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
print(pd.crosstab(d_train['Title'], d_train['Sex']))

print('\n---------- 8、名字长度分布 ----------')
d_train['NameLength'] = d_train['Name'].apply(len)
print(d_train.groupby(['NameLength'])['PassengerId'].count())

print('\n---------- 9、舱位甲板分布 ----------')
d_train['Deck'] = d_train['Cabin'].str[0]
print(d_train.groupby(['Deck'])['PassengerId'].count())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上述数据显示了如下几个问题:
(1)特征值中,存在non值。对于non值较多(这个具体标准可以自行判断)的特征,可以直接丢弃;对于non值较少的特征值,我们在后续需要通过一定方法将non值进行补齐;
(2)在后续模型拟合的过程中,除了树模型可以处理字符串类型,其他模型需要数据保持int或float类型,以便进行模型训练。所以需要对字符串类型的特征——Embarked、Name等进行编码处理。

2.数据处理

(1)补齐non值

print("The null num of the traindata:\n",d_train.isnull().sum())
print("-"*25)
print("The null num of the testdata;\n",d_test.isnull().sum())
print("-"*25)

在这里插入图片描述
在这里插入图片描述
这里我们可以看到,无论是训练集,还是测试集,均为Age、Cabin两个特征有缺失值,在训练集中,Embarked缺失2个;在测试集中,Fare缺失1个。Cabin上面提到过,缺失数量过多,直接丢弃。下面需要对Age、Embarked、Fare特征值进行补齐。补齐的原则有几种:
(1)均值:常见于特征为连续值;
(2)中位数:常见特征为整型离散变量;
(3)众数;
(4)建个模型回归/分类一下
(5)各种采样方法
各种方法其效果仁者见仁智者见智,主要还是看能不能更好的拟合数据分布。在本篇中,由于Age特征为整型离散变量,使用中位数进行补齐。

d_train.Age.fillna(d_train["Age"].median(),inplace=True)
d_test.Age.fillna(d_test["Age"].median(),inplace=True)

Embarked为字符型变量,可以使用众数进行补齐

data_1.Embarked.fillna(data_1['Embarked'].mode()[0],inplace=True)

Fare为连续变量,可以使用均值进行补齐

data_test.Fare.fillna(data_1['Fare'].mean(),inplace=True)

(2)丢弃意义不大的特征

drop_column=["PassengerId","Cabin","Ticket"]
d_train.drop(drop_column,axis=1,inplace=True)
d_test.drop(drop_column,axis=1,inplace=True)

(3)处理字符串特征值并编码

我们可以看到Name的值较长,且其中包含头衔和姓名。这里将姓名只保留头衔,即诸如“Mr”“Miss”这种。

d_train["Title"]=data_1["Name"].str.split(",",expand=True)[1].str.split(".",expand=True)[0]
d_test["Title"]=data_test["Name"].str.split(",",expand=True)[1].str.split(".",expand=True)[0]

将字符串类型特征值进行编码

from sklearn.preprocessing import LabelEncoder
label=LabelEncoder()
dataset=[d_train,d_test]
for data in dataset:
	data["SexCode"]=label.fit_transform(data["Sex"])
    data["EmbarkedCode"]=label.fit_transform(data["Embarked"])
    data["TitleCode"]=label.fit_transform(data["Title"])

至此,相关的特征值大致处理完毕


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值