数据分析——泰坦尼克号乘客数据集

数据分析——泰坦尼克号(二)

泰坦尼克号乘客数据:https://www.kaggle.com/c/titanic/overview
Datawhale开源课程:https://github.com/datawhalechina/hands-on-data-analysis

二、数据清洗及特征处理

2.1 导入库

#加载所需的库
import numpy as np
import pandas as pd

#加载数据train.csv
data = pd.read_csv('train.csv')
data.head()

2.2 缺失值观察与处理

2.2.1 缺失值观察

# 查看缺失值
# 方法一
data.info()
# 方法二
data.isnull().sum()
# 查看指定列的缺失值
data[['Age','Cabin','Embarked']].isnull()
#data[['Age','Cabin','Embarked']].isnull().sum()

【思考】检索空缺值用np.nan,None以及.isnull()哪个更好

三种方式代码如下:

# np.nan
data[data['Cabin'] == np.nan] = 0
# data.head(10)
# Nonw
data[data['Cabin']==None]=0
# data.head(10)
# isnull
data[dtat['Cabin'].isnull()]
# data.head(10)
  • np.isnan()多用于单个值的检验,pd.isnull()用于对一个DataFrame或Series(整体)的检验。
  • numpy和pandas的很多函数能处理NaN,但是如果遇到None就会报错

2.2.2 缺失值处理

【思路】 一般可以采用以下几种:

  • 直接删除缺失值项:直接删除缺失值过多的列
  • 特殊值填补法:如0值、平均值、中位数等,可以减少数值上来带的误差
  • .随机森林填补法:主要是基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。
# 直接删除:
data0 = data.dropna()
#data0.head()
# 特殊值填补:
# 平均值
data = data.fillna(data.mean()['Age'])
# 中位数 一般很少用
data = data.fillna(data.median()['Age'])
# 0值
data = data.fillna(0)

2.3 重复值观察与处理

思路:使用的是duplicated()函数

subset: 同duplicated(),设置去重的字段
keep: 这里稍有不同,duplicated()中是将除设置值以外重复值都返回True,而这里是保留的意思。同样可以设置first、last、False

  • first:保留第一次出现的重复行,删除其他重复行
  • last:保留最后一次出现的重复行,删除其他重复行
  • False:删除所有重复行
# duplicated的返回值是布尔值,返回True和False
data[data.duplicated()]
# 指定'Cabin','Embarked'
data2[data2.duplicated(subset=['Cabin','Embarked'], keep = False)]

处理重复值

# 直接删除
data = data.drop_duplicates()
# 删除指定的列
data2.drop_duplicates(subset=['Age'],inplace=True) #inplace:布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。
data2.reset_index(drop=True) # reset_index 可以修改删除后的索引,避免出现索引混乱

2.4 特征观察与处理

  • 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
  • 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征

2.4.1 分箱操作(离散化处理)

分箱操作:将数据进行等距或者等频分组,一般为数值型特征,也可以是文本型特征,但一般要把文本型转换成数值型

# 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], 5,labels = list('12345'))
#data.head()
# 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], [0,5,15,30,50,80],right = False)
#data.head()
# 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
data['AgeBand'] = pd.cut(data['Age'], [0,0.1,0.3,0.5,0.7,0.9],labels = list('1234'))
#data.head()

2.4.2 对文本变量进行转换

1. 查看文本变量名以及种类

#  查看文本变量名及种类
#方法一: value_counts
data['Sex'].value_counts()
# data['Cabin'].value_counts()
# data['Embarked'].value_counts()
# 方法二:unique
data['Sex'].unique()
# data['Cabin'].unique()
# data['Embarked'].unique()

2. 文本转换表达

# 将类别文本转换为数字表达
# 方法一: replace
data['Sex_num'] = data['Sex'].replace(['male','female'],[0,1])
data.head()
# 方法二: map
data['Sex_num'] = data['Sex'].map({'male': 0, 'female': 1})
data.head()
# 方法三:使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder # 加载
data['Cabin'] = LabelEncoder().fit_transform(data['Cabin'])  # 参数只能是字符串或者数字(argument must be a string or number)

# Datawhale参考写法
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(data0[feat].unique(), range(data0[feat].nunique())))
    data0[feat + "_labelEncode"] = data0[feat].map(label_dict)
    data0[feat + "_labelEncode"] = lbl.fit_transform(data0[feat].astype(str))
  • onehot编码又叫独热编码,其为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
  • Onehot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

参考链接:https://www.jianshu.com/p/38f9f426e246

# 将文本变量Sex, Cabin, Embarked用one-hot编码表示
for col in ['Sex','Cabin','Embarked']:
    x = pd.get_dummies(data[col], prefix = col)
    data = pd.concat([data,x],axis = 1) # 将转换好的x按列拼接到原数据data中

data.head()

2.4.3 从纯文本特征里提取出特征

(从Name中提取Titles,即Mr,Miss,Mrs等)

Series.str可用于以字符串形式访问系列的值并对其应用几种方法。 Pandas Series.str.extract()函数用于提取正则表达式中的捕获组作为DataFrame中的列。对于系列中的每个主题字符串,从正则表达式pat的第一个匹配项中提取组。
Series.str.extract(pat, flags=0, expand=True)
【参数】:

  • pat: 具有捕获组的正则表达式模式。
  • flags: int,默认值为0
  • expand:如果为True,则返回每个捕获组只有一列的DataFrame。
data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()

你可能感兴趣的:(数据分析,python)