蛋殼“破碎”,深圳市蛋殼公寓租房數(shù)據(jù)分析

前言
2020年以來(lái),受疫情沖擊、政策監(jiān)管收緊等多重因素影響,長(zhǎng)租公寓可謂路途坎坷。根據(jù)中國(guó)房地產(chǎn)報(bào)不完全統(tǒng)計(jì),今年最近幾個(gè)月時(shí)間里,暴雷的長(zhǎng)租公寓累計(jì)達(dá)到20多家,數(shù)十萬(wàn)租客受到影響。
蛋殼公寓,憑借著長(zhǎng)租公寓風(fēng)口,用5年時(shí)間,做到了分散式長(zhǎng)租公寓第二,僅次于自如。于2020年1月17日在紐約證券交易所正式掛牌上市,成為2020年登陸紐交所的中國(guó)第一股。然而,風(fēng)口退去,加之突如其來(lái)的疫情,于近日暴雷,已有很多文章對(duì)蛋殼公寓的商業(yè)模式、租金貸、管理方式等進(jìn)行了深入分析。
本文僅從數(shù)據(jù)角度出發(fā),爬取了蛋殼公寓深圳區(qū)域所有在租公寓信息,清洗數(shù)據(jù),并進(jìn)行可視化分析,為大家了解蛋殼公寓提供一個(gè)新的視角。
可視化分析
區(qū)域分布
通過(guò)繪制深圳市蛋殼公寓分布地圖,我們可以很直觀的看出,蛋殼公寓主要分布在深圳的發(fā)展中心以及軸線上,前海中心與福田羅湖中心的公寓租金價(jià)格明顯高于其他區(qū)域。軸線基于便捷的軌道交通串聯(lián),周邊配套較為齊全,滿足了廣大年輕白領(lǐng)的租住需求。
具體從行政區(qū)分布來(lái)看,龍崗區(qū)雖然整體公寓租金相對(duì)更低,但公寓數(shù)量高于福田和南山區(qū)。蛋殼公寓的分布與貝殼找房較為類似,但貝殼在租房源數(shù)量上遠(yuǎn)高于蛋殼。深圳貝殼租房數(shù)據(jù)分析可查看本公眾號(hào)往期原創(chuàng)文章:睡地?cái)俹r租房?Python分析深圳租房數(shù)據(jù)告訴你。
從小區(qū)分布來(lái)看,位于龍崗區(qū)的錦薈PARK在租公寓最多,共有83個(gè)房源。
錦薈PARK周邊配套齊全,地鐵上蓋,靠近大生體育公園,1公里內(nèi)產(chǎn)業(yè)配套有金輝工業(yè)園、志華工業(yè)園、中和盛世珠寶文化創(chuàng)意創(chuàng)新產(chǎn)業(yè)園等,對(duì)勞動(dòng)力具有一定吸引力。同時(shí)還有醫(yī)院、文體廣場(chǎng)等,可以滿足都市白領(lǐng)生活一站式服務(wù)需求。
租金分布
深圳蛋殼公寓平均租金為1911元/月,第一、第二、第三四分位數(shù)分別為1530,1870,2192,說(shuō)明房租還是比較集中的。
對(duì)深圳蛋殼公寓租金進(jìn)行分段,我們發(fā)現(xiàn)公寓的價(jià)格主要集中在1000-2000元/月之間,共計(jì)2995個(gè),占比59.71%。其次是2000-3000元/月,數(shù)量為1798,占比35.84%。
面積分布
深圳蛋殼公寓面積集中在10㎡以下和10-20㎡,10-20㎡的公寓共有2415個(gè),占比達(dá)48.14%,10㎡以下的公寓也不少,數(shù)量為2206個(gè),占比43.98%。
戶型分布
深圳蛋殼公寓在租的房屋戶型大部分為4室1衛(wèi),占比高達(dá)58.64%,其次是5室1衛(wèi),占比18.72%。
樓層分布
從深圳蛋殼公寓所在樓層分布來(lái)看,其南山區(qū)和福田區(qū)的公寓所在樓層相對(duì)更高。
大多數(shù)的公寓分布在10層以下,占比58.59%,40層以上的公寓僅有 42個(gè),占比0.84%。
周邊地鐵
深圳蛋殼公寓普遍距離地鐵較近,平均距離為592米,距離地鐵最遠(yuǎn)的公寓也不到2公里,完全可以步行解決軌道出行問(wèn)題。
相關(guān)性分析
從相關(guān)系數(shù)表可以看出,深圳蛋殼公寓的面積、周邊地鐵數(shù)對(duì)公寓的價(jià)格有較大的的影響,相關(guān)系數(shù)分別為0.54和0.22。蛋殼公寓在進(jìn)行房屋定價(jià)時(shí),對(duì)公寓的面積以及公寓的地鐵配套有較大權(quán)重的考慮。由于深圳蛋殼所有的公寓距離地鐵都不到2公里,距離的遠(yuǎn)近對(duì)公寓的價(jià)格影響有限。另外,所在樓層也不是蛋殼主要考慮的定價(jià)因素。
技術(shù)實(shí)現(xiàn)
數(shù)據(jù)來(lái)源
蛋殼公寓網(wǎng)頁(yè)結(jié)構(gòu)相對(duì)簡(jiǎn)單,數(shù)據(jù)結(jié)構(gòu)統(tǒng)一,簡(jiǎn)單的url翻頁(yè)構(gòu)造即可。本文用request請(qǐng)求到數(shù)據(jù),用xpath對(duì)返回的數(shù)據(jù)進(jìn)行解析,最后以追加模式將數(shù)據(jù)存儲(chǔ)為csv文件。爬蟲(chóng)核心代碼如下:
def get_danke(href):
time.sleep(random.uniform(0, 1)) #設(shè)置延時(shí),避免對(duì)服務(wù)器產(chǎn)生壓力
response = requests.get(url=href, headers=headers)
if response.status_code == 200: #部分網(wǎng)頁(yè)會(huì)跳轉(zhuǎn)404,需要做判斷
res = response.content.decode('utf-8')
div = etree.HTML(res)
items = div.xpath("/html/body/div[3]/div[1]/div[2]/div[2]")
for item in items:
house_price=item.xpath("./div[3]/div[2]/div/span/div/text()")[0]
house_area=item.xpath("./div[4]/div[1]/div[1]/label/text()")[0].replace('建筑面積:約','').replace('㎡(以現(xiàn)場(chǎng)勘察為準(zhǔn))','')
house_id=item.xpath("./div[4]/div[1]/div[2]/label/text()")[0].replace('編號(hào):','')
house_type=item.xpath("./div[4]/div[1]/div[3]/label/text()")[0].replace('\n','').replace(' ','').replace('戶型:','')
house_floor=item.xpath("./div[4]/div[2]/div[3]/label/text()")[0].replace('樓層:','')
house_postion_1=item.xpath("./div[4]/div[2]/div[4]/label/div/a[1]/text()")[0]
house_postion_2=item.xpath("./div[4]/div[2]/div[4]/label/div/a[2]/text()")[0]
house_postion_3=item.xpath("./div[4]/div[2]/div[4]/label/div/a[3]/text()")[0]
house_subway=item.xpath("./div[4]/div[2]/div[5]/label/text()")[0]
else:
house_price = ""
house_area = ""
house_id = ""
house_type = ""
house_floor = ""
house_postion_1 = ""
house_postion_2 = ""
house_postion_3 = ""
house_subway = ""
數(shù)據(jù)清洗
導(dǎo)入數(shù)據(jù)
import pandas as pd
import re
df = pd.read_csv('/菜J學(xué)Python/數(shù)據(jù)分析/蛋殼公寓/sz_danke.csv')
df.sample(10)

查看數(shù)據(jù)信息
df.info()

數(shù)據(jù)切分
#租金分段
df['租金分段'] = pd.cut(df['價(jià)格'],[0,1000,2000,3000,4000,1000000],labels=['1000元以下','1000-2000元','2000-3000元','3000-4000元','4000元以上'],right=False)
#面積分段
df['面積分段'] = pd.cut(df['面積'],[0,10,20,30,40,1000000],labels=['10㎡以下','10-20㎡','20-30㎡','30-40㎡','40㎡以上'],right=False)
#樓層分段
df['所在樓層']=df['樓層'].apply(lambda x:x.split('/')[0])
df['所在樓層'] = df['所在樓層'].astype("int")
df['樓層分段'] = pd.cut(df['所在樓層'],[0,10,20,30,40,1000000],labels=['10層以下','10-20層','20-30層','30-40層','40層以上'],right=False)
地鐵字段清洗
def get_subway_num(row):
subway_num=row.count('號(hào)線')
return subway_num
def get_subway_distance(row):
distance=re.search(r'\d+(?=米)',row)
if distance==None:
return -1
else:
return distance.group()
df['地鐵數(shù)']=df['地鐵'].apply(get_subway_num)
df['距離地鐵距離']=df['地鐵'].apply(get_subway_distance)
df['距離地鐵距離']=df['距離地鐵距離'].astype("int")
數(shù)據(jù)可視化
各行政區(qū)公寓數(shù)量
#柱狀圖
df3 = df["位置1"].value_counts()
df3 = df3.sort_values(ascending=False)
df3 = df3.round(2)
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
.add_xaxis(df3.index.to_list())
.add_yaxis("",df3.to_list())
.set_global_opts(title_opts=opts.TitleOpts(title="各行政區(qū)公寓數(shù)量",subtitle="數(shù)據(jù)來(lái)源:蛋殼公寓 \t制圖:菜J學(xué)Python",pos_left = 'left'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=14)), #更改橫坐標(biāo)字體大小
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=14)), #更改縱坐標(biāo)字體大小
)
.set_series_opts(label_opts=opts.LabelOpts(font_size=16))
)
c.render_notebook()
小區(qū)公寓數(shù)量TOP10
#條形圖
df7 = df["小區(qū)"].value_counts()[:10]
df7 = df7.sort_values(ascending=True)
df7 = df7.tail(10)
print(df7.index.to_list())
print(df7.to_list())
c = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
.add_xaxis(df7.index.to_list())
.add_yaxis("",df7.to_list()).reversal_axis() #X軸與y軸調(diào)換順序
.set_global_opts(title_opts=opts.TitleOpts(title="小區(qū)公寓數(shù)量TOP10",subtitle="數(shù)據(jù)來(lái)源:蛋殼公寓 \t制圖:菜J學(xué)Python",pos_left = 'left'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改橫坐標(biāo)字體大小
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=13)), #更改縱坐標(biāo)字體大小
)
.set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
)
c.render_notebook()
蛋殼公寓租金分布
#玫瑰圖
df11 = df["租金分段"].value_counts()
df11 = df11.sort_values(ascending=False)
df11 = df11.round(2)
print(df11)
c = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
.add(
"",
[list(z) for z in zip(df11.index.to_list(),df11.to_list())],
radius=["30%", "70%"], #圓環(huán)的粗細(xì)和大小
rosetype='area'
)
.set_global_opts(legend_opts = opts.LegendOpts(is_show = False),title_opts=opts.TitleOpts(title="蛋殼公寓租金分布",subtitle="數(shù)據(jù)來(lái)源:蛋殼公寓\n制圖:菜J學(xué)Python",pos_top="0.5%",pos_left = 'left'))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:go7utgvlrp%",font_size=16))
)
c.render_notebook()
蛋殼公寓樓層分布
# 漏斗圖
count = df['樓層分段'].value_counts() # pd.Series
print(count)
job = list(count.index)
job_count = count.values.tolist()
from pyecharts.charts import Funnel
c = (
Funnel(init_opts=opts.InitOpts(theme=ThemeType.WALDEN))
.add("", [list(i) for i in zip(job,job_count)])
.set_global_opts(
title_opts=opts.TitleOpts(title="蛋殼公寓樓層分布",subtitle="數(shù)據(jù)來(lái)源:蛋殼公寓\n制圖:菜J學(xué)Python",pos_top="0.1%",pos_left = 'left'),legend_opts = opts.LegendOpts(is_show = False))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:go7utgvlrp%",font_size=16))
)
c.render_notebook()
參考文獻(xiàn)
1.公眾號(hào)@地產(chǎn)一條 :誰(shuí)能拯救蛋殼?
2.公眾號(hào)@Datawhale:數(shù)據(jù)項(xiàng)目總結(jié)--蛋殼公寓租金分析!
3.知乎@方先生:蘇州市蛋殼公寓租房分析
4.天下銀保@馬嘉辛 :蛋殼公寓深陷流動(dòng)性危機(jī)!房東、租客、銀行都慌了,租金貸成“萬(wàn)惡之源”?
往期推薦:
收藏 | 49 個(gè) Python 學(xué)習(xí)資源
我都逛哪些技術(shù)網(wǎng)站?(程序員必備58個(gè)網(wǎng)站匯總)
肝!精心整理了 50 個(gè)數(shù)據(jù)源網(wǎng)站!
