链家租房市场数据分析

文章目录

  • 链家租房市场数据分析
    • 前言
    • 待解决的问题
    • 链家网数据爬取
    • 租房数据整理
    • 租金、面积、户型的数据可视化
    • 结论

前言

近年来,持续高昂的房价将很多想要安身立命的人挡在了买房的门槛之外。在外漂泊的人们,只能暂时转向租赁市场寻求居住场所。购房行为代替给租房市场带来了巨大的规模和效益。
本文使用爬虫爬取上海链家网上租房的信息,然后进行一些探索和分析,了解租房市场行情。(项目使用R 3.5.1软件,调用的R包有Rvest、RMySQL、dplyr、ggplot2、caret)

待解决的问题

1.各地区的租房数量是如何分布的?

2.不同地区的租房价格?不同地区的租房面积大小?

4.房子的户型、朝向、楼层统计情况是怎样的?

5.哪一种户型的房子需求最多?对于合租人群来说,哪些户型的性价比比较高?

6.如果要使用租房信息对房源进行分类,可以大致分为哪几类?

7.影响租房价格的因素可能有哪些?哪个因素对价格影响最大?

链家网数据爬取

打开一个上海链家租房的网页:
链家租房市场分析(R爬虫、数据可视化)-编程知识网

可以发现:

  1. 网页URL格式为"https://sh.lianjia.com/zufang/"+所在地区+"/pg"+页码数,利用这个规律可进行多页数据爬取;
  2. 可获取有效信息:房源标题、价格、面积、所在地区、户型。

使用Rvest包分别爬取不同地区的数据,最终得到20796条租房信息,这里用RMySQL包保存到数据库中(也可以不使用数据库,直接保存在数据框中,使用rbind函数往数据框中添加新的数据)。
执行代码如下:

#加载包
library('rvest')
library('RMySQL')#连接数据库
conn <- dbConnect(MySQL(),dbname="rtest",username="root",password="123456",host="localhost",port=3306)
dbSendQuery(conn,"SET NAMES GBK")addrs <- c("jingan",'xuhui',"huangpu","changning","putuo","pudong","baoshan","zhabei","hongkou","yangpu","minhang","jinshan","jiading","chongming","fengxian","songjiang","qingpu")#各个地区
#爬虫爬取
for(k in 1:17){ for(i in 1:100){url <- paste("https://sh.lianjia.com/zufang/",addrs[k],"/pg",as.character(i),sep = '')html <- read_html(url)nodes <- html_nodes(html,"div.content__list div div p.twoline a")title <- html_text(nodes,"title")#房源标题link <- html_attr(nodes,"href")#房源链接nodes <- html_nodes(html,"div.content__list div div span.content__list--item-price")price <- html_text(nodes,"title")#价格nodes <- html_nodes(html,"div.content__list div div p.content__list--item--des")addinfo <-  html_text(nodes,"title")#其他信息,包括面积,朝向,所在地区,楼层数data <- data.frame(title=title,addinfo=addinfo,price=price,link=link)dbWriteTable(conn,"zufang",data,append=T)#写入数据库Sys.sleep(0.02)}
}

租房数据整理

爬取完毕以后,将数据导入R中进行查看,

house<-dbReadTable(conn,"zufang",row.names=F)#从数据库中导入数据
house <-unique(house)#数据去除重复值

由于在本文中,row_names、title、link并没有发挥用处,因此删除这几个字段,将剩下的字段进行简单数据切分和处理,去除单位、转换数据类型,并提取有效特征。
最后得到8个字段:

  • price:房源价格
  • area:房源面积
  • north-south:朝向
  • huxing:户型,X室X厅X卫
  • floors:分低楼层、中楼层、高楼层
  • num_person:可居住人数,根据户型中卧室的数量判断可居住人数
  • plc1 :所属地区
  • plc2:所属路段
    链家租房市场分析(R爬虫、数据可视化)-编程知识网
    初步整理完数据以后,我们可以对数据进行描述性统计:

共计21796条数据,8个字段;

price、area、num_person这几个字段为数值型变量,其余字段为因子型变量;

租房价格最高为350000元,最低为1000元,均价为9118元;

房源面积最大为 1839平方米,最小为8平方米,平均面积为102.7平方米;

超过90%的住房朝向为朝南,比较适宜居住;

不同的楼层对应的房源供应数量大致相等,都在7000多套左右;

房源较多的地区为浦东区、闵行区、松江区和徐汇区。

链家租房市场分析(R爬虫、数据可视化)-编程知识网

缺失值处理
查看数据集中缺失值的数量:
缺失值为0,不需要对数据集进行缺失值处理。

链家租房市场分析(R爬虫、数据可视化)-编程知识网

租金、面积、户型的数据可视化

1.上海不同地区的租房数量

#加载包
library(dplyr)
library(ggplot2)#各区住房数量
freq <- data.frame(table(house$plc1))
plot <- ggplot(data = freq, mapping = aes(x = reorder(Var1, -Freq),y = Freq)) + geom_bar(stat = 'identity', fill = 'lightcoral') + theme(axis.text.x  = element_text(angle = 45, vjust = 0.5)) + xlab('地区') + ylab('套数')+ coord_flip()
plot

链家租房市场分析(R爬虫、数据可视化)-编程知识网

从图中可以看出,浦东新、闵行、松江的租房供应量比较大,这几个地方大多属于上海郊区,地处偏远;静安区、黄浦区等中心地区房源相对而言较少。
也许是因为郊区的区域面积要大得多,也许人们出于价格方面的考虑,总之郊区的租房房源有比较大的需求市场。

数据中金山区和崇明区的数据严重不足,不具有代表性,因此删除这两个区的数据。

#数量太少
house <- house[house$plc1!="金山",]
house <- house[house$plc1!="崇明",]

2.各区人均租房均价

house$pricePerPerson <- round(house$price / house$num_person)# 人均房租 = 租金 / 房间数
house %>% group_by(plc1) %>% summarise(avePrice= mean(pricePerPerson)) %>%ggplot( aes(x = reorder(plc1,avePrice), y = avePrice)) + geom_bar(stat="identity", fill = "lightcoral") +labs(title="上海市各区人均租房均价", x="地区", y = "人均价格(元)") + coord_flip()

链家租房市场分析(R爬虫、数据可视化)-编程知识网
从租房的人均价格上来看,静安区、黄浦区的租房人均价格最高,作为租房者,即使选择最便宜的合租的方式,也需要花费将近8000元用于租房。
另一点是,城区的房租人均价格基本都在4000元以上,而郊区房租人均价格普遍在4000元以下。如果打算在租房上花费两三千元,那么就不得不忍受距离上的劣势。

3. 各个地区平均租房面积

house %>% group_by(plc1) %>% summarise(aveArea= mean(area)) %>%ggplot( aes(x = reorder(plc1,aveArea), y = aveArea)) + geom_bar(stat="identity", fill = "lightcoral") +labs(title="上海市各区租房平均面积", x="地区", y = "面积(㎡)") + coord_flip()

链家租房市场分析(R爬虫、数据可视化)-编程知识网

除青浦区外,其余地区的租房平均面积差别不大,都在80㎡到120㎡之间。青浦区的平均面积则多达170㎡,也没有出现离群值,原因具体不详 ╮(╯▽╰)╭

4.面积和价格的关系图

#面积和价格的散点图
plot(house$area,house$price)
abline(lm(house$price~house$area))

链家租房市场分析(R爬虫、数据可视化)-编程知识网

总体来看,租金与房子面积成正相关,大的房子租金会相应贵很多。

5. 户型

#户型分布
house$huxing <- as.character(house$huxing)
freq <- data.frame(table(house$huxing))
plot <- ggplot(data = freq, mapping = aes(x = reorder(Var1, -Freq),y = Freq)) + geom_bar(stat = 'identity', fill = 'lightcoral') + theme(axis.text.x  = element_text(angle = 45, vjust = 0.5)) + xlab('户型') + ylab('数量')
plot

链家租房市场分析(R爬虫、数据可视化)-编程知识网

从图片上来看,户型的种类非常多,但是相当多户型的数量比较少,数据呈现长尾特征,我们可以将数量较多的类别拎出来,将剩余数量较少的类别归为“其他”。

#对户型进行数量由多到少的排序
type <- arrange(type_freq,-type_freq[,2])
View(type)
name<- c('2室1厅1卫','1室1厅1卫','2室2厅1卫','3室2厅2卫','3室2厅1卫','4室2厅3卫','2室2厅2卫','3室1厅1卫','1室0厅1卫','4室2厅2卫')#数量较多的几项
#将数量过少的归为其他
house$huxing2 <- ifelse(house$huxing %in% name, house$huxing,'其他')
freq2 <- data.frame(table(house$huxing2))
plot2 <- ggplot(data = freq2, mapping = aes(x = reorder(Var1, Freq),y = Freq)) + geom_bar(stat = 'identity', fill = 'lightcoral') + theme(axis.text.x  = element_text(angle = 45, vjust = 0.5)) + xlab('户型') + ylab('套数')+coord_flip()
plot2

链家租房市场分析(R爬虫、数据可视化)-编程知识网
(“其他”这一类中包含的户型大多是大户型,房间数量较多)

从户型的数量上来看,1居室/2居室/3居室的房源较多,适合一个人住或者2-3个人合租,对租房有一定品质要求的人来说,不失为一种好的选择。

户型性价比
对于想要租房的人来说,合租是一种比较好的方式。那么对于想要合租的人来说,究竟哪一种户型的房子比较划算呢?

#合租:各户型性价比
house %>% group_by(huxing2) %>% summarise(avePc= mean(pricePerPerson)) %>%ggplot( aes(x = reorder(huxing2,avePc), y = avePc)) + geom_bar(stat="identity", fill = "lightcoral") +labs(title="上海市合租各房源户型的人均价格", x="地区", y = "人均价格(元)") + coord_flip()

链家租房市场分析(R爬虫、数据可视化)-编程知识网

如果不考虑其他因素,从图片上来看,3室1厅1卫是性价比最高的户型,三人合租的话人均价格不超过2000元;
2室2厅2卫则是最“奢侈”的合租选择,人均价格超过6000元;
“其他”(户型的房间数较多)的性价比也很低,说明并不是房子越大、可居住人数越多,合租的性价比越高。

结论

通过数据爬曲和数据的初步探索,我们解决了前文提出的5个问题,剩下如何将房源进行分类、如何探究影响房价的可能性因素这两个问题,将在下一篇文章中写。

本文结论包括:

  1. 浦东、松江等郊区房源供应数量远远大于上海市中心地区;
  2. 房源朝向大多朝南,低楼层、中楼层、高楼层的房子数量差不多;
  3. 如果按每人1居室来算,上海市人均租房均价为4030元,城区各区的租房人均平均价格都高于4000元,郊区各区的租房人均平均价格都低于4000元;
  4. 各地区租房平均面积差不多,均为80-120㎡,但不同的房子面积差别很大,最大的将近2000㎡,最小只有8㎡;
  5. 房租价格和面积成正比,房子越大、租金越贵;
  6. 1居室/2居室/3居室的房源较多,性价比最高的户型是3居室的房子。