看房子的思考——房产数据可视化 | 🏆 技术专题第三期征文

3,192 阅读11分钟

前言

买房子是大事情,万万马虎不得,稍有不慎就会加入维权大军,从而劳心、劳力、费时、费钱,苦不堪言。

去年陪朋友看房子,转遍了武汉三镇,终是如愿以偿。在此期间,引发了我的一些思考——

  • 1、房产是否建立一套评价体系?
  • 2、能否用一种好的可视化方式来选房?
  • 3、智能推荐房产?

1.房产评价体系

1.1.买房的初衷

每个人都有自己买房的初衷。

有的上班族说:“我只想在公司旁买个小房子方便上班,最好二手房,买了就可以住,不想等,不想把钱给房东用来还房贷。”

有的未婚或新婚夫妇说:“想买个80平的2居室结婚,方便上班,大了也买不起。”

有的已育夫妇说:“后几年可能要生二胎,想置换一个大的,同时最好是学区房,小孩子上学方便。”

有小资女孩说:“买个loft就够了,但是就要在商圈里,看电影、逛街、shopping都不耽误。”

老家有个钢材老板跟我说:“想买一个离大医院近的,环境好的,好养老。”

当然有炒房客啥都不管:“我就要买那种升值快的!”

然而大多数人的钱包都是有限的,需要反复踩点、再三斟酌,毕竟现在买房事关六个钱包,不可大意。

1.2.房产的量化维度

人有千面,房有万套,如何找到自己满意的才是关键。聆听一些初衷之后,我们大概可以整理出一些关键维度——

  • 0.位置
  • 1.单价
  • 2.面积
  • 3.总价
  • 4.卧室个数
  • 5.是否精装
  • 6.是否新房
  • 7.物业费
  • 8.物业服务
  • 9.医疗
  • 10.教育
  • 11.商业
  • 12.交通
  • ...(大家可以自行补充)

对于0-7,我们可以认为它是客观维度,而8-12就有一些主观性,这里最好建立一种专家评分系统对其进行打分(比如满分为10分这种)。

于是对于某一套房产,可以有一组数据对其进行描述,那么多套房产可以用以下数据描述:

export const HOUSE_DATA = [{
    name: '中建康城',
    lng: 114.411094,
    lat: 30.471274,
    unitPrice: 18000,
    area: 100,
    totalPrice: 1800000,
    bedroomNum: 3,
    isRenovation: 1,
    isNewHouse: 0,
    propertyFee: 2.2,
    useFor: '在售',
    location: '中建康城东区18栋2106',
    description: '交通便利',
    medicalScore: 7,
    educationScore: 8,
    businessScore: 10,
    trafficScore: 9,
    propertyScore: 4,
    environmentScore: 5,
}, {
    name: '清江山水',
    lng: 114.401809,
    lat: 30.475233,
    unitPrice: 19600,
    area: 121,
    totalPrice: 2371600,
    bedroomNum: 3,
    isRenovation: 1,
    isNewHouse: 0,
    propertyFee: 2.8,
    useFor: '出租',
    location: '清江山水18栋2106',
    description: '交通便利',
    medicalScore: 7,
    educationScore: 8,
    businessScore: 9,
    trafficScore: 7.1,
    propertyScore: 8.2,
    environmentScore: 7.4,
}, {
    name: '光谷坐标城',
    lng: 114.412862,
    lat: 30.474282,
    unitPrice: 22000,
    area: 90,
    totalPrice: 1980000,
    bedroomNum: 2,
    isRenovation: 1,
    isNewHouse: 0,
    propertyFee: 3.1,
    useFor: '在售',
    location: '光谷坐标城',
    description: '交通便利,离商业区近',
    medicalScore: 6,
    educationScore: 7.8,
    businessScore: 9,
    trafficScore: 7.1,
    propertyScore: 6.2,
    environmentScore: 7.4,
}, ...]

注:以上数据纯属编造。这里的难度应该在于专家评分系统的建立,即如何客观的对某一套房产的各个可评价维度进行打分,比如某一套房产离地铁口近,可以认为它交通好,但是具体打多少分,还需专家结合实际情况来评定。因为本文纯属YY,数据就通过mock的方式来模拟了。

2.多维数据可视化

传统的可视化手段如曲线图、柱状图,饼图等,通常只能用于分析低维数据(二维或者是三维),当数据的维度大于三维时,使用传统的可视化手段很难去直接理解多维空间的数据。而由于人类的视觉只能对二维或三维空间进行观察,所以通常将多维空间的数据映射到低维空间中,本文将使用平行坐标与地图对房产数据进行可视化表征。

2.1.何为平行坐标

较为为官方的表述:

所谓平行坐标,是在二维平面上通过M条等距离的平行轴表示M维数据属性。其中,每一条平行坐标轴表示一个属性维度,坐标轴上的取值范围即对应属性的最小值与最大值。因此,每一个M维的数据项都可以依据其每个属性的取值在M条平行坐标轴线上获得M个点,将这M个点依次连接,可以形成一条折线。所以每一个M维的数据项都可以在M维平行坐标系中用一条折线表示,相似的数据项就具有相似的折线走向趋势。

这里引用一个echarts的官方示例图

大家点进去看看大概就明白是怎么一回事了。

2.2.基于d3.js的平行坐标插件parallel-coordinates

因为echarts提供的平行坐标功能较为单一,本文使用了parallel-coordinates(它的github中许多关于平行坐标的教程与论文,这里就不再冗余的贴链接了),它的ES6版本地址为parcoords-es

这里有它的基本示例

  • 1.提供各种模式的刷操作(对数据进行筛选)
  • 2.提供交换坐标轴操作
  • 3.给不同的线以不同的颜色
  • 4.曲线化(减少视觉混乱)
  • 5.视觉聚类方法Bundling(将视觉上同类的线进行捆绑以减少视觉混乱)
  • 6.还有其他特性等待大家可以自行去探索哈。

2.3.基于平行坐标的房产数据可视化表征

本文设计的可视化页面如上图所示。主要分为三块(平行坐标显示区,表格以及地图),三者可以互相联动。

2.3.1.刷操作

假如要选择单价在2W以下、面积为100平米左右、三房、且商业评分较高的房子,你可以这么做:

列表和地图会同步显示筛选出来的结果。

2.3.2.定位

筛选之后,可以查看筛选结果的具体信息,点定位可以去房产的具体地理位置。

这里其实可以补充一个功能,点地图上房产的图标显示周围若干公里内的医院、公交站、学校等信息(这个链家APP上已有该功能),这里由于懒得造数据的原因就未写在demo中。

2.3.3.交换坐标轴

交换坐标轴操作改变平行坐标轴的排列顺序,得到不同的视图和可视化信息。通常可以将维度关系较为密切的平行坐标轴交换到相邻位置,从而更好的在视图上呈现维度之间的相互关系。

比如我想知道物业费与物业服务质量之间的关系,可以拖动其中某一个轴到另一轴旁边,如图:

不一定物业费高的物业的服务水平就高,以性价比的找法当然希望找物业费低的但是物业服务水平高的房子。这个时候可以使用第二种刷操作,角度筛选,如图: 相当于是筛选出满足某一个斜率范围的房子。

2.3.4.其他功能

这里还可以选择对那些维度进行隐藏,筛选的模式、颜色、是否使用曲线、是否允许交换坐标轴。

3.房产智能推荐与相似度搜索

智能推荐太可怕了,我时不时就会被抖音的智能推荐视频吸进去无法自拔,所以抖音这类app在我的手机应用里总是来也匆匆,去也匆匆。因为并不会机器学习那些高大上的推荐算法,所以就自己YY了下。

3.1.相似性距离度量

这里先用通俗的语言介绍下相似性度量——

物以类聚,人以群分,但是世界上的人这么多,怎么分嘛。非数学形式来说,嗯,酒肉朋友算一类啦,要打牌算一类啦,要打游戏的也勉强算一类啦。也就是说,要找到人与人之间的相似之处,那么麻烦来了,如何衡量人与人之间的相似性呢?比如说有n个人,首先要衡量每两个人的相似性,也就是一个组合问题,有n个点,就有(n-1)*n/2个对角线,所以就要算这么多次。那么问题就变成如何衡量两个人之间的相似性了啦。嗯,问题似乎变简单了。

假设有一个傻逼A和另外一个智障B,怎么来计算他们之间到底有多相似呢?一个人可以用来衡量的有方方面面,我们只能衡量A和B在某几方面的相似性,比方说,来考察性别、爱不要打牌、打不打dota、酒量多少、音乐上的审美。好吧,简单点就说这么多。那么傻逼A就有一个向量A:【男,爱打牌,打dota,酒量一斤半,音乐审美中等】;智障B也有一个向量:【女,不爱打牌,不打dota,不喝酒,音乐审美中高】。现在要做的事情就是先把两个向量数值化。比如1代表男,0代表女;1代表喜欢打牌,0代表不喜欢打牌;酒量的话呢,先给一个上限吧,比如两斤,那么可以用1来代表两斤,那么傻逼A的一斤半就给一个0.75分吧,好的,这一项智障B是0分;音乐审美A算0.5,B就算0.75吧。那么我们来看一下数值化后的向量:

A:【1,1,1,0.75,0.5】

B:【0,0,0,0,0.75】

现在我们来算A跟B在这几方面的相似性吧。一个最简单的算法是耳熟能详的欧氏距离啦:

不相似性 AB=sqrt((1-0)的平方+(1-0)的平方+(1-0)的平方+(0.75-0)的平方+(0.5-0.75)的平方) = 1.9039。数值越远,代表相差越大。

这个时候又来一个呆瓜C,他是男的,不爱打牌,不要打dota,不喝酒,音乐上审美高。那么C:【1, 0, 0, 0, 1】

分别计算一哈,

不相似度AC = 1.6202

不相似度BC = 1.0308

如果强行要把这三个人分成两类的话,很明显,傻逼A一个人是一类,B和C两个人是一类。

常见的还有余弦相似度,可以看看阮一峰大神的文章

其他的相似性距离度量算法还有很多,大家可以自行搜索哈。

于是乎,我们可以通过相似性度量来得到任何两个房产之间的相似性程度,可以将与用户收藏或者喜欢的房产相似性较高的推荐给用户。

3.2.Kmeans聚类算法相似性搜索

Kmeans的算法思想是将一组数据,以相似性度量为评价指标,对其划分为k类。算法步骤如下:

1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。

2、从数据集中随机选择k个数据点作为质心。

3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。

4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。

5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。

6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。

具体可以看文章

于是我们可以将房产数据,按照想要的维度划分为k个类,每一个类用不同的颜色来表示,以便于用户筛选。

尾声

本文纯属个人对看房子的一些思考,很难用于实践,只是一种看问题的思维方式。

代码由于太过肮脏就不贴了。

第一次在这里写文章,混个脸熟哈。

补充:demo地址 仓库地址

代码很乱,甚至有bug,大家宽容点看看就好啦。

🏆 技术专题第三期 | 数据可视化的那些事......