1)明确分析的目的

本次数据分析的数据来源于kaggle上有关于房价预测,数据来源:House Prices: Advanced Regression Techniques。此次的分析目的已经很明确了,即根据已有数据对房屋的价格进行分析,从而预测价格走势。

2)数据收集

上文已经提到本文的分析数据来源。那么本部分就只需将已取得的数据读取到R中,做数据处理前的准备,这里就用到此前学习过的R读取excel的方式,这里我们稍微复习一下:

(1)使用R自带函数:read.csv();

(2)借助于“包”:有xlsx、XLConnect或openxlsx。

这里我们采用直接采用函数read.csv,从R数据统计结果中可以看到,本数据一共包含81个变量,共1460组数据。

> HPdata<-read.csv("C:/Users/PYD/Desktop/train.csv")

可以看到数据已读取到R中

3)数据处理

数据处理这一部分主要就是对已取得的数据进行整理,以方便我们后续进行分析。主要包含有缺失值处理、数据格式处理、更改错误信息、增加新变量等。

(1)缺失值处理

数据分析之前,要先进行缺失值处理,看一下缺失值具体出现在哪些特征里,缺失信息对整个特征是否有重要的影响。首先我们先进行缺失情况的统计。

a)识别缺失数据

因本文数据所含特征值比较多,所以我们先将含有缺失值的变量筛选出来进行分析。

使用which函数将含有缺失值的列下标提取出来,然后将整个数据中含有缺失值的特征提取出来:

#首先载入需要用到的程序包
>library("dplyr")
>library("mice")
>library("ggthemes")
>library("gridExtra")
>library("ggplot2")
>library("GGally")
>
> NAS<-which(colSums(is.na(HPdata))>0)
> NASLotFrontage        Alley   MasVnrType   MasVnrArea 4            7           26           27 BsmtQual     BsmtCond BsmtExposure BsmtFinType1 31           32           33           34
BsmtFinType2   Electrical  FireplaceQu   GarageType 36           43           58           59 GarageYrBlt GarageFinish   GarageQual   GarageCond 60           61           64           65 PoolQC        Fence  MiscFeature 73           74           75
> NASdata<-HPdata[,NAS]

然后对缺失的数据进行快速分类。缺失的数据分为两种类型:

<1>MCAR:完全随机缺失,指某个变量是否缺失与它本身的值无关,与其他任何变量的值也无关;

<2>MAR:随机缺失,某个变量的缺失数据与其他观测变量相关,与它自身的值无关。

<3>NIMAR:非随机缺失:某个变量的缺失数据与其他观测值及自身值都相关。

通常数据缺失的理想状态为MCAR,假设数据缺失为此种类型,过多的数据丢失也是一个问题,一般缺失值比例的最大阈值为5%,若某些特征或样本缺失值的数据缺失超过5%,那可能就需要忽略掉这些特征或样本了,因此,我们先简单看一下特征值缺失情况。

> NMiss<-function(x){sum(is.na(x))/length(x)*100}
> apply(NASdata,2,NMiss)LotFrontage        Alley   MasVnrType   MasVnrArea     BsmtQual 17.73972603  93.76712329   0.54794521   0.54794521   2.53424658 BsmtCond BsmtExposure BsmtFinType1 BsmtFinType2   Electrical 2.53424658   2.60273973   2.53424658   2.60273973   0.06849315 FireplaceQu   GarageType  GarageYrBlt GarageFinish   GarageQual 47.26027397   5.54794521   5.54794521   5.54794521   5.54794521 GarageCond       PoolQC        Fence  MiscFeature 5.54794521  99.52054795  80.75342466  96.30136986
> NMiss<-function(x){sum(is.na(x))}
> apply(NASdata,2,NMiss)LotFrontage        Alley   MasVnrType   MasVnrArea     BsmtQual     BsmtCond BsmtExposure BsmtFinType1 BsmtFinType2 259         1369            8            8           37           37           38           37           38 Electrical  FireplaceQu   GarageType  GarageYrBlt GarageFinish   GarageQual   GarageCond       PoolQC        Fence 1          690           81           81           81           81           81         1453         1179 MiscFeature 1406
> 

从上面的数据可以看到,有许多样本的缺失值都超过了5%,甚至有的都达到了90%,如Alley、PoolQC等样本,对于这些缺失较多的数据我们进行删除处理。

这里也可以使用VIM包来对数据缺失的模式有一个更直观的视觉展现。VIM包提供了大量可视化数据集中缺失值的函数,例如aggr(),matrixplot(),marginplot()。

> library("VIM")
> aggr_plot<-aggr(NASdata,numbers=TRUE,sortVars=TRUE,labels=names(NASdata),cex.axis=.5,
gap=3,ylab=c("Histogram of missing data","Pattern"))
Variables sorted by number of missings: Variable        CountPoolQC 0.9952054795MiscFeature 0.9630136986Alley 0.9376712329Fence 0.8075342466FireplaceQu 0.4726027397LotFrontage 0.1773972603GarageType 0.0554794521GarageYrBlt 0.0554794521GarageFinish 0.0554794521GarageQual 0.0554794521GarageCond 0.0554794521BsmtExposure 0.0260273973BsmtFinType2 0.0260273973BsmtQual 0.0253424658BsmtCond 0.0253424658BsmtFinType1 0.0253424658MasVnrType 0.0054794521MasVnrArea 0.0054794521Electrical 0.0006849315

b)检查分析导致数据缺失的原因

从上面的统计来看,PoolQC、MiscFeature、Alley、Fence等词缺失量比较大,这里我们将数据缺失值超过5%的数据做删除处理,另外从特征本身的字面意思来看,GarageType、GarageYrBlt、 GarageFinish、GarageQual、 GarageCond应该为相似特征,其缺失值的数量都相同,从数据来源的特征解释中也可以看到,这些特征都是用来描述房子车库的一些信息,而这些信息可以使用完整的数据特征GarageCars来表现了,因此对这五个特征进行删除处理。

另外,对于BsmtExposure 、BsmtFinType2、BsmtQual 、 BsmtCond、BsmtFinType1 等特征从特征值来看,应该也为相似特征,从数据源特征描述可以看到,这些是用来描述地下室的一些特征信息,而关于地下室的信息特征总共有9个,其中四个是完整的数据信息,已足以表征basement(地下室)的特征信息了。

由此含有缺失值的特征就只剩下FireplaceQu、LotFrontage、MasVnrType、MasVnrArea 、Electrical。但从字面以及特征解释中可以看到MasVnrType、MasVnrArea 有很高的相关性,同属于描述外墙的特征,而且从上图可以看出,它们缺失的实例完全相同,从字面意思来看其对房价的影响不太大,这里我们也做删除处理。

总的来看,经过分析后,数据中剩下的包含缺失值的样本目前就只剩下FireplaceQu、LotFrontage、Electrical。而在剩下的三个缺失值当中,FireplaceQu(壁炉质量)跟特征Fireplaces(壁炉数量)相关,当Fireplaces为0时,FireplaceQu(壁炉质量)为缺失值,因此对此缺失值的填补是无意义的。

c)删除或补全缺失数据

根据上面的分析,先对整个数据中需要删除的特征进行处理。

> NASdata1<-NASdata[,-which(colnames(NASdata)%in%c("LotFrontage","Electrical"))]
> y<-which(colnames(HPdata)%in%colnames(NASdata1))
> HPdata1<-HPdata[,-y]

现在数据集HPdata1中只包含LotFrontage、Electrical两个含缺失值的特征了。从上面的分析可以看到,特征Electrical仅含有一个缺失值,因此这里就多Electrical进行简单插补处理,取Eelectrial中的众数SBrkr来填补。

> table(HPdata1[,"Electrical"])
FuseA FuseF FuseP   Mix SBrkr 94    27     3     1  1334
> HPdata1[which(is.na(HPdata1[,"Electrical"])),"Electrical"]<-c("SBrkr")
> table(HPdata1[,"Electrical"])
FuseA FuseF FuseP   Mix SBrkr 94    27     3     1  1335
> sum(is.na(HPdata1[,"Electrical"]))
[1] 0

至此就只剩下一个特征LotFrontage存在缺失值。多重插补是在面对复杂缺失值问题时最常用的方法。这里我们使用mice包来填补LotFrontage缺失的数据。

> imp<-mice(HPdata1,m=5,method = "rf")
> fit<-with(imp,lm(SalePrice~LotFrontage))
> pooled<-pool(fit)
> summary(pooled)estimate std.error statistic       df      p.value
(Intercept) 103864.930 7664.1623  13.55203 25.32757 4.121148e-13
LotFrontage   1099.599  105.4407  10.42860 22.52669 1.179994e-10
#这里对summary出来的参数值不是很明了,先暂且搁置
> HPdata2<-complete(imp,action = 3)
> summary(HPdata2$LotFrontage)Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 21.00   59.75   70.00   70.14   80.00  313.00
> summary(HPdata$LotFrontage)Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 21.00   59.00   69.00   70.05   80.00  313.00     259

4)数据分析

现在我们得到了一个没有缺失值的数据集HPdata2,接下来就来分析一下各个特征值与SalePrice之间的关系。首先将数据集中字符串型和数值型分开来进行分析。

 F_obj1<-sapply(HPdata2,is.factor)
> F_data<-HPdata2[,F_obj1,drop=FALSE]#或者HPdata2[which(sapply(HPdata2,is.factor))]
> colnames(F_data)[1] "MSZoning"      "Street"        "LotShape"      "LandContour"   "Utilities"     "LotConfig"     "LandSlope"    [8] "Neighborhood"  "Condition1"    "Condition2"    "BldgType"      "HouseStyle"    "RoofStyle"     "RoofMatl"
[15] "Exterior1st"   "Exterior2nd"   "ExterQual"     "ExterCond"     "Foundation"    "Heating"       "HeatingQC"
[22] "CentralAir"    "Electrical"    "KitchenQual"   "Functional"    "PavedDrive"    "SaleType" "SaleCondition"
> N_data<-HPdata2[which(sapply(HPdata2,is.numeric))]
> names(N_data)[1] "Id"            "MSSubClass"    "LotFrontage"   "LotArea"      [5] "OverallQual"   "OverallCond"   "YearBuilt"     "YearRemodAdd" [9] "BsmtFinSF1"    "BsmtFinSF2"    "BsmtUnfSF"     "TotalBsmtSF"
[13] "X1stFlrSF"     "X2ndFlrSF"     "LowQualFinSF"  "GrLivArea"
[17] "BsmtFullBath"  "BsmtHalfBath"  "FullBath"      "HalfBath"
[21] "BedroomAbvGr"  "KitchenAbvGr"  "TotRmsAbvGrd"  "Fireplaces"
[25] "GarageCars"    "GarageArea"    "WoodDeckSF"    "OpenPorchSF"
[29] "EnclosedPorch" "X3SsnPorch"    "ScreenPorch"   "PoolArea"
[33] "MiscVal"       "MoSold"        "YrSold"        "SalePrice"

F_data中放置的为HPdata2中的字符串型数据,N_data中放置的为HPdata2中的数值型数据。

(1)数据可视化

首先通过数据可视化来了解一下各个特征值分布情况。对于离散型变量最直观的就是条形图,连续性变量可以使用折线图来显示。

#建立直方图和密度图函数
#直方图函数
plotHist <- function(data_in, i)
{data <- data.frame(x=data_in[[i]])p <- ggplot(data=data, aes(x=factor(x))) + stat_count() + xlab(colnames(data_in)[i]) + theme_light() + theme(axis.text.x = element_text(angle = 90, hjust =1))return (p)
}
#密度图函数
plotDen <- function(data_in, i){data <- data.frame(x=data_in[[i]], SalePrice = data_in$SalePrice)p <- ggplot(data= data) + geom_line(aes(x = x), stat = 'density', size = 1,alpha = 1.0) +xlab(paste0((colnames(data_in)[i]), 'n', 'Skewness: ',round(skewness(data_in[[i]], na.rm = TRUE), 2))) + theme_light() return(p)}
#建立直方图或密度图的调用函数
doPlots <- function(data_in, fun, ii, ncol=3)
{pp <- list()for (i in ii) {p <- fun(data_in=data_in, i=i)pp <- c(pp, list(p))}do.call("grid.arrange", c(pp, ncol=ncol))
}

使用直方图对字符型特征变量进行图形显示。

> doPlots(F_data, fun = plotHist, ii = 1:8, ncol = 2)

> doPlots(F_data, fun = plotHist, ii = 9:16, ncol = 2)

> doPlots(F_data, fun = plotHist, ii = 17:24, ncol = 2)

> doPlots(F_data, fun = plotHist, ii = 25:29, ncol = 2)

绘制Neighborhood和SalePrice的箱线图。

> ggplot(HPdata2, aes(x = Neighborhood, y = SalePrice)) +
+     geom_boxplot() + geom_hline(aes(yintercept=80), colour='red', linetype='dashed', lwd=2) +
+     scale_y_continuous() +
+     theme_few() 

从箱线图上可以看出,BrkSide和OldTown以及SWISU地区附近有便宜的房子,而NridgHt和NoRidge有几个高价异常值。

使用折线图对数值型特征变量进行图形显示。从特征属性及取值来看,'BedroomAbvGr', 'HalfBath', ' KitchenAbvGr','BsmtFullBath', 'BsmtHalfBath', 'MSSubClass'这几特征虽然是数值型,但是其取值为有限的几个常数值,因此使用直方图会更加直观。

> N_data1<-N_data[,-which(colnames(N_data)%in%c("BsmtFullBath",
"BsmtHalfBath","FullBath","HalfBath","BedroomAbvGr","KitchenAbvGr"))]
> N_data2<-N_data[,which(colnames(N_data)%in%c("BsmtFullBath",
"BsmtHalfBath","FullBath","HalfBath","BedroomAbvGr","KitchenAbvGr"))]
> doPlots(N_data1, fun = plotDen, ii = 2:7, ncol = 2)

> doPlots(N_data1, fun = plotDen, ii = 8:13, ncol = 2)

> doPlots(N_data1, fun = plotDen, ii = 14:19, ncol = 2)

> doPlots(N_data1, fun = plotDen, ii = 20:29, ncol = 2)

上面的密度图可以看出所有的特征偏度均不为零。从YearBuilt的密度图上可以看到,这次的统计数据中新老房子都有,这可能预示着由于住房危机,近年来房屋数量有所下降。

> doPlots(N_data2, fun = plotHist, ii = 1:6, ncol = 2)

从上面的直方图和密度图我们可以看到原始的数据并不是标准的正态分布,我们需要优化这些数据,使其能够按照机器学习的特性进行学习,我们先看一下房价与地面居住面积、地下室面积的散点图。

ggplot(HPdata2,aes(y=SalePrice,x=GrLivArea))+geom_point()

>ggplot(HPdata2,aes(y=SalePrice,x=TotalBsmtSF))+geom_point()

从上面两副散点图可以看到,数据存在存在离群点,很显然应该去掉。

> HPdata3<- HPdata2[(HPdata2$GrLivArea<=4000)&(HPdata2$TotalBsmtSF<=4000),]

另外在上面进行数据展示的时候,可以看到数值型数据的偏度都比较大,并且曲线比较复杂,这里使用log(x+1)进行转换,使数据线性化,这样会方便后续数据处理和分析。

#把所有的数值型数据取出来
> N_data2<-HPdata3[which(sapply(HPdata3,is.numeric))]
#计算每一个变量的偏度
> skew <- sapply(names(N_data2),function(x){skewness(N_data2[[x]],na.rm = T)})
#选择一个偏度阈值,将超过阈值的变量进行转换
> skew <- skew[skew > 0.75]
> for(x in names(skew))
+ {
+     HPdata3[[x]] <- log(HPdata3[[x]] + 1)
+ }

接下来我们从上面产生的数据集中选出一组训练集。

#设置训练集观测组数
> smp_size <- floor(0.75 * nrow(HPdata3))
#取出训练集
> set.seed(123)
> I_train <- sample(seq_len(nrow(HPdata3)), size = smp_size)
> train_data<-HPdata3[I_train,]
> validate<-HPdata3[-I_train,]
#将Id特征从数据集中移除
> train_data <- subset(train_data,select=-c(Id))

使用随机森林建立训练模型。

> library(randomForest)
> house_model <- randomForest(SalePrice~.,data = train_data)

查看变量重要性。

> importance    <- importance(house_model)
> varImpPlot(house_model)

至此,训练模型已经建立完成,可以将validate的数据集导入到模型中进行房价预测对比。

> P_validata<-validate
> P_validata$SalePrice<-rep(NA,364)
> prediction<-predict(house_model,P_validata)
> hist(prediction)
> hist(validate$SalePrice)

从图上看,预测结果和实际结果有一定的契合度,预测结果显示房价区间在11到13之间,从实际房价来看的确有90%多的数据集中在11到13之间,并且大多数房价集中在11.5到12.5之间。

参考文献:

Predicting House Prices using R​www.kaggle.comKaggle房价预测:数据预处理--练习 - qilixuening的博客 - CSDN博客​blog.csdn.net

kaggle房价预测特征意思_R语言实战:复杂数据处理和分析之Kaggle房价预测相关推荐

  1. r语言electricity数据集_R语言实战学习

    <R语言实战>中文电子版 提取码:lx35 已经学习打卡R语言22天了,可以说是初窥真容--基本了解R的数据和函数:作为程序语言,就是要多练习,多领悟,在实战中发现问题并解决问题. 所以, ...

  2. R plot图片背景设置为透明_R语言实战 牛国庆

    [toc] 第一章 1.3.2 R中帮助函数 R中用于管理R工作空间的函数 函数setwd()不会自动创建一个不存在的目录.如果必要的话,可以使用函数dir.create()来创建新目录,然后使用se ...

  3. spss典型相关分析_R语言实战 多元统计分析Day10— —典型相关分析

    R语言实战多元统计分析Day10-- 典型相关分析 01 前言 典型相关分析是用于分析两组随机变量之间的相关性程度的一种统计方法,它能够有效的揭示两组随机变量之间的相互线性依赖关系,这种方法是由Hot ...

  4. r语言 新增一列数字类型_R语言实战之R语言基础语法精讲(一)

    R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具.在学习R数据科学之前,我们首先要对R语言的基础语法有一个良好的了 ...

  5. r语言 悲观剪枝_R语言实战(5) ——高级数据管理

    往期回顾: R语言实战(1)--R语言介绍 R语言实战(2)--创建数据集 R语言实战(3)--图形初阶 R语言实战(4) --数据管理 本期是我们推出<R语言实战>赠书活动的最后一天啦! ...

  6. r语言 新增一列数字类型_R语言实战(2)——创建数据集【学习分享】

    往期回顾: R语言实战(1)--R语言介绍[学习分享] 引言:上一章我们通过简单的例子了解了R语言及R语言能实现的一些功能,本期我们将一起学习R中的数据结构,以及向R中导入数据的方法. 2.1 数据结 ...

  7. readxmls r语言_R语言实战(一)介绍、数据集与图形初阶

    本文对应<R语言实战>前3章,因为里面大部分内容已经比较熟悉,所以在这里只是起一个索引的作用. 第1章       R语言介绍 获取帮助函数 help(), ? 查看函数帮助 exampl ...

  8. r语言 图形一览_R语言实战—图形篇(图形初阶)

    最近沉迷学习R语言,不得不说<R语言实战>真的太详细了,详细的阅读完这本书后,我的收获不小.为了方便自己复习,将这本书的内容整理归纳为两个部分:统计篇(数据分析)和图形篇(数据可视化). ...

  9. 数据分析与挖掘实战-应用系统负载分析与磁盘容量预测

    应用系统负载分析与磁盘容量预测 背景 某大型企业为了信息化发展的需要,建设了办公自动化系统.人力资源管理系统.财务管理系统.企业信息门户系统等几大企业级应用系统.因应用系统在日常运行时,会对底层软硬件 ...

最新文章

  1. seaborn可视化散点图并自定义图像的标题(title)以及自定义标题的字体大小(Set a Title to a Seaborn Plot)
  2. 【小项目关键技术二】UGV电机编码测速
  3. @value 静态变量_你理解 PHP 中的静态方法吗?
  4. crm使用soap创建下拉框
  5. 斯坦福CS231n项目实战(四):浅层神经网络
  6. main线程 子线程 顺序_面试官:线程池如何按照core、max、queue的执行顺序去执行?详解...
  7. 【转载】android程序报找不到Application
  8. 软件工程 团队作业 #9
  9. SpringMVC 文件上传
  10. linux的基本使用方法,Linux/Unix基本使用方法
  11. java 获取bean的注解_如何获取spring 注解的bean
  12. maven的一些依赖
  13. 5.1声道定位测试音源(PCM-WAV)定位测试音源(PCM-WAV)
  14. 计算机音乐专业学什么软件有哪些内容,电脑音乐入门装备(软件篇)
  15. java移库数据同步,洗车管理系统会员管理+门店店务同步管理
  16. eth1 does not seem to be present, delaying initialization
  17. 私有化(xx,_x,__xx,__xx__,xx_)
  18. 金彩教育:怎么布局人群标签
  19. 达梦中的连接查询方式
  20. 雪花算法:分布式唯一 ID 生成利器

热门文章

  1. Lucene.Net---1索引的建立
  2. 国内主流IT公司Field Sales销售薪资 来自著名猎头公司内部信息 给IT的朋友们知道个行情 - 天涯...
  3. jsp中jsp中群发邮件群发邮件
  4. Centos 修改默认网卡为eth0
  5. int到string的转换
  6. CRC原理及其逆向分析方法
  7. js Array Map and Set
  8. 观《phonegap第三季 angularjs+ionic视频教程 实时发布》学习笔记(一)
  9. HDU 5727 Necklace
  10. Caliburn笔记-基本Command(wpf框架)