数据采集与预处理(微课版) 课件 第8章 房产数据预处理_第1页
数据采集与预处理(微课版) 课件 第8章 房产数据预处理_第2页
数据采集与预处理(微课版) 课件 第8章 房产数据预处理_第3页
数据采集与预处理(微课版) 课件 第8章 房产数据预处理_第4页
数据采集与预处理(微课版) 课件 第8章 房产数据预处理_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章房产数据预处理“Python数据采集与预处理目录CONTENTS研究背景和目标分析8.1数据描述与探索8.2数据预处理8.3学习目标掌握计算属性间相关性方法掌握对缺失值数据处理方法掌握对离散数据进行观察和处理操作掌握对非正态分布数据进行纠偏操作掌握Box-Cox的变换和反变换操作研究背景和目标分析018.1研究背景和目标分析研究背景对于当代的年轻人来说,尤其是对刚毕业的年轻人,租房几乎成为了一种刚需,然而租房并不是一种长远之策,购买属于自己的房产是更加明智的选择。因此房产价格将会持续的成为人们关注的焦点,并且针对房屋价格的分析和预测研究也会层出不穷。基于以上背景,本讲将会针对一套完整的国外房价数据集进行分析并可视化,带领读者寻找数据中的规律,探究如何合理构造模型将会用到的特征数据。目标分析本章中使用的数据是来自kaggle上的国外房屋价格公开数据集。打开本书配套资料中的房价数据集csv文件可以看到如图所示具体的内容。8.1研究背景和目标分析准备工作在开始工作之前,我们需要导入所需的Python三方库,如以下代码所示。本章的所有工作都在jupyternotebook上完成。importwarnings#过滤一些不影响代码运行的警告warnings.filterwarnings('ignore')fromscipyimportstatsimportnumpyasnpimportpandasaspdimportseabornassnsimportmatplotlib.pyplotasplt#该语句功能是可以内嵌绘图,并可省略plt.show()这一步,但在jupyter中可有可无%matplotlibinline数据描述与探索028.2数据描述与探索数据读取读取后的数据展示如图所示,可以看到数据字段非常多,并且具有大量空值,此外“Id”和索引重复,均按序记录了行数,后面视需求可以选择删除。同时左下角为我们展示了整个数据一共有1460条,每条数据有81个字段。#读取全部数据train_datatrain_data=pd.read_csv('D:/Anaconda3/jupyter_work/house-prices/train.csv',encoding='utf-8')train_data查看列名由于字段太多,为了更加清晰的观察所有字段,将列名如下单独列出,结果如下图所示。在如此多的字段中如何提取出重要的信息呢?既然是研究销售价格的规律,则必然要寻找这些字段中哪些和销售价格联系最紧密,这也是之后预处理工作中需要完成的目标。#显示所有列名称train_data.columns查看缺失值在第一个步骤中我们已经初步发现了数据集中存在很多缺失值,但具体是哪些字段具有数据缺失需要找出来,方便后续的预处理工作。代码如下所示,缺失值字段如右图所示。#统计所有列的缺失值is_null=train_data.isnull().sum()is_null[is_null!=0]8.2数据描述与探索查看信息描述使用info()函数和describe()函数可以查看Dataframe中的整体描述和数学统计信息。对整体数据使用info()函数可以看到不同字段内容数据类型已经对应,不用再进行数据类型转换,其部分结果如左图所示;对“SalePrice”字段使用describe()函数可以看到所有房屋销售价格的数学统计结果,结果如右图所示。#查看describe和info信息print(train_data['SalePrice'].describe())print(train_())8.2数据描述与探索查看价格是否正态分布在机器学习中,许多模型对具有正态分布的数据训练效果更好,学习速度更快,并且正态分布数据的泛化性更高,因为自然界很多事物的概率密度大多是正态分布的。此外从目标分布来说,非正态分布会导致标签数据的损失值出现误导,或许结果看着很小,但实际结果很大。尤其在回归问题上,对正态分布的数据有着较高的要求。检查目标变量是否满足正态分布一般有三种常用方法:直方图、KDE分布图、Q-Q图。直方图和KDE分布图可以比较直观的看出数据样本本身的分布特征,推荐使用seaborn中的distplot()函数,它的主要功能是绘制单变量的直方图,且还可以在直方图的基础上加入kdeplot和rugplot的部分内容,是一个功能非常强大且实用的函数。Q-Q图则推荐使用scipy中的proplot()函数来绘制。8.2数据描述与探索查看价格是否正态分布#设置图像大小与清晰度plt.figure(figsize=(10,6),dpi=150)#设置子图间的间距等条件plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.1,hspace=0.4)#绘制第一个子图plt.subplot(211)plt.title('PriceDistribution')#销售价格的数量分布曲线sns.distplot(train_data['SalePrice'],hist=True,kde=True,rug=False)#绘制第二个子图plt.subplot(212)#绘制Q-Q图bplot(train_data['SalePrice'],plot=plt)plt.title("PriceDistribution")plt.show()8.2数据描述与探索查看价格是否正态分布从上面的图中可以看出,销售价格并没有严格呈现正态分布,虽然类似于正态分布的形状,但是在图像右方数据有很大的偏度,这种情况称为偏态分布。偏态分布是指频数分布不对称,集中位置偏向一侧。若集中位置偏向数值小的一侧,称为正(右)偏态分布;集中位置偏向数值大的一侧,称为负(左)偏态分布。与正态分布相对而言,偏态分布有两个特点:①左右不对称(即所谓偏态)②当样本增大时,其均数趋向正态分布。基于以上特点,在后续的预处理工作中,则需要调整目标数据至正态分布。8.2数据描述与探索数据预处理038.3数据预处理属性规约由于数据集中数据字段数量过于庞大,杂乱的属性特别多,有必要先进行合理的数据属性规约,提取出关联度高,有明显线性关系的属性特征来进行后续的数据预处理。那么在如此多的属性字段中如何找寻与销售价格高度关联,有重要影响作用的属性呢?我们可以使用关联矩阵来判断不同属性间的关联性,而关联矩阵可以使用热度图(Heatmap)来表达各个特征之间的关联程度。绘制热度图一般使用seaborn中的heatmap()函数,而我们的绘制依据是数据相关性分析中常用到的corr()函数,该函数计算了不同变量之间的相关性,取值范围为[-1,1],取值接近-1,表示反相关,类似反比例函数,取值接近1,表正相关。函数默认使用皮尔逊(Pearson)标准相关系数来进行相关系数的计算。此外,由于特征字段过多,我们绘图时提前做出筛选,只展示前十个由最高相关性的特征。使用nlargest()函数可以指定以某列为基准以降序方式返回前n个最大值的列,我们利用其来显示和SalePrice高度相关的十个特征所共同构成的关系矩阵。属性规约k=10#关系矩阵中将显示10个特征plt.figure(figsize=(7,7),dpi=100)corrmat=train_data.corr()#计算相关系数#显示和saleprice相近的十个关系变量矩阵,#nlargest()是输出最大相关排序,排完了之后选取salprice列的索引cols=corrmat.nlargest(k,'SalePrice')['SalePrice'].index#根据排好序的cols来生成Pearson相关系数矩阵cm=np.corrcoef(train_data[cols].values.T)sns.set(font_scale=1.25)#绘制热力图hm=sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)plt.show()8.3数据预处理属性规约8.3数据预处理利用前面的操作我们获得了十个与销售价格SalePrice最相关的特征,将这十个特征与SalePrice的相关性以水平条形图绘制出,在DataFrame的plot()函数中设置kind参数为barh既可以调整绘制的水平条形图,绘制结果如所示,代码如下所示。plt.figure(figsize=(12,6),dpi=150)#计算相关系数矩阵后进行排序,在排好序的结果基础上进行绘图train_data.corr()['SalePrice'][cols].sort_values(ascending=False).plot(kind='barh',figsize=(12,6),title='VariableCorrelationwithSalePrice')属性规约8.3数据预处理为了进一步缩小特征变量的范围,通过观察上图,决定保留相关性在0.6以上的属性。所以最终所选取的特征为:SalePrice(销售价格)、OverallQual(房屋整体材料和质量)、GrLivArea(可居住面积)、GarageCars(车库可容纳车辆)、GarageArea(车库面积)、TotalBsmtSF(全部地下室面积)、1stFlrSF(一楼面积大小)。#选取前七个与销售价格相关性最高的字段(包括了SalePrice)feature_data=train_data[cols[:7]]feature_data缺失值处理8.3数据预处理在本章中针对于重复值本数据集不进行处理,因为不同于客户信息等类型的数据,房屋信息允许有重复值的出现。对缺失值进行处理我们使用代码检查属性规约中提取出的特征列,发现没有数据缺失,这从某种层面上也证明了所选取特征的重要性。(往往越不重要的属性字段会出现越多的缺失值)为了作为示例,我们针对其他有代表性的列进行缺失值填充。通过代码观察下数据集中的数据缺失情况。#统计train_data中的缺失值train_data[cols].isnull().sum()#统计所有列缺失值并排序total=train_data.isnull().sum().sort_values(ascending=False)#计算缺失比率percent=(train_data.isnull().sum()/train_data.isnull().count())\.sort_values(ascending=False)missing_data=pd.concat([total,percent],axis=1,keys=['Total','Percent'])missing_data.head(15)缺失值处理8.3数据预处理从右图数据中可以看到,前五行所展示的属性列中缺失值都达到了15%以上,则这五列字段完全可以视作无效数据删除。针对其他缺失数据列,主要分三种情况填充,分别为中位数填充、众数填充、None值填充。以LotFrontage(到街道的距离)为例,我们选择使用中位数填充而不用均值,因为某些比较大或比较小的特殊值可能会使均值无法更好地反映平均数值,所以这里选用中位数更加好。以GarageType(车库类型)和MasVnrArea(砌体面积)为例,这两个字段在实际情境中确实可能是没有内容或者是难以统计,所以在不曲解原数据的原则上我们可以根据实际情况补全None或0值。以Electrical(电力系统)和KitchenQual(厨房品质)为例,这两个字段代表内容在实际住房情景中都是不可或缺且方便统计的,并且和前面的街道距离所不同的是,这两个字段内容都是离散的选项,并非分布具有连续性的数值,所以不能使用中位数或者均值,而应该使用众数来填充。缺失值处理8.3数据预处理以上情况填充代码如下:#到街道的距离train_data['LotFrontage']=train_data.groupby('Neighborhood')['LotFrontage'].transform(lambdax:x.fillna(x.median()))#车库和砌体部分字段train_data['GarageType']=train_data['GarageType'].fillna('None')train_data['MasVnrArea']=train_data['MasVnrArea'].fillna(0)#电力系统和厨房品质train_data['Electrical']=train_data['Electrical'].fillna(train_data['Electrical'].mode()[0])train_data['KitchenQual']=train_data['KitchenQual'].fillna(train_data['KitchenQual'].mode()[0])异常值处理8.3数据预处理针对异常值的处理,我们使用直方图和散点图来结合观察。首先绘制所选的特征列的直方统计图。从图中我们可以看到,与销售价格相关的六个特征中,除了离散型分布的变量外,连续型分布的数据中都存在着小部分的离群点,这些离群点由于过于偏离而可以被视作异常值删除。其次,具体应不应该删除或是要如何删除这些离群点,我们还需要绘制散点图,以此来更加详细的观察数据特点。#选取除SalePrice以外的所有列来绘制直方图feature_data.iloc[:,1:].hist(figsize=(20,15),bins=50,grid=False,color='red')plt.show()异常值处理8.3数据预处理直方图绘制结果。异常值处理8.3数据预处理plt.figure(figsize=(14,10),dpi=200)plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.3,hspace=0.3)#绘制第一个散点子图plt.subplot(221)plt.scatter(x=train_data['GrLivArea'],y=train_data['SalePrice'],color='red',edgecolor='black')plt.title('GrLivArea',fontsize=15)#绘制第二个散点子图plt.subplot(222)plt.scatter(x=train_data['1stFlrSF'],y=train_data['SalePrice'],color='green',edgecolor='black')plt.title('1stFlrSF',fontsize=15)异常值处理8.3数据预处理#绘制第三个散点子图plt.subplot(223)plt.scatter(x=train_data['GarageArea'],y=train_data['SalePrice'],color='yellow',edgecolor='black')plt.title('GarageArea',fontsize=15)#绘制第四个散点子图plt.subplot(224)plt.scatter(x=train_data['TotalBsmtSF'],y=train_data['SalePrice'],color='blue',edgecolor='black')plt.title('TotalBsmtSF',fontsize=15)plt.show()异常值处理8.3数据预处理通过观察散点图的的分布情况,可以看到GrLivArea与1stFlrSF在大于4000处都有明显的离群点,我们可以将其删去;GarageArea和TotalBsmtSF分别在大于1200和4000处有离群点,可以将其删除。删除前和删除后的散点图,分别如左图和右图所示。数据转换8.3数据预处理由前面小节中的内容可以知道,我们的目标数据并不服从完全的正态分布,而是一种具有偏尾的偏态分布。为了解决这一问题,从而将SalePrice数据映射为正态分布,需要利用函数变换的手段来调整数据,进行目标数据纠偏。广义上说,如果我们有一个样本量为n的样本yi(i=1,2,3,…,n),数据变换指的就是选择某个函数f(x),将其作用在样本上,得到新的样本f(yi)的过程。在本节中,我们的变换函数的任务就是要把样本分布偏出来的“尾巴”给缩回去。数据转换8.3数据预处理在Pandas中有skew()方法来表示偏态,大于0右偏,小于0左偏。在pandas中使用kurtosis()方法来表示峰度,kurtosis>0,尖峰态(leptokurtic),数据集比较分散,极端数值较多。kurtosis<0,低峰态(platykurtic),数据集比较集中,两侧的数据比较少。下面代码计算了偏态和峰度,结果偏度Skewness为1.882876,峰度Kurtosis为6.536282。由此可见目标数据右偏,并且为尖峰态。#计算偏态和峰度print("Skewness:%f"%train_data['SalePrice'].skew())print("Kurtosis:%f"%train_data['SalePrice'].kurt())数据转换8.3数据预处理通常来说,可以尝试一下几种方法:(1)如果数据高度偏态,则使用对数变换。①对数变换,即将原始数据X的对数值作为新的分布数据:x=np.log(x)②当原始数据中有小值及零时:x=np.log1p(x)(2)如果数据轻度偏态,则使用平方根变换。①平方根变换,即将原始数据X的平方根作为新的分布数据:x=np.sqrt(x)(3)如果数据的两端波动较大,则使用倒数变换。①倒数变换,即将原始数据X的倒数作为新的分析数据:x=1/x数据转换8.3数据预处理在本节中针对目标数据采用对数变换,使用np.log1p()函数来进行变换,将变换后的目标数据再次绘制直方图和Q-Q图,结果如下图所示,可以看到数据基本上服从正态分布。数据转换8.3数据预处理此外我们还可以使用Box-Cox变换来自动的进行数据转换。Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式。Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。Box-Cox变换的目标有两个:一个是变换后,可以一定程度上减小不可观测的误差和预测变量的相关性。主要操作是对因变量转换,使得变换后的因变量于回归自变量具有线性相依关系,误差也服从正态分布,误差各分量是等方差且相互独立;第二个是用这个变换来使得因变量获得一些性质,比如在时间序列分析中的平稳性,或者使得因变量分布为正态分布。数据转换8.3数据预处理在Python中我们可以使用scipy中的special模块的boxcox()函数来进行Box-Cox变换,或者是stats模块中的boxcox()函数来进行变换,二者区别在于前者需要人为指定Box-Cox变换中的lambda值,而后者包含了Box-Cox中的lambda计算(即不需要给函数boxcox输入参数lambda,boxcox()函数的返回值中就有lambda),我们采用后者来计算,其格式为:y,lambda0=boxcox(x,lmbda=None,alpha=None)在本章中的使用代码如下。使用stats.boxcox()函数来对数据进行变换,返回变换后的目标数据结果和λ值,λ的值为-0.07692391328663316。#进行Box-Cox变换train_data.SalePrice,lambda_=stats.boxcox(train_data.SalePrice)print(lambda_)数据转换8.3数据预处理使用变换后的数据绘制出直方图和Q-Q图,并且计算出Skewness和Kurtosis。从结果中可以看到,在横坐标值为3的区域附近,Box-Cox转换的效果比自己选择转换函数手动转换的效果要更好。#再次观察SalePriceplt.figure(figsize=(10,6),dpi=150)plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=0.1,hspace=0.5)#第一个子图#直方图plt.subplot(2,1,1)sns.distplot(train['SalePrice'],fit=stats.norm)(mu,sigma)=stats.norm.fit(train['SalePrice'])plt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论