0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python爬取趕集網(wǎng)北京二手房數(shù)據(jù)&R對爬取的二手房房價做線性回歸分析

電子工程師 ? 來源:lq ? 2019-02-27 09:49 ? 次閱讀

前言:本文主要分為兩部分:Python爬取趕集網(wǎng)北京二手房數(shù)據(jù)&R對爬取的二手房房價做線性回歸分析。文章思路清晰,代碼詳細,特別適合剛剛接觸Python&R的同學(xué)學(xué)習(xí)參考。

Part1:Python爬取趕集網(wǎng)北京二手房數(shù)據(jù)

入門爬蟲一個月,所以對每一個網(wǎng)站都使用Xpath、Beautiful Soup、正則三種方法分別爬取,用于練習(xí)鞏固。數(shù)據(jù)來源如下:

本文使用Beautiful Soup講解。

Xpath傳送門:Xpath+requests爬取趕集網(wǎng)北京二手房數(shù)據(jù)

import requestsimport refrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoupimport csvimport timeheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}def get_one_page(url): try: response = requests.get(url,headers = headers) if response.status_code == 200: return response.text return None except RequestException: return Nonedef parse_one_page(content): try: soup = BeautifulSoup(content,'html.parser') items = soup.find('div',class_=re.compile('js-tips-list')) for div in items.find_all('div',class_=re.compile('ershoufang-list')): yield { 'Name':div.find('a',class_=re.compile('js-title')).text, 'Type': div.find('dd', class_=re.compile('size')).contents[1].text,#tag的 .contents 屬性可以將tag的子節(jié)點以列表的方式輸出 'Area':div.find('dd',class_=re.compile('size')).contents[5].text, 'Towards':div.find('dd',class_=re.compile('size')).contents[9].text, 'Floor':div.find('dd',class_=re.compile('size')).contents[13].text.replace(' ',''), 'Decorate':div.find('dd',class_=re.compile('size')).contents[17].text, 'Address':div.find('span',class_=re.compile('area')).text.strip().replace(' ','').replace(' ',''), 'TotalPrice':div.find('span',class_=re.compile('js-price')).text+div.find('span',class_=re.compile('yue')).text, 'Price':div.find('div',class_=re.compile('time')).text } #有一些二手房信息缺少部分信息,如:缺少裝修信息,或者缺少樓層信息,這時候需要加個判斷,不然爬取就會中斷。 if div['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price'] == None: return None except Exception: return Nonedef main(): for i in range(1,50): url = 'http://bj.ganji.com/fang5/o{}/'.format(i) content = get_one_page(url) print('第{}頁抓取完畢'.format(i)) for div in parse_one_page(content): print(div) with open('Data.csv', 'a', newline='') as f: # Data.csv 文件存儲的路徑,如果默認路徑就直接寫文件名即可。 fieldnames = ['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() for item in parse_one_page(content): writer.writerow(item) time.sleep(3)#設(shè)置爬取頻率,一開始我就是爬取的太猛,導(dǎo)致網(wǎng)頁需要驗證。if __name__=='__main__': main()

對于小白容易遇見的一些問題:

a、有一些房屋缺少部分信息,如缺少裝修信息,這個時候需要加一個判斷,如果不加判斷,爬取就會自動終止。我在這里跌了很大的坑。

b、Data.csv知識點存儲文件路徑默認是工作目錄,關(guān)于工作目錄傳送門:python中如何查看工作目錄

c、爬蟲打印的是字典形式,每一個房屋信息都是一個字典,由于對Python中excel相關(guān)庫是我知識盲點,所以爬蟲的時候?qū)⒆值溲h(huán)直接寫入CSV。

pycharm中打印如下:

圖一

將字典循環(huán)直接寫入CSV效果如下:

圖二

d、很多初學(xué)者對于Address這種不知道如何處理,這里強調(diào)一下Beautiful Soup 中.contents的用法,親身體會,我在這里花了好多時間才找到答案。

圖三

Part2:R對爬取的二手房房價做一般線性回歸分析

下面我們用R對抓取的趕集網(wǎng)北京二手房數(shù)據(jù)做一些簡單的分析。

2.1、數(shù)據(jù)的說明

Name:主要是商家的醒目標(biāo)題,分析的時候沒有啥參考意義

Type:臥室數(shù)、客廳數(shù)、衛(wèi)生間數(shù)

Area:面積(平方米)

Towards:朝向

Floor:樓層

Decorate:裝修情況如:精裝修、簡單裝修、毛坯房

Address:二手房的地址

TotalPrice:總價

Price:均價(元/平方米)

2.2、數(shù)據(jù)清洗

data<-read.csv("E://Data For R/RData/data.csv")DATA<-data[,-c(1,7)]#將Name和Address兩列去掉DATA[sample(1:nrow(DATA),size=10),]

圖四

#在爬取的時候加入了判斷,所以不知道爬取的數(shù)據(jù)中是否存在缺失值,這里檢查一下colSums(is.na(DATA))

圖五

#這里將Type的臥室客廳和衛(wèi)生間分為三個不同的列##這里需要注意,有一些房屋沒有客廳如:1室1衛(wèi)這時候需要單獨處理,還有一些沒有廁所信息。library(tidyr)DATA=separate(data=DATA,col=Type,into = c("Bedrooms","Halls"),sep="室")DATA=separate(data=DATA,col=Halls,into = c("Halls","Toilet"),sep="廳")##將衛(wèi)生間后面的漢字去掉DATA$Toilet<-str_replace(DATA$Toilet,"衛(wèi)","")###如圖六,將Halls中帶有漢字去掉,因為有一些房屋信息沒有客廳,如:1室1廳,在分成臥室和客廳時,會將衛(wèi)生間分到客廳一列。DATA$Halls<-str_replace(DATA$Halls,"衛(wèi)","")##取出沒有客廳信息的數(shù)據(jù),這些數(shù)據(jù)被separate到Halls列newdata<-DATA[which(DATA$Toilet %in% NA),2]newdata##將沒有客廳的房屋信息Halls列填充為0DATA[which(DATA$Toilet %in% NA),2]<-0DATA[which(DATA$Toilet %in% NA),3]<-newdatacolSums(DATA=="") ?Bedrooms ? ? ?Halls ? ? Toilet ? ? ? Area ? ?Towards ? ? ?Floor ? Decorate ? ? ? ? 0 ? ? ? ? ?0 ? ? ? ? ?2 ? ? ? ? ?0 ? ? ? ? ?0 ? ? ? ? ?0 ? ? ? ? ?0 TotalPrice ? ? ?Price ? ? ? ? 0 ? ? ? ? ?0 ##發(fā)現(xiàn)有2個廁所沒有信息,將其填寫為0。DATA$Toilet[DATA$Toilet == ""]<-0

圖六

##這里將Area后的㎡去掉DATA$Area<-str_replace(DATA$Area,"㎡","")##查看Towards的類型table(DATA$Towards)Towards ? ?北向 ?東北向 ?東南向 ?東西向 ? ?東向 ?南北向 ? ?南向 ?西北向 ? ? 51 ? ? ?25 ? ? ?23 ? ? ?50 ? ? ?65 ? ? ?32 ? ?1901 ? ? 678 ? ? ?38 西南向 ? ?西向 ? ? 28 ? ? ?26 ##將Floor信息帶括號的全部去除DATA$Floor<-str_replace(DATA$Floor,"[(].*[)]","")##正則表達式#查看Floor的類別信息 低層 ?地下 ?高層 共1層 共2層 共3層 共4層 共5層 ?中層 ?632 ? ?32 ? 790 ? ?36 ? ?61 ? 101 ? ?68 ? 130 ?1016 #分別將TotalPrice和Price后面的萬元、元/㎡去掉DATA$TotalPrice<-str_replace(DATA$TotalPrice,"萬元","")DATA$Price<-str_replace(DATA$Price,"元/㎡","")head(DATA)

圖七

##將數(shù)據(jù)轉(zhuǎn)換格式DATA$Bedrooms<-as.factor(DATA$Bedrooms)DATA$Halls<-as.factor(DATA$Halls)DATA$Toilet<-as.factor(DATA$Toilet)DATA$Area<-as.numeric(DATA$Area)DATA$TotalPrice<-as.numeric(DATA$TotalPrice)DATA$Price<-as.numeric(DATA$Price)DATA$Towards<-as.factor(DATA$Towards)DATA$Decorate<-as.factor(DATA$Decorate)str(DATA)

圖八

以上數(shù)據(jù)清洗完畢。

Part3:描述性分析

主要思路是探究單個自變量對因變量的影響,對房價的影響因素進行模擬探究之前,首先對各變量進行描述性分析,已初步判斷房價的影響因素。這里探究各個因素對總價影響。

3.1探究Bedrooms與TotalPrice的關(guān)系

table(DATA$Bedrooms) 1 2 3 4 5 6 7 9 541 1225 779 193 102 20 5 1 ##由于擁有6、7、9個臥室數(shù)的數(shù)量較少,這里我們排出這些數(shù)據(jù)。DATA<-DATA[-(which(DATA$Bedrooms %in% "6")),]DATA<-DATA[-(which(DATA$Bedrooms %in% "7")),]DATA<-DATA[-(which(DATA$Bedrooms %in% "9")),]table(DATA$Bedrooms) ? 1 ? ?2 ? ?3 ? ?4 ? ?5 541 1225 ?779 ?193 ?102 library(ggplot2)ggplot(DATA,aes(x=Bedrooms,y=TotalPrice))+geom_boxplot(col="red")

圖九

DATA$Bedrooms<-as.numeric(DATA$Bedrooms)##這里將臥室數(shù)為1、2、3命名為A,4為B,5為CDATA$Bedrooms[DATA$Bedrooms=='1']<-"A"DATA$Bedrooms[DATA$Bedrooms=='2']<-"A"DATA$Bedrooms[DATA$Bedrooms=='3']<-"A"DATA$Bedrooms[DATA$Bedrooms=='4']<-"B"DATA$Bedrooms[DATA$Bedrooms=='5']<-"C"

不同臥室數(shù),TotalPrice不同,且隨著臥室數(shù)的增多,總價越高,符合大眾的認知。

3.2探究Halls與TotalPrice的關(guān)系

table(DATA$Halls) 0 1 2 3 4 5 9 20 1674 1050 77 18 1 0 ##5個客廳只有一個個體,我們這里將其排出DATA<-DATA[-(which(DATA$Halls %in% "5")),]table(DATA$Halls) ? 0 ? ?1 ? ?2 ? ?3 ? ?4 ? ?5 ? ?9 ?20 1674 1050 ? 77 ? 18 ? ?0 ? ?0 ggplot(DATA,aes(x=Halls,y=TotalPrice))+geom_boxplot(col="red")

圖十

客廳數(shù)為3時候總價最高,客廳數(shù)為0、1和2的時候總價低于客廳數(shù)3和客廳數(shù)4。

3.3探究Toilet與TotalPrice的關(guān)系

#探究衛(wèi)生間與總價的關(guān)系table(DATA$Toilet) 0 1 2 3 4 5 6 7 9 2 2142 470 116 74 26 7 2 0 #這里將衛(wèi)生間數(shù)為0、6和7的去掉DATA<-DATA[-(which(DATA$Toilet %in% "0")),]DATA<-DATA[-(which(DATA$Toilet %in% "6")),]DATA<-DATA[-(which(DATA$Toilet %in% "7")),]table(DATA$Toilet) ? 0 ? ?1 ? ?2 ? ?3 ? ?4 ? ?5 ? ?6 ? ?7 ? ?9 ? 0 2142 ?470 ?116 ? 74 ? 26 ? ?0 ? ?0 ? ?0 ggplot(DATA,aes(x=Toilet,y=TotalPrice))+geom_boxplot(col="red")

圖十一

一般臥室數(shù)越多,衛(wèi)生間數(shù)也越多,即衛(wèi)生間數(shù)越多,總價越高。

3.4探究Area與TotalPrice的關(guān)系

ggplot(DATA, aes(x=Area, y=TotalPrice)) + geom_point(col='red')

圖十二

這個完全符合住房面積越大,總價越高。

3.5探究Towards與TotalPrice的關(guān)系

ggplot(DATA,aes(x=Towards,y=TotalPrice))+geom_boxplot(col="red")

圖十三

3.6探究Floor與TotalPrice的關(guān)系

ggplot(DATA,aes(x=Floor,y=TotalPrice))+geom_boxplot(col="red")

圖十四

圖中信息顯示樓層一共只有1、2、3、地下的總價較高。

3.7探究Decorate與TotalPrice的關(guān)系

ggplot(DATA,aes(x=Decorate,y=TotalPrice))+geom_boxplot(col="red")

圖十五

不同裝修信息對總價影響較小。

Part4:模型建立

fit <-lm(TotalPrice~Bedrooms+Halls+Toilet+Area+Towards+Floor+Decorate,data=DATA)summary(fit)Call:lm(formula = TotalPrice ~ Bedrooms + Halls + Toilet + Area + ? ?Towards + Floor + Decorate, data = DATA)Residuals: ? ? Min ? ? ? 1Q ? Median ? ? ? 3Q ? ? ?Max -1330.80 ?-103.49 ? -21.41 ? ?63.88 ?2961.59 Coefficients: ? ? ? ? ? ? ? ? ?Estimate Std. Error t value Pr(>|t|) (Intercept) -112.7633 88.3010 -1.277 0.201697 Bedrooms2 -43.5934 16.2533 -2.682 0.007359 ** Bedrooms3 -82.6565 20.7641 -3.981 7.04e-05 ***Bedrooms4 -63.3096 34.9521 -1.811 0.070198 . Bedrooms5 79.0618 54.0763 1.462 0.143842 Halls1 -5.0663 64.2764 -0.079 0.937182 Halls2 -53.8905 65.4427 -0.823 0.410307 Halls3 -303.9750 79.2280 -3.837 0.000127 ***Halls4 -528.5427 104.0849 -5.078 4.07e-07 ***Toilet2 112.9566 19.1171 5.909 3.87e-09 ***Toilet3 543.7304 38.8056 14.012 < 2e-16 ***Toilet4 ? ? ? ? ? 735.1894 ? ?55.0977 ?13.343 ?< 2e-16 ***Toilet5 ? ? ? ? ? 338.7906 ? ?84.2851 ? 4.020 5.98e-05 ***Area ? ? ? ? ? ? ? ?5.1091 ? ? 0.1619 ?31.557 ?< 2e-16 ***Towards東北向 ? ? 138.9088 ? ?79.3817 ? 1.750 0.080248 . ?Towards東南向 ? ? 187.1895 ? ?68.5388 ? 2.731 0.006351 ** Towards東西向 ? ? 176.3055 ? ?65.8384 ? 2.678 0.007453 ** Towards東向 ? ? ? 210.9435 ? ?73.2744 ? 2.879 0.004022 ** Towards南北向 ? ? ?75.7831 ? ?57.1199 ? 1.327 0.184704 ? ?Towards南向 ? ? ? ?60.1949 ? ?56.9678 ? 1.057 0.290763 ? ?Towards西北向 ? ? ?75.4326 ? ?71.1415 ? 1.060 0.289091 ? ?Towards西南向 ? ? 169.8106 ? ?75.9626 ? 2.235 0.025467 * ?Towards西向 ? ? ? 234.0816 ? ?76.5585 ? 3.058 0.002253 ** Floor地下 ? ? ? ?-812.3578 ? ?63.3277 -12.828 ?< 2e-16 ***Floor高層 ? ? ? ? ?12.3525 ? ?14.2466 ? 0.867 0.385991 ? ?Floor共1層 ? ? ? -313.7278 ? ?52.1342 ?-6.018 2.00e-09 ***Floor共2層 ? ? ? -453.3692 ? ?41.6829 -10.877 ?< 2e-16 ***Floor共3層 ? ? ? -601.7032 ? ?44.3336 -13.572 ?< 2e-16 ***Floor共4層 ? ? ? -183.7866 ? ?36.3396 ?-5.057 4.52e-07 ***Floor共5層 ? ? ? ?-41.4184 ? ?25.7922 ?-1.606 0.108419 ? ?Floor中層 ? ? ? ? ?-1.7223 ? ?13.5961 ?-0.127 0.899204 ? ?Decorate簡單裝修 ?-63.1591 ? ?22.0584 ?-2.863 0.004224 ** Decorate精裝修 ? ?-49.3276 ? ?19.8544 ?-2.484 0.013033 * ?Decorate毛坯 ? ? -157.0299 ? ?24.3012 ?-6.462 1.22e-10 ***---Signif. codes: ?0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 265.5 on 2794 degrees of freedomMultiple R-squared: ?0.6852, ? ?Adjusted R-squared: ?0.6815 F-statistic: 184.3 on 33 and 2794 DF, ?p-value: < 2.2e-16

模型的F檢驗拒絕原假設(shè),說明建立的模型是顯著的;Ajusted R-squared為0.6815,模型的擬合程度尚可接受。

后面還有模型的檢驗,之后有機會會進行更深入的探討。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6842

    瀏覽量

    88758
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4776

    瀏覽量

    84390
  • 線性回歸
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    4293

原文標(biāo)題:Python&R爬取分析趕集網(wǎng)北京二手房數(shù)據(jù)(附詳細代碼)

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    python音頻文件的步驟

    python爬蟲音頻文件
    發(fā)表于 08-22 14:23

    Python豆瓣電影信息和存儲數(shù)據(jù)

    Python——豆瓣電影信息并存儲數(shù)據(jù)
    發(fā)表于 03-11 11:19

    python基礎(chǔ)語法及流程控制

    數(shù)據(jù)加密解密3.課程中過的網(wǎng)站紅牛分公司數(shù)據(jù) 鏈家二手房數(shù)據(jù) 歷史天氣
    發(fā)表于 08-31 07:41

    二手儀器儀表

    主要經(jīng)營產(chǎn)品:二手示波器,二手萬用表,二手示波器碳棒,二手頻譜分析儀,二手網(wǎng)絡(luò)分析儀,
    發(fā)表于 12-22 11:12 ?596次閱讀

    出售二手儀器儀表 電子工具設(shè)備

    主要經(jīng)營產(chǎn)品:二手示波器,二手萬用表,二手示波器碳棒,二手頻譜分析儀,二手網(wǎng)絡(luò)分析儀,
    發(fā)表于 12-26 14:59 ?905次閱讀

    看我如何挑二手筆記本(二手也有好貨)

     看我如何挑二手筆記本(二手也有好貨)  筆記本電腦在國內(nèi)興起,不過是近幾年來的事。但是在各大廠商鋪天蓋地的宣傳下,加上筆記本電腦自
    發(fā)表于 01-23 14:03 ?1327次閱讀

    二手iPhone市場崛起 且看最全的二手iPhone驗機指南

    據(jù)調(diào)研機構(gòu)IDC報告顯示,2015年全球二手手機出貨量為8130萬部,而2020年將達到2.226億部,年復(fù)合增長率為22.3%。這也意味著越來越多的人將選擇二手手機來使用。
    發(fā)表于 12-12 11:35 ?1423次閱讀

    Python CSDN的極客頭條

    Python 如何CSDN的極客頭條呢?
    的頭像 發(fā)表于 03-21 14:58 ?4790次閱讀
    <b class='flag-5'>Python</b> <b class='flag-5'>爬</b><b class='flag-5'>取</b>CSDN的極客頭條

    VR/3D看,123看突破傳統(tǒng)技術(shù)局限提升客戶意向成交率

    123看成立于2015年,是全球首個通過機器視覺/機器學(xué)習(xí)實現(xiàn)極低成本3D建模的技術(shù)提供商。通過將人工智能領(lǐng)域的前沿科技應(yīng)用于房地產(chǎn)領(lǐng)域,123看突破了傳統(tǒng)技術(shù)的局限,使用低成本的相機、無需專業(yè)攝影師拍攝,從而第一次實現(xiàn)在新房和二手
    發(fā)表于 08-18 10:51 ?2523次閱讀

    Python這個超炫的黑科技,可全網(wǎng)各種資源!

    以前找房子費時又耗力,還要謹(jǐn)防被黑中介或二手房東坑一把!現(xiàn)在鍵盤敲敲幾下,就能用Python找到房子,簡直太牛了。
    的頭像 發(fā)表于 08-05 10:05 ?7190次閱讀

    二手手機市場正在逐步變大

    二手手機市場正在逐步變大,近日,IDC出具了2020年全球二手手機市場報告,數(shù)據(jù)顯示,去年全球新機市場下降6.4%,而二手手機市場卻逆勢上漲9.2%,達到了2.25億部,IDC認為,到
    的頭像 發(fā)表于 01-19 12:18 ?2018次閱讀

    二手半導(dǎo)體設(shè)備的緣起

    二手半導(dǎo)體設(shè)備也不是這幾年才興起的產(chǎn)物,“其實我沒離開過江湖,我只是長期在江湖底下潛水?!蔽矣X得這可以作為二手半導(dǎo)體設(shè)備的真實寫照。十多年來,二手半導(dǎo)體設(shè)備市場一直是IC制造供應(yīng)鏈的重要組成部分。
    的頭像 發(fā)表于 05-17 14:40 ?5388次閱讀
    <b class='flag-5'>二手</b>半導(dǎo)體設(shè)備的緣起

    如何用python抖音app數(shù)據(jù)

    記錄一下如何用pythonapp數(shù)據(jù),本文以抖音視頻app為例。
    的頭像 發(fā)表于 03-16 09:07 ?5249次閱讀

    購買二手的N9040B頻譜分析儀多少錢

    二手頻譜分析儀價格多少錢?二手頻譜分析儀供應(yīng)平臺在哪找?哪家二手你頻譜分析儀平臺比較靠譜呢?最近
    的頭像 發(fā)表于 10-09 17:58 ?1578次閱讀
    購買<b class='flag-5'>二手</b>的N9040B頻譜<b class='flag-5'>分析</b>儀多少錢

    Scrapy怎么Python文件

    我們介紹了Scrapy框架運行基本原理,緊接著我們介紹了如何利用Scrapy文本數(shù)據(jù)
    的頭像 發(fā)表于 02-24 15:16 ?549次閱讀
    Scrapy怎么<b class='flag-5'>爬</b><b class='flag-5'>取</b><b class='flag-5'>Python</b>文件