基于Python的線上租房網站的數據分析與可視化展示_第1頁
基于Python的線上租房網站的數據分析與可視化展示_第2頁
基于Python的線上租房網站的數據分析與可視化展示_第3頁
基于Python的線上租房網站的數據分析與可視化展示_第4頁
基于Python的線上租房網站的數據分析與可視化展示_第5頁
已閱讀5頁,還剩41頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

33摘要近年來,隨著城市化水平進程的加快,以及土地價格上漲,房價節節攀升,對于絕大多數剛入職場的應屆畢業生而言,租房成為滿足居住需求的第一選擇。互聯網的發展帶動了傳統行業轉型,房屋租賃市場由傳統的房東直租和中介租房轉換為以線上租房平臺為代表的新租房模式。如何在眾多租房信息中精準篩選出滿足自己需求的房源顯得越來越重要。本文使用基于Python的網絡爬蟲技術獲取鏈家租房平臺上北京、上海、廣州、深圳、蘇州五個城市的相關租房數據,數據存儲為CSV格式,并使用Pandas庫將數據進行清洗、分析,使用Pyecharts庫將分析結果進行可視化,以期對租房用戶和房東定價提供參考。關鍵詞:租房網站;數據采集;數據分析與可視化;Python;Pandas;Pyecharts前言近年來,隨著公路里程和高鐵里程的不斷增加,交通變得越來越發達,流動人口越來越多。據統計,2017年流動人口達到2.5億。而且城市化建設步伐加快,一、二線城市吸納了全國各地大量的人才,帶動了租房市場的發展,租賃人口也隨之不斷增加。各大城市對應屆大學生租房補貼等利好政策也促進了住房租賃市場的發展。然而傳統的租房模式存在房源信息不對稱、缺乏法律保障、中介費高、中介管理混亂等問題。在這樣的環境下,為了開擴市場,提升核心競爭力,房屋租賃市場與互聯網相結合,以線上租房平臺為代表的新租房模式迅速發展了起來。目前線上租房平臺大體上可以分為兩類模式。一類是業主自營模式,以Airbnb為代表,平臺只是為房主和房客提供一個交易的平臺,不對房源做出任何干預。第二類是平臺自營,例如自如、鏈家等,這類平臺會對房源做出一定的干預,房東將房源交給平臺,平臺對房源進行一定的包裝并統一運營管理。但是線上租房平臺信息繁多,如何精準地獲取數據并根據用戶需求找到適合的房源是本文研究的重點。綜上所述,本文選取鏈家網北京、上海、廣州、深圳、蘇州五個城市的租房信息作為研究對象,通過數據采集技術獲取租房信息,并且通過數據分析與可視化技術研究房源分布、價格、面積、樓層、戶型等租房相關因素。緒論1.1課題背景近年來,隨著公路里程和高鐵里程的不斷增加,交通變得越來越發達,流動人口越來越多。據統計,2017年流動人口達到2.5億。而且城市化建設步伐加快,一、二線城市吸納了全國各地大量的人才,帶動了租房市場的發展,租賃人口也隨之不斷增加。各大城市對應屆大學生租房補貼等利好政策也促進了住房租賃市場的發展。然而傳統的租房模式存在房源信息不對稱、缺乏法律保障、中介費高、中介管理混亂等問題。在這樣的環境下,為了開擴市場,提升核心競爭力,房屋租賃市場與互聯網相結合,以線上租房平臺為代表的新租房模式迅速發展了起來。目前線上租房平臺大體上可以分為兩類模式。一類是業主自營模式,以Airbnb為代表,平臺只是為房主和房客提供一個交易的平臺,不對房源做出任何干預。第二類是平臺自營,例如自如、鏈家等,這類平臺會對房源做出一定的干預,房東將房源交給平臺,平臺對房源進行一定的包裝并統一運營管理。但是線上租房平臺信息繁多,如何精準地獲取數據并根據用戶需求找到適合的房源是本文研究的重點。綜上所述,本文選取鏈家網北京、上海、廣州、深圳、蘇州五個城市的租房信息作為研究對象,通過數據采集技術獲取租房信息,并且通過數據分析與可視化技術研究房源分布、價格、面積、樓層、戶型等租房相關因素。1.2課題意義根據CBNData的2018年輕人租房大數據報告,90后95后年輕人初入職場,成為了租房主力軍。報告指出,預計住房租賃市場未來將持續增長,至2023年預計租賃人口將達到2.48億人。隨著租房的需求持續增加,催生出了越來越多的中介服務,而線上租房平臺也乘著互聯網的東風迅速發展,比較知名的互聯網租房平臺有鏈家、自如、Airbnb等。對于初入職場的95后而言,為了避免黑中介扣押金的問題,往往會選擇較為透明的線上租房,除此以外,通過線上租房平臺,還可以通過搜索、篩選功能精確的找到符合自己要求的住房。在此背景下,對線上租房平臺進行數據分析就顯得尤為重要。本文對當下年輕人租房所需要考慮的因素,例如房源地理分布、戶型、租金、面積等進行數據分析與可視化處理。并以北京、上海、廣州、深圳、蘇州為例,通過數據分析得出相對客觀的結果,并將結果進行可視化呈現。通過對租房數據的分析,可以清晰地發現房源的各項信息,為用戶租房提供借鑒;可以了解同一區域內房租均價、每平米均價、每居室均價等,為房東定價提供參考。

相關環境和技術2.1Python簡介Python是一門語法簡潔但是功能強大的解釋型編程語言,因其簡單如上手的特點,廣受開發者喜愛,曾多次獲得TIOBE最佳年度語言排名第一名。它擁有簡潔但高效的數據結構,例如列表相當于長度可變的數組,因此能用使用簡單的而又高效的語言進行開發。Python以其開發效率著稱,致力于用最短、最優雅的方式完成任務。盡管Python的運行效率受人詬病,但被被稱為“膠水語言”的它可以調用C/C++程序,將耗時的部分轉移給C/C++運行,然后由Python來整合,這樣就可以兼顧開發高效與運行高效。本文使用的Pandas庫就是基于C語言開發,在大多數數據分析部分,運行效率已經不輸C語言。2.2Requests簡介使用Python進行網絡爬蟲通常有兩種常用的庫,一種是urllib,一種是requests。使用urllib的request模塊就可以方便地實現發送請求并得到響應。然而urllib仍有不足之處,例如使用urllib添加cookies時就需要另外寫opener和handler。而requests則可以很好的解決這個問題,使用requests庫可以更方便地實現添加cookie,處理登錄驗證、設置代理等,也因此requests庫成為了使用頻率最高的爬蟲庫。2.3BeautifulSoup簡介BeautifulSoup庫是Python的一個解析HTML或XML的第三方程序庫,可以用它來方便地提取數據。它的優點有很多,例如自動將輸入文檔轉換為Unicode編碼,輸出文檔為UTF-8編碼,開發者無需擔心編碼的問題,它提供了一些簡單的函數來解析文檔、選擇元素、搜索數據。使用beautifulsoup庫可以處理不規范的標簽,并生成解析樹,使用方法選擇器的find_all()方法可以快速獲取內容,大大節約編程時間。2.4Pandas簡介Pandas是Python的一個用于數據處理的第三方程序庫。它不僅提供了豐富的數據結構,例如DataFrame、series等,同時也為處理數據表和時間序列提供了相應的函數。使用Pandas可以很便利地操作不同來源的數據,例如CSV文件、MySQL數據庫、MongoDB數據庫、Pickle文件、excel表格、txt文本、json數據等,支持類似于SQL的增、刪、改、查,支持豐富的數據處理函數,支持靈活處理缺失數據和異常數據等,是Python的最強大的數據分析與處理的工具。2.5Pyecharts簡介Echarts是百度開發的一款可視化JS庫,不僅擁有豐富的基本圖標,還支持地理數據可視化,卻提供了中文文檔,是近年來較為流行的可視化JS庫。而Pyecharts是結合了Python與Echarts的第三方庫,擁有Python簡潔優雅的語法,提供了眾多API,幾乎完美支持全部的Echarts圖表,相對Echarts來說,使用Pyecharts進行數據可視化,不需要使用WEB框架即可直接使用。第三章需求分析3.1可行性分析通過對本論文實現的網絡爬蟲和數據可視化功能進行可行性分析,可以讓我們對整體的一個項目結構有一個明確的認知。并且對其進行可行性分析的過程中,我們可以預先發現一些日后可能存在的程序問題,并對其進行優化。本論文在軟件方面,主要采用Pycharm這款工具來進行python語言的編寫,并且可以在PyCharm軟件中下載本文中需要的第三方庫,例如BeautifulSoup4、Requests、Pyecharts等第三方工具庫。這使得我們在編程環境上大大節省了時間和安裝第三方庫所額外花費的精力。 在技術方面,本文采用python語言為編程語言,主要因為其語言的簡潔性、易用性以及其對第三方庫友好的支持性。采用requests庫來發送請求并得到響應,使用BeautifulSoup來對數據進行解析,使用pandas庫對數據進行清洗,以及使用Pyecharts來實現數據的可視化。3.2需求分析本文旨在分析一線城市的房源信息,為租戶租房和房東定價提供參考。在對鏈家網的數據采集中,主要選取北京、上海、廣州、深圳、蘇州這五個城市作為主要的研究對象,分別對房屋概況、地理位置、面積大小、朝向、戶型、樓層以及租金等方面的信息進行采集,接著對采集的數據進行數據清洗,提取出有用的信息,并將數據格式進行處理,然后通過數據可視化技術對租房信息進行分析。整體流程如下圖所示:圖3-1數據分析流程圖數據獲取與存儲,即通過網絡爬蟲技術,獲取本文研究對象所需的數據,并將這些數據存儲在本地。網絡爬蟲技術采集的原始數據的組織形式可能有很多鐘形態,但大多數時候數據是以json格式傳輸的。為了便于后續分析與處理,在數據獲取與存儲階段,應該盡量保持數據原有的存儲結構,不進行額外的處理,以防止出現臟數據。本文的數據采集部分,主要使用Python語言對鏈家租房網站的北京、上海、廣州、深圳、蘇州五個城市進行數據采集,獲取了租房信息中的地理位置、面積大小、朝向、租金、戶型、樓層等關鍵信息并將獲取到的數據按照城市名保存為CSV文件。采集的具體流程為:1、解析網頁結構,確定網絡爬蟲方案;2、拼接URL,用于獲取各城市的各行政區的房源數據;3、偽造請求頭,向服務器發起;4、請求解析服務器返回的響應信息5、保存文件數據采集具體流程圖如下圖所示:圖3-2數據采集流程圖數據清洗與預處理,通常是指對采集到的數據進行一定的處理,以便后續的數據分析與可視化。數據預處理的主要目的是清除、處理一些異常值。這些異常值可能是數據采集時由于網絡io阻塞導致的重復值,也有可能是系統錯誤導致的異常值,也有可能是網站反爬蟲技術導致的無效值和缺失值。將這些沒有價值的數據和異常的數據清洗掉,能更顯著地反映出各個字段之間的潛在聯系,便于后續分析。通常情況下,數據清洗的策略有丟棄法和替換法。例如,丟棄法包括重復值去重、空值丟棄、去掉異常的最值等。替換法包括用均值、插值法替換缺失值。在本文的數據清洗與預處理部分中,主要使用Pandas庫進行數據清洗工作,需要將樓層中的異常值所在的該條記錄去掉,例如樓層中存在“未知”和“地下室”等記錄,可以使用Pandas的反向索引刪除異常值。由于這些記錄不多,不會影響整體的分析,因此可以直接去掉。此外,樓層字段和面積大小字段也存在“0”和“未知”等無效屬性,需要刪除記錄。初步清洗掉無效屬性以后,需要規整數據,提取出有效數據。例如摘要字段只需要提取整租/合租類型,位置字段只需要提取所在行政區,不需要具體的地址。樓層字段和房型字段,通過正則表達式提取數值,用于說明所在的樓層和房型是幾室的,其他無效文字剔除。面積大小和樓層字段,需要去除數值單位,只保留數值,以便進行數值計算與排序。具體清洗流程如下圖所示:圖3-3數據清洗流程圖數據探索性分析與可視化,即通過一些分析方法充分認識已經清洗完的干凈數據,而后根據租戶最關心的問題,試圖從數據中發現潛在的聯系并得出分析結論。而數據可視化只是數據分析的輔助手段,用于更好地展示數據。在探索性數據分析中,數據可視化可以輔助分析者,使得分析過程更加形象、立體。數據可視化是讓分析者認識數據、理解數據最直接、最形象、最容易的方式,能夠使分析過程更加簡單。本文的數據分析與可視化部分,采用Pyecharts繪圖庫,繪制了餅圖、柱狀圖、地圖、條形圖等,結合圖表詳細分析了整租和合租的占比情況、房屋朝向對租金的影響、房源的分布情況、不同區域的平均租金和每平米租金以及哪些戶型最受到歡迎。經過上述可視化分析,使得租戶和房東能夠更加直觀地了解房源信息。數據分析與可視化流程如下:圖3-4數據分析與可視化流程圖

第四章數據采集4.1整體設計本文對鏈家租房網站的房源信息進行采集,包括如下字段:摘要、位置、大小、朝向、戶型、樓層、價格。爬蟲整體的設計思路為向服務器發送請求,解析返回的html元素,使用beautifulsoup庫提取出有價值的信息,然后使用循環拼接url的方式獲取下一頁的數據。主要分為如下幾個部分:分析網頁結構,找到對應的請求地址偽造請求頭,向網站請求數據解析響應的數據獲取各市的區域范圍5.保存數據4.2分析網頁與請求數據首先打開鏈家網站,切換到租房選項卡,然后將地點定位在北京,此時通過Chrome瀏覽器的開發者模式我們可以發現此時的URL地址是/zufang/。很明顯,bj是北京的縮寫,因此如果是別的城市,只需要將bj修改為其他城市的拼音首字母即可。例如上海租房,即為/zufang/,不同的城市有不同的域名。這是在數據采集工作前需要考慮的第一點。使用Chrome瀏覽器的開發者工具查看當前網頁的cookie,可以發現有一個名為select_city的字段,北京的值為110000。如圖3-1所示。如果是其他城市,這個值也會發生變化,也就是說不同城市有不同的站點對應著不同的cookie。這是數據采集工作前第二個注意點。圖4-1Chrome瀏覽器中cookie信息圖第三個注意點是區域劃分。一個市可以劃分為若干個行政區,每個行政區還可以分為若干個商圈。以北京市為例,區域選擇東城,東城還包含多個商圈。如下圖所示:圖4-2區域范圍圖此時URL為/zufang/dongcheng/,如果選擇其中的一個商圈,例如安定門,則URL變為/zufang/andingmen/。體現在URL上,行政區和所屬商圈并非是父節點與子節點的關系,但是必須要先獲得上一級的區域,才能獲取到具體的商圈,然后才可以針對該商圈內的房源數據進行數據采集。也就是說,在設計爬蟲函數時,需要先設計一個函數獲取行政區的頁面數據,然后再設計一個函數從頁面數據中提取出各商圈的URL。最后通過拼接URL的方式向服務發送請求。如果不按照區域劃分來進行爬蟲,那么僅能獲取到前100頁的房源數據。請求數據首先需要偽造請求頭,鏈家網站定位不同地區就會切換到對應的站點,每個站點的cookie都有不同,因此在爬蟲程序開始之前需要先通過瀏覽器的開發者工具獲取當前站點的cookie,然后才能進行爬蟲。除此以外還對異常進行處理,防止出現網絡堵塞的情況,以及適當添加請求延遲,防止被網站反爬蟲檢測到。代碼如下:def

get_res(url):

head

=

{

"User-Agent":

"Mozilla/5.0

(Windows

NT

10.0;

Win64;

x64)

AppleWebKit/537.36

(KHTML,

like

Gecko)

Chrome/81.0.4044.138

Safari/537.36

Edg/81.0.416.77",

"Cookie":

"lianjia_uuid=7a8a36e1-876a-48c4-bd6b-8856a1ce21ff;

UM_distinctid=174fb463ffe3c2-0801c61ab79807-7e647b6e-1fa400-174fb463fff57a;

_ga=GA1.2.55439363.1601943522;

_smt_uid=5f7bb7e7.48e89141;

sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22174fb464d382ff-0b5f27dc617831-7e647b6e-2073600-174fb464d3a193%22%2C%22%24device_id%22%3A%22174fb464d382ff-0b5f27dc617831-7e647b6e-2073600-174fb464d3a193%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D;

_gid=GA1.2.1284386193.1602169686;

lianjia_ssid=055b7ef2-6dd2-40a7-aa3b-fe91cf909a59;

select_city=110000;

User-Realip=;

srcid=eyJ0Ijoie1wiZGF0YVwiOlwiODM5MzY1MmE2NDIwZWRiOGZjNDM4YzQxZjIwOWM1M2Q2ZThmOTM2ZjBmMjUwMjJkMmIzMjMzYmFhZjBkZDIwZmJmZmJmZWI2ODRlMDNmNGJkMTk5OGRhMWVlMDUzYmQ2OWEyYjE5NjIzNTIxNDVkOGExNjYzZWY2NjgzNzBmMWU4M2JiYTA3N2Q2ZjQ4YTI0NTYwNWUwMGZkMDg2YzM4NTJhY2YwNGIzOTRmYWMzMWIxNTZiODdmMTNjZTk3Y2Y3YmY2NzUzYzI2YmQ0YmQwYWM3OTdlNTUyMzhlYTU0NzFhNDU5YmRlNzI1MTMxNGQwZmE3NWNlZTlhYzJiODQ0ZTVhMGZmOTFkMGVkMmJjYTk1ZTA5MTA2YTgxNzRhY2FhNDkzZjVmMmI0YTA0Mjk5MTBhNzQ3NGEyYjNmMDhlMTVhYjFkOGYxY2Y2YzFkZDcwNmEzZTFhMWIxNGZmODMwMFwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIyMDE4NThjZlwifSIsInIiOiJodHRwczovL2JqLmxpYW5qaWEuY29tL3p1ZmFuZyIsIm9zIjoid2ViIiwidiI6IjAuMSJ9",

"Connection":

"keep-alive"

}

try:

response

=

requests.get(url,

headers=head,

timeout=10)

return

response.text

except

requests.exceptions.RequestException

as

e:

print('第二次嘗試獲取

',

url)

try:

response

=

requests.get(url,

headers=head,

timeout=10)

return

response.text

except

requests.exceptions.RequestException

as

e:

print('獲取',

url,

'失敗')

4.3解析響應數據與獲取區域范圍使用beautifulsoup庫處理返回以后的響應數據,可以提取出本文研究對象所需要的數據。這部分定義了一個getData函數,在函數內部調用了上一模塊的請求函數,然后對返回的信息進行處理。使用beautifulsoup庫找到本文研究對象所需要的信息所在的頁面層級。例如,在本例中爬取的信息都在名為content__list--item--main的div中,返回的是tag組成的列表。接下來再對該列表進行查找即可找到所需的信息。代碼如下所示:def

getData(url):

datalist

=

[]

html

=

get_res(url)

if

html

==

'':

return

''

bs

=

BeautifulSoup(html,

"html.parser")

list

=

bs.find_all("div",

class_="content__list--item--main")

for

item

in

list:

try:

info1

=

item.contents[1].contents[1].string.strip()

info2

=

item.contents[3].contents[1].string.strip()

+

"-"

+

item.contents[3].contents[3].string.strip()

+

"-"

+

\

item.contents[3].contents[5].string.strip()

info3

=

item.contents[3].contents[8].string.strip()

info4

=

item.contents[3].contents[10].string.strip()

if

'南'

in

info4

or

'北'

in

info4

or

'東'

in

info4

or

'西'

in

info4:

info5

=

item.contents[3].contents[12].string.strip()

info6

=

item.contents[3].contents[13].contents[2].string.replace("

",

"").replace("\n",

"")

else:

info4

=

''

info5

=

item.contents[3].contents[10].string.strip()

info6

=

item.contents[3].contents[11].contents[2].string.replace("

",

"").replace("\n",

"")

info7

=

item.contents[9].contents[0].contents[0]

except:

print(url,

'數據篩選出現了問題')

continue

datalist.append([info1,

info2,

info3,

info4,

info5,

info6,

info7])

return

datalist

獲取區域范圍區域范圍可以劃分為大區域和小區域。大區域是行政區,小區域是商圈,先請求主站點,獲取行政區的跳轉URL,然后拼接URL,依次請求行政區的地址,獲取該行政區的商圈URL,通過循環遍歷即可獲取所有大小區域的URL。代碼如下所示:def

getBigAreaList(url):

bigAreaList

=

[]

html

=

get_res(url)

bs

=

BeautifulSoup(html,

"html.parser")

list

=

bs.find_all("li",

class_="filter__item--level2")

for

item

in

list:

href

=

item.contents[1].get('href')

if

'ditie'

in

href

or

href

==

"/zufang/":

continue

bigAreaList.append(href)

return

bigAreaList

def

getSamllAreaList(bigAreaList):

samllAreaList

=

[]

for

bhref

in

bigAreaList:

url

=

""

+

bhref

html

=

get_res(url)

bs

=

BeautifulSoup(html,

"html.parser")

list

=

bs.find_all("li",

class_="filter__item--level3")

for

item

in

list:

href

=

item.contents[1].get("href")

if

href

==

bhref:

continue

samllAreaList.append(href)

return

samllAreaList

4.4保存文件與主函數CSV是以純文本形式存儲數據,由任意數目的記錄組成,每條記錄由若干字段組成,相當于一個結構化表。而爬蟲爬取的數據一般情況下為結構化數據,因此使用CSV儲存數據。代碼如下所示:def

saveData(datalist):

#

headers

=

['摘要',

'位置',

'大小',

'朝向',

'戶型',

'樓層',

'價格(元/月)']

file

=

open('databj.csv',

'a',

newline='',

encoding='UTF-8')

csvf

=

csv.writer(file)

csvf.writerows(datalist)

主函數主函數主要是調用函數,傳入大小區域列表,獲取頁面數拼接請求URL等。主函數代碼如下所示:import

requests

import

csv

import

time

import

random

from

bs4

import

BeautifulSoup

#

網頁解析

if

__name__

==

"__main__":

baseurl

=

"/zufang"

counter

=

0

start

=

time.time()

failedUrls

=

[]

print('開始獲取網頁列表')

list

=

getSamllAreaList(getBigAreaList(baseurl))

print('獲取網頁列表結束')

for

href

in

list:

url

=

""

+

href

print(url,

'開始獲取房數')

html

=

get_res(url)

if

html

==

'':

failedUrls.append(url)

continue

bs

=

BeautifulSoup(html,

"html.parser")

num

=

int(bs.find("span",

class_="content__title--hl").string)

print('共有

',

num,

'

套')

if

num

==

0:

continue

for

i

in

range(1,

num

//

30

+

2):

counter

=

counter

+

1

print('開始獲取',

url

+

"pg"

+

str(i))

datalist

=

getData(url

+

"pg"

+

str(i))

if

datalist

==

'':

print('沒有獲取到')

failedUrls.append(url

+

"pg"

+

str(i))

counter

=

counter

-

1

continue

saveData(datalist)

print('第

'

+

str(counter)

+

'

個頁面數據已保存')

time.sleep(random.random())

end

=

time.time()

print('總共用時:',

int((end

-

start)

//

60),

'

分鐘',

int((end

-

start)

%

60),

'秒')

print('請求失敗連接數:',

len(failedUrls))

第五章數據預處理5.1數據清洗獲取到數據之后需要對一些臟數據進行處理。例如樓層這一列,本應該是數值型的字段,但是出現了“未知”、“地下室”等,這些需要被清洗掉。這里使用的是pandas的反向索引。代碼如下所示:df

=

df[~df["樓層"].str.contains("地下室")]

df

=

df[~df["樓層"].str.contains("未知")]

在摘要信息中,只需要知道整租還是合租即可,即提取出包含整租或合租的記錄即可,再將該列名稱修改為租房方式。租房面積這一列中,大小為0的記錄顯然是臟數據,需要刪除掉。除此以外還有戶型字段,需要刪除戶型為“未知”的記錄。代碼如下所示:df

=

df[df["摘要"].str.contains("整租|合租")]

df.rename(columns={"摘要":

"租房方式"},

inplace=True)

df

=

df[~df["大小"].str.contains("0")]

df

=

df[~df["戶型"].str.contains("未知")]

5.2提取有效數據對數據進行預處理以后就可以提取出有效數據了。首先來預覽一下數據,如下圖所示:圖5-1數據預覽圖首先需要添加列名,然后對摘要列提取出整租/合租,其他無關信息都要刪除掉。第二列的地區只需要保留xx區,不需要具體地址。第三列面積大小需要提取出數值,第五列在本文中只需要知道是幾室即可,通過正則表達式提取出數值。第六列提取處樓層數。代碼如下所示:def

process_data(filename):

df

=

pd.read_csv(filename)

df.columns

=

['摘要',

'位置',

'大小',

'朝向',

'戶型',

'樓層',

'價格(元/月)']

#

提取租房方式

df

=

df[df["摘要"].str.contains("整租|合租")]

df["摘要"]

=

[x[:2]

for

x

in

df["摘要"]]

#

修改列名

df.rename(columns={"摘要":

"租房方式"},

inplace=True)

#

提取地區

#

df["位置"]=[x.replace("區","")

for

x

in

df["位置"]]

df["位置"]

=

[x[:2]

for

x

in

df["位置"]]

#

提取面積大小

df["大小"]

=

[re.search(r"\d+",

x)[0]

for

x

in

df["大小"]]

df

=

df[~df["大小"].str.contains("0")]

#

提取戶型

df

=

df[~df["戶型"].str.contains("未知")]

df["戶型"]

=

[x[:1]

for

x

in

df["戶型"]]

#

提取樓層數

#

可能存在層高不一致的問題,因此不能用簡單的高樓層低樓層區分

df

=

df[~df["樓層"].str.contains("地下室")]

df

=

df[~df["樓層"].str.contains("未知")]

df["樓層"]

=

[re.findall(r"\d+",

x)[0]

for

x

in

df['樓層']]

return

df

第六章數據分析與可視化6.1整租與合租占比經過北京的群租房事件,平臺已不顯示北京地區和上海地區的合租房信息。因此這部分只有廣州和深圳兩個城市參與分析。使用pandas的value_counts()可以快速分組,然后將數據處理成[(key,value),(key,value)]的形式,以便后續pyecharts調用。如下是代碼及效果圖:#

1.

整租

合租占比

#

深圳

sz_type

=

sz_clean["租房方式"].value_counts()

sz_type_data

=

[i

for

i

in

zip(["整租",

"合租"],

[int(sz_type["整租"]),

int(sz_type["合租"])])]

#

上海

sh_type

=

sh_clean["租房方式"].value_counts()

#

上海無合租

sh_type_data

=

[("整租",

sh_type["整租"])]

#

廣州

gz_type

=

gz_clean["租房方式"].value_counts()

gz_type_data

=

[i

for

i

in

zip(["整租",

"合租"],

[int(gz_type["整租"]),

int(gz_type["合租"])])]

#

北京

bj_type

=

bj_clean["租房方式"].value_counts()

#

北京無合租

bj_type_data

=

[("整租",

bj_type["整租"])]

#

蘇州

su_type

=

su_clean["租房方式"].value_counts()

su_type_data

=

[i

for

i

in

zip(["整租",

"合租"],

[int(su_type["整租"]),

int(su_type["合租"])])]

def

draw_type_pie(data,

name):

pie

=

Pie(init_opts=opt.InitOpts(width="600px",

height="600px"))

pie.add(series_name="租房方式占比",

data_pair=data,

radius=[120,

240])

pie.set_global_opts(title_opts=opt.TitleOpts(name

+

"租房類型對比"))

pie.set_series_opts(

label_opts=opt.LabelOpts(position="inside",

is_show=True,

formatter="{b}:

{c}

(wlz9kdd%)",

font_size=14),

tooltip_opts=opt.TooltipOpts(is_show=False))

return

pie

draw_type_pie(sz_type_data,

"深圳").render("深圳租房類型對比.html")

draw_type_pie(gz_type_data,

"廣州").render("廣州租房類型對比.html")

draw_type_pie(su_type_data,

"蘇州").render("蘇州租房類型對比.html")

圖6-1深圳租房類型對比圖圖6-2廣州租房類型對比圖圖6-3蘇州租房類型對比圖由上圖可知,廣州、深圳、蘇州三地大多數都是整租的房源。在以往的認知中,剛進入職場的年輕人大多數會選擇合租以降低租房成本。然而根據圖表得出結果卻與此相悖。從平臺角度和市場需求角度分析其可能得原因,一是經過北京的群租房事件,平臺為規避風險,不會上架過多的合租房源,其二可能是如今的年輕人更渴望私密的個人空間,不愿意與陌生人合租,體現在平臺上則整租房源數量遠大于合租。6.2房屋的朝向對比房屋朝向也是相對比較重要的一個租房因素,因為房屋的朝向與租金直接掛鉤,也許租戶不會太在意朝向,但是不會不在意房租。以下是代碼及效果圖:#

2.

房屋朝向占比

餅圖

def

get_direction_data(data):

dir

=

data["朝向"].value_counts()

return

[("南",

int(dir["南"])),

("東南",

int(dir["東南"])),

("西南",

int(dir["西南"])),

("北",

int(dir["北"])),

("東",

int(dir["東"])),

("其他",

len(data)

-

int(

dir["南"])

-

int(dir["東南"])

-

int(dir["西南"])

-

int(dir["北"])

-

int(

dir["東"]))]

def

draw_direct_pie(data,

name):

pie

=

Pie(init_opts=opt.InitOpts(width="600px",

height="600px"))

pie.add("房間朝向對比",

data,

radius=[120,

240],

)

pie.set_series_opts(

label_opts=opt.LabelOpts(position="inside",

is_show=True,

formatter="{b}:

{c}

(1fhj6pd%)",

font_size=14),

tooltip_opts=opt.TooltipOpts(is_show=False))

pie.set_global_opts(title_opts=opt.TitleOpts("{}房屋朝向".format(name)))

pie.render("{}房屋朝向.html".format(name))

draw_direct_pie(get_direction_data(bj_clean),

"北京")

draw_direct_pie(get_direction_data(sh_clean),

"上海")

draw_direct_pie(get_direction_data(gz_clean),

"廣州")

draw_direct_pie(get_direction_data(sz_clean),

"深圳")

draw_direct_pie(get_direction_data(su_clean),

"蘇州")

圖6-4北京市房源房屋朝向對比圖圖6-5上海市房源房屋朝向對比圖圖6-6廣州市房源房屋朝向對比圖圖6-7深圳市房源房屋朝向對比圖圖6-8蘇州市房源房屋朝向對比圖根據上圖,除了蘇州、上海以外,其他三個城市的朝南方向的房源數據并沒有占據壓倒性的優勢。一則是由于統計方式導致的,因為在統計時房源朝向時,整租房源有多個房間的朝向歸類為其他,尤其是北京市,整租房源占比較多的情況下,擁有多個房間朝向的“其他”分類遠超其他朝向。二是上文提到的,對一些租戶來說更在意租金而不是房間朝向,同一套房源的朝北房間一般都會比朝南房間便宜一些,尤其是在廣深兩市,平臺提供了相當大比例的朝北房間,反映了市場有這樣的需求。 而蘇州和上海兩地建筑風格相似,都流行“板式住宅”。“板式住宅”的特點是東西長、南北短,采光好,南北通透,基本每戶都有朝南的臥室。這也解釋了為什么蘇州、上海兩地朝南戶型占據大多數。6.3房源分布情況房源分布,也就是說租房房源在城市的哪個區域更多,可以一定程度上反映哪些區域的房源房租適合,交通便利。這個部分使用地圖顯示大致的房源數量的多寡,使用柱狀圖顯示詳細的房源數量。以下是代碼及效果圖:#

3.

房源分布圖(按區分組)

#

蘇州

su_area

=

[]

for

i

in

su_clean["位置"]:

if

i

==

"工業":

su_area.append(i

+

"園區")

elif

i

==

"昆山":

su_area.append(i

+

"市")

else:

su_area.append(i

+

"區")

su_clean["位置"]

=

su_area

su_clean["累計"]

=

0

su_amount

=

su_clean[["位置",

"累計"]].groupby(by=["位置"]).count().reset_index()

su_amount.sort_values(by=["累計"],

inplace=True,

ascending=False)

def

get_amount(data):

area

=

[i

+

"區"

for

i

in

data["位置"]]

data["位置"]

=

area

data["累計"]

=

0

new_data

=

data[["位置",

"累計"]].groupby(by=["位置"]).count().reset_index()

new_data.sort_values(by=["累計"],

inplace=True,

ascending=False)

return

new_data

gz_amount

=

get_amount(gz_clean)

bj_amount

=

get_amount(bj_clean)

sz_amount

=

get_amount(sz_clean)

def

draw_amount_bar(x_data,

y_data,

name):

bar

=

Bar()

bar.add_xaxis(x_data)

bar.add_yaxis(series_name="",

y_axis=y_data)

bar.set_global_opts(title_opts=opt.TitleOpts("{}房源數量分布".format(name)),

xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(interval=0,

font_size=14,

rotate=-15)),

yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}套",

font_size=14))

)

return

bar.render("{}各區租房數量柱狀圖.html".format(name))

draw_amount_bar([i

for

i

in

bj_amount["位置"]],

[int(i)

for

i

in

bj_amount['累計']],

"北京")

draw_amount_bar([i

for

i

in

sh_amount["位置"]],

[int(i)

for

i

in

sh_amount['累計']],

"上海")

draw_amount_bar([i

for

i

in

gz_amount["位置"]],

[int(i)

for

i

in

gz_amount['累計']],

"廣州")

draw_amount_bar([i

for

i

in

sz_amount["位置"]],

[int(i)

for

i

in

sz_amount['累計']],

"深圳")

draw_amount_bar([i

for

i

in

su_amount["位置"]],

[int(i)

for

i

in

su_amount['累計']],

"蘇州")

#

房源數量分布熱力圖

def

draw_amount_map(data,

name,

pieces):

map

=

Map(init_opts=opt.InitOpts(width="900px",

height="900px"))

map.add("房源數量",

data,

name)

map.set_global_opts(title_opts=opt.TitleOpts(name

+

"房源地理分布"))

map.set_global_opts(visualmap_opts=opt.VisualMapOpts(is_piecewise=True,

pieces=pieces))

return

map.render("{}房源數量分布圖.html".format(name))

piece_sz

=

[

{'max':

1000,

'color':

'#FFFFF0'},

{'min':

1000,

'max':

1999,

'color':

'#FFE0E0'},

{'min':

2000,

'max':

2999,

'color':

'#FEC0C0'},

{'min':

3000,

'max':

3999,

'color':

'#FD9090'},

{'min':

4000,

'max':

4999,

'color':

'#FC6060'},

{'min':

5000,

'max':

5999,

'color':

'#C92C34'},

{'min':

6000,

'color':

'#6F171F'},

]

draw_amount_map([i

for

i

in

zip(sh_amount["位置"],

sh_amount["累計"])],

"上海",

piece_sh)

draw_amount_map([i

for

i

in

zip(bj_amount["位置"],

bj_amount["累計"])],

"北京",

piece_bj)

draw_amount_map([i

for

i

in

zip(gz_amount["位置"],

gz_amount["累計"])],

"廣州",

piece_gz)

draw_amount_map([i

for

i

in

zip(sz_amount["位置"],

sz_amount["累計"])],

"深圳",

piece_sz)

draw_amount_map([i

for

i

in

zip(su_amount["位置"],

su_amount["累計"])],

"蘇州",

piece_su)

圖6-9北京市房源分布柱狀圖圖6-10北京市房源分布地理圖圖6-11上海市房源分布柱狀圖圖6-12上海市房源分布地理圖圖6-13廣州市房源分布柱狀圖圖6-14廣州市房源分布地理圖圖6-15深圳市房源分布柱狀圖圖6-16深圳市房源分布地理圖圖6-17蘇州市房源分布柱狀圖圖6-18蘇州市房源分布地理圖通過上述的圖,可以發現,房源密集的區域無一不是企業較多,交通便利的地方。以北京市為例,除了周邊的通州、大興、昌平、順義、房山等區有較多房源外,房源集中在朝陽區、豐臺、海淀、東城、西城等中心城區,當然這片區域也是最貴的。其中朝陽區的房源最多,幾乎是排名第二的豐臺區房源的兩倍。上海也是一樣,除了周邊的寶山、嘉定、松江、青浦、奉賢等區有較多房源以外,房源主要集中在中心城區及浦東新區。廣州的房源數量在四個城市中是最多的,共有88932條,主要集中在天河、番禺、白云、黃埔及越秀區,房源數量均超過6000條,選擇眾多。由地圖可知,這些房源都較為集中,給附近的公共交通帶來巨大的壓力。深圳的房源主要集中在龍崗區、福田區及南山區,房租相對便宜一些的龍崗區的房源數量是最多的,有將近7000套,占比近20%。雖然蘇州市的房源數量是四個城市中最少,但作為新一線城市,蘇州的房源主要集中在昆山市和吳中區。由于工業園區并不屬于行政區,因此在地圖上難以體現,吳中區和工業園區的地理位置高度重疊,可以粗略地將二者相加,房源數量超過一萬套。不論是工業園區還是排在后面的高新區,都是企業較多的行政區,而昆山市因其常年位居百強縣第一名,吸引眾多外來打工者。并且,上海11號線地鐵通往昆山花橋站,有不少人在上海工作的人選擇在昆山租房,因此房源數量也是相當多。6.4租金分析以上的分析還不是最重要的,房源的地理分布透露的信息也不算多,租金才是租戶更關心的因素。為此,本文分析了各區平均租金、各區每平米平均租金、各區每居室平均租金等。各區平均租金各區的平均租金可以看出各區整體的房租分布情況。由于北京的密云區,蘇州的太倉市、常熟市、張家港市的樣本太少,因此不計算在內。以下是代碼及效果圖:#

4.

各區平均租金

bj_avg_price

=

bj_clean[["位置",

"價格(元/月)"]].groupby(by=["位置"],

as_index=False).mean().sort_values(by=["價格(元/月)"],

ascending=False)

sh_avg_price

=

sh_clean[["位置",

"價格(元/月)"]].groupby(by=["位置"],

as_index=False).mean().sort_values(by=["價格(元/月)"],

ascending=False)

gz_avg_price

=

gz_clean[["位置",

"價格(元/月)"]].groupby(by=["位置"],

as_index=False).mean().sort_values(by=["價格(元/月)"],

ascending=False)

sz_avg_price

=

sz_clean[["位置",

"價格(元/月)"]].groupby(by=["位置"],

as_index=False).mean().sort_values(by=["價格(元/月)"],

ascending=False)

su_avg_price

=

su_clean[["位置",

"價格(元/月)"]].groupby(by=["位置"],

as_index=False).mean().sort_values(by=["價格(元/月)"],

ascending=False)

def

draw_avgpri_bar(data,

name):

bar

=

Bar()

bar.add_xaxis([i

for

i

in

data["位置"]])

bar.add_yaxis(series_name="平均租金",

y_axis=[int(i)

for

i

in

data["價格(元/月)"]])

bar.set_global_opts(title_opts=opt.TitleOpts("{}各區平均租金".format(name)),

xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(interval=0,

font_size=14,

rotate=-15)),

yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}元/月",

font_size=14)))

return

bar.render("{}各區平均租金.html".format(name))

draw_avgpri_bar(bj_avg_price,

"北京")

draw_avgpri_bar(sh_avg_price,

"上海")

draw_avgpri_bar(gz_avg_price,

"廣州")

draw_avgpri_bar(sz_avg_price,

"深圳")

draw_avgpri_bar(su_avg_price,

"蘇州")

圖6-19北京各區平均租金柱狀圖圖6-20上海市各區平均租金柱狀圖圖6-21廣州市各區平均租金柱狀圖圖6-22深圳市各區平均租金柱狀圖圖6-23蘇州市各區平均租金柱狀圖由上圖可以看出北京市朝陽區的平均租金最高,海淀區、西城區、東城區緊隨其后,這四個區是北京市最發達的城區,東城區和西城區是政治文化中心,海淀是高科技產業、教育產業、高校聚集地,而朝陽區則是經濟中心,因此這四個區的房價遙遙領先也不奇怪了。上海市黃浦區的平均租金最高,長寧區與浦東新區次之。黃浦區位于上海市中心,是上海的經濟、行政和文化中心,經濟實力過硬。長寧區是被被稱為上海的富人區,房租普遍更貴,且長寧區吸引了來自全球各地的外籍人士及港澳臺同胞等,成為眾多境外人士首選的居住地。而浦東新區自改革開放以來發生了翻天覆地的變化,坐擁陸家嘴金融圈,可以說是上海經濟最強的區,因此房租也是高居不下。廣州市天河區的平均租金最高,隨后是越秀區和海珠區,從地圖上看,這三個區聚集在一處,位于地鐵沿線,交通便利,且三個區面積不大,通勤時間短,不失為租房的好地方,房租也因此水漲船高。深圳市南山區的平均租金最高,遠超排名第二的福田區,平均房租排名前三的區也是GDP排名前三的區。考慮到南山區有眾多高科技公司,例如中興、騰訊等,因此平均房租高也正常。蘇州市工業園區的平均租金最高,為5232元/月,遠超其他區的平均3000元/月的平均租金。原因在于工業園區聚集了大量高科技企業及外資企業,且交通便利,環境優美。從總體上看,蘇州市、廣州市平均租金較低,非常適合年輕人打拼,而上海市月平均租金破萬的就有7個區,遠遠超過其他三個城市,即使是北京,也僅有朝陽區月平均房租堪堪超過一萬元,也許是上海作為全國的經濟中心,聚集了大量的“后浪”,也僅有“后浪”才能負擔得起這么昂貴的房租。各區每平米租金各區每平米租金代碼及效果圖如下所示:#

5.每平米租金

分區

柱狀圖

地圖

def

get_rent_psm(data):

data["每平米租金"]

=

np.round(data["價格(元/月)"]

/

data["大小"].astype(int),

1)

rent_psm_area

=

data[["每平米租金",

"位置"]].groupby(by=["位置"],

as_index=False).mean()

rent_psm_area["每平米租金"]

=

rent_psm_area["每平米租金"].astype(int)

rent_psm_area.sort_values(by=["每平米租金"],

ascending=False,

inplace=True)

return

rent_psm_area

bj_rent_psm

=

get_rent_psm(bj_clean)

#

bj_rent_psm

=

bj_rent_psm[~bj_rent_psm["位置"].str.contains("密云區")]

sh_rent_psm

=

get_rent_psm(sh_clean)

gz_rent_psm

=

get_rent_psm(gz_clean)

sz_rent_psm

=

get_rent_psm(sz_clean)

su_rent_psm

=

get_rent_psm(su_clean)

def

draw_rent_psm_bar(data,

name):

bar

=

Bar()

bar.add_xaxis([i

for

i

in

data["位置"]])

bar.add_yaxis("",

y_axis=[i

for

i

in

data["每平米租金"]]).reversal_axis()

bar.set_series_opts(label_opts=opt.LabelOpts(position="right"))

bar.set_global_opts(title_opts=opt.TitleOpts("{}每平米租金".format(name)),

xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}元/每平米",

font_size=14)),

yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(font_size=14)))

bar.render("{}每平米租金_柱狀圖.html".format(name))

draw_rent_psm_bar(bj_rent_psm,

"北京")

draw_rent_psm_bar(sh_rent_psm,

"上海")

draw_rent_psm_bar(gz_rent_psm,

"廣州")

draw_rent_psm_bar(sz_rent_psm,

"深圳")

draw_rent_psm_bar(su_rent_psm,

"蘇州")

#

每平米租金

分區

地圖

def

draw_rent_psm_map(data,

name):

map

=

Map(init_opts=opt.InitOpts(width="900px",

height="900px"))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論