本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于菜J學Python ,作者J哥
前言
香港的貧富差距問題一直十分尖銳,最突出的體現就是收入和樓價的巨大差異,早在60年代末香港房價就經歷了暴漲,人們早已對不動產的金融屬性了如指掌,全港的投資情緒一直都相當火熱,
即便香港當前失業率高企,經濟環境較差,但購買力仍在,樓市依然堅挺,
為了更加深入了解香港房地產市場,本文用Pyhton采集了香港在售26281套二手房資料并做可視化分析,試圖從資料層面理解香港樓市現狀,
九龍房源最多,港島價格更高
香港特別行政區,下轄香港島、九龍半島、新界3個地區共18個磁區,九龍半島在售二手房源共8108個,占比28.62%,根據中原城市指數CCI(僅包括大型屋苑),港島報187.66點,高于香港其他地區,
具體磁區來看,香港在售二手房源集中分布在葵青區、元朗區、屯門區等地,而九龍城區、深水埗區、中西區、灣仔區、東區等地房價較高,香港在售二手房實用呎價均價為呎(折合人民幣約元平方米),最低實用呎價4421/呎,最高實用呎價$96965/呎,
將軍澳二手房源最多
將軍澳、元朗和屯門在售二手房均超1000套,其中,將軍澳以2112套二手房源居首,
九龍站二手房均價最高
九龍站、山頂/南區、貝沙灣和中半山在售二手房均價超過萬呎,九龍站以37232/呎遙遙領先,遠高于香港二手房整體均價,
小戶型為主,2房占比超一半
從建筑面積來看,香港在售二手房普遍建面在500呎-1200呎(46-111平方米),占比高達78.52%,共計18825套,
從居室來看,香港在售二手房中,2房共計12231套,占比51.05%;3房共計7613套,占比31.76%;4房以上71套,占比僅為0.29%,
各樓齡段均有一定比例分布
從香港在售二手房樓齡來看,25-39年樓齡的二手房源最多,共7396套,占比31.31%;15-24年5939套,占比25.36%;40年以上房源也有2347套,占比10.93%,
50%以上二手房低于1000萬
從香港在售二手房售價來看,1000萬(約429-858萬人民幣)房源數量為12301套,占比51.31%,
描述性統計
相關性分析
從相關系數表和回歸圖來看,間隔(即居室)和樓齡都與香港二手房房價無明顯的相關性,實用面積與房價具有較強的正相關性,一般來說,人們在看房子時看到的面積是建筑面積,但卻不是實用面積,套內建筑面積=套內使用面積+套內墻體面積+陽臺面積,而實用面積就是套內使用面積,另外,實用率與房價也無相關性,這與大部分人的感性認識存在偏差,
技術實作
本文資料來源于中原地產,網頁結構相對簡單,資料清洗主要用到Python的pandas庫,由于內容較多,僅提供核心欄位清洗代碼,資料可視化主要用到Python的pyecharts庫,都是一些基礎圖表,
資料獲取
爬蟲核心代碼
#將繁體轉換成簡體
def tradition2simple(line):
return Converter('zh-hans').convert(line)
#決議網頁
def get_page(page):
if page <11:
url = 'http://hk.centanet.com/findproperty/BLL/Result_SearchHandler.ashx?url=http%3A%2F%2Fhk.centanet.com%2Ffindproperty%2Fzh-HK%2FHome%2FSearchResult%3Fposttype%3DS%26src%3DC%26minprice%3D%26maxprice%3D%26sortcolumn%3D%26sorttype%3D%26limit%3D100%26currentpage%3D{0}'.format(page)
else:
url = 'http://hk.centanet.com/findproperty/BLL/Result_SearchHandler.ashx?url=http%3A%2F%2Fhk.centanet.com%2Ffindproperty%2Fzh-HK%2FHome%2FSearchResult%3Fposttype%3DS%26src%3DC%26minprice%3D%26maxprice%3D%26sortcolumn%3D%26sorttype%3D%26limit%3D-1%26currentpage%3D{0}'.format(page)
req = requests.get(url, headers = headers)
bs = req.json()
# print(bs)
ts = tradition2simple(bs['post'])
# print(ts)
html = etree.HTML(ts)
if __name__ == '__main__':
ua = UserAgent(verify_ssl=False)
headers = {"User-Agent": ua.random}
for page in range(1,2624): #共2623頁
get_page(page)
# time.sleep(1)
print("第%d頁爬取完成"%page)
print('-'*100)
資料預覽
資料清洗
建筑面積/單價
#例外字符替換為空
df["建筑面積"] = df["建筑面積"].str.replace(",","").astype("float")
df["建面單價"] = df["建面單價"].str.replace("$","").str.replace(",","").str.replace("/呎","").astype("float")
#建筑面積和建面單價缺失值用均值填充
df = df.fillna(value=https://www.cnblogs.com/hhh188764/p/{'建筑面積':df["建筑面積"].mean(),'建面單價':df["建面單價"].mean()})
間隔
# 存在缺失值、換行符、非數字型、無房間數等臟資料
df["間隔"] = df["間隔"].str.replace("\r\n","").str[:1]
df = df[ ~ df['間隔'].isin(['('])] #洗掉某列包含特殊字符的行
df["間隔"] = df["間隔"].str.replace("開","0").astype("float")
df = df.fillna(value=https://www.cnblogs.com/hhh188764/p/{'間隔':df["間隔"].mean()})
df["間隔"] = df["間隔"].astype("int")
售價
#售價單位存在萬和億,進行統一化處理
df["售價"] = (df["售價"].str.replace("$","").str.replace(",","").str[:-1].astype(float) * df['售價'].str[-1].map({"萬": 1, "億": 10000})).astype("int")
資料可視化
回歸圖
fig,axes=plt.subplots(5,1,figsize=(12,30))
sns.regplot(x='間隔',y='實用單價',data=https://www.cnblogs.com/hhh188764/p/df1,color='green',marker='*',ax=axes[0])
sns.regplot(x='樓齡',y='實用單價',data=https://www.cnblogs.com/hhh188764/p/df1,color='green',marker='*',ax=axes[1])
sns.regplot(x='實用面積',y='實用單價',data=https://www.cnblogs.com/hhh188764/p/df1,color='green',marker='*',ax=axes[2])
sns.regplot(x='建筑面積',y='實用單價',data=https://www.cnblogs.com/hhh188764/p/df1,color='green',marker='*',ax=axes[3])
sns.regplot(x='實用率',y='實用單價',data=https://www.cnblogs.com/hhh188764/p/df1,color='green',marker='*',ax=axes[4])
條形圖
df5 = df1.groupby('屋苑位置')['實用單價'].count()
df5 = df5.sort_values(ascending=True)
df5 = df5.tail(10)
print(df5.index.to_list())
print(df5.to_list())
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
.add_xaxis(df5.index.to_list())
.add_yaxis("",df5.to_list()).reversal_axis() #X軸與y軸調換順序
.set_global_opts(title_opts=opts.TitleOpts(title="香港二手房數量TOP10",subtitle="資料來源:中原地產 \t制圖:J哥",pos_left = 'left'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改橫坐標字體大小
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改縱坐標字體大小
)
.set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
)
c.render_notebook()
餅圖
df2 = df1.groupby('間隔')['實用單價'].count()
print(df2)
df2 = df2.sort_values(ascending=False)
regions = df2.index.to_list()
values = df2.to_list()
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
.add("", list(zip(regions,values)))
.set_global_opts(title_opts=opts.TitleOpts(title="香港二手房間隔分布",subtitle="資料來源:中原地產\n制圖:J哥",pos_top="1%",pos_left = 'left'))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=16))
)
c.render_notebook()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/204506.html
標籤:Python
下一篇:機械硬碟隨機IO慢的超乎你的想象
