R语言-上海二手房数据分析
案例:通过分析上海的二手房的数据,分析出性价比(地段,价格,未来的升值空间)来判断哪个区位的二手房性价比最高
1.载入包
library(ggplot2)
library(Hmisc)
library(car)
library(caret)
2.加载数据集
houses <- read.csv('E:\\Udacity\\Data Analysis High\\R\\R_Study\\二手房分析案例\\链家二手房.csv',sep=',',header=T)
3.查看数据集
describe(houses)
数据集有以下几个字段构成
## 小区名称
## 户型
## 面积
## 区域
## 楼层
## 朝向
## 价格.W.
## 单价.平方米.
## 建筑时间
探究影响房价的主要因素是什么
4.查看户型的分布
type_freq <- data.frame(table(houses$户型))
type_p <- ggplot(data=type_freq,aes(x=reorder(Var1,-Freq),y=Freq))+
geom_bar(stat='identity',fill='steelblue')+
theme(axis.text.x = element_text(angle = 30,vjust = 0.5))+
xlab('户型')+
ylab('套数')
type_p
结论:户型的分布不符合正态分布
需要对户型的数据进行清洗,找出主要的户型
5.对户型数据进行清洗
# 把低于一千套的房型设置为其他
type <- c('2室2厅','2室1厅','3室2厅','1室1厅','3室1厅','4室2厅','1室0厅','2室0厅','4室1厅') houses$type.new <- ifelse(houses$户型 %in% type,as.character(houses$户型),'其他')
type_freq <- data.frame(table(houses$type.new))
# 绘图
type_p <- ggplot(data = type_freq, mapping = aes(x = reorder(Var1, -Freq),y = Freq)) +
geom_bar(stat = 'identity', fill = 'steelblue') +
theme(axis.text.x = element_text(angle = 30, vjust = 0.5)) +
xlab('户型') + ylab('套数')
type_p
结论:2室2厅,2室1厅,3室2厅是上海比较多的二手房户型
6.楼层数据清洗
# 新建floor变量,使用ifelse来判断具体的楼层
houses$floor <- ifelse(substring(houses$楼层,1,2) %in% c('低区','高区','中区'),substring(houses$楼层,1,2),'低区')
# 计算百分比
percent <- paste(round(prop.table(table(houses$floor))*100,2),'%',sep = '')
df <- data.frame(table(houses$floor))
df <- cbind(df,percent)
df
7.建筑时间清洗
# 自定义众数函数
stat.mode <- function(x, rm.na = TRUE){
if (rm.na == TRUE){
y = x[!is.na(x)]
}
res = names(table(y))[which.max(table(y))]
return(res)
}
# 自定义函数,实现分组替补
my.impute <- function(data, category.col = NULL,
miss.col = NULL, method = stat.mode){
impute.data = NULL
for(i in as.character(unique(data[,category.col]))){
sub.data = subset(data, data[,category.col] == i)
sub.data[,miss.col] = impute(sub.data[,miss.col], method)
impute.data = c(impute.data, sub.data[,miss.col])
}
data[,miss.col] = impute.data
return(data)
}
# 将建筑时间中空白字符串转换为缺失值
houses$建筑时间[houses$建筑时间 == ''] <- NA
#分组替补缺失值,并对数据集进行变量筛选 final_house <- subset(my.impute(houses, '区域', '建筑时间'),select = c(type.new,floor,面积,价格.W.,单价.平方米.,建筑时间))
#构建新字段builtdate2now,即建筑时间与当前2016年的时长
final_house <- transform(final_house, builtdate2now = 2016-as.integer(substring(as.character(建筑时间),1,4)))
#删除原始的建筑时间这一字段
final_house <- subset(final_house, select = -建筑时间)
8.查看房价和面积的正态分布
# 自定义正态分布的函数
# 自定义绘图函数
norm.test <- function(x, breaks = 20, alpha = 0.05,
plot = TRUE){
if(plot == TRUE)
{#设置图形界面(多图合为一张图)
opar <- par(no.readonly = TRUE)
layout(matrix(c(1,1,2,3),2,2,byrow = TRUE),
width = c(2,2),heights = c(2,2))
#绘制直方图
hist(x, freq = FALSE, breaks = seq(min(x),
max(x), length = breaks), main = 'x的直方图',
ylab = '核密度值')
#添加核密度图
lines(density(x), col = 'red', lty = 1, lwd = 2)
#添加正态分布图
x <- x[order(x)]
lines(x, dnorm(x, mean(x), sd(x)),
col = 'blue', lty = 2, lwd = 2.5)
#添加图例
legend('topright',
legend = c('核密度曲线','正态分布曲线'),
col = c('red','blue'), lty = c(1,2),
lwd = c(2,2.5), bty = 'n')
#绘制Q-Q图
qqnorm(x, xlab = '实际分布', ylab = '正态分布',
main = 'x的Q-Q图', col = 'blue')
qqline(x)
#绘制P-P图
P <- pnorm(x, mean(x), sd(x))
cdf <- 0
for(i in 1:length(x)){cdf[i] <- sum(x <= x[i])/length(x)}
plot(cdf, P, xlab = '实际分布', ylab = '正态分布',
main = 'x的P-P图', xlim = c(0,1),
ylim = c(0,1), col = 'blue')
abline(a = 0, b = 1)
par(opar)
}
#定量的shapiro检验
if (length(x) <= 5000) {
shapiro <- shapiro.test(x)
if(shapiro$p.value > alpha)
print(paste('定量结果为:', 'x服从正态分布,',
'P值 =',round(shapiro$p.value,5), '> 0.05'))
else
print(paste('定量结果为:', 'x不服从正态分布,',
'P值 =',round(shapiro$p.value,5), '<= 0.05'))
shapiro
}
else {
ks <- ks.test(x,'pnorm')
if(ks$p.value > alpha)
print(paste('定量结果为:', 'x服从正态分布,',
'P值 =',round(ks$p.value,5), '> 0.05'))
else
print(paste('定量结果为:', 'x不服从正态分布,',
'P值 =',round(ks$p.value,5), '<= 0.05'))
ks
}
}
# 面积的正态检验
norm.test(houses$面积)
# 价格的正态检验
norm.test(houses$价格.W.)
结论:房价和面积均不服从正态分布,因此不能对其进行做线性回归模型
9.查看上海地区二手房的均价
avg_price <- aggregate(houses$单价.平方米.,by=list(houses$区域),FUN=mean)
p <- ggplot(data=avg_price,aes(x=reorder(Group.1,-x),y=x,group=1))+
geom_area(fill='lightgreen')+
geom_line(colour = 'steelblue', size = 2)+
geom_point()+
ylab('均价')
p
结论:静安区和徐汇区的价格较高
10.模型构建
在对房屋进行建模的时候,首先使用聚类把不同类型的房子给划分出来,我选择面积,房价,单价/㎡来进行聚类的划分
10.1 聚类的个数
# 模型构建
tot.wssplot <- function(data,nc,seed=1234){
# 计算距离的平方和
tot.wss <- (nrow(data)-1) * sum(apply(data,2,var))
for(i in 2:nc){
set.seed(seed)
tot.wss[i] <- kmeans(data,centers = i,iter.max = 100)$tot.withinss
}
plot(1:nc,tot.wss,type='b',xlab = 'Number of Cluster',
ylab = 'Within groups sum of squares',col='blue',lwd=2,
main='choose best clusters')
}
# 找出判断聚类的三个主要的指标
stander <- data.frame(scale(final_house[,c('面积','价格.W.','单价.平方米.')]))
# 做出聚类个数图
tot.wssplot(stander,15)
结论:分成5个类的模型的效果会比较好
10.2聚类
set.seed(1234)
clust <- kmeans(x=stander,centers = 5,iter.max = 100)
table(clust$cluster)
结论:每个聚类的结果
10.3查看聚类的结果
# 查看每个户型的平均面积
aggregate(final_house$面积,list(final_house$type.new),FUN=mean)
# 比较每个类中的面积,单价,每平米价格
aggregate(final_house[,3:5],list(clust$cluster),FUN=mean)
结论:
第1组是地段型的房子,地段位于上海的核心区域,每平米的单价是最高的
第2组是面积型的房子,地段稍逊于第1组,面积都在350平米以上,属于享受阶层买得起的房子
第3组是均衡型的房子,地段和面积均属于发展中的状态,房价涨势稳定,将来的发展空间较大
第4组是廉价型的房子,面积和价格都相对比较低,地段和面积相对较低
10.4聚类的散点图
p <- ggplot(data=final_house[,3:5],aes(x=面积,y=单价.平方米.,color=factor(clust$cluster)))+
geom_point(pch=20,size=3)+
scale_color_manual(values = c('red','blue','green','black','orange'))
p
11建模
11.1 将类别变量变成因子类型
final_house$floor <- factor(final_house$floor)
final_house$type.new <- factor(final_house$type.new)
final_house$clsuter <- factor(clust$cluster)
11.2构建公式
# 选择出所有的因子变量
factors <- names(final_house)[sapply(final_house, class)=='factor']
formal <- f <- as.formula(paste('~',paste(factors,collapse = '+')))
dummy <- dummyVars(formula = formal,data=final_house)
pred <- predict(dummy,newdata=final_house)
head(pred)
11.3建模
final_house2 <- cbind(final_house,pred)
# 选择需要建模的因子
model_data <- subset(final_house2,select=-c(1,2,3,8,17,18,24))
fit1 <- lm(价格.W. ~ .,data=model_data)
summary(fit1)
结论:建造时间和2室1厅的影响不明显,需要对模型进行修改
11.4修改模型
#由于房价不符合正态分布,所以要对价格取对数
powerTransform(fit1)
fit2 <- lm(log(价格.W.) ~ .,data=model_data)
summary(fit2)
结论:R²的值得到了提高,并且建造时间和2室1厅的影响已经计入到模型中去
11.5查看最终模型的诊断结果
opar <- par(no.readonly = TRUE)
par(mfrow = c(2,2))
plot(fit2)
par(opar)
结论:符合线性回归模型的假设
R语言-上海二手房数据分析的更多相关文章
- R语言 ggplot2包
R语言 ggplot2包的学习 分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将 ...
- Rmarkdown用法与R语言动态报告
Rmarkdown用法与R语言动态报告数据分析用R语言非常便捷,因为R语言的社区强大,并且在不断更新和完善,提供了各种分析利器.Knitr和Rmarkdown包则是数据分析中的动态报告利器. 下面是一 ...
- R语言 一套内容 从入门 到放弃
[怪毛匠子整理] 1.下载 wget http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3.0.1.tar.gz 2.解压: tar -zxvf R-3.0. ...
- R语言缺点
R的优点:免费,开源,体积小.缺点:对大文本处理差,另外一个也在于开源,package如果出错,烦死你.当你跑比较大的simulation,对效率有要求的时候,有时还是不得不用C,这可能是10小时和1 ...
- R 语言赋值运算符:`<-` , `=`, `<<-`
<- 与 = 间的区别 <- 与 = 在大部分情况下是应该可以通用的.并且,相对于 <<- 运算符,它们的赋值行为均在它们自身的环境层(environment hierarch ...
- 【R语言入门】R语言中的变量与基本数据类型
说明 在前一篇中,我们介绍了 R 语言和 R Studio 的安装,并简单的介绍了一个示例,接下来让我们由浅入深的学习 R 语言的相关知识. 本篇将主要介绍 R 语言的基本操作.变量和几种基本数据类型 ...
- 数据分析和R语言的那点事儿_1
最近遇到一些程序员同学向我了解R语言,有些更是想转行做数据分析,故开始学习R或者Python之类的语言.在有其他编程语言的背景下,学习R的语法的确是一件十分简单的事.霸特,如果以为仅仅是这样的话那就图 ...
- R语言数据分析
CSDN博客:包括R语言基础.R语言数据挖掘.hadoop大数据及spark等 http://blog.csdn.net/qq_16365849 R语言及数据分析 http://blog.csdn.n ...
- 零基础数据分析与挖掘R语言实战课程(R语言)
随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析, 挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况 ...
随机推荐
- ArcGIS api for javascript——鼠标悬停时显示信息窗口
描述 本例展示当用户在要素上悬停鼠标时如何显示InfoWindow.本例中,要素是查询USA州图层的QueryTask的查询结果.工作流程如下: 1.用户单击一个要素 2.要素是“加亮的”图形. 3. ...
- Spring可扩展Schema标签
基于Spring可扩展Schema提供自己定义配置支持 http://blog.csdn.net/cutesource/article/details/5864562 WARN : org.sprin ...
- POJ 3150 Cellular Automaton(矩阵高速幂)
题目大意:给定n(1<=n<=500)个数字和一个数字m,这n个数字组成一个环(a0,a1.....an-1).假设对ai进行一次d-step操作,那么ai的值变为与ai的距离小于d的全部 ...
- vue19 组建 Vue.extend component、组件模版、动态组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue进阶之事件处理器
过滤 <html> <head> <meta charset="UTF-8"> <meta name="viewport&quo ...
- 30.angularJS第一个实例
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 Angu ...
- linux和Windows双系统让 Windows 把硬件时间当作 UTC
linux和Windows双系统让 Windows 把硬件时间当作 UTC Windows设置如下:开 始->运行->CMD,打开命令行程序(Vista则要以管理员方式打开命令行程序方可有 ...
- 喜马拉雅FM
import requestsimport jsonstart_url ='https://www.ximalaya.com/revision/play/album?albumId=3595841&a ...
- NStimer 被堵塞
我们在界面上滚动一个scrollview,那么我们会发如今停止滚动前,会发现NSTimer未被运行.就好像scrollView在滚动的时候将timer暂停了一样,在查看对应文档后发现,这事实上就是ru ...
- Unityclient通信測试问题处理(一)
Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...