東莞二手房數據分析

版本信息:R3.4;          操作時間:2017年9月

之前在公衆號號看到一篇某地二手房數據爬取分析的帖子,有感而發,正好項目地在東莞,也做了一個東莞二手房數據爬取及分析的帖子。(後附代碼)


數據獲取

通過百度‘東莞二手房’,直接查看前面的‘安居客’的東莞二手房售賣網站。


通過查看網也結構,‘安居客’網頁爲靜態網頁,且其翻頁地址變動具有穩健規律。故可以簡單的獲取到網頁數據。


我主要抓取了一級頁面的這些信息,我覺得用來練手這些數據足夠了,還有一個原因就是業務上沒啥深度的理解創造需求:


但是在爬取中也發現幾個問題:

  • 安居客網頁售房信息只有50頁,但其內容有較高的更新率,所以我採取隔天爬取爬取了好幾天的數據,最後合併去重得到最終數據。這樣做的好處是可以獲取儘量多的數據,壞處是爬取頻率過高,激活網頁反扒終糟IP拉黑(悲傷ing)
  • 網頁內容標籤結構不完整,結構不是絕對整齊的,所以需要直接爬取大標籤內容,然後二次清洗

最終我們獲得了16995條有效數據,如此大量的數據得益於我們不怕封IP的多次抓取(其實我的IP真的被封了【哭】)。




文本分析

在描述數據之前,突發奇想的想看看各位‘地主房東’都是怎麼描述自己房屋的,也就是售賣信息的標題(我認爲售賣信息的標題必然要包含房屋的賣點,同樣也可以反映出市場的需求點)。所以先一步給‘房屋描述’做個文本分析。

單獨拿出房屋描述列,因爲每一條比較短,切關鍵詞重複出現的情況比較少,所以並沒有通過分詞創造矩陣,直接雜糅出了分詞結果:


然後把結果整理一下,順便去掉了單字的分詞:(去掉單個字的詞,提煉詞頻,共有8518個詞,最多出現4662次,最少出現1次。

以爲寫個精裝我就會相信!

做個詞雲展示一下房東售賣信息的關鍵詞,包括報告開始的那個詞雲也是成果之一:


從詞雲和詞頻表中,我們可以簡單的總結出:

  • 房東售賣房屋的關鍵詞彙總一下(或者說市場需求的潮流):房屋精裝、家電齊全、花園洋房、南北通透採光要好、視野開闊、陽臺寬大,地鐵口、交通便利等等硬條件。還得帶上,價格合理,誠心急售!
  • 詞頻在200左右的範圍裏提到了:品質、時尚、高端、生態、經典等關鍵詞,說明隨着房屋檔次的上升,房屋售賣的關鍵詞也越來越注重檔次。又如詞頻在70左右的範圍裏談到 :設計、山湖、優雅、幸福、 健怡、養生等關鍵詞。說明土豪還是比較注重精神層面的享受。


數據描述

簡單將數據集清洗一下,得到若干字段,接下來我們依託這幾個字段看看它們相互關係和自身分佈表達什麼信息


1.各地區的房源

總體看,還是中心城區的房源數量最多,但是東南組團也是比較多房源,是新經濟槓點嗎?尤其是鳳崗、塘廈、樟木頭。至於項目的相關地:東城區,更是數量位居第二,僅次於南城區,勢頭迅猛!

2.各戶型

  • 三室兩廳’的房型數9738,超過一半,東莞人民對三室兩廳的房型熱情是偏執的,狂熱的!
  • 3室2廳平均單價爲15646.09元/m2;3室2廳平均面積爲102.90799m2;
  • 東莞人民不光在住房認知上看法是驚人一致的,而且東莞人民還很有錢(東莞人民有錢這件事,這纔是開始,噓!)

3.熱門區域

我從數據裏取了前30個熱門的二手房源地,大家有興趣買房,可以考慮先去這些地方看看。比如西平、官井頭地區的房源最多,可以結合情況優先參考。

4.面積和樓層


  1. 低層別墅的數量多於小戶,大部分人喜歡中層中戶,東莞人民很有錢2.0!(這裏的底、高層之分是依據原本數據裏標註的提取,故存在30層的中層和15層的高層這樣的侷限性。So,這裏無法做深入說明。)
  2. 表中看出,大中小戶佔比差別其實不大,但是之前我們得出三室兩廳佔比超一半,所以,東莞人民對 三室兩廳的感情,誇張到什麼程度了!!!(95m2以下標記爲小戶;95m2至120m2的標記爲中戶;120m2以上的標識爲大戶;(僅憑經驗人爲分組,卻乏業務理解))

5.房齡關於地區


  1. 後來的纔是正常發展速度,中間有幾年東莞就像做夢一樣跳躍式發展,結果後續又跳躍下降,其實結合新聞,我們知道那幾年東莞繁華過後正逢某事件整頓,經濟一片蕭條,雖然有了復甦的勢頭,但是相比之前倒是有所差距。
  2. 各區的新建房數量都同比下降,沒有出現特別明顯的新增長點。(其實我更想知道這拉了數據的1900年代的房子是什麼樣子)

6.房齡關於戶型

  • 新建的房子在減少,但是,東莞人民對 三室兩廳 的狂熱追求並沒有停止!相比於三室兩廳、一廳、三廳的房子,東莞人民對其他房型的追求可比稱之爲冷淡。

7.房價

  • 這單價,進2萬的大衆水平,和北京昌平區有的一拼了,這得多有錢,富有的東莞人民3.0!

  • 單價那麼高,總價也就不說什麼了,但是在數據裏出現了高達5000萬的房子,等會要瞄一眼數據5000萬的豪宅什麼樣。

8.地區房價

順便瞄一眼各地區的總價和單價,這裏對y軸上限做了限制,爲了更好觀察大衆水平。


  • 在房屋總價上面,大衆數值除了南城、松山湖地區明顯偏高以爲,其他地區都較爲穩定。

  • 在單價分佈上各地區波動較爲明顯,尤其是松山湖(又是松山湖)地區,毋庸置疑,松山湖地區就是東莞的土豪雲集地,高端層次人士居住地。

9.豪宅

最後,我們瞄一眼原始數據裏,那些房價超過3000萬的房子,爲什麼是三千萬,因爲3000萬相當於清朝中期20萬兩白銀,當時買個地方官員最高到道臺,相當於現在的副省長,而價格四品道臺要16400兩,知府也就是市長要13300兩,縣長要9600兩。房子賣了就是一方諸侯。


數量不多,但是很驚豔,首先不出所料,不少是松山湖地區的。其次,和想象中一樣,該大的大,該貴的貴,看不下去了!



馬上結束了

簡單總結一下:

  1. 東莞人民對三室兩廳的戶型有一種狂熱的需求,尤其是中層的三室兩廳。
  2. 松山湖地區是東莞的土豪區。
  3. 儘管經濟發展受挫了,恢復纔剛開始,但是不能掩蓋東莞人民很有錢的事實。非常有錢!
  4. 房東售賣房屋的關鍵詞彙總一下(或者說市場需求的潮流):房屋精裝、家電齊全、花園洋房、南北通透採光要好、視野開闊、陽臺寬大,地鐵口、交通便利等等硬條件。還得帶上,價格合理,誠心急售!

寫在最後

本篇報告完全有感而發,起嚴謹性上,包括有些結論都完全依託數據,有一定侷限性。




代碼

library(rvest)
library(xml2)
library(stringr)
library(dplyr)

house <- data.frame()
for(i in 1:50){
gurl<- str_c("https://dg.anjuke.com/sale/p",i,"/?pi=baidu-cpc-dg-tyongdg2-all&kwid=4279453665&utm_term=%E4%B8%9C%E8%8E%9E%E6%88%BF%E4%BB%B7%E8%B5%B0%E5%8A%BF%E5%9B%BE#filtersort")

tmp <- gurl%>%read_html(encoding = "UTF-8")%>%html_nodes(".list-item")#固定父級標籤部分
house_name <- tmp%>%html_nodes(".houseListTitle")%>%html_attr("title")#名稱,不知道什麼用,先爬下來
house_address <- tmp%>%html_nodes(".comm-address")%>%html_attr("title")#房子地址
house_price <- tmp%>%html_nodes(".price-det")%>%html_nodes("strong")%>%html_text()#價格
house_price2 <- tmp%>%html_nodes(".pro-price")%>%html_nodes(".unit-price")%>%html_text()
house_point <- tmp%>%html_nodes(".house-title+ .details-item")%>%html_text()
house_label <- tmp%>%html_nodes(".tags-bottom")%>%html_text()
houseall <- data.frame(house_name,house_address,house_price,house_price2,house_point,house_label)
house <- rbind(house, houseall)
}
write.csv(house, file="house8.csv", row.names = T, fileEncoding = "UTF-8")
#前後共爬了8次,導致ip被拉黑了
################################洗礦########################
house2 <- read.csv(file = "house2.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house3 <- read.csv(file = "house3.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house4 <- read.csv(file = "house4.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house5 <- read.csv(file = "house5.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house6 <- read.csv(file = "house6.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house7 <- read.csv(file = "house7.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
house8 <- read.csv(file = "house8.csv",fileEncoding = "UTF-8", stringsAsFactors=F)

housex <- rbind(house2,house3,house4,house5,house6,house7,house8)#合併一下
write.csv(housex, file="housex.csv", row.names = T, fileEncoding = "UTF-8")#以防意外,還是寫出一下

names(housex)
housex2 <-  housex[,-1]#去掉唯一標識列
housex2 <- unique.data.frame(housex2)#神級函數,一鍵到位
rm(house1,house2,house3,house4,house5,house6,house7,house8,houseall,house)#釋放內存
rm(zzz, housex)#再釋放一下

library(stringr)
library(splitstackshape)
#head(housex2$house_name)
housex3 <- concat.split.multiple(housex2, "house_address", "<U+00A0><U+00A0>")
housex3 <- concat.split.multiple(housex3, "house_address_2", "-")
housex3 <- concat.split.multiple(housex3, "house_point", "|")
housex3 <- concat.split.multiple(housex3, "house_point_4", " ")

housex3$house_price2<- as.numeric(sub(pattern = "元/m2", "", housex3$house_price2, perl= TRUE))
housex3$`area(m2)` <- as.numeric(sub(pattern = "m2", "", housex3$`area(m2)`, perl= TRUE))#這裏學到一個叼的
#head(housex3$area(m2))
housex3$house_label <- gsub(pattern = "\\s", "", housex3$house_label, perl= TRUE)#去掉label字段多餘符號
colnames(housex3)[c(10,11,12,13)] <- c("type","area(m2)", "high", "year")#重命名
colnames(housex3)[3] <- "price(y/m2)"

##########################################粗煉################################
housex3$year <- substr(housex3$year,1,4)#提取年份
housex3$area_fz <- ifelse(housex3$`area(m2)` < 95, "小戶", ifelse(housex3$`area(m2)` >= 120, "大戶", "中戶"))
housex3$high_fz <- ifelse(substr(housex3$high,1,2) == "高層", "高層",ifelse(substr(housex3$high,1,2) == "中層", "中層", "低層"))

##################因子轉換
varname <- c("house_address_1","house_address_2_1","house_address_2_2","house_address_2_3","house_address_2_4","type","area_fz","high_fz")
for(i in varname){
  housex3[,i] <- as.factor(housex3[,i])
}
housex3$city <- ifelse(housex3$house_address_2_1 =="莞城"|housex3$house_address_2_1 =="南城"|housex3$house_address_2_1 =="東城"|housex3$house_address_2_1 =="茶山"|housex3$house_address_2_1 =="寮步"|housex3$house_address_2_1 =="大嶺山"|housex3$house_address_2_1 =="大朗"|housex3$house_address_2_1 =="松山湖","中心組團",
                       ifelse(housex3$house_address_2_1 =="常平"|housex3$house_address_2_1 =="橫瀝"|housex3$house_address_2_1 =="東坑"|housex3$house_address_2_1 =="石排"|housex3$house_address_2_1 =="企石"|housex3$house_address_2_1 =="橋頭"|housex3$house_address_2_1 =="謝崗", "東北組團", 
                              ifelse(housex3$house_address_2_1 =="塘廈"|housex3$house_address_2_1 =="樟木頭"|housex3$house_address_2_1 =="清溪"|housex3$house_address_2_1 =="黃江"|housex3$house_address_2_1 =="鳳崗", "東南組團", 
                                     ifelse(housex3$house_address_2_1 =="萬江"|housex3$house_address_2_1 =="高埗"|housex3$house_address_2_1 =="石碣"|housex3$house_address_2_1 =="石龍"|housex3$house_address_2_1 =="麻涌"|housex3$house_address_2_1 =="中堂"|housex3$house_address_2_1 =="望牛墩"|housex3$house_address_2_1 =="洪梅"|housex3$house_address_2_1 =="道滘", "西北組團","西南組團"))))
################################
#housex <- read.csv(file = "housex.csv",fileEncoding = "UTF-8", stringsAsFactors=F)
#洗不動了,先這樣吧
write.csv(housex3, file="housex3.csv", row.names = F, fileEncoding = "UTF-8")#寫出這個數據集
#####################################################################
#####################################################################
#####################################詞雲來一波################################
library(jiebaR)
library(wordcloud2)

house_name <- housex3$house_name
house_name <- unlist(house_name)
class(house_name)
#head(house_name)

wk <- worker()#其實這一步,哎,都是l淚
#dir()

segname <-  segment(house_name, wk)#出現分詞結果
segnamem <- segname[nchar(segname)>1]##停詞字典不能用,直接粗暴的刪掉一個字的
keyname <- data.frame(sort(table(segnamem), decreasing = T))#給出詞頻表
keynamepro <- keyname[keyname$Freq >1,]#詞太多了,取一半
keynamepro2 <- keynamepro[1:1000,]#還是太多,取8分之一
write.csv(keynamepro2, file="keynamepro2.csv", row.names = F, fileEncoding = "UTF-8")#寫出文件是個好習慣
wordcloud2(keyname, size = 1, figPath = "house2.png", color = "random-dark")#找一張酷炫的圖


#這裏寫個小節
#東莞,或者大部分地區售房,先要吹噓自己的房屋精裝修,家電齊全,,其實都那樣,買房嘛,花園洋房,南北通透採光要好,
#視野開闊,陽臺寬大,地鐵口,交通便利等等硬條件,還得帶上,價格合理,誠心急售
#200多個說到   品質,時尚,高端,生態,經典,
#70多談到 設計,山湖, 優雅,幸福, 健怡, 養生
#######################################################################
##################################ggplot2#########################################
housex3 <- read.csv(file = "housex3.csv",fileEncoding = "UTF-8", stringsAsFactors=F)#這種活還是要一氣呵成,辛苦把數據集寫出了,好習慣
str(housex3)#這裏看看變量屬性,重新定義一下。真是5000行報錯煉神,醉了

library(ggplot2)
###################先來看看東莞各區域的房源
paddress <- ggplot(data = housex3, aes(house_address_2_1))
paddress + geom_bar(aes(fill= city))+
      labs(x=NULL, y="待售房", title="東莞各區二手房庫存") +
  theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=15))+ theme_bw()

#table(housex3$house_address_2_1,housex3$city)
#theme(axis.text.y= element_text(size=15, family="myFont", color="black", face= "bold", vjust=0.5, hjust=0.5))
##可以明顯的看到,南城、東城、鳳崗地區的房源明顯居多,而在組團區分上,
##明顯是中心組團地區和東南組團地區的房源較多,東南組團地區地處郊區,城區面積大,人少可以理解。
##但是,這中心組團爲市中心,這麼多二手房源,可以細思一下


#################再看看各房型
toptype <- sort(table(housex3$type),decreasing=T)[1:15]
ttype <- data.frame(toptype)
ttype$type <- rownames(ttype)
 
ptype <- ggplot(data = ttype ,aes(x=reorder(Var1,sort(Freq)), y=Freq))#這裏一點要吐槽一下趙同學,智商低的一批

ptype + geom_col(aes(fill="red"))+ theme_bw() + geom_text(label=ttype$Freq)+
  labs(x=NULL, y="待售房", title="各房型受衆熱度") +
  theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=10))
#三室兩廳的房型數9738,超過一半,東莞人民對三室兩廳的房型熱愛是偏執的,狂熱的,

 typeprice <-  aggregate(housex3$price.y.m2.,by=list(housex3$type),mean)
#而 3室2廳 平均單價爲 15646.09元/m2,
 typearea <-  aggregate(housex3$area.m2.,by=list(housex3$type),mean)
 #而 3室2廳 平均面積爲  102.90799m2
 #so, 東莞人在住房認知上看法還是驚人的一致另外,東莞還是有錢人多,好吧,地球還是有錢人多
 
 #########################看看各面積分布
 ggplot(housex3, aes(x=factor(1),fill= area_fz))+geom_bar(width=1)+coord_polar(theta = "y")
 #各種戶型佔比差不多,應該跟我的閾值設置有關係,但是結合之前的結論,
 
#type3_2 <- housex3[which(housex3$type=="3室2廳"),]    
 ##############################二手房地點分佈
 addresstop15 <- sort(table(housex3$house_address_2_2),decreasing=T)[1:30]
 addresstop15 <- data.frame(addresstop15)
 addresstop15$addr<- rownames(addresstop15)
 

 ptype <- ggplot(data = addresstop15 ,aes(x=reorder(Var1,sort(Freq)), y=Freq))#這裏一點要吐槽一下趙同學,智商低的一批
 ptype + geom_col(aes(fill= "red"))+
   labs(x=NULL, y="待售房", title="各地區房屋數量") + theme_bw() +
   geom_text(aes(label=addresstop15$Freq),  position = position_dodge(0.9), vjust = 0) + 
   theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=10))
 
 ###############################################各樓層分佈
 
 paddress <- ggplot(data = housex3, aes(high_fz))
 paddress + geom_bar(aes( fill= area_fz))+
   labs(x=NULL, y="待售房", title="樓層分佈") 
   #theme(axis.text.x = element_text(angle = 60, vjust = 0.5, size=15))
 
 #############################################房齡分佈
 ggplot(housex3,aes(year))+geom_bar(aes(fill=type))+
   theme_bw() + xlim(1990, 2017) + 
   labs(x=NULL, y="待售房", title="房齡分佈")#房齡和放型的關係
 
 ggplot(housex3,aes(year))+geom_bar(aes(fill=city))+
   theme_bw() + xlim(1990, 2017) + 
   labs(x=NULL, y="待售房", title="房齡分佈")#房齡關於地區的關係 
 
 
 ########################################二手房總價和單價分佈:
 ggplot(housex3,aes(price.y.m2.))+geom_histogram(aes(fill="red")) + theme_bw() +
       labs(x="房屋單價", y="待售房", title="房屋單價分佈")    #單價分佈

  ggplot(housex3,aes(house_price))+geom_histogram(aes(fill="red")) + theme_bw() +
    labs(x="房屋總價", y="待售房", title="房屋總價分佈") #總價分佈

YQ <-  housex3[which(housex3$house_price > 3000),]
names(YQ)
YQ1 <- YQ[,-c(7,8,9)] #豪宅
 ##############################################
##############################各區細況###############
 #################各區的均價#######################

avgprice <-  aggregate(housex3$price.y.m2.,by=list(housex3$house_address_2_1),mean)
colnames(avgprice)[2] <- "value"

#############箱線圖
tb<-ggplot(housex3,aes(house_address_2_1,house_price))
tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ ylim(0,2000) + 
  theme_bw() +labs(x=NULL, y=NULL, title="房屋總價分佈") #總價


tb<-ggplot(housex3,aes(house_address_2_1,price.y.m2.))
tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ylim(5000,100000)+
  theme_bw() + labs(x=NULL, y=NULL, title="房屋單價分佈")  #單價

tb<-ggplot(housex3,aes(city,price.y.m2.))
tb+geom_boxplot(outlier.colour="darkgreen",fill="grey80")+ylim(5000,100000)#單價


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章