1.1 线性规划模型
回归是基于已有数据对新的数据进行预测,比如预测股票走势。这里我们主要讲简单线性回归。基于标准的线性回归,可以扩展出更多的线性回归算法。线性回归就是能够用一个直线较为精确地描述数据之间的关系,这样当出现新的数据的时候,就能够预测出一个简单的值。
线性回归模型有很好的可解释性,可以从权重W直接看出每个特征对结果的影响程度。线性回归适用于X和y之间存在线性关系的数据集,可以使用计算机辅助画出散点图来观察是否存在线性关系。我们尝试使用一条直线来拟合数据,使所有点到直线的距离之和最小。

1.2 项目概述
本项目通过爬虫获取链家网深圳二手房信息,包括二手房的区县,地段,介绍,税收,户型,朝向等信息,对这些信息进行预处理之后存入数据框。通过Echarts绘制数据可视化图表,获得对深圳房产信息的直观展示大屏,根据数据可视化大屏,对照深圳市地图以及深圳各个地段背景信息,分析出影响深圳市房价的因素。以及对房产数据构建线性回归模型,并利用tkinter构建图形用户界面,获取用户输入后在程序底层使用线性回归模型进行计算,为用户显示出房产估价,便于用户的使用。

二.利用网络爬虫获取二手房信息
2.1 数据来源及介绍
数据集收集了链家深圳二手房网共计19,547条二手房销售数据,每个数据反映了深圳市一套二手房的地段,单价等基本信息。爬取到的信息存入“深圳市房价.xlsx”中。
表格 1 数据集各字段含义
列名 含义
Area 房产所在县区
Title 房产描述
Community 所在小区
Position 所在地段
Tax 纳税情况
Total_price 总价(万元)
Unit_price 单价(元/平方米)
hourseType 户型
hourseSize 面积大小(平方米)
direction 房屋朝向
fitment 装修情况

2.2 网络爬虫概述
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫对某一站点访问,如果可以访问就下载其中的网页内容,并且通过爬虫解析模块解析得到的网页链接,把这些链接作为之后的抓取目标,并且在整个过程中完全不依赖用户,自动运行。
网络爬虫按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。

2.3 requests库概述
Python中的requests库为第三方库,是基于Urllib采用Apache2 Licensed开源协议的HTTP库。通过requests.session()函数构建一个会话。使用headers=设置请求头,请求头包含了浏览器信息,用于把爬虫伪装成浏览器。使用get(“url”,headers=”headers”)获取网页,对应了HTTP协议中的GET请求,使用这个函数可以取得URL对应的HTML文档内容(字符串),用于在其中提取信息。
HTTP协议,又称为超文本传输协议,是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵循这个标准。设计HTTP最初的目的是提供一种接收HTML页面的方法,HTTP是一种基于“请求与响应”模式的,无状态的应用层协议。HTTP协议采用URL(统一资源定位符)作为单位网络资源的。在互联网上每个文件都有它专属的URL地址,它包含的信息指出文件的位置,以及浏览器或程序应该如何处理它。

2.4 利用网络爬虫爬取链家地产网站深圳二手房信息
访问链家二手房交易网站(地点选择深圳市)通过观察网页页面结构以及开发者模式下寻找HTML元素与网页结构的对应关系,确定了网页中单价,总价,描述信息,是否有五年房本以及所在区县等信息以及各个信息在HTML中的位置。通过观察HTML文档中这些信息上下文的特点,利用正则表达式对需要提取的信息进行定位,定位之后提取出这些信息,保存到pandas数据框中。
本次项目使用Python request库对链家房产网站的二手房出售信息进行爬取。
分为以下步骤:
1准备程序包。.Python爬虫需要安装req uests包,因此先使用pip install命令导入导入requests包,设置请求header,并且根据链家二手房网站的基本URL建立带有请求header的会话,以便于后续发送get请求爬取HTML字符串。
2.定位页面元素。打开浏览器,进入到链家深圳市福田区的二手房交易网站,打开开发者模式,通过认真观察网页的HTML以及将要提取的数据附近HTML字符串的特征,构造符合将要提取数据的正则表达式,在所爬取的HTML字符串中匹配到所需的总价,位置等信息,以便于后续进行爬虫操作。
3.构造请求URL。依次进入链家地产网的深圳市各县区的页面,发现每个页面URL最后一段字符串对应一个区县。建立一个字典,键表示为各个区县,值表示为URL最后一段那段字符串,例如福田区对应futianqu。然后构造循环,依次带入字典中的元素(键和值),根据链家网站深圳各个区县的页面URL构造网站请求URL(即在/ershoufang/后面加上字典里面存的区县字段)
4.获取二手房数量。在上面构造的循环里面加上一个获取页数和二手房总数的请求,获取每个区县的二手房数量以及这个区县的页面总页数。
5.数据提取与保存。构造一段循环,爬取每一页中的HTML,爬取使用已构造的URL,通过GET请求爬取各个区县每一页的房产数据,并且按照逐条房地产信息把HTML拆分成若干段,然后再构造一个循环把上述HTML中每一部分,在所爬取的HTML片段中提取房产信息,保存到pandas数据框中,移交给数据清洗部分。
本次爬取的数据为房价信息的原始数据,后续过程中需要对所爬取的房地产数据进行分析以及数据可视化,在这其中较为核心的数据为房产的单价和总价信息,后续会利用这些数字信息进行可视化以及数据分析,因此需要把这些数据处理好以便于后续计算。

图 1 采集到的数据

三.利用pandas库对二手房数据进行清洗
3.1数据清洗的概述
在大数据分析过程中,计算数据之前需要对数据进行清洗,去掉数据中的无用值。数据清洗是对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在的错误,并提供数据一致性。我们获得的(录入计算机后的)原始数据,有时并不能直接用于计算,建模等后续操作,因为可能存在重复或者错误,比如重复录入,小数点错误等,这是需要将这些“脏”的东西洗掉,以保证数据的正确,整洁等。

3.2 对二手房数据进行预处理
在上一步(利用网络爬虫爬取链家地产网站深圳二手房信息)我们利用python中的requests库构建爬虫爬取到了链家深圳各县区的二手房房价,描述信息,位置与户型等数据。但是有一点需要注意到,HTML为超文本标记语言,它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联。这种组织信息方式将分布在不同位置的信息资源用随机方式进行连接,为人们查找,检索信息提供方便。比较常见的HTML5文档为字符串构成的文档,在网页HTML中直接提取出来的面积,房地产总价和单价信息为字符串类型,字符串类型不是int,float等数字类型,无法直接进行数值计算。通过float()直接把提取出的总价信息与面积信息转换成float类型。但是在所爬取的字符串的“单价”数字中存在逗号分隔,使用str. replace(‘,’, ‘’)去掉逗号,再转换成float类型,存入数据框。

3.3 使用如下几个步骤对所采集的房地产数据进行清洗
1.遍历数据框的每一行,检查数据中除“税收”字段外的所有字段,删掉其中存在“None”的数据。
2.遍历数据中的“税收”字段,由于这个字段提取的是网站中房产信息描述中是否有“房本满五年“,没有这个标签则在即不到任何信息,采集不到信息则在此房产信息存入数据框时此字段存入None。由于该字段只有“房本满五年”与“None”两种取值,因此去掉所有这两个值之外的数据。
3.检查float型字段(总价,单价,面积),因为房价和面积不可能存在小于零的情况或者等于零的情况,我们不能排除链家网站服务器中的数据是准确的,因而需要把采集到的数据进行清理,去掉所有不合理的数据,这三个字段的取值必须为大于0的数,不可取为0或负数。

3.4 数据清洗的意义
大数据时代,产生的数据多以非结构化数据为主,由于非结构化数据并不能直接为研究所用,因此多数情况下,需要将非结构结构化数据转化成结构化数据,而在这个过程中,就存在必要的数据清洗,将其转化成符合研究的数据格式。

四.利用Echarts百度开源可视化工具对数据进行可视化
4.1 Echarts概述
ECharts(Enterprise Charts)是百度开源的数据可视化工具,底层依赖轻量级Canvas库ZRender。兼容了几乎全部常用浏览器的特点,使它可广泛用于PC客户端和手机客户端。ECharts能辅助开发者整合用户数据,创新性的完成个性化设置可视化图表。本项目在Python中导入Pyecharts实现房地产价格数据的可视化,并导出HTML文件,在浏览器中显示图表大屏。
制作数据大屏分为以下主要步骤:
1.导入Pyecharts第三包,作出准备;
2.按照因素对数据集进行分组,存入临时数据框;
3.对临时数据集进行计算,求出图表绘制所需的平均值或比例等数据;
4.把数据集代入Pyecharts库函数对应的图标生成函数,在函数的参数中调整相应的设置;
5.渲染图表,重复上述4步做出其他图表;
6.使用Pyecharts当中的组合图表功能,将所有图片拼接在一张html文件中进行展示

4.2 绘制深圳市二手房的数据图表
4.2.1深圳市各区县房价数据地图可视化
Pyecharts包提供了通过数据框与样式设置生成地图,柱状图等可视化图形的方法,通过此第三方包可以生成视觉效果较为直观的各类图表,做成数据大屏。
使用dataframe.groupby()对处理后的数据按照区县为键进行聚合,求出每个区县的房价均价平均值并且重置索引。初始化Map,把区县和均价的数据(把元转换成万元)以及相关设置(标题,单位,标签显示等)带入到初始化的Map中,然后使用map.render_notebook()把map渲染在Jupyter Notebook里面,用于图表显示测试。
4.2.2 深圳市二手房均价TOP 10地段
上一步使用的是临时数据框,因而data数据框中保存的仍然是原始数据。使用dataframe.groupby()把data数据框中的数据以地段为键进行分组,求得每组平均值存入临时数据框temp,生成深圳市各区域地段的平均房价,根据所得数据生成柱状图。
4.2.3 深圳市二手房 户型数量分布
把预处理好的数据的户型列提取出来,存入临时数据框temp。计算临时数据框中所保存的每种户型类型各自所占的比例。把每种户型按照比例排名之后使用Echart.charts中的Pie根据所统计及排名的数据生成饼状图。
4.2.4 深圳市房源描述词云图
把预处理好的数据的房源描述信息提取出来,存入一个字符串中,使用jieba库对房源描述信息进行分词。把去掉停用词的词语列表中取出其中数量最多的50个词,放入一个集合中,生成词云。使用Echarts中的Page组合图表,布局后生成chart_config.json,然后调用page.save_resize_html生成图表大屏的HTML。

图 2 数据可视化大屏

五.利用线性回归模型进行房产估价
5.1 线性回归模型概述
线性回归方程是利用数理统计中的回归分析,来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法之一。线性回归也是回归分析中第一种经过严格研究并在实际应用中广泛使用的类型。按自变量个数可分为一元线性回归分析方程和多元线性回归分析方程。
在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。不太一般的情况,线性回归模型可以是一个中位数或一些其他的给定X的条件下y的条件分布的分位数作为X的线性函数表示。像所有形式的回归分析一样,线性回归也把焦点放在给定X值的y的条件概率分布,而不是X和y的联合概率分布(多元分析领域)。
线性回归优点:善于获取数据集中的线性关系;适用于在已有了一些预先定义好的变量并且需要一个简单的预测模型的情况下使用;训练速度和预测速度较快;在小数据集上表现很好;结果可解释,并且易于说明;当新增数据时,易于更新模型;不需要进行参数调整(下面的正则化线性模型需要调整正则化参数);不需要特征缩放等优点。
线性回归缺点:不适用于非线性数据;预测精确度较低;可能会出现过度拟合(下面的正则化模型可以抵消这个影响);分离信号和噪声的效果不理想,在使用前需要去掉不相关的特征;不了解数据集中的特征交互;如果数据集具有冗余的特征,那么线性回归可能是不稳定的等缺点。
我们使用线性回归方程对所采集到的深圳市二手房信息构建回归模型,以达到用户可以输入自己期望的地段,户型等信息了解该基本信息下大概的房产价格,用户可以根据所估算的价格进行初步决策,以及用户可以输入多组信息相互比较,得出自己的结论。

5.2 构建前的数据预处理
构建线性回归方程之前的数据预处理过程如下:
1.去掉总价,面积,区县这三列,总价取决于单价和面积,因为面积无法确定单价,也就是说这一列的取值不会决定单价最终的值,所以把总价这一列去掉。由于面积和单价没有因果关系,面积为总价除以单价所得的值,不会影响单价,所以面积这一列去除掉。本次线性回归分析针对的自变量中含有地段,一个县区包含了多个地段,地段的精确度比计算县区更大,所预测的信息更精准,因此使用地段信息代替区县作为房产区域位置。
2.剩余的数据中存在字符串类型,因此应该把字符串转变为数字类型,一便于计算线性回归方程。使用groupby()把数据框中的一个自变量列和单价列提取出来,按照自变量的值(字符串)进行分类,求出每一类的均值,把这个均值赋给这个自变量中对应的字符串,把字符串和数字的对应关系保存到excel文件中。由于tax列只有两种取值,所以这一列取为布尔值即可。处理完成各列数据后,每一列的数据均为数值类型,以便于后续过程中构建线性回归模型。预处理之后的数据存入excel中,命名为“数字化.xlsx”。

5.3 利用房产数据构建线性回归方程
1.数据集的准备。把上一步预处理之后的数据读取excel后存入一个数据框,作为构建线性回归方程的数据集。
2.设置自变量和因变量。从数据框中取出作为自变量的列,把这些列存入X变量中,作为自变量矩阵。从数据框中取出一列(单价)作为因变量,存入变量Y中。
3.模型的初始化。使用LinearRegression()初始化线性回归模型,保存到变量LR中,此时LR中还没有训练过的线性回归模型。
4.准备训练集和测试集。使用train_test_split()对训练集进行拆分,随机拆分成8:2的两部分,其中80%作为训练集,20%作为测试集。
5.训练模型。把已经拆分的自变量和因变量(训练集部分)带入LR对象的fit()方法中,进行模型的构建,取出模型中的五个权重和截距,保存在文本文件weight.txt中,用于后续房价预测程序权重截距的读取。
6.平均方误差的计算以及决定系数的计算。使用mean_squared_error()函数,带入因变量的实际值和预测值,计算出模型的平均方误差。然后把拆分出的测试集中的自变量和因变量带入linear_regressor.score(x_test,y_test)函数中求得决定系数为0.71左右,说明模型的预测存在一些的误差。

5.4 房价估算程序以及利用tkinter包构建图形用户界面
5.4.1 房价估算程序
构建函数calPrice(args),参数中包括了地段,户型等基本信息和面积。在这个函数中,首先读取数据预处理过程中保存的数值和字符串的对应关系文档(excel),获得字符串对应的数。然后使用with open()打开线性回归方程构建过程中生成的文本文件,提取其中的值并转换为float类型。构建房价计算方程,函数的形参对应的数值作为这个方程的自变量,实参作为这个方程的自变量系数,后面加上截距,通过带入形参对应的数值可以计算出房价单价信息。单价信息乘上面积获得总价信息。把单价信息和总价信息放入一个元组,这个元组作为函数的返回值。若形参中存在非法字段,则返回由两个’Nan’构成的元组,后续步骤中若返回值为(‘Nan’,’Nan’)则弹出提示信息,不显示房价信息。
5.4.2 房价估算程序GUI界面
在GUI(图形用户界面)中,用户可以通过其中的图形对象进行操作,设备收到操作指令后,对用户进行结果的反馈,反馈的结果即用户接收到的信息也是图形对象,因此用户无须具备专业知识和操作技能就能够实现操作。作为一种界面显示格式, GUI设计极大地方便了用户的操作。
为便于用户使用房价估算程序,我们使用Python中的图形用户界面程序包“tkinter”。首先使用tk.Tk()建立一个root容器,初始化文字提示信息以及各个控件,包括地段输入框,装修信息的下拉菜单,税收的复选框等输入控件及计算按钮和输出框。按照Grid网格把GUI每个元素排列进容器中,设置元素间的距离防止排列过于紧凑。为计算按钮绑定函数,在所绑定的函数中设置输入控件的取值代码,把这些值带入到calPrice函数,把返回值显示在右侧的单价显示框和总价显示框中。

图 3 GUI界面

六.房产价格数据分析
6.1 县区因素对房价供需关系的影响
观察深圳各县区的房价分布地图可知,深圳市南山区和福田区是深圳市房价评均单价最高的两个县区,达到了7万元以上的每平方米单价,而远离市中心的坪山区房价较低,仅3.5万元/平方米。深圳市各个区域的房价与供需关系存在巨大差异。例如,福田区和南山区是深圳市房价较高的区域,这与它们的区位、教育资源、经济发展水平等因素有关。同时,不同区域的政策支持和市场预期也会影响其房价的供需关系。

6.2 区域因素对房价供需关系的影响
深圳市各个街区的房价与供需关系也存在巨大差异。在地图中寻找这些排名前十的街区我们发现,房价较高的街区多数位于深圳市的金融行业活跃的地区,靠近港口的贸易发达地区,位于深圳和香港交界处的保税区附近或者配套设施齐全,教育资源与经济水平较发达的市中心地区。

图 4 深圳房价Top10地段分布
例如,深圳湾以及科技园区域位于深圳口岸,贸易活动频繁,港口经济贸易发达,房价较高。香蜜湖地区位于深圳和香港交界处,附近有福田火车站与保税区等地方,处于地方交通枢纽,商业发达,交通方便,房价仅次于深圳湾。
福田区和南山区是深圳市房价较高的区域,这与它们的区位、教育资源、经济发展水平等因素有关。同时,不同区域的政策支持和市场预期也会影响其房价的供需关系。

6.3 从深圳市房源描述词云图可以看出
购房者最多关注的是“唯一”,“诚心”,“五年”等信息,可以看出购房者希望从出售者以及开发商的诚心,购房者希望可以安心的卖到一套符合心意的房产。从“五年“可以看出购房者希望可以买到有五年房本的二手房减少上税,减轻经济上的负担。其它方面例如购房者关心户型与采光,房产的居住体验如何,是否舒适等因素,以及地理位置上是否靠近地铁口,交通上是否方便等因素。

七.评价与优化
本项目是一个基于大数据技术的房价数据分析及可视化项目。通过该项目,我们对大量的房地产数据进行了的分析和可视化呈现,为房地产行业的相关决策提供了有价值的洞察和参考。
在项目中,我们采集了大量的房地产数据,包括房价、税收、地理位置、建筑特征等。通过数据清洗和预处理,我们确保了数据的准确性和一致性,并为后续的分析工作做好了准备。
通过这个项目,我们为房地产行业提供了一个分析工具,帮助相关人员更好地理解市场动态、制定决策和规划战略。同时,我们还通过可视化呈现,将复杂的数据变得易于理解和消化,为非技术人员提供了一种直观的方式来获取有关房价数据的信息。
基于线性回归的房地产估价程序可以比较粗略地估计出指定地段,户型等条件下房产的价格,以供房地产购买者估算房价,进而做出相应的选择。由于自变量数量较少,离散变量处理不够科学等原因,该估价程序较现实价格存在一定的差异,不能很准确地估计出房价信息。
总体而言,本项目的成功实施为房价数据的深度分析和可视化展示提供了一个可行的解决方案。在未来,该项目还可以进一步扩展和优化,以适应不断变化的房地产市场需求,为更多的决策者和投资者提供有价值的数据洞察。

2023.5.30编写

keywords: “Python,大数据,线性回归,可视化”