1. 程式人生 > >基於Python的南京二手房數據可視化分析

基於Python的南京二手房數據可視化分析

4.3 目的 交易 通過 http 爬蟲程序 內存 atp 數據分析

1 內容簡介

首先通過爬蟲采集鏈家網上所有南京二手房的房源數據,並對采集到的數據進行清洗;然後,對清洗後的數據進行可視化分析,探索隱藏在大量數據背後的規律;最後,采用一個聚類算法對所有二手房數據進行聚類分析,並根據聚類分析的結果,將這些房源大致分類,以對所有數據的概括總結。通過上述分析,我們可以了解到目前市面上二手房各項基本特征及房源分布情況,幫助我們進行購房決策。

2 應用技術介紹

1)Python網絡爬蟲技術

  • Requests
  • Beautifulsoup

2)Python數據分析技術

  • Numpy
  • Matplotlib
  • Pandas

3)k-means聚類算法

4)高德地圖開發者應用JS API

3 數據采集及數據清洗

3.1 數據采集

該部分通過網絡爬蟲程序抓取鏈家網上所有南京二手房的數據,收集原始數據,作為整個數據分析的基石。

3.1.1 鏈家網網站結構分析

鏈家網二手房主頁界面如圖1、圖2,主頁上面紅色方框位置顯示目前南京二手房在售房源的各區域位置名稱,中間紅色方框位置顯示了房源的總數量,下面紅色方框顯示了二手房房源信息縮略圖,該紅色方框區域包含了二手房房源頁面的URL地址標簽。圖2下面紅色方框顯示了二手房主頁上房源的頁數。

鏈家網二手房主頁截圖上半部分:

技術分享圖片

圖1 鏈家網二手房主頁

鏈家網二手房主頁截圖下半部分:

技術分享圖片

技術分享圖片

圖2 鏈家網二手房主頁

二手房房源信息頁面如圖3、圖4。我們需要采集的目標數據就在該頁面,包括基本信息、房屋屬性和交易屬性三大類。各類信息包括的數據項如下:

1)基本信息:小區名稱、所在區域、總價、單價。

2)房屋屬性:房屋戶型、所在樓層、建築面積、戶型結構、套內面積、建築類型、房屋朝向、建築結構、裝修情況、梯戶比例、配備電梯、產權年限。

3)交易屬性:掛牌時間、交易權屬、上次交易、房屋用途、房屋年限、產權所屬、抵押信息、房本備件。

技術分享圖片

圖3 二手房房源信息頁面

技術分享圖片

圖4 二手房房源信息頁面

3.1.3 網絡爬蟲程序關鍵問題說明

1)問題1:鏈家網二手房主頁最多只顯示100頁的房源數據,所以在收集二手房房源信息頁面URL地址時會收集不全,導致最後只能采集到部分數據。

解決措施:將所有南京二手房數據分區域地進行爬取,100頁最多能夠顯示3000套房,該區域房源少於3000套時可以直接爬取,如果該區域房源超過3000套可以再分成更小的區域。

2)問題2:爬蟲程序如果運行過快,會在采集到兩、三千條數據時觸發鏈家網的反爬蟲機制,所有的請求會被重定向到鏈家的人機鑒定頁面,從而會導致後面的爬取失敗。

解決措施:①為程序中每次http請求構造header並且每次變換http請求header信息頭中USER_AGENTS數據項的值,讓請求信息看起來像是從不同瀏覽器發出的訪問請求。②爬蟲程序每處理完一次http請求和響應後,隨機睡眠1-3秒,每請求2500次後,程序睡眠20分鐘,控制程序的請求速度。

3.2 數據清洗

對於爬蟲程序采集得到的數據並不能直接分析,需要先去掉一些“臟”數據,修正一些錯誤數據,統一所有數據字段的格式,將這些零散的數據規整成統一的結構化數據。

3.2.1 原始數據主要需要清洗的部分

主要需要清洗的數據部分如下:

1)將雜亂的記錄的數據項對齊

2)清洗一些數據項格式

3)缺失值處理

3.2.3 數據清洗結果

數據清洗前原始數據如圖8,清洗後的數據如圖9,可以看出清洗後數據已經規整了許多。

技術分享圖片

圖8 清洗前原始數據截圖

技術分享圖片

圖9 清洗後的數據截圖

4 數據可視化分析

在數據清洗完成後,我們就可以開始對數據進行可視化分析。該階段主要是對數據做一個探索性分析並將結果可視化呈現,幫助人們更好、更直觀的認識數據,把隱藏在大量數據背後的信息集中和提煉出來。本文主要對二手房房源的總價、單價、面積、戶型、地區等屬性進行了分析。

數據可視化分析主要步驟如下:1)數據加載;2)數據轉換;3)數據可視化呈現。

4.1 數據加載

數據分析和建模的大量工作都是用在數據準備上的,如:清理、加載、轉換等。清洗完成後的數據仍然存儲在文本文件(CSV格式)中,要對數據進行可視化分析,必須先要將數據按一定結果加載到內存中。我們使用Pandas提供的DataFrame對象來加載和處理我們清洗後的數據,Pandas同時提供將表格型數據讀取為DataFrame對象的函數。數據加載處理過程中需要註意的主要問題如下:

1)數據項的行列索引的處理;

2)數據類型推斷和數據轉換;

3)缺失值的處理。

4.2 數據整體質量分析

4.2.1 數據基本情況

數據加載後,數據基本情況如圖10。從圖中可以看到加載後的數據一共20527行、25列,占用內存3.9+MB。在數據類型上,一共有3列float64類型,2列int64類型,20列object類型。除了戶型結構、套內面積、抵押信息三列數據項缺失值比較多之外,其他列數據項的缺失值都不多,所以數據整體的質量還不錯。

技術分享圖片

圖10 數據基本情況圖

4.2.2 整體數據文件詞雲

從整體數據文件詞雲(見圖11),我們可以得到在南京二手房房源信息中經常出現的高頻詞,如商品房、普通住宅、一梯兩戶、鋼混結構、精裝等。我們可以通過這些高頻詞,十分粗略的了解整個數據文件中的基本內容。

技術分享圖片

圖11 整體數據文件詞雲

4.2.3 南京各區域二手房房源數量折線圖

南京各區域二手房房源數量折線圖(見圖13)橫軸為南京各個行政區域名稱,縱軸為房源數量(套)。從圖中可以看出,江寧在售的房源數量最多,高達5000多套,占了總量的1/4。與之相反的是六合區,六合區在售的房源數量僅有1套,數量太少,其他各區的數量相差不多。所以我們後面關於六合區的分析會存在一定誤差。

技術分享圖片

圖13 南京各區域二手房房源數量折線圖

4.2.4 南京二手房房屋用途水平柱狀圖

南京二手房房屋用途水平柱狀圖(見圖14)橫軸為房源數量(套),縱軸為房屋用途類型。從圖中我們可以看出,房屋用途類型有:普通住宅、別墅、商業辦公、酒店式公寓、車庫5中類型。其中我們主要關心的普通住宅類型的房源數量近20000套,占總量絕大部分。所以在本文中,我們沒有剔除掉房屋用途為其他類型的記錄,因為這些類型在所有房源樣本中占比相當少,不會影響後面的分析結果,同時它們也屬於二手房的範疇內。

技術分享圖片

圖14 南京二手房房屋用途水平柱狀圖

4.2.5 數據整體質量總結

通過前面的分析,我們可以看出該數據文件的整體質量還不錯。雖然存在一些缺失值比較多的數據項,但我們比較關註一些數據項缺失值不多。這些缺失值較多的都是一些次要的數據項,不影響我們的分析。在房屋用途類型上,數據文件中一共包括了5種類型的二手房房源信息,其中普通住宅類型占比98%以上,所以我們後面分析基本可以看成是針對普通住宅類型的二手房進行的分析,這也符合我們期望。整個數據文件中唯一不足的是六合區域的二手房房源樣本點太少,這使我們對六合區域的分析會存在一定的誤差。

4.3 南京二手房基本信息可視化分析

二手房基本信息可視化分析主要針對二手房:區域、總價、單價、建築面積四個屬性的分析。

4.3.1 南京各區域二手房平均單價柱狀圖

南京各區域二手房平均單價柱狀圖(見圖15)橫軸為南京各區域名稱,縱軸為單價(元/平米)。從圖中我們可以看到建鄴區和鼓樓區二手房平均單價最高,近40000元/平米。建鄴區是市中心城區,近幾年發展勢頭很好,房價一路飆升,現在已經成了南京最貴的區域之一。鼓樓區作為南京市的核心地帶,擁有眾多商場和學區房,其均價一直高升不下。從整體上來看,南京市各個區域(除去存在誤差的六合區)均價都已經超過了20000元/平米。這些可以體現出近幾年南京市房價猛漲的結果。浦口區雖然相比房價已經很低了,但相較於浦口前幾年的房價,差不多是翻了一番。

技術分享圖片

圖15 南京各區域二手房平均單價

4.3.2 南京各區域二手房單價和總價箱線圖

南京各區域二手房單價箱線圖(見圖16)橫軸為南京各區域名稱,縱軸為單價(元/平米)。二手房平均單價雖然是一個重要參考數據,但平均值不能有效的表示出數據整體上的分布情況,特別是數據中一些離散值的分布情況,這些信息的表現則需要借助箱線圖。從圖16中可以看出,建鄴和鼓樓兩個區域房源單價正常值分布都不是太集中,50%的單價分布在30000-50000的區間內,區間跨度比其他區都要大。雖然建鄴區平均單價略高於鼓樓區,但鼓樓區的異常值特別多,單價超過50000的房源數不勝數,最高單價有達到100000的,單價上限遠高於建鄴區,而建鄴區異常值相對較少。綜合以上情況來看,鼓樓區應該是南京市單價最高的區域。與鼓樓區相鄰的玄武區和秦淮區單價正常值分布較為集中50%的數據都分布在30000-40000之間,但這兩個異常值也比較多,單價上限也非常高。這些區域單價如此多的異常值,跟這些區域集中的教育和醫療資源有著密不可分的關系。

技術分享圖片

圖16 南京各區域二手房單價箱線圖

南京各區域二手房總價箱線圖(見圖17和圖18)橫軸為南京各區域名稱,縱軸為單價(萬元)。圖18對圖17縱軸進行了縮放,更易於觀察,其他方面沒有區別。從總價這個維度來看,鼓樓、建鄴這兩個單價最高區域,總價非常的高,500萬元的二手房以分布在正常值範圍內了。南京其他各區域二手房價格大部分都集中在200-400萬元之間,下四分位數十分靠近200萬。江寧、棲霞雖然在單價不高,但總價不低,尤其是近幾年房價漲幅比較高的江寧,500萬以上異常值都已經比較多了。浦口區總價數據分布最為集中,絕大部分數據都200-300萬區間內。

技術分享圖片

圖17 南京各區域二手房總價箱線圖

技術分享圖片

圖18 南京各區域二手房總價箱線圖

4.3.3 南京二手房單價最高Top20

南京二手房單價最高Top20水平柱狀圖(見圖19)橫軸為單價(元/平米),縱軸為小區名字。從圖中可以看出,單價前20的房源都已經超過9萬,並且都集中在鼓樓區,這也印證了上面箱線圖中鼓樓區如此多異常值的存在。

技術分享圖片

圖19 南京二手房單價最高Top20

4.3.4 南京二手房單價和總價熱力圖

南京二手房單價熱力圖(見圖20)和南京二手房總價熱力圖(見圖21)紅色區域代表房源密集度高且房價高的區域。從圖中可以看出鼓樓、玄武、秦淮、建鄴上半部分是密集度最高的區域。這4個區域處於南京市正中心的位置,交通方便,醫療、教育等資源集中,這些因素一起造就了這些區域高價格。

技術分享圖片

圖20 南京二手房單價熱力圖

技術分享圖片

圖21 南京二手房總價熱力圖

4.3.5 南京二手房總價小於200萬的分布圖

南京二手房總價小於200萬的房源一共有6000多套,分布圖見圖23。從圖中我們可以看出,除了鼓樓區和建鄴區比較少,其他區域低於200萬的房子還是有的。

技術分享圖片

圖23 南京二手房總價小於200萬的分布圖

4.3.6 南京二手房建築面積分析

南京二手房建築面積分布區間圖(圖24)橫軸為房源數量(套),縱軸為分布區間(平米)。從圖中可以看出在建築面積50-100區間內房源數量最多,超過了10000套。其次是100-150區間與小於50的區間。

技術分享圖片

圖24 南京二手房建築面積分布區間柱狀圖

南京各區域平均建築面積柱狀圖(圖25)橫軸為各區域名字,縱軸為建築面積(平米)。從圖中可以看出玄武、秦淮、鼓樓這幾個單價比較高的老城區平均建築面積最小,平均面積80平米左右。反而是江寧、浦口這兩個單價最低的區域平均建築面積最大,平均面積大小超過了100平米。

技術分享圖片

圖25 南京各區域二手房平均建築面積柱狀圖

4.3.7 南京二手房單價、總價與建築面積散點圖

南京二手房總價與建築面積散點圖(圖26)橫軸為建築面積(平米),縱軸為總價(萬元)。從圖中可以看出,總價與建築面積這兩個變量符合正相關關系。數據點分布比較集中,大多數都在總價0-1500萬元與建築面積0-400平米這個區域內。

技術分享圖片

圖26 南京二手房總價與建築面積散點圖

南京二手房單價與建築面積散點圖(圖27)橫軸為建築面積(平米),縱軸為單價(元/平米)。從圖中可以看出建築面積與單價並無明顯關系,同樣樣本點分布也較為集中,離散值不多,但單價特別高的房源,建築面積都不是太大,可能因為這些房源一般都位於市中心。

技術分享圖片

圖27 南京二手房單價與建築面積散點圖

4.4 南京二手房房屋屬性可視化分析

4.4.1 南京二手房房屋戶型占比情況

從南京二手房房屋戶型餅狀圖(圖28)中可以看出,2室1廳與2室2廳作為標準配置,一共占比接近一半。其中3室2廳和3室1廳的房源也占比不少,其他房屋戶型的房源占比就比較少了。

技術分享圖片

圖28 南京二手房房屋戶型餅狀圖

4.4.2 南京二手房房屋裝修情況

從南京二手房房屋裝修情況餅狀圖(圖29)可以看出,近60%的房源的房屋裝修情況都是其他,可能因為房源全部為二手房的緣故,大家都自主裝修過的。

技術分享圖片

圖29 南京二手房裝修情況餅狀圖

4.4.3 南京二手房房屋朝向分布情況

南京二手房房屋朝向柱狀圖(圖30)橫軸為房屋朝向,縱軸為房源數量(套)。從圖中我們可以看出,只有少數幾種的朝向比較多,其余的都非常少,明顯屬於長尾分布類型(嚴重偏態)。這也符合我們的認識,房屋朝向一半以上都是坐北朝南的。

技術分享圖片

圖30 南京二手房房屋朝向分布柱狀圖

4.4.4 南京二手房建築類型占比情況

從南京二手房建築類型餅狀圖(圖31)中,我們可以看出房源的建築類型65.6%都是板樓,現在房地產商喜歡開發的塔樓反而較少,這和南京二手房建築時間都比較久遠相符。

技術分享圖片

圖31 南京二手房建築類型餅狀圖

5 數據聚類分析

該階段采用聚類算法中的k-means算法對所有二手房數據進行聚類分析,根據聚類的結果和經驗,將這些房源大致分類,已達到對數據概括總結的目的。在聚類過程中,我們選擇了面積、總價和單價這三個數值型變量作為樣本點的聚類屬性。

5.1 k-means算法原理

5.1.1 基本原理

k-Means算法是一種使用最普遍的聚類算法,它是一種無監督學習算法,目的是將相似的對象歸到同一個簇中。簇內的對象越相似,聚類的效果就越好。該算法不適合處理離散型屬性,但對於連續型屬性具有較好的聚類效果。

5.1.2 聚類效果判定標準

使各個樣本點與所在簇的質心的誤差平方和達到最小,這是評價k-means算法最後聚類效果的評價標準。

技術分享圖片

5.1.3 算法實現步驟

1)選定k值

2)創建k個點作為k個簇的起始質心。

3)分別計算剩下的元素到k個簇的質心的距離,將這些元素分別劃歸到距離最小的簇。

4)根據聚類結果,重新計算k個簇各自的新的質心,即取簇中全部元素各自維度下的算術平均值。

5)將全部元素按照新的質心重新聚類。

6)重復第5步,直到聚類結果不再變化。

7)最後,輸出聚類結果。

5.1.4 算法缺點

雖然K-Means算法原理簡單,但是有自身的缺陷:

1)聚類的簇數k值需在聚類前給出,但在很多時候中k值的選定是十分難以估計的,很多情況我們聚類前並不清楚給出的數據集應當分成多少類才最恰當。

2)k-means需要人為地確定初始質心,不一樣的初始質心可能會得出差別很大的聚類結果,無法保證k-means算法收斂於全局最優解。

3)對離群點敏感。

4)結果不穩定(受輸入順序影響)。

5)時間復雜度高O(nkt),其中n是對象總數,k是簇數,t是叠代次數。

5.2 算法實現關鍵問題說明

5.2.1 K值的選定說明

根據聚類原則:組內差距要小,組間差距要大。我們先算出不同k值下各個SSE(Sum of
squared
errors)值,然後繪制出折線圖(圖32)來比較,從中選定最優解。從圖中,我們可以看出k值到達5以後,SSE變化趨於平緩,所以我們選定5作為k值。

技術分享圖片

圖32 不同k值下SSE值折線圖

5.2.2 初始的K個質心選定說明

初始的k個質心選定是采用的隨機法。從各列數值最大值和最小值中間按正太分布隨機選取k個質心。5.2.3
關於離群點

離群點就是遠離整體的,非常異常、非常特殊的數據點。因為k-means算法對離群點十分敏感,所以在聚類之前應該將這些“極大”、“極小”之類的離群數據都去掉,否則會對於聚類的結果有影響。離群點的判定標準是根據前面數據可視化分析過程的散點圖和箱線圖進行判定。根據散點圖和箱線圖,需要去除離散值的範圍如下:

1)單價:基本都在100000以內,沒有特別的異常值。

2)總價:基本都集中在3000以內,這裏我們需要去除3000外的異常值。

3)建築面積:基本都集中在500以內,這裏我們需要去除500外的異常值。

5.2.4 數據的標準化

因為總價的單位為萬元,單價的單位為元/平米,建築面積的單位為平米,所以數據點計算出歐幾裏德距離的單位是沒有意義的。同時,總價都是3000以內的數,建築面積都是500以內的數,但單價基本都是20000以上的數,在計算距離時單價起到的作用就比總價大,總價和單價的作用都遠大於建築面積,這樣聚類出來的結果是有問題的。這樣的情況下,我們需要將數據標準化,即將數據按比例縮放,使之都落入一個特定區間內。去除數據的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行計算和比較。

我們將單價、總價和面積都映射到500,因為面積本身就都在500以內,不要特別處理。單價在計算距離時,需要先乘以映射比例0.005,總價需要乘以映射比例0.16。進行數據標準化前和進行數據標準化後的聚類效果對比如下:圖32、圖33是沒有數據標準化前的聚類效果散點圖;圖34、圖35是數據標準化後的聚類效果散點圖。

數據標準化前的單價與建築面積聚類效果散點圖:

技術分享圖片

圖32 數據標準化前的單價與建築面積散點圖

數據標準化前總價與建築面積聚類效果散點圖。

技術分享圖片

圖33 數據標準化前總價與建築面積散點圖

數據標準化後單價與建築面積聚類效果散點圖。

技術分享圖片

圖34 數據標準化後單價與建築面積散點圖

數據標準化後總價與建築面積聚類效果散點圖。

技術分享圖片

圖35 數據標準化後總價與建築面積散點圖

5.3 聚類結果分析

聚類結果如下

1)聚類結果統計信息如下:

技術分享圖片

2)聚類後的單價與建築面積散點圖和總價與建築面積散點圖見圖34、圖35。

3)聚類結果分組0、1、2、3、4的區域分布圖分別如下:圖36、圖37、圖38、圖39、圖40。

聚類結果分組0的區域分布圖如下:

技術分享圖片

圖36 聚類結果0區域分布圖

聚類結果分組1的區域分布圖如下:

技術分享圖片

圖37 聚類結果1區域分布圖

聚類結果分組2的區域分布圖如下:

技術分享圖片

圖38 聚類結果2區域分布圖

聚類結果分組3的區域分布圖如下:

技術分享圖片

圖39 聚類結果3區域分布圖

聚類結果分組4的區域分布圖如下:

技術分享圖片

圖40 聚類結果4區域分布圖

根據以上聚類結果和我們的經驗分析,我們大致可以將這20000多套房源分為以下4類:

a、大戶型(面積大,總價高),屬於第0類。平均面積都在200平以上,這種大戶型的房源相對數量較少,主要分布在鼓樓、建鄴、江寧、棲霞等地(具體可從各類中的區域分布圖可知)。

b、地段型(單價高),屬於第2、4類。這種房源圍繞南京市中心位置集中分布,地理位置極好,交通方便,主要分布鼓樓、玄武、建鄴、建鄴等地(具體可從各類中的區域分布圖可知)。

c、大眾蝸居型(面積小、價格相對較低、房源多),屬於第3類。這類房源分布範圍廣,主要圍繞在各地鐵線兩邊。典型的區域有秦淮、鼓樓、江寧、玄武、浦口等地。

d、高性價比型(面積相對大,單價低),屬於第1類。典型的區域有棲霞、浦口、江寧等地。

ps:等有人看了我再公布github地址:),感覺會火

基於Python的南京二手房數據可視化分析