实验背景
房价是中国老百姓最关注的话题,中国丈母娘10大择婿标准排首位的就是有房,其次是有车有存款
和大家一起撸一撸中国各个城市的房价情况。要结婚的亲们看过来
实验器材
●python
● AR
● LSTM
● 房价网
● scrapy
● pyecharts
● Manner-Kendall(M-K)非参数检验法
实验内容
数据获取
本实验用于分析的数据来自于房价网(https://sz.fangjia.com/zoushi),房价网的房价均值走势数据并没有对外公开,每个城市只提供图片形式的下载。
通过观察客户端的请求信息,可以通过url
https://sz.fangjia.com/trend/yearData?defaultCityName=深圳&districtName=®ion=&block=&keyword=
请求服务端,获取返回的json数据即可。
还有一个问题,我们要获取全国的各城市的数据,可以看出不同城市,上面的url前缀是不一样的,比如深圳是
【sz.fangjia.com】,厦门是【xm.fangjia.com】
在页面上找到这个,通过分析html代码,城市和城市的url都在div里。
好了,我们来总结一下我们要获取历史房价的步骤:
- 从页面抓取城市和城市的url
- 通过不同的城市url请求历史房价的json数据
本实验采用流行的爬虫框架scrapy来获取数据。scrapy简单例子可参见wedo创客实验以往文章:
简要代码如下
- 获取城市的url,存入本地文件里
class FjSpider(scrapy.Spider): name = 'fjspider' allowed_domains = ['gz.fangjia.com'] start_urls = [] start_urls.append("http://gz.fangjia.com/zoushi?cityName=广州&__s=1&keyword=") def parse(self, response): items = [] headings = response.xpath('//*[@id="moreCity"]') for content in headings: for i in range(0, 23): print(i) cnname = content.xpath('./div['+str(i) +']/a//text()').extract() enname = content.xpath('./div['+str(i) +']/a/@name').extract() url = content.xpath('./div[' + str(i) + ']/a/@href').extract() for j in range(len(cnname)): item = HeadingItem() item['cnname'] = cnname[j] item['enname'] = enname[j] item['url'] = url[j] items.append(item) return items
- 请求历史房价信息,由于房价网会对过于集中频繁请求的情况做限制,增加验证码输入。所以需要分多次下载,代码中存储了哪些城市已经下载,同时增加了每个城市下载的间隔时间,避免出现需要输入验证码的情况。
class FjSpider2(scrapy.Spider): name = 'fjspider2' allowed_domains = [] start_urls = [] city = [] base_dir = os.getcwd() # check if download num = 0 is_download = {} download_file = base_dir + '/download.txt' with open(download_file, "r") as f: for line in f: is_download[line] = 1 num = num + 1 filename = base_dir + '/fjspider.txt' index = 0 with open(filename, "r") as f: for line in f: if not line in is_download: info = line.split("|") http = info[2].replace("/zoushi", "") .replace(" ", "") url = http+"/trend/year2Data?defaultCityName=" +info[0]+"&districtName=®ion=&block=&keyword=" start_urls.append(url) city.append(info[0]) with open(download_file, 'a') as ff: ff.write("%s" % (line)) index = index + 1 if index > num + 50: break def parse(self, response): items = [] values = json.loads(response.body_as_unicode()) city = values['series'][0]['name'] array = values['series'][0]['data'] for i in range(len(array)): item = HeadingItem() item['time'] = int(array[i][0]/1000) item['value'] = array[i][1] item['city'] = city items.append(item) return items
好了,让我们看看下载的数据(为了需要我们加了省份信息)
数据信息为:
- 数据为周粒度的
- 数据周期为最近两年
- 房价取的整个城市的房价均价
房价数据分析
1
当前房价分布分析
我们获取的房价数据为时间序列的数据,为了反映当前房价情况。我们选取每个城市最近的时间的房价(由于各个城市最近的房价采集点并不一样)为代表当前房价。
思路:
- 先获取每个城市的最近时间点
- 再获取最近时间点的房价
结论:
- 最高房价: 56944
- 最低房价:2437
- 75%城市的房价在7520下面
房价前十(囊括北上广深),福建有2个,多为沿海城市
- 房价倒十: 集中在新疆和黑龙江
- 房价全国分布,高房价都集中沿海地带
- 单价1万以上房价分布,广东和浙江最多,其他为省会城市;福建有三个:福州,厦门,漳州
- 单价在2万以上的城市分布,福建有两个,广东有三个
2
房价趋势分析
对于房价,我们更希望能知道未来房价的走势和机会点。
本实验采用 Manner-Kendall(M-K)非参数检验法来检测房价的上升和下降趋势。本实验判断趋势的数据不采用最近两年的数据,只采用最近6个月的数据
- MK检测法说明:
- python实现
import math import numpy as np def mk_test(x): s=0 length=len(x) for m in range(0,length-1): for n in range(m+1,length): if x[n]>x[m]: s=s+1 elif x[n]==x[m]: s=s+0 else: s=s-1 #计算vars vars=length*(length-1)*(2*length+5)/18 #计算zc if s>0: zc=(s-1)/math.sqrt(vars) elif s==0: zc=0 else: zc=(s+1)/math.sqrt(vars) #计算za zc1=abs(zc) #计算倾斜度 ndash=int(length*(length-1)/2) slope1=np.zeros(ndash) m=0 for k in range(0,length-1): for j in range(k+1,length): slope1[m]=(x[j]-x[k])/(j-k) m=m+1 slope=np.median(slope1) return (slope,zc1)
- 结论1:房价较高的城市有下降趋势的
下降的城市并不是很多,而且下降趋势并不是很明显
- 结论2:房价较高的城市有上降趋势的
- 结论3:房价较低的城市有上降趋势的
虽然有在增长,但可以看出增长的幅度不大
3
房价简单预测
这里我们用AR(自回归模型)和LSTM做下简单的房价预测,都采用tensorflow里模块。预测未来12周(3个月)
- 厦门
- AR
- LSTM
- 预测价格保持平稳均价在4.8万
- 金华lstm
- 预测价格保持增长,均价将达到1.8万
- 深圳lstm
- 预测效果好像不好
- 漳州
- 预测价格保持平稳均价在1.2万
- 泉州lstm
- 预测价格小幅下降均价在0.88万
- 莆田lstm
- 预测价格保持平稳均价在0.96万
- 西安 lstm
- 预测价格保持增长,均价将突破1万
实验结语
本实验和大家一个分析了中国房价的现状。简单做下总结
- 75%的城市房价在7500 一下, 1万以上城市42个(12%),2万以上的城市有11个(3%),福建,广东比例最多。
- 19个城市有叫小幅度的下降,厦门,深圳高房价的城市在列
- 51个城市有一定程度的上升
- MK趋势分析检测,值在30以上的上升趋势明显,值在-20以下的下降趋势明显
- lstm效果好于AR