摘 要
这两年OF一直在关注房价,抛开政策、炒房等一些外部因素,对于房屋本身来说,哪些是影响房价的主要因素?OF在众多因素中挑选了几个进行分析:房屋年龄、面积、层数(1/1.5/2/2.5/...)、卧室数量、卫生间数量。
首先,OF从Kaggle上下载了一份关于国外某城市的房产数据,并且经过了数据处理。那么接下来,我们主要进行数据可视化和分析,今天分析的主要目的是:
1、影响房价的内部主要因素是什么?
2、建立模型进行房价预测。
单因素分布:直方图
这不是一个很大的数据,也没有太多的列,因此第一步可以绘制直方图,查看下各因素的数据分布情况。
import pandas as pd
import seaborn as sns
df1 = pd.read_csv(r"./data/house_data.csv")
#直方图
df1.hist(bins=20,figsize=(13,13),xrot=-15)
特征:线性回归
这些影响房价的因素,我们又称之为“特征”。这些特征是如何影响房价的?就好比x,y,我们来看下各特征与房价间的关系图:
从这些图表上看,房屋年龄与房价的关系并不明显,房屋面积与房价的关系最明显,其次明显的是卫生间数量与房价的关系。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r"./data/house_data.csv")
house = house.astype(float)
col1 = house.columns
# 生成图表
for col in col1:f, ax = plt.subplots(1, 1, figsize=(12, 8), sharex=True) sns.regplot(x=col, y='price', data=house, ax=ax)x = ax.get_xlabel()y = ax.get_ylabel()ax.set_xlabel(x, fontsize=18)ax.set_ylabel(y, fontsize=18)
特征:箱型图
为了确定卧室数量、卫生间数量、楼层数与价格的比较,OF更喜欢箱型图,因为有数字呈现,但它们不是连续的,如 1,2,... 卧室,2.5, 3,... 楼层(可能 0.5 代表阁楼 )。
通过箱型图,去除一些黑点的异常值,我们可以发现,曲线上升比较明显的有房屋面积、卫生间数量,还有卧室数量也有些微小的曲线上升,那么我们可以认为整体上,房价与这3个特征有关系。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r"./data/house_data.csv")
house = house.astype(float)
col1 = house.columns
# 生成图表
for col in col1:f, ax = plt.subplots(1, 1, figsize=(12, 8), sharex=True) sns.boxplot(x=house[col],y='price', data=house, ax=ax)x = ax.get_xlabel()y = ax.get_ylabel()ax.set_xlabel(x, fontsize=24)ax.set_ylabel(y, fontsize=24)
特征:变量相关性
模型中有太多特征并不总是一件好事,因为当我们想要预测新数据集的值时,它可能会导致过度拟合和更糟糕的结果。如果想要一眼看出各变量间的关系,OF不得不向大家介绍皮尔逊相关性矩阵,用热图来呈现。
怎么看这张图?很简单,右侧的颜色色条中向上红色加深代表正相关;向下蓝绿色加深代表负相关(绝对值越大,相关性越大)。因为我们主要分析各变量与房价间的关系,所以我们比较最下一行的数据。
square房屋面积 0.7 > bathrooms卫生间数量 0.53 > bedrooms 0.31 > floos 0.26
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house = pd.read_csv(r"./data/house_data.csv")
house = house.astype(float)
#计算各变量的相关性
corr = house.corr()
#为上三角形生成掩码
mask = np.triu(np.ones_like(corr, dtype=bool))
#建立matplotlib图
f, ax = plt.subplots(figsize=(11, 9))
#生成自定义颜色的图表
cmap = sns.diverging_palette(200, 10, center='light',as_cmap=True)
#用蒙版绘制热图并修正纵横比
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=1,vmin=-1, center=0,square=True, linewidths=.5, cbar_kws={"shrink": .4}, annot=True)
多因素:3D图
上述绘制了房价与其他因子的对比,似乎价格与这些因子之间没有完美的线性关系。3个变量彼此之间的关系又如何?为了说明这一点,我更喜欢3D 图。
上图显示,当房屋面积增加时,卧室或浴室增加,同时房价也增加,但是,层数、卧室、浴室与房屋面积没有类似的关系。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import itertools
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False #这两行需要手动设置
house = pd.read_csv(r"./data/house_data.csv")
house = house.astype(float)
hs2 = house.drop(['price'],axis=1)
col1 = house.columns
col2 = hs2.columns
combine = pd.DataFrame(itertools.combinations(col2, 2))
for i in range(len(combine)):fig = plt.figure(figsize=(10,6))ax = Axes3D(fig)x=house[combine[0][i]]y=house[combine[1][i]]z=house['price']ax.scatter(x,y,z)plt.title("三维分析"+combine[0][i]+"-"+combine[1][i]+"-"+"price",fontsize=18)ax.set_xlabel(combine[0][i],fontsize=14)ax.set_ylabel(combine[1][i],fontsize=14)ax.set_zlabel('price',fontsize=14)plt.tick_params(labelsize=10) plt.show()
结 语
经过线性回归、箱型图、皮尔逊相关性矩阵和3D图的分析,都能分析出来房价与房屋面积、卫生间数量有比较大的关系。下期将会涉及一些机器学习的知识来预测房价,敬请期待哦!