回顾&引言】前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察。那么在这里,我们主要是做数据分析的流程性学习,主要是包括了数据清洗以及数据的特征处理,数据重构以及数据可视化。这些内容是为数据分析最后的建模和模型评价做一个铺垫。开始之前,导入numpy、pandas包和数据
#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
train=pd.read_csv('train.csv')
train
2 第二章:数据清洗及特征处理
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。2.1 缺失值观察与处理
我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢2.1.1 任务一:缺失值观察
(1) 请查看每个特征缺失值个数
(2) 请查看Age, Cabin, Embarked列的数据 以上方式都有多种方式,所以大家多多益善train.describe()
#count 表示不是空值的数的个数
train.info()
#non-null count 表示不是空值的数的个数
train.isnull().sum()
#直接展示空值的个数
#missingno库——matrix()函数
import missingno as msno
msno.matrix(train)
​
# 若报错:ModuleNotFoundError: No module named 'missingno'
​
# 在Anoconda Prompt(Anoconda)中安装missingno
#输入指令: pip install missingno
# 查看是否安装成功
#输入指令: conda list
​
#这是一种将缺失值可视化的方法,可以看到顶上为数据集中的列,当每一列中有缺失值时就会出现白色的条纹,既可以直观的看到缺失值,也能观察其位置。
msno.bar(train)
# 这是将每一列的数画出柱状图,当一列的数据中出现缺失值时,就会比无缺失值要低,可以从上面直观的观察出来。
msno.heatmap(train)
# 观察数据,我们可以看出当一列有缺失值时就会用热力图表示出来,图中显示出来的是特征之间存在缺失的相关性。
msno.dendrogram(train)
# 这是一种快速画出一个树状图,通过树状图我们在图上画一条横线,此时我们能对列进行分类,可以看到当一列中有缺失值时,基本会单独一类,然后无缺失值的列分为一类,从而形象的观察出是否有缺失值。
2.1.2 任务二:对缺失值进行处理
(1)处理缺失值一般有几种思路(2) 请尝试对Age列的数据的缺失值进行处理(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理删除存在缺失值的个案 * 简单删除法 存在缺失值的整行数据删除 * 权重法 存在缺失值的整行数据删除,将完整的数据个案赋予不同的权重,个案的权重通过logistic或probit回归求得 缺失值插补 * 均值插补 数据属性为定距型:以该属性存在值的平均值来插补缺失的值 数据属性为非定距型:该属性的众数来补齐缺失的值 * 利用同类均值插补 用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。 * 极大似然估计(Max Likelihood ,ML) 在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。重要前提:适用于大样本。 * 多重插补(Multiple Imputation,MI) 多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。 多重插补方法分为三个步骤: ①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性; ②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。 ③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。 假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。 上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。(1)贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。 (2)贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。 原文链接:https://blog.csdn.net/xuezhangmen/article/details/118177206#自定义函数,去掉缺失值超过50%的列
def find_missingL(data):#统计缺失值个数missing_numL = data.isna().sum(axis=0).sort_values(ascending=False)missing_propL = missing_numL/float(len(data)) #计算缺失值比例drop_indexL = missing_propL[missing_propL>0.5].index.tolist() #过滤要删除特征名return drop_indexLtrain2 =  pd.read_csv('queshi.csv')
train2.drop(find_missingL(train2),axis = 1)
​
#自定义函数,去掉缺失值超过50%的行
def find_missingH(data):#统计缺失值个数missing_numH = data.isna().sum(axis=1).sort_values(ascending=False)missing_propH = missing_numH/data.shape[1]#计算缺失值比例     shape[1] 行数  shape[0]列数drop_indexH = missing_propH[missing_propH>0.5].index.tolist() #过滤要删除特征名 # .tolist()直接将ndarray转换成列表return drop_indexHtrain3 = pd.read_csv('queshi.csv')
train3.drop(find_missingH(train3),axis = 0)
print(train2,'\n\n',train2.drop(find_missingL(train2),axis = 1),'\n\n',train3.drop(find_missingH(train3),axis = 0))
dropna()方法 能够找到DataFrame类型数据的空值(缺失值),将空值所在的行/列删除后,将新的DataFrame作为返回值返回。函数形式:dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)参数: axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。 how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。 thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。 subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。 inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。原文链接:https://blog.csdn.net/qq_35608277/article/details/112415092fillna():可以指定填充指定列或者整个数据集fillna()函数详解 inplace参数的取值:True、False True:直接修改原对象 False:创建一个副本,修改副本,原对象不变(缺省默认) method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None pad/ffill:用前一个非缺失值去填充该缺失值 backfill/bfill:用下一个非缺失值填充该缺失值 None:指定一个值去替换缺失值(缺省默认这种方式) limit参数:限制填充个数 axis参数:修改填充方向df['需要填充的数据集列名'].fillna(value =填充值,limit=从头算起的填充次数) data['A'].fillna(value = data['A'].mean(),limit=1)value参数也允许传入字典格式,键为要填充的特征名,值为要填充的缺失值。 values = {'A':4,'B':3,'C':4} data.fillna(value=values)原文链接:https://blog.csdn.net/lady_chen/article/details/114294852补: 3、sklearn填充 4、利用算法填充 https://blog.csdn.net/weixin_44747933/article/details/108675302【思考1】dropna和fillna有哪些参数,分别如何使用呢?【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?#思考回答
​
​
​
【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html2.2 重复值观察与处理
由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢2.2.1 任务一:请查看数据中的重复值
train[train['Age'].isnull()] = 0
train[train.duplicated()]        # 筛选train中重复值标记为True的数据记录
​
#第一个重复的行开始展示
# DataFrame.duplicated(subset=None, keep=‘first’)
​
# 参数
# subset    表示识别重复项的列索引或列索引序列。默认标识所有的列索引
# keep  表示采用哪种方式保留重复项。
# ‘first’,默认值,删除重复项,仅保留第一次出现的数据项。
# ‘last’ ,删除重复项,仅保留最后一次出现的数据项。
# ‘False’,表示将所有相同的数据都标记为重复项。
​
# 原文链接:https://blog.csdn.net/akun1213/article/details/122676852
2.2.2 任务二:对重复值进行处理
(1)重复值有哪些处理方式呢?(2)处理我们数据的重复值方法多多益善DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False, ignore_index=False)参数说明:subset 表示删除重复项的列索引或列索引序列,默认删除所有的列索引。
keep 表示采用哪种方式保留重复项。
‘first’,默认值,删除重复项,仅保留第一次出现的数据项。 ‘last’,删除重复项,仅保留最后一次出现的数据项。 ‘False’,表示将所有相同的数据都标记为重复项。 inplace 表示是否放弃副本数据,返回新的数据,默认为False
True,放弃副本,更新原数据。 False,不更新原数据。 ignore_index 表示是否对删除重复值后的对象的行索引重新排序,默认为False。
True,重新排序。 False,不重新排序。原文链接:https://blog.csdn.net/akun1213/article/details/122676852train_clear=train.drop_duplicates()
train_clear.head(20)
2.2.3 任务三:将前面清洗的数据保存为csv格式
train_clear.to_csv('test_clear.csv')
2.3 特征观察与处理
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。2.3.1 任务一:对年龄进行分箱(离散化)处理
(1) 分箱操作是什么?(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示(5) 将上面的获得的数据分别进行保存,保存为csv格式分箱操作是什么: 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。 尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。 而特征离散化处理通常采用的就是分箱法数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。原文链接:https://blog.csdn.net/qq_22172133/article/details/118883524#无监督分箱
#等频法
"""
qcut函数是根据数据本身的数量来对数据进行分割
:param X: 原始数据,只接收1维矩阵或Series
:param q: 整数,当q为整数时,代表分箱数
:param duplicates: 默认值为raise,如果X中有重复值时会报错。当duplicates='drop'时,X中有重复值时会对分箱合并
:param labels: 接收array型或False型数据,当labels=False时,只返回分箱的索引。当labels为array时,其长度要和q相等
"""
train_clear['AgeBand'] = pd.qcut(train_clear.Age, q=5, labels = [1,2,3,4,5])
train_clear.head()
#等距法:
"""
cut函数是根据数据的值来对数据进行分割
:param X: 原始数据,只接收1维矩阵或Series
:param bins: 为整数时,代表分箱数,和qcut的q参数一样
:param labels: 接收array型或False型数据,当labels=False时,只返回分箱的索引。当labels为array时,其长度要和bins相等
"""
#equal_distance_cut = pd.cut(data.category_34, 5, labels = range(0, 5))
​
#自定义法:
"""
cut函数是根据数据的值来对数据进行分割
:param X: 原始数据,只接收1维矩阵或Series
:param bins: 为array时,代表自定义分箱区间,默认左开右闭
:param labels: 接收array型或False型数据,当labels=False时,只返回分箱的索引。当labels为array时,其长度要和bins相等
"""
​
train_clear['AgeBand_ed'] = pd.cut(train_clear.Age,[0,5,15,30,50,80], labels =[1,2,3,4,5])
train_clear.head()
​
​
​
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
train_clear['AgeBand_pc'] = pd.qcut(train_clear['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
train_clear.head()
【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html【参考】https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html2.3.2 任务二:对文本变量进行转换
(1) 查看文本变量名及种类
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示#查看文本变量名及种类
#方法一:
train_clear['Sex'].value_counts()
train_clear['Cabin'].value_counts()
train_clear['Embarked'].value_counts()
#方法二:
train_clear['Sex'].unique()
array(['male', 'female', 0], dtype=object)
#方法二:
train_clear['Sex'].nameunique()
3
#将类别文本转换为12345
​
#方法一: replace
train_clear['Sex_num'] = train_clear['Sex'].replace(['male','female'],[1,2])
train_clear.head()
#方法二: map
train_clear['Sex_num'] = train_clear['Sex'].map({'male': 1, 'female': 2})
train_clear.head()
#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:lbl = LabelEncoder()  label_dict = dict(zip(train_clear[feat].unique(), range(train_clear[feat].nunique())))train_clear[feat + "_labelEncode"] = train_clear[feat].map(label_dict)train_clear[feat + "_labelEncode"] = lbl.fit_transform(train_clear[feat].astype(str))
​
train_clear.head()
#将类别文本转换为one-hot编码
​
#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))x = pd.get_dummies(train_clear[feat], prefix=feat)train_clear = pd.concat([train_clear, x], axis=1)#df[feat] = pd.get_dummies(df[feat], prefix=feat)train_clear.head()
2.3.3 任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
train_clear['Title'] = train_clear.Name.str.extract('([A-Za-z]+)\.', expand=False)
train_clear.head()
# 保存上面的为最终结论
train_clear.to_csv('test_fin.csv')

第二章:第一节数据清洗及特征处理-自测相关推荐

  1. 如何建立图像数据矩阵和图像显示灰度之间的关系!_放射技术考试第四章第一节 数字图像的特征...

    第四章第一节   数字图像的特征 一.模拟与数字 (一)模拟信号 在信息科学中,能够计数的离散量称为数字信号(整数),不能计数的连续量称为模拟信号. 模拟是以某种范畴的表达方式如实地反映另一种范畴.例 ...

  2. 软件构造 第二章 第一节 软件生命周期和版本控制

    软件构造第二章 第一节 软件生命周期和版本控制 基本内容 Software Development Lifecycle (SDLC) Traditional software process mode ...

  3. 思维导图下载 注册安全_2019安全工程师《建筑实务》第二章第一节考点:物料提升机思维导图...

    2019安全工程师<安全生产专业实务-建筑施工安全>第二章第一节考点:物料提升机思维导图,本节的大部分知识点前两节塔式起重机和施工升降机相似,大家可以对比之前考点的思维导图来理解记忆,本知 ...

  4. 《啊哈!算法》第二章 - 第一节 - 解密QQ号(Java实现)

    <啊哈!算法>第二章 - 第一节- 解密QQ号(Java实现) 解密QQ号--队列 解密QQ号--队列 新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ号, 小 ...

  5. 第二章:第一节数据清洗及特征处理-课程

    [回顾&引言]前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察.那么在这里,我们主要是做数据分析的流程性学习,主要是包括了 ...

  6. 动手学数据分析Task2第一节数据清洗及特征处理

    第二章:数据清洗及特征处理 我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将 ...

  7. linux 下  qserialport waitforreadyread_北师大版初中数学八年级(下)第二章第一节不等关系(精品)...

    第二章 一元一次不等式与 一元一次不等式组 2.1不等关系 一.知识点梳理 不等式:一般地,用"<"(或"≤"),">"(或&q ...

  8. 第二章第一节 能把梳子卖给和尚吗

    第二章 能把梳子卖给和尚吗 1.求职遭遇奇妙陷阱 话说刘备大四毕业那年春天,卢植因为得罪了校办公室主任左丰,被指控犯罪批捕入狱,案由涉及男女情色和贪污受贿.直到刘备毕业离校,才因为查无实据而无罪获释. ...

  9. Titanic第二章:第一节数据清洗及特征处理

    2.1 缺失值观察与处理 import numpy as np import pandas as pd from matplotlib import pyplot as plt #读取文件train ...

最新文章

  1. 快速检索并引用你在CSDN上所有的博文笔记
  2. apple个人开发者证书无线发布app的实现(转)
  3. 解释一下python中的//,%和**运算符
  4. 最新综述:作为体现具体化自然语言环境的文本世界
  5. while的用法java_java中的while循环和do while循环
  6. 插件安装失败_贴片保险丝额定电流应用电路为什么会安装失败?
  7. 大数据之-Hadoop3.x_MapReduce_WordCount案例集群运行---大数据之hadoop3.x工作笔记0093
  8. 虹软java接摄像头_java基于虹软sdk实现人脸识别(demo)
  9. Linux怎么删除tomcat日志,Linux下定时切割Tomcat日志并删除指定天数前的日志记录...
  10. 使用Flash绘制曲线动画
  11. 用什么 软件测试无线频段,Wirelessmon无线频段与信号强度扫描工具软件使用技巧...
  12. win10服务器只显示4g内存,64位win10识别到了4G内存,却只用了3.1G,为什么?
  13. Photoshop脚本 镜头光晕滤镜的使用
  14. Python练习——基础练习题1
  15. 浅析影响银行小微信贷业务精细化发展的六大要素
  16. 20172327 2017-2018-2 《程序设计与数据结构》第十一周学习总结
  17. java专区软件_分享几款让你事半功倍的装机必备软件
  18. 数据库读写分离(二)
  19. bootstrap轮播图代码详解
  20. 计算机二级vfp模拟考试题,2016年计算机二级《VFP》测试题及答案

热门文章

  1. lzma算法_十款性能最佳的压缩算法
  2. curl指定代理_如何使用cURL指定用户代理
  3. 计算机能使用硬盘吗,旧电脑的硬盘能直接插在新电脑上用吗?
  4. C++11 std::this_thread::sleep_for让我睡一会再干活
  5. 第四届“绽放杯”5G应用征集大赛圆满落幕 中国移动参与项目获奖数量四年蝉联第一
  6. Python实验,用pygame做飞机大战游戏设计
  7. SSL与数字证书,Htpps
  8. 开发质量问题复盘总结-pua性质的标题
  9. 【SQLServer】常用时间格式转换
  10. 修改Odoo 8版权信息