本次分析的数据为爬取链家网租房首页的3000余条整租房源数据。数据量较小,分析结果难免存在偏差,本分析报告仅作为实战项目展示。本报告中所描述的平均租金指单套房源租金的中位数。

数据源可至百度网盘提取,永久有效。
链接:https://pan.baidu.com/s/1EqfsnGlb63HeUlKlQfGEgg
提取码:i20b

本项目分为两部分,数据清洗、可视化探索。本文为第二部分,第一部分可前往查看。
链家网北京市租房数据分析python实战——数据清洗

以下是可视化探索的正文内容,大部分图是jupyter截图或导出图片。

导入数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('ggplot') plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedata = pd.read_csv('data_cleaned.csv', index_col=0)
data['区商圈'] = data['行政区'] + ' ' + data['商圈'] # 增加一列区商圈

数据概览

data.info()

data.describe()

data[data['租金']==data['租金'].max()]
data[data['租金']==data['租金'].min()]
data[data['单价']==data['单价'].max()]
data[data['单价']==data['单价'].min()]

爬取的数据源,经过清洗和整理,得到2934条整租房源信息。

面积最大为156平方米,最小为8平方米。 月租金最高为6800元/套,有3套房源,分别位于东城区、朝阳区;最低为460元/套,是位于昌平区鼓楼大街的一处地下室。 单套房源的月租金单价最高为437.5元/平方米,位于海淀区苏州桥,面积只有8平方米;最低为14.4元/平方米,是位于房山区良乡的一处地下室。

1. 房源租金

本节是对得到的2934套房源数据进行分析,得出结论。

北京市整体

从箱型分布看出,全市整租房源的租金主要分布在2500-5500元/套左右,平均租金为3850元/套。

plt.figure(figsize=(6, 10))
ax = plt.subplot()sns.boxenplot(y='租金', data=data)ax.set_ylabel('租金(元/月)', fontsize=15)
ax.set_title('房源租金分布', fontsize=18)

不同区域

把从区域租金按照价格高低分成三个不同的级别

第一级别:海淀区、朝阳区、西城区、东城区,平均租金在4500-5000元/套。

第二级别:亦庄开发区、丰台区、石景山区,平均租金在3500-4000元/套。

第三级别:房山区、通州区、顺义区、门头沟区、昌平区、大兴区、密云区,平均租金在2400-3000元/套。

plt.figure(figsize=(14,10))
ax = plt.subplot()sns.boxenplot(x='行政区', y='租金', data=data)
ax.set_xlabel('区域', fontsize=18)
ax.set_ylabel('租金(元/月)', fontsize=18)
ax.set_xticklabels(ax.get_xticklabels(), rotation=25)
ax.tick_params(labelsize=16)
ax.set_title('不同区域租金分布', fontsize=20)plt.savefig('不同区域租金分布.png')

2. 房源数量

从租房客户群的选择倾向考虑,首要关注的几个因素是房屋的租金、位置(区域+商圈)、户型、面积等。

一般租房的心路历程:
依据工作地点、通勤时间、熟悉程度,会大致划分出一片意向租房区。
然后通过中介、论坛等途径来找房源,在权衡租金、位置、户型、面积等因素后,对待选房源的朝向、装修、楼层、是否有电梯等特征,及水电燃气采暖性质等基础配套进行对比。
最终选择出一套合适的房源。

本节对2934套房源数据进行概览,找出要切入的点,在下一节深入分析。

2.1 首要因素

1. 在北京市房屋租赁市场中,整租房源数量最多的行政区是朝阳区,排名前3的商圈分别是顺义区顺义城、房山区良乡、朝阳区定福庄。

朝阳区面积470.8平方千米,在城六区中居首位,分析结果较为准确。 下一节主要分析朝阳区的商圈价格,看哪一片的房源又多又便宜。

根据一般认知,房源数量的第二位应该是海淀区,可能是因为数据源仅为链家租房首页的3000余条数据,结果可能与实际存在一些偏差。对此不进行深入探讨。

2. 主要户型是2室1厅1卫,1室1厅1卫,1室0厅1卫。多数房源的面积是在30-60平方米这个区间内。

1室的户型还是有很大的市场,也是很多单身人士的首选。所以我想关注这一户型房源的位置,配套,主要是价格。

1室1厅1卫的面积多在30平方米,1室0厅1卫价格也是2000-4000不等。 2室1厅1卫、2室2厅1卫的区别在于餐厅、客厅的区别。

fig, axes = plt.subplots(2, 2, figsize=(20, 18)) # 绘制2*2多子图
fig.subplots_adjust(hspace=0.5, wspace=0.1) # 设置子图的间距area = data['行政区'].value_counts()
# area.plot.bar(ax=axes[0, 0], rot=50)
sns.barplot(area.index, area, palette='Blues_d', ax=axes[0, 0])
axes[0, 0].tick_params(labelsize=15) # 设置轴刻度文字大小,两个轴同时设置
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=35) # 设置轴刻度文字方向,旋转角度
axes[0, 0].set_xlabel('区域', fontsize=18)
axes[0, 0].set_ylabel('房源数量', fontsize=18)trade_top20 = data['区商圈'].value_counts()[:20]
sns.barplot(trade_top20.index, trade_top20, palette='Blues_d', ax=axes[0, 1])
axes[0, 1].tick_params(labelsize=15)
axes[0, 1].set_xticklabels(axes[0, 1].get_xticklabels(), rotation=70)
axes[0, 1].set_xlabel('Top20商圈', fontsize=18)
axes[0, 1].set_ylabel('')type_top10 = data['户型'].value_counts()[:10]
sns.barplot(type_top10.index, type_top10, palette='Blues_d', ax=axes[1, 0])
axes[1, 0].tick_params(labelsize=15)
axes[1, 0].set_xticklabels(axes[1, 0].get_xticklabels(), rotation=30)
axes[1, 0].set_xlabel('Top10户型', fontsize=18)
axes[1, 0].set_ylabel('房源数量', fontsize=18)# 现在一般认知中,90㎡以下是小户型,zhidao90-144平米的就是中户型,144以上属于大户型。根据对业务理解,划分面积区间。
bins = [7, 15, 30, 60, 90, 125, 156]
size = pd.cut(data['面积'], bins).value_counts()
sns.barplot(size.index, size, palette='Blues_d', ax=axes[1, 1])
axes[1, 1].tick_params(labelsize=15)
axes[1, 1].set_xticklabels(axes[1, 1].get_xticklabels(), rotation=0)
axes[1, 1].set_xlabel('面积区间', fontsize=18)
axes[1, 1].set_ylabel('')plt.suptitle('房源数量分布总览', fontsize=25) # 多子图加总标题

6层板楼一般属于老旧小区,这类房源最多,远远多于其他楼层的房子。

既然数量多,那价格会与普通房源有差别吗?下一节会重点分析6层老房的价格,及其所处的商圈。

fig = plt.figure(figsize=(15, 8))
ax = plt.subplot()total_floor = data['总楼层'].round().value_counts()
sns.barplot(x = total_floor.index, y = total_floor, palette='Blues_d') # palette修改调色板
ax.tick_params(labelsize=15)
ax.set_xlabel('总楼层', fontsize=18)
ax.set_ylabel('房源数量', fontsize=18)
ax.set_title('房源所在楼栋总层高', fontsize=20)

2.2. 房源特征

从2934条信息来看房源的基本特征:
常见的朝向有南北朝向、朝南、朝西、朝东、朝北。
简装修的房源占比较多,为73.42%
楼层高度分布均匀,有1.64%的地下室出租
有电梯的房源占比为40.35%

fig, axes = plt.subplots(2, 2, figsize=(14, 10))
plt.subplots_adjust(wspace=0.1, hspace=0.4)deco = data['装修'].value_counts()  # fine decoration 装修
axes[0, 1].pie(deco, autopct='%.2f%%', explode=[0.01, 0.01], labels=['简装', '精装'], startangle=90)
axes[0, 1].set_title('装修', fontsize=16)elebator = data['电梯'].value_counts() # elebator 电梯
axes[1, 1].pie(elebator, autopct='%.2f%%', explode=[0.01, 0.01], labels=['无', '有'], startangle=90)
axes[1, 1].set_title('电梯', fontsize=16)loc = data['朝向'].value_counts()[:10] # 房屋朝向 location
sns.barplot(loc.index, loc, ax=axes[0, 0], palette='Blues_d')
axes[0, 0].set_title('Top10 朝向', fontsize=16)
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=45, fontsize=12)
axes[0, 0].set_ylabel('房源数量')floor = data['楼层位置'].value_counts() # 楼层 floor
axes[1, 0].pie(floor, autopct='%.2f%%', explode=[0.01, 0.01, 0.01, 0.01], labels=['高楼层', '中楼层', '低楼层', '地下室'], startangle=90)
axes[1, 0].set_title('楼层', fontsize=16)plt.suptitle('房源特征', fontsize=20)plt.savefig('房源特征.png')

2.3 基础设施

从房源的基础设施来看,有80%左右的房源分别提供民水、民电、燃气、集中供暖。

房源特征和基础设施部分,只做基础了解,后续暂不进行深入分析。

fig, axes = plt.subplots(2, 2, figsize=(10, 10))water = data['用水'].value_counts()
axes[0, 0].pie(water, autopct='%.2f%%', explode=[0.01, 0.01, 0.01], labels=['民水', '暂无数据', '商水'], startangle=90, )
axes[0, 0].set_title('用水性质', fontsize=18)electric = data['用电'].value_counts()
axes[0, 1].pie(electric, autopct='%.2f%%', explode=[0.01, 0.01, 0.01], labels=['民电', '暂无数据', '商电'], startangle=90)
axes[0, 1].set_title('用电性质', fontsize=18)gas = data['燃气'].value_counts()
axes[1, 0].pie(gas, autopct='%.2f%%', explode=[0.01, 0.01, 0.01] , labels=['有', '无', '暂无数据'], startangle=90)
axes[1, 0].set_title('是否供燃气', fontsize=18)heating = data['采暖'].value_counts()
axes[1, 1].pie(heating, autopct='%.2f%%', explode=[0.01, 0.01, 0.01], labels=['集中供暖', '自采暖', '暂无数据'], startangle=90)
axes[1, 1].set_title('采暖性质', fontsize=18)plt.suptitle('房源基础设施', fontsize=20)

3. 细分市场

目前我居住在朝阳区,近期会有重新租房的打算,重点想关注1室的房子。

结合个人情况,对位置、户型、总楼层做具体分析,给之后的租房计划提供参考信息,以求租到物美价廉的房子。

位置:朝阳区的商圈,房源数量、租金。

户型:1室1厅1卫、1室0厅1卫、1室0厅0卫、1室1厅0卫。

总楼层:6层

缩小范围后,最终做选择时,再对单价进行对比。
前期在大范围做单价对比是没有意义的,房子也不是按照平方米来出租的。

3.1 朝阳区商圈

朝阳区的房源有854套,对此进行分析,得出以下结论:
朝阳区各大商圈中,平均租金相对较低有首都机场、立水桥、双桥、豆各庄、管庄等,再结合房源数量来看,选择在双桥、管庄租房是一个不错的选择。

chaoyang = data[data['行政区']=='朝阳']
chaoyang_group = chaoyang.groupby('商圈')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')])
chaoyang_price = chaoyang_group[chaoyang_group['房源数量'] > 9 ].sort_values(by='平均租金') # 筛选出超过10套房源的商圈,按照租金进行升序排序# 可视化
fig, ax = plt.subplots(1, 1, figsize=(23, 10))
ax1 = ax.twinx()chaoyang_price['房源数量'].plot.line(ax=ax1, color='green', linewidth=4) # 要先画折线图,后画柱状图
ax1.legend(('房源数量', ), loc='upper center', fontsize=20) # 图例要用元组才可以显示全 chaoyang_price['平均租金'].plot.bar(ax=ax, color='blue', alpha=0.5) # 柱状图
ax.legend(('平均租金', ), fontsize=20)ax.set_xlabel('朝阳区商圈', fontsize=23)
ax.set_ylabel('平均租金', fontsize=20)
ax.set_xticklabels(ax.get_xticklabels(), fontsize=23, rotation=30)
ax.tick_params(labelsize=20)ax1.set_ylabel('房源数量', fontsize=20)
ax1.set_ylim(0, 90) # 设置y轴范围
ax1.tick_params(labelsize=20)ax1.set_title('朝阳区各大商圈的平均租金与房源数量', fontsize=25)plt.savefig('朝阳区各大商圈的平均租金与房源数量.png')

chaoyang.describe()

3.2 户型为1室的房源

户型为1室的房源共1511条,对此进行分析,得出以下结论:

对于想要选择户型为1室的租客,且首要考虑因素为价格的,可选择在郊区租房,如房山区的良乡、长阳商圈,昌平区的鼓楼大街商圈、顺义区的顺义城、后沙峪商圈。这些商圈房源的平均租金在3000元以下。

若想要在城六区租房(东城区、西城区、朝阳区、海淀区、丰台区、石景山区),从租金和房源数量综合考虑,可选择东城区东四、崇文门,朝阳区双桥、定福庄、潘家园。

整体来看,亦庄开发区也是一个不错的选择,距主城区不是很远,平均租金在3800元,房源数量27套。

type1 = data[data['户型'].isin(['1室1厅1卫', '1室0厅1卫', '1室0厅0卫', '1室1厅0卫'])] # 1室的房源共1511条
type1_group = type1.groupby('区商圈')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')]) # 按照区商圈分类,并计算count, median
type1_price = type1_group[type1_group['房源数量']>14].sort_values(by='平均租金') # 筛选出超过15套房源的商圈,按照租金进行升序排序# 可视化
fig, ax = plt.subplots(1, 1, figsize=(23, 10))
ax1 = ax.twinx()type1_price['房源数量'].plot.line(ax=ax1, color='red' ,linewidth=4)
# ax1.set_ylim(0, 70)
ax1.set_yticks([0, 20, 40, 60, 80]) # 设置y轴的刻度范围及标记,默认不从0开始
ax1.legend(('房源数量',), loc='upper center', fontsize=20)type1_price['平均租金'].plot.bar(ax=ax, color='blue', alpha=0.5)
ax.legend(('平均租金',), fontsize=20)ax.set_xticklabels(ax.get_xticklabels(), rotation=65)
ax.set_xlabel('')
ax.set_ylabel('平均租金', fontsize=20)
ax.tick_params(labelsize=20)
ax1.set_ylabel('房源数量', fontsize=20)
ax1.tick_params(labelsize=20)ax.set_title('1室户型的平均租金与房源数量', fontsize=25)

type1['租金'].describe()

3.3 总楼层为6层的老房

对6层的老房和其他房源的平均租金进行对比,发现没有明显特征差异。

floor6 = data[data['总楼层']==6]
floor7 = data[data['总楼层']!=6]floor6_qu = floor6.groupby('行政区')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')])
floor7_qu = floor7.groupby('行政区')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')])floor_merge = pd.merge(floor6_qu, floor7_qu, left_index=True, right_index=True)
floor_compare = floor_merge[['平均租金_x', '平均租金_y']].rename(columns={'平均租金_x': '6层老房', '平均租金_y':'其它'}).sort_values(by='6层老房')#可视化
fig = plt.figure(figsize=(20, 10))
ax = plt.subplot()floor_compare.plot.bar(ax=ax, alpha=0.8)
ax.legend(fontsize=20)ax.tick_params(labelsize=20)
ax.set_xticklabels(ax.get_xticklabels(), rotation=30)ax.set_xlabel('')
ax.set_ylabel('平均租金', fontsize=20)ax.set_title('6层老房与其它房的平均租金对比', fontsize=25)


6层的老房子有1317套,按照区商圈进行分组。
房山区良乡、顺义区顺义城、朝阳区的定福庄3个商圈在租的老房最多。
城六区中,石景山区苹果园、丰台区和义商圈的平均租金较低,可以作为选择范围。

floor6_group = floor6.groupby('区商圈')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')])
floor6_price = floor6_group[floor6_group['房源数量']>14].sort_values(by='平均租金')# 可视化
fig, ax = plt.subplots(1, 1, figsize=(23, 10))
ax1 = ax.twinx()floor6_price['房源数量'].plot.line(ax=ax1, color='yellow', linewidth=4 )
ax1.legend (('房源数量',), loc='upper center', fontsize=20)floor6_price['平均租金'].plot.bar(ax=ax, color='blue', alpha=0.5)
ax.legend(('平均租金',), fontsize=20)ax.set_xticklabels(ax.get_xticklabels(), fontsize=20, rotation=70)
ax.tick_params(labelsize=20)
ax.set_xlabel('')
ax.set_ylabel('平均租金', fontsize=20)
ax1.tick_params(labelsize=20)
ax1.set_ylabel('房源数量', fontsize=20)
ax1.set_ylim(0, 160)ax.set_title('6层老房的平均租金与房源数量', fontsize=25)plt.savefig('6层老房的平均租金与房源数量.png')

4.总结

本次的链家网北京市租房数据分析python实战,在通过数据清洗、可视化探索后,得出了一些小结论。

  • 从房源数量看:

朝阳区在租房源最多,排名前3的商圈分别是顺义区顺义城、房山区良乡、朝阳区定福庄。
总楼层为6层的老房,在租房源远多于其它楼栋的房子,但是二者的租金并无较大差异。

  • 租房较常考虑的因素方面:

主要户型是2室1厅1卫,1室1厅1卫,1室0厅1卫。
多数房源的面积是在30-60平方米这个区间内。
常见的朝向有南北朝向、朝南、朝西、朝东、朝北。
简装修的房源占比较多,为73.42%
有电梯的房源占比为40.35%。
房源的相对楼层(高、中、低楼层)分布均匀,还有1.64%的地下室出租。
有80%左右的房源分别提供民水、民电、燃气、集中供暖。

  • 细分市场:

如果要在朝阳区租房,可以选择双桥、管庄商圈,房源数量多,平均租金相对较低为4400元。
如果要选择1室的户型,亦庄开发区是一个不错的选择,距主城区不是很远,平均租金在3800元,房源数量27套。

  • 本项目可改进之处:
  • 数据量较少,也不一定是均匀分布的数据。 后续可爬取更多数据,进行分析。
  • 在细分市场的分析较少。后续可对房源的不同特征进行组合,并设立评价指标,进行分析。

欢迎留言探讨更多可能性。

链家网北京市租房数据分析(二)——基于python的数据可视化相关推荐

  1. 链家网北京市租房数据分析(一)——基于python的数据清洗

    作为北漂中的一员,我们都明白,租房是不能回避的问题.租房被坑,也是难以避免的.多数人都有那么一段不堪回首的与黑中介面对面的往事.其实,就是贪图便宜. 便宜可以占,但是我们要理性地占便宜.要有全局观.大 ...

  2. python 爬取链家网北京租房信息

    刚学习了python,中途遇到很多问题,查了很多资料,最关键的就是要善于调试,div信息一定不要找错,下面就是我爬取租房信息的代码和运行结果: 链家的房租网站 两个导入的包 1.requests 用来 ...

  3. ER图连接线上加个圆圈什么意思_如何拿链家网的租房数据做些有意思的事情?...

    周末周六两天,做了链家网的爬虫,可能有很多朋友做过,当然很多人只是练爬虫,但没有对爬取数据进行一些可视化去发现一些比较有意思的东西,今天想要通过抓取的数据进行一些比较有趣的统计分析. 如果你想要这份数 ...

  4. 利用神经网络预测链家网上海租房价格(Python)

    代码详见:Predict-house-rent-with-neutral-network 简介 本项目利用Python的scrapy框架爬取链家网的上海市租房信息,利用pandas.numpy.mat ...

  5. python链家网高并发异步爬虫and异步存入数据

    python链家网二手房异步IO爬虫,使用asyncio.aiohttp和aiomysql 很多小伙伴初学python时都会学习到爬虫,刚入门时会使用requests.urllib这些同步的库进行单线 ...

  6. python聚类算法中x是多维、y是一维怎么画图_基于Python的数据可视化:从一维到多维...

    目录 一.iris数据集介绍 二.一维数据可视化 三.二维数据可视化 四.多维数据可视化 五.参考资料 一.iris数据集介绍 iris数据集有150个观测值和5个变量,分别是sepal length ...

  7. 『数据可视化』基于Python的数据可视化工具

    刘宇宙,现在一家创业型公司做技术总负责,做爬虫和数据处理相关工作,曾从事过卡系统研发.金融云计算服务系统研发,物联网方向大数据研发,著书一本,<Python3.5从零开始学> 如何做Pyt ...

  8. 链家网杭州租房信息数据爬取+数据分析

    参考https://mp.weixin.qq.com/s/vvZ2yBb2eMKP800LUPoAWg 需求分析¶ 过去一个月,全国热点城市的房租如脱缰野马.一线的房租同比涨了近20%.一夜醒来,无产 ...

  9. python pyecharts_基于Python的数据可视化库pyecharts介绍

    什么是pyecharts? pyecharts 是一个用于生成 Echarts 图表的类库. echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化.pyecharts 是一个用于生 ...

最新文章

  1. Yahoo中国变脸?
  2. (转)json-lib 的maven dependency
  3. 简明 Git 命令速查表
  4. [高级软件工程教学]团队Beta阶段成绩汇总
  5. java怎么获取该项目系统的参数_Java 获取系统参数
  6. HH SaaS电商系统服务商品在移动端下单结算的交互设计
  7. 三宝机器人怎么充电_巨人通力导致吉祥三宝+36号故障怪现象的又一因素
  8. bzoj 1095 捉迷藏
  9. 源服务器未能找到目标资源的表示或者不愿,java - 源服务器没有找到目标资源的当前表示,或者不愿意透露一个存在。 关于部署到 tomcat - 堆栈内存溢出...
  10. java创建xml设置路径_java 写入xml文件 地址如何设置为局域网内的另一台服务器上...
  11. 如何运行项目或工程中的单独java文件---找不到或无法加载主类”错误的原因
  12. uoj#267. 【清华集训2016】魔法小程序(乱搞)
  13. CSS实现输入框的高亮效果-------Day50
  14. Ubuntu 12.04 下安装 Eclipse
  15. 「首席看业务架构」商业模式画布
  16. 深入浅出SSD 学习笔记整理——Johnathan Sung
  17. 数字功放和模拟功放差异介绍
  18. 北京2008年奥运会体育图标
  19. 成长感悟:谁定义了你的大学生活
  20. 作也 努力努力在努力

热门文章

  1. c语言二维函数杨辉三角,C语言编写杨辉三角(二维数组方法)
  2. 淘宝/京东/京粉 QQ 消息 转链 软件
  3. 【数学】C101_LQ_埃及分数 分数(简单数学分析 | 模拟 / 求公比)
  4. LTE QPSK 16QAM星座图、调制符号与bit序列映射关系
  5. OpenNMS守护程序名称
  6. java使用json的时候常见的引包错误
  7. HTML5 六 MathML
  8. 16apsk matlab,与低计算复杂度解映射相结合的16APSK星座优化
  9. ChatGPT 被大面积封号,到底发生什么了?
  10. redis锁和分布式锁的实现