python二手房价格预测_分析香港2万6千套在售二手房数据,1000万的居然有那么多...

0e2c7b13da9b28fc4115856e7b53e47e.png

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于菜J学Python ,作者J哥

前言

香港的贫富差距问题一直十分尖锐,最突出的体现就是收入和楼价的巨大差异。早在60年代末香港房价就经历了暴涨,人们早已对不动产的金融属性了如指掌,全港的投资情绪一直都相当火热。

25a4aeaa60084ff7ddf301ecf6c318fc.png

即便香港当前失业率高企,经济环境较差,但购买力仍在,楼市依然坚挺。

c112f8cbcf4d4de3df55de581b1d9c51.png

为了更加深入了解香港房地产市场,本文用Pyhton采集了香港在售26281套二手房数据并做可视化分析,试图从数据层面理解香港楼市现状。

九龙房源最多,港岛价格更高

e5660ea8fd97d4590035bace9291580c.png

香港特别行政区,下辖香港岛、九龙半岛、新界3个地区共18个分区。九龙半岛在售二手房源共8108个,占比28.62%。根据中原城市指数CCI(仅包括大型屋苑),港岛报187.66点,高于香港其他地区。

6899be4d651a35f7a0db5d923b66dbc9.png

具体分区来看,香港在售二手房源集中分布在葵青区、元朗区、屯门区等地,而九龙城区、深水埗区、中西区、湾仔区、东区等地房价较高。香港在售二手房实用呎价均价为呎(折合人民币约元平方米),最低实用呎价4421/呎,最高实用呎价$96965/呎。

将军澳二手房源最多

1f12f97d62126ef8e1a140be0a5b2d4e.png

将军澳、元朗和屯门在售二手房均超1000套,其中,将军澳以2112套二手房源居首。

九龙站二手房均价最高

78caa5bad6d96a989efcf0df63e2dc72.png

九龙站、山顶/南区、贝沙湾和中半山在售二手房均价超过万呎,九龙站以37232/呎遥遥领先,远高于香港二手房整体均价。

小户型为主,2房占比超一半

0fbc5beaf1a5295983086a5e9a1373f2.png

从建筑面积来看,香港在售二手房普遍建面在500呎-1200呎(46-111平方米),占比高达78.52%,共计18825套。

96a6cf7cbd980f9389131f6c4d837539.png

从居室来看,香港在售二手房中,2房共计12231套,占比51.05%;3房共计7613套,占比31.76%;4房以上71套,占比仅为0.29%。

各楼龄段均有一定比例分布

ae0707b4f3faefd7bc50bae8fa1aa061.png

从香港在售二手房楼龄来看,25-39年楼龄的二手房源最多,共7396套,占比31.31%;15-24年5939套,占比25.36%;40年以上房源也有2347套,占比10.93%。

50%以上二手房低于1000万

4039edc5d701acf40e663ce50a7f62e1.png

从香港在售二手房售价来看,1000万(约429-858万人民币)房源数量为12301套,占比51.31%。

描述性统计

7d287a5c83a79bed8ee39820aabc4367.png

相关性分析

9c9e7163177bea5b105bf1acf7be64aa.png

6424226dc400f547fa6762086d97a3c1.png

e419d1ba28c35c82e641f347b62c8954.png

2d495d213d1e65fd23d613b979cfa030.png

从相关系数表和回归图来看,间隔(即居室)和楼龄都与香港二手房房价无明显的相关性。实用面积与房价具有较强的正相关性,一般来说,人们在看房子时看到的面积是建筑面积,但却不是实用面积。套内建筑面积=套内使用面积+套内墙体面积+阳台面积,而实用面积就是套内使用面积。另外,实用率与房价也无相关性,这与大部分人的感性认识存在偏差。

技术实现

本文数据来源于中原地产,网页结构相对简单。数据清洗主要用到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)

数据预览

8f9db7b00ed8844d270f2126bf9a4dda.png

数据清洗

建筑面积/单价

#异常字符替换为空

df["建筑面积"] = df["建筑面积"].str.replace(",","").astype("float")

df["建面单价"] = df["建面单价"].str.replace("$","").str.replace(",","").str.replace("/呎","").astype("float")

#建筑面积和建面单价缺失值用均值填充

df = df.fillna(value={"建筑面积":df["建筑面积"].mean(),"建面单价":df["建面单价"].mean()})

间隔

# 存在缺失值、换行符、非数字型、无房间数等脏数据

df["间隔"] = df["间隔"].str.replace("

","").str[:1]

df = df[ ~ df["间隔"].isin(["("])]  #删除某列包含特殊字符的行

df["间隔"] = df["间隔"].str.replace("开","0").astype("float")

df = df.fillna(value={"间隔":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=df1,color="green",marker="*",ax=axes[0])

sns.regplot(x="楼龄",y="实用单价",data=df1,color="green",marker="*",ax=axes[1])

sns.regplot(x="实用面积",y="实用单价",data=df1,color="green",marker="*",ax=axes[2])

sns.regplot(x="建筑面积",y="实用单价",data=df1,color="green",marker="*",ax=axes[3])

sns.regplot(x="实用率",y="实用单价",data=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="数据来源:中原地产 制图: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="数据来源:中原地产

制图:J哥",pos_top="1%",pos_left = "left"))

.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=16))

)

c.render_notebook()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值