本次分析的租房数据主要来源于上一篇博客中获取的“房天下”网站租房信息,对该数据分析主要使用了Pandas数据处理库。
将数据保存到MongoDB数据库后,在这里使用数据库可视化工具robo3t,将数据以表格的形式出现,可以看到北京租房数据如图1所示。
首先需要将MongoDB的数据读取到Pandas库的DataFrame数据中,DataFrame类似于表格数据,而且有很多对数据处理有用的函数。此外并不是每条数据的所有信息都对本次分析有价值,可以筛选每条记录的city、price、rooms、area、region和titile字段,保存到一个列表中,最终将该列表转化为DataFrame,具体代码如下:
def coll_to_dataframe(coll):
table = db[coll]
data=list(table.find())
data_list=[]
for d in data:
temp={}
temp['city']=d['city']
temp['price']=d['price']
temp['rooms']=d['rooms']
temp['area']=d['area']
temp['region']=d['region']
data_list.append(temp)
df = pd.DataFrame(data_list)
将数据放入DataFrame构造器后,各字段的内容并没有改变。如图5-1所示。求每月的平均租金需要对数字进行操作,因此,将price和area字段转变为数字,操作df如下:
df['price']=df['price'].str.replace('元/月','').astype(float)
df['area']=df['area'].str.replace('㎡','').astype(float)
这样通过将df[‘price’],df[‘area’]转变为字符串,然后将’元/月’和’㎡’通过空字符代替,就可以将price和area字段转变为float类型。
处理数据前,需要检查缺失值和空值,通过df.info()函数可以查看df的相关信息。如图2所示,可以看到一共48894条记录,每个字段都没有缺失,所以不需要进行缺失值处理。
图2 表格相关信息图
处理数据过程中会看到如图3所示的异常值,这几条信息存放在city为‘shengzhen’的集合中,但是地区却是东莞市,这应该是商家信息发布有误,通过查看地址address,发现这些房子属于东莞市。由于数据量较小,可将这些房子city字段修改为东莞,并移到数据库‘dongguan’的集合中。(在写代码时并未想到Mongodb数据库可以用中文命名集合)
图3 数据异常值图
此外,还有如图4所示的异常数据。
图4中数据并未表明该房所在市区,这对后面分析求各个区的均值较为不利,但该房屋属于深圳,不能简单将其删除,会影响该市总体均值。因此,需要在求该市各区均值市进行筛选,将通过下面语句删除:
df_temp=df_temp[~(df_temp['region'].isin(['龙军花园','汇隆中心','明景园']))]
爬虫的过程中偶尔出现对某个网页的重复爬取或者商家在不同的时间段发布了重复的租房信息,这些重复信息将影响平均值的计算,DataFrame构造器中的duplicated()函数可以判断是否存在重复值。可通过以下语句进行重复值的删除:
df.duplicated()
df=df.drop_duplicates()
在获取租房信息时,一些房东为吸引租客,发布虚假或错误信息。因此,存在不完整信息和离群值。散点图可以很好的观察出异常值。如图5所示,将面积与价格的关系以散点图的方式展现,观察离群值。从图中可以看出,有一点价格高达200万元,还有房屋面积大于2000平方米,价格却贴近x轴,接近于零的几个点,很明显不符合实际情况。将这些点筛选出来查看其它信息,发现信息确实存在异常,所以将这些样本值剔除。
该散点图主要使用了Matplotlib进行作图。
import matplotlib.pyplot as plt
df.plot.scatter(x='area',y='price')
plt.figure()
plt.show()
筛选area小于450的作散点图
df1=df[df['area']<450]
df1.plot.scatter(x='area',y='price')
plt.figure()
plt.show()
数据处理需要将网络上庞杂的信息,经过清洗可转变为有价值的信息。由于网上信息存在很多不规范的地方,数据处理也显得尤为重要。它也是在数据分析过程中的基本步骤。经过以上对租房数据的数据库保存信息的数据的重复值、缺失值和异常值等处理,基本可以得到有效的租房数据,这对后面的数据分析有很大的作用。
经过上一部分对各大热门城市租房信息转变成本课题所需要的数据后,本章将从租金、地理位置和户型等多因素进行租房房价的分析。
首先对各个城市的平均月租金价格进行分析,将各个城市的月租金相加求平均值DataFrame构造器有df[‘price’].mean()聚合函数可以求均值,但求得平均值后,得出北京的月租金为10000元/月,显然不符合实际情况。原因是大城市租房大多是合租,面积对租金的影响很大。于是,需要用单价除以面积求出各大城市下每月每平方米的租金来进行比较。通过以上计算方法可以得出如图6-1所示各大城市每月每平方米的租金。
图 6 各大城市均价结果图
通过Pyecharts图表类库将以上结果渲染出图表,需要将城市信息与各大城市均值传给Bar类,具体代码如下:
#平均价格分布,data为保存了图6信息的列表
from pyecharts import Bar
chart=Bar('各大城市排名(元/平方米/月)')
#将city作为横坐标
data_city=list(map(lambda x:x['city'],data))
#将平均每平方米每月的价格作为纵坐标
data_aver=list(map(lambda x:x['aver_price'],data))
chart.add('',data_city,data_aver,is_convert=False, mark_line=['average'],mark_point=['max','min'],
is_random=True,legend_text_size=18,label_text_color=["#004"],is_label_show=True) #xaxis_rotate=270,
chart.render('average_price.html')
经过以上处理,可以得到如图7所示的柱状图。从图中可以看出,17个热门城市的租房均价为每月每平方米49.76元。然而,十七个城市中只有北京、上海、广州、深圳和杭州五个城市超过了平均线,其中北京、深圳和上海三地是平均线的两倍多。
图7热门城市平均租房房价柱状图
接下来着重分析这是十七个城市中租房房价排名前十的城市。可以通过以上的data列表进行排序,然后进行Pyecharts渲染可以得到图8所示结果。
图8租房房价排名图
代码:
#平均价格分布
average.sort(key=lambda data:data['aver_price'],reverse=True)
data=average[0:10]
print(average)
from pyecharts import Bar
chart=Bar('租房房价排名(元/平方米/月)')
#将city作为横坐标
data_city=list(map(lambda x:x['city'],data))
#将平均每平方米每月的价格作为纵坐标
data_aver=list(map(lambda x:x['aver_price'],data))
chart.add('',data_city,data_aver,is_convert=False, mark_line=['average'],mark_point=['min'],
legend_text_size=18, label_text_color=["#004"],is_label_show=True,label_color='yellow') #is_random=True,
chart.render('average_price1.html')
从图8所示中可以看出租金最贵的前十个城市中,北京、上海和深圳遥遥领先。与图7所示不同的是广州和杭州在这次排名中低于租金前十名的平均线,北京、上海和深圳抬高了整体租价水平。
由上面的数据可以看出,北京、上海、深圳和广州等一线城市的租金领跑全国。现在,重点对这几个城市的各个城区进行价格分析。通过DataFrame的分组和聚合操作可以按各个城市的城区进行分组,然后处理结果,通过树状图的形式展示,可分别得出图9,图10,图11,图12所示的结果。图中矩形面积越大表示租金越贵。
代码:
#通过DataFrame计算出每个地区月均房价数据返回为一个列表
def region_price(coll):
df_temp,city=coll_to_dataframe(coll)
#按照地区进行分组求出每个区的平均值
if city=='深圳':
df_temp=df_temp[~(df_temp['region'].isin(['惠州','中航格澜阳光花园二期','松仔园',
'伽乐园','惠鑫公寓','鸿达兴花园','龙军花园','汇隆中心','明景园']))]
#按地区分组求和
data=df_temp.groupby('region').sum()
price_region=round((data['price']/data['area']),2)#series类型不能更改为float
print(price_region)
data=dict(price_region)
li=[]
for key,value in data.items():
temp={}
temp['value']=round(float(value),2)
temp['name']=key+':'+str(round(float(value),2))
li.append(temp)
#print(li)
return li,city # 返回一个列表[{ }]
from pyecharts import TreeMap
#将各地区数据可视化
def show_regionPrice(coll):
data,city=region_price(coll)
title=city+"各区租房房价分布(元/(㎡/月))"
treemap = TreeMap(title=title, width=1200, height=600)
treemap.add(city,data, is_label_show=True, label_pos='inside',label_text_size=19)
treemap.render(coll+"_region_price1.html")
#遍历生成北上广深的各地区月均每平米租价
collection=['beijing','shanghai','guangzhou','shengzhen']
for coll in collection:
show_regionPrice(coll)
由图9结合前面的结果分析可以得到,北京90%城区的租金都高于平均价格两倍之多。其中东城区的租金高达每平米每月187.78元,租一个一百平米的房子每月需要支付租金18700元。查看相关资料得知,东城、西城、朝阳和海淀区,都处于首都的最核心位置,其中著名的中关村位于海淀区,而且东城区地铁线居多,所获取的租房信息中,可以看到其地址都距离地铁站不远。
图10上海各城区租金分布图
同样可以得到图10所示的上海城区租金分布,查阅相关信息可以得知上述图表中,每个城市租金最高的几个区的地理位置优越,都位于中心城区或附近,交通发达,是该市的经济、文化和商业中心,说明租金的高低受经济发展的影响较大。
图11 深圳各城区租金分布图
由图11深圳的租金看出,深圳南山区和福田区的租金较为突出的高。毫无意外,南山区为141.58元,可以和北京、上海的核心区域相比。南山区有腾讯、大疆、南山科技园等一大批互联网产业坐落于此,并且有七条地铁线,而南山区的GDP不仅是深圳第一,而且是广东第一。
由图12所示广州各城区的租金情况可看出,虽然广州的总体租金价格要低于地区排名前十的平均租金,但是,其中天河区、越秀区与海珠区的租金水平高于平均线,而且天河区要高出很多,为80.29元,越秀区为69.06元,海珠区为63.86元。
图12广州各城区租金分布图
由以上几大一线城市城区租金图表可知,租金最高的地方一般都位于城市的最核心位置,地铁交通便利、商业发达,并且有很多的大型公司。北京上海无论是核心区域还是边缘地区租金普遍较高。相比于北京上海的租金,深圳和广东除核心区域外,(例如:深圳南山区和福田区每平方米月租均超过100元),大部分城区的租金要低很多。
通过对十七个城市所有租房数据的户型分组统计,展示前七种户型在总体中的占比,用Pyecharts饼图展示可得到如图13所示的户型分布图。
图13 户型分布图
通过划分区间对各种户型的面积进行分组,统计各区间房间面积占总体样本的多少,然后通过环形图展示各占比如图14所示。
图14房屋面积分布图
#面积分布
df['area']=(df['area'].str.replace('㎡','').astype(int))
df=df[df['area']<800]
area=df['area']
sum_a=area.sum()
#fanwei=list(range(0,250,30))
bins =[0,30,60,90,120,150,200,300,400,800]
count=pd.cut(area.values,bins=bins,right=False)
area_range=count.value_counts()#series,区间一个数
#print(area_range)
from pyecharts import Pie
attr = ["[0-30)", "[30-60)", "[60-90)", "[90-120)", "[120-150)", "[150-200)", "[200-300)", "[300-400)",'[400-800)']
area_range=list(area_range)
pie = Pie("房屋面积分布",title_pos='center')
pie.add(
"",
attr,
area_range,
radius=[40, 70],
label_text_color=None,
is_label_show=True,
legend_orient="vertical",
legend_pos="left",)
pie.render('area_distributions.html')
由图14户型分布图,可以得出一室一厅的户型占22.26%,两室的共占37%左右,多数户型为两室和三室。这三种户型较为实用,由图6-9面积分布图,面积在[30120)平方米占据了总体样本的73%。[030)平方米这种小户型只占4.8%。
接下来将价格进行划分区间,观察市场价格多数在哪个区间内,Pandas库提供了pd.cut()函数,可以对DataFrame进行区间的划分,然后将对区间进行分组统计个数,可以将统计结果传给Pyecharts的Pie类,用玫瑰图来展示结果。
图15 租房价格分布图
df['price']=df['price']=df['price'].str.replace('元/月','').astype(int)
price=df['price']
bins=[0,2000,4000,6000,8000,10000,12000,15000]
temp=pd.cut(price.values,bins=bins,right=False)
price_count=temp.value_counts()
print(price_count)
from pyecharts import Pie
attr=['[0,2000)','[2000,4000)','[4000,6000)','[6000,8000)','[8000,10000)','[10000,12000)','[12000,15000)']
price_count=list(price_count)
pie=Pie('租房价格分布',title_pos='center')
pie.add('',attr,price_count,radius=[20,75],center=[50,60],is_label_show=True,
rosetype='radius',legend_orient="vertical",legend_pos="left")
pie.render('price_distributions.html')
从图15中可以看出一个月[0,2000)区间租金占了27.81%,这部分多为一室一厅,多半为一个人居住,[2000,4000)占到了总样本值的45%,接近一半,这部分多为两居室或者三居室,[4000,6000)这部分多为四居室及以上,比较之下这部分户型要少很多,说明大部分租房户型都是一居、两居或三居室。
在发布租房信息时,房东会把房子最重要的特点放在标题中,以此来吸引人们的浏览和点击。在获取数据时,已经将这些标题信息放在title字段中。因此,可以通过词频统计,统计这些标题中出现最多的几个词,统计词频前,需要将这些字段进行处理,删掉一些没有价值的字段,使用jieba分词来进行词频统计,然后作出词云图,将这些出租房特点展示出来。
图16 标题词云图
#用标题展示关键词词云
import jieba.analyse
title=df['title'].astype(str)
title=str(title)
#jieba分词做词频分析,找出出现前100次的分词
result=jieba.analyse.textrank(title,topK=50,withWeight=True)#输出为一个列表字典[{}]
key=[]
value=[]
for tex,widget in result:
key.append(tex)
value.append(widget)
from pyecharts import WordCloud
wordcloud= WordCloud(width=1300, height=620)
wordcloud.add("", key, value, word_size_range=[20, 100])
wordcloud.render('title_cloud.html')
如图16所示可看出,租的房子基本为装修过的,设备齐全,多为小区租房,地铁站较为重要,两居和三居较多,同时这也符合户型分布的结果。可以看出,多数人都是租住合租房,而且交通是一个很重要的考量因素。
通过对租房数据的分析,可以发现北上广深这些一线城市经济发达,集中了大量的资源、机遇。但是消费水平高,租金和房价都比其他省会城市要高很多。而杭州赶上了互联网的浪潮,发展迅速,租金也在上涨,月租金每平方米达53元,与广州的总体水平相当。
经济发展水平高,交通便利,临近地铁站,这些因素都会导致该地段的租金水涨船高。并且一线城市租金相比其他城市要高出两三倍之多。其他各个省会城市,除杭州外,每平方米月租金都低于45元。一线城市的高发展水平,高收入人群,支撑着高房租。