PartⅠ:數(shù)據(jù)獲取和數(shù)據(jù)清洗
寫(xiě)在前面
很早就有寫(xiě)博客的想法没咙,一直對(duì)自己不自信所以沒(méi)敢嘗試通孽,每次看其他大神的博客都很羨慕和崇拜泌豆,希望自己在未來(lái)的某一天也能給其他人給予一些力所能及的幫助。目前的我還是個(gè)小小小小白,很多東西都只懂些皮毛劫流,這是我的第一篇博客,分享一下我在學(xué)校的一篇期末論文(輕點(diǎn)噴嗚嗚嗚...
如果有疑問(wèn)或者分享,歡迎私信我或者留言办艋恪仍秤!一起進(jìn)步吧!請(qǐng)各位大神多多指教啦~
研究背景
隨著近年來(lái)經(jīng)濟(jì)的飛速發(fā)展可很,北上廣深這四大都市全方位均有突出的表現(xiàn)诗力,工作機(jī)會(huì)多,生活質(zhì)量高我抠,發(fā)展前景可觀苇本。但是要在這些城市定居不是一件容易的事,所以二手房便成為了大部分來(lái)大城市打拼人們的選擇菜拓。通過(guò)Python爬取房天下網(wǎng)站中深圳十個(gè)區(qū)的的房源相關(guān)信息瓣窄,對(duì)爬取的數(shù)據(jù)集進(jìn)行清洗,并對(duì)各維度的數(shù)據(jù)進(jìn)行可視化纳鼎,探索深圳二手房的整體情況俺夕,分析房?jī)r(jià)的影響因素,最終得出深圳購(gòu)買二手房的策略和方向贱鄙。
數(shù)據(jù)獲取
本研究選擇了房天下網(wǎng)站(http://sz.esf.fang,com/)作為爬取對(duì)象劝贸,爬取步驟大概分成了四步,分別是:首先是指定網(wǎng)站的url贰逾,然后發(fā)起get請(qǐng)求悬荣,其次是通過(guò)利用xpath語(yǔ)句進(jìn)行相關(guān)信息點(diǎn)的定位并獲取數(shù)據(jù),最后把數(shù)據(jù)保存到本地疙剑。
深圳一共十個(gè)地區(qū)氯迂,每個(gè)區(qū)每頁(yè)房源為100 個(gè),每個(gè)房源爬取三個(gè)數(shù)據(jù)言缤,即每頁(yè)大約為300個(gè)數(shù)據(jù)嚼蚀。每個(gè)地區(qū)爬取10頁(yè),且開(kāi)5個(gè)線程同時(shí)爬取以提高爬取效率管挟。(另外一篇博客再來(lái)講講線程哈哈哈)由于該網(wǎng)頁(yè)是通過(guò)異步加載的轿曙,所以在爬取時(shí)選用selenium模擬瀏覽器登陸網(wǎng)站∑ⅲ【友情提示:房天下網(wǎng)站在爬取一定的數(shù)據(jù)量后會(huì)需要輸入驗(yàn)證碼导帝,所以可能爬取過(guò)程會(huì)有點(diǎn)麻煩,建議換個(gè)網(wǎng)站或者爬取數(shù)據(jù)量不要太多(俺的能力還不能解決驗(yàn)證碼/(ㄒoㄒ)/~~)】
數(shù)據(jù)清洗
爬取后總共獲得了11416條房源數(shù)據(jù)穿铆。首先對(duì)其進(jìn)行重復(fù)值檢查:
#導(dǎo)入數(shù)據(jù)
data = pd.read_csv(r"C:\\Users\\Administrator\\OneDrive\\桌面\\數(shù)據(jù)清洗\\深圳二手房數(shù)據(jù).csv")
#data.head()
#取前5列有效數(shù)據(jù)進(jìn)行分析
data = pd.DataFrame(data.loc[:,['區(qū)名','地址','基本信息','總價(jià)','單價(jià)']])
#重復(fù)值檢查
data = data.drop_duplicates()#清除重復(fù)值
通過(guò)Python代碼刪除重復(fù)值您单,刪除掉了394行重復(fù)值,得到一個(gè)11021行5列的新數(shù)據(jù)荞雏。
然后進(jìn)行缺失值檢查:
#缺失值檢查
data.isnull().any()#有4列存在缺失值
#清除上述4列含缺失值的行
newdata = data.dropna(subset=['基本信息','地址','總價(jià)','單價(jià)'])
newdata.shape
#再次進(jìn)行缺失值檢查
newdata.isnull().any()#無(wú)缺失值
通過(guò)刪除缺失值虐秦,刪除掉了10列含有缺失值的行平酿,得到一個(gè)11011行5列的新數(shù)據(jù)。
通過(guò)上述重復(fù)值和缺失值處理悦陋,新數(shù)據(jù)需要更新一下索引蜈彼,否則后面進(jìn)一步處理數(shù)據(jù)時(shí)會(huì)因?yàn)樯鲜鰧?duì)部分?jǐn)?shù)據(jù)進(jìn)行刪除后索引缺失而報(bào)錯(cuò),對(duì)新數(shù)據(jù)進(jìn)行更新索引俺驶。其中幸逆,在基本信息列中,因?yàn)樵W(wǎng)站保存數(shù)據(jù)的緣故痒钝,存在多條信息整合在一起的情況秉颗,并且用號(hào)分開(kāi),所以需要對(duì)其進(jìn)行分列操作送矩。
#對(duì)新數(shù)據(jù)進(jìn)行更新索引(否則后面處理會(huì)因?yàn)樯厦鎸?duì)部分?jǐn)?shù)據(jù)刪除后索引缺失而報(bào)錯(cuò))
newdata.reset_index(inplace=True)
#把基本信息列分成下面5列
for i in range(len(newdata['基本信息'])):
s=newdata['基本信息'][i]
lis_s=s.split("|")
fenlie("樓層",0)
fenlie("建樓時(shí)間",1)
fenlie("布局",2)
fenlie("面積",3)
fenlie("朝向",4)
#查看分列后存在空值的數(shù)據(jù)
newdata[newdata.T.isnull().any()]
#把原始基本信息數(shù)據(jù)列剔除
newdata = newdata.drop(columns=['基本信息'])
#把新數(shù)據(jù)中存在缺失值的行進(jìn)行刪除
newdata1 = newdata.dropna(subset=['面積','朝向'])
#查看數(shù)據(jù)類型
newdata1.dtypes
通過(guò)Python的split函數(shù)把基本信息分成五列蚕甥。然而,經(jīng)過(guò)分列后的數(shù)據(jù)會(huì)存在有空值的情況栋荸,同樣利用Python代碼去除掉含有空值的行菇怀,刪除掉了318行,得到一個(gè)10693行10列的新數(shù)據(jù)晌块。
通過(guò)查看數(shù)據(jù)類型爱沟,得知二手房的面積、單價(jià)匆背、布局呼伸、建樓時(shí)間均為object,可以通過(guò)replace函數(shù)對(duì)其進(jìn)行清洗工作钝尸,讓其成為數(shù)字float括享,方便下面的可視化分析。
同時(shí)珍促,對(duì)二手房的樓層進(jìn)行簡(jiǎn)化處理铃辖,分為低樓層、中樓層和高樓層三個(gè)等級(jí)猪叙。對(duì)于二手房的朝向會(huì)存在多個(gè)朝向的情況娇斩,在分析時(shí)會(huì)引起歧義,所以本文只選取了每個(gè)房源朝向的第一個(gè)值來(lái)作為研究對(duì)象穴翩,其余進(jìn)行刪除犬第。
#對(duì)部分?jǐn)?shù)據(jù)列進(jìn)行清洗工作(去除掉多余字符并將其轉(zhuǎn)成float方便下面對(duì)其進(jìn)行分析)
newdata1['面積'] = newdata1['面積'].map(lambda x: x.replace('平米\n','')).astype('float')
newdata1['單價(jià)'] = newdata1['單價(jià)'].map(lambda x: x.replace('元/平米',''))
newdata1['單價(jià)'] = newdata1['單價(jià)'].map(lambda x: x.replace('單價(jià)','')).astype('float')
newdata1['布局'] = newdata1['布局'].map(lambda x: x.replace('\n',''))
newdata1['建樓時(shí)間'] = newdata1['建樓時(shí)間'].map(lambda x: x.replace('年建','')).astype('float')
#對(duì)樓層進(jìn)行簡(jiǎn)化處理(分低、中芒帕、高三個(gè)等級(jí))
def floor(f):
if f is not None:
f = str(f)[:3]
return f
#floor = {'低樓層': '低','中樓層': '中','高樓層': '高'}
newdata1['樓層'] = newdata1['樓層'].map(floor)
#對(duì)朝向列每行進(jìn)行只取第一個(gè)值操作,大部分?jǐn)?shù)據(jù)有多個(gè)朝向分析時(shí)會(huì)引起歧義
def fangxiang(fx):
if fx is not None:
fx = str(fx)[:3]
return fx
newdata1['朝向'] = newdata1['朝向'].map(fangxiang)
通過(guò)上述清洗處理后的數(shù)據(jù)集大致如下:
最后對(duì)數(shù)據(jù)集進(jìn)行異常值檢查遥椿,通過(guò)Python軟件中的describe函數(shù)對(duì)數(shù)據(jù)集進(jìn)行描述性分析淆储,發(fā)現(xiàn)存在最高的二手房單價(jià)為每平方米20 多萬(wàn)冠场,證明存在異常值。
利用箱線圖進(jìn)一步分析本砰,二手房最小面積為14平米碴裙,最大面積為754.05平米,最便宜的25萬(wàn)点额,最貴的8000 萬(wàn)舔株;面積大概集中在63-113平米,價(jià)格大概集中在319-730萬(wàn)还棱,本文將總價(jià)和面積高于上限的當(dāng)作異常值進(jìn)行刪除處理载慈,考慮大多數(shù)人可購(gòu)買的情況,并把單價(jià)與建樓時(shí)間過(guò)久遠(yuǎn)等不符合客觀事實(shí)的刪除珍手。
(代碼和數(shù)據(jù)集我就不放了~有興趣的小伙伴可以私信我哈哈哈)