2022年6月,笔者准备去北京海淀某地租房,看中了一个小区的房子。笔者囊中羞涩,只想租一个小一居室,大约44.5平米,但是这个小区的房子,各类大小的房子都有,偏偏44.5平米户型房子的价格没有,房东开价6600,但是笔者并不清楚这个价格是否合理,在笔者的印象中,似乎44平米的房子只要6000就可以租下来了,所以为了探求这个44平米房子的定价到底多少比较合适,笔者准备用数学的方式去解析。这主要是因为笔者最近一直在研究股票的定价和走势,并就职于某投资公司。
一、简单线性回归模型
这个用线性回归去预测房子的价格是最简单直接的想法,因为房子的价格基本上就是正比于房屋的面积。
首先从安居客平台人肉扒一些数据,这里可以做成爬虫形式,但是鉴于笔者第二天就要和房东见面并讨价还价,现在肯定是没有时间搞爬虫了。人肉的部分数据如下:
price area
0 6900 54.00
1 7800 64.00
2 7500 64.00
3 8000 79.47
4 7300 65.00
5 7500 64.00
6 8700 78.00
7 9300 88.00
8 6800 53.00
9 7650 61.00
10 7500 63.00
使用python的sklearn库做线性回归拟合,代码如下:
data = pd.read_csv("house_lianjia.csv")
test_data = pd.read_csv("test_data.csv")
X_train = data.iloc[:,1:2]
Y_train = data.price
X_test = test_data.iloc[:,1:2]
model = LinearRegression()
model.fit(X_train, Y_train)
a = model.intercept_ # 截距
b = model.coef_ # 回归系数
Y_pred = model.predict(X_test)
print(Y_pred)
结果:
截距= 2943.219869932199 ,回归系数= [68.76643144],说明每平米的价值是68元,截距2943说明这个房子哪怕是0平米,也有约2943元的价值,2943可以视为该地段的溢价。
但是发现我们44.5 平米的房子的预测价格是6000,显然与房东和中介的价格6600相去甚远,似乎我们的模型过于简单了。
二、多元线性回归预测房价
我在猜想,这套房子可能有一些别的因素让它的价格飙升,仔细看了下,这套房子是精装修的,其他的地方,与其他房子并无而致,那么我就加上了是否精装修的数据也作为input参数,继续使用上述代码拟合。
结论:
截距= 2827.2965946558515 ,回归系数= [ 73.18208156 -432.21539661]
房屋预测价格5651元,更低了!
是否装修的回归系数居然是一个负数!也就是说,装修过的房子反而价格更低了,这让我开始怀疑数据有问题。仔细观察数据发现,在安居客平台上,装修和不装修的房子价格差距几乎没有,反而由于不少同平米但是简装的房子要价更高(可能是房东或中介开价不合理),导致反而装修成了负因素。
看来,装修并不能成为影响价格。那么我们怎么改进呢?
三、多项式回归预测房价
这里我突然想到,我的训练数据,普遍在60-80平左右,是相对比较大的房子。而根据常识,(胡诌的数据),3升的可乐要10元,1升的可乐要6元,500ml的可乐不会1升可乐的价格一半而更可能是4元。由于房子本身就是可以提供诸如学区、交通等诸多属性,面积反而是越大,单位面积越便宜,那么聪明的大家一定想到,用多项式去预测房价和面积的关系更合理。这个大概是因为单位面积是一个导数的概念,我们并不能线性的认为这个导数是不变的。
修改代码,将其中的linear regression,改为
poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(X_train)
model = linear_model.LinearRegression()
model.fit(X_poly, Y_train)
结论:
预测模型 y=3913.375914298715+(0.0*x)+(39.629799812165544*x^2)
预测价格是6090
6090相比于6000还是靠谱一点,但是仍然与房东给出的价格差很远,难道房东要黑心的吃我一笔生意?看了看,确实有很多中介打出了如5500租48平,6000租50平,6500租54平之类的数据。
四、修改修改还是修改
于是我便打定主意,去找房东砍价,我报出了6100元,但是房东说只租6500。似乎结局应该是我们找别的房子,这个交易告吹而结束。
并不是!房东和中介好心的劝我说6500的价格是合理的,我反过来和他们告知,有很多中介,能给出6500租到54平的数据,那我为什么要花6500去租一个45平的数据?
但是他们告诉我,建议去实地看看那些小中介的房子,于是我就跑去和那些小中介交流。
结果令人诧异的是,当我和这些小中介交流的时候,他们纷纷告诉我,有些价格是乱标的,有些只是第一个月的价格,有些根本就是欺诈,他们只是用低价招揽顾客,然后实际并没有那么便宜的房子!而且也有很多小中介会提出,和小中介签约而非和房东直签。这样风险就很大,而且网上也不乏小中介以各种理由扣钱的事例。
所以,这说明我数据本身就是脏的呀!就像股票中有很多噪音,在房子中,也有很多房子的价格是别人乱标的,这些会极大的干扰你的模型。我于是人肉重新从链家和我爱我家这2个大平台上抄录数据,因为这2个大中介起码还是最靠谱的。
使用新的数据重新跑模型,结论如下:
在多项式回归中
y=5029.849501721333+(0.0*x)+(18.31727360194959*x^2)
44平米的房子的预测价格是6485
虽然这2家大平台数据量有点少,不太适合用多项式拟合。
那么重新用线性拟合呢?
截距= 3472.349750926156 ,回归系数= [63.7437833]
44平米的房子的预测价格是6300.
这下结果就非常接近房东和中介的开价了,这说明如果预测有所偏差,可能不是你模型有问题,而是你的数据有问题!
五、终章
鉴于6月是北京的租房旺季,我也意识到房东给出的6500是合理,于是我火速和房东沟通,房东鉴于我长租,一个人,就降到了6400元。而我,知道6400元是合理的价格。
不知道读者有没有对模型有新的修改意见。