最近忙活了一阵子,终于把房子的事情落实了,俗话说饱暖思淫欲,某天突发奇想能不能利用手头上的一些工具对北京的二手房数据捣鼓一下,看看能不能有一些有意思的发现?想到以前有点python经验,正巧最近也在看R,正好借此机会巩固一下,齐活,走起!
一、数据准备
看了下各大房产网站,从数据的量级、真实性、即时性等方面对比了下,有的数据挺多,但是数据真实性不高,上面既有房主的帖子,也有中介的帖子;有的真实性不错,但是房源太少,综合对比下来,最终选择了某家网。
有了数据源,用Python写了一个爬虫,从网站上随机爬取了30000条房源数据。有人可能说数据太少了,少就少吧,这里只是想起到一个抛砖引玉的作用。
二、数据整理
来看下获取的数据,每条数据描述了房子的13个属性,分别为:区、小区、户型、面积、朝向、区域(区下面更细分的一级,比如昌平的天通苑、回龙观)、楼层、房龄、学区、地铁、税、总价、单价。
- 区,原始数据都是英文代号,比如BJCP代表昌平,BJCY代表朝阳,为了查看起来方便,将它们都替换为相应的中文名。
- 楼层,原始数据大部分是以“低楼层”、“中楼层”这样的楼层区间划分的,不过有少量数据也写了具体楼层,我统一把它替换为楼层区间。
- 学区和地铁,我进行了简化,只进行了是否学区、是否地铁的划分,对于学区的品质,地铁的远近没有细分。
- 税,抓取的30000条数据里面很奇怪只有“满五唯一”和空值这两种,并没有例如“满二不唯一”、“满二唯一”等类型,为了简化,就认为空值没有免税。
- 对异常值的处理,查看了一下数据,通过与网站上同区域同小区的数据对比,有一些年代过早、总价、单价过高过低等异常情况,比如年代为1000年的房子,总价43亿的“西山小镇”等等,这可能是信息录入员笔误或者采用了默认值造成,由于异常值占比较小,我进行了简单的删除处理。
- 为了对面积、年代这样的连续值进行分组,我增加了四列,
- 面积分组:0~50, 50~100, 100~150, 150~200, >200
- 年代分组:<1990, 90~95, 95~00, 00~05, 05~10, 10~15, >=2015
- 总价分组:0~1, 1~2, 2~3, 3~4, 4~5, 5~6, 6~7, 7~8, 8~9, 9~10,
>10,单位为百万 - 单价分组:0~1万, 1~2万, 2~3万, 3~4万, 4~5万, 5~6万, 6~7万, 7~8万, 8~9万,
9~10万, >10万
整理完共有29790条数据,这是数据的结构:
## 'data.frame': 29790 obs. of 17 variables:
## $ area : Factor w/ 15 levels "昌平","朝阳",..: 2 13 7 7 15 5 6 14 2 11 ...
## $ region : Factor w/ 5139 levels "@北京","10AM新坐标",..: 674 2299 1789 1955 1063 463 2764 407 2480 2601 ...
## $ zone : Ord.factor w/ 53