完整案例分析分享:义乌房屋租赁市场分析

我们将以一个完整案例来操作,从数据的获取,数据的清洗,数据的建模,数据的分析以及数据的展示等整个流程来处理。在案例过程中可能涉及到的函数,命令,操作方式等,也可以进行一些知识的稳固。
file

我们如果想租房,第一反应是上网搜索一些相关的出租信息,这里以安居客做为搜索分析查询的来源。
file

接下来就是我们希望获取的一些信息,在上面这个界面里,我们希望获取到的主要信息有这些:标题,租金,面积,地区,房型,楼层,租赁方式等。

此外我们还需要进行一些数据的获取,例如发布时间,配套设施,这些数据是在详细页面里,我们打开详细页面来看下。
file

通过这些数据我们能大致判断下整个租赁市场的整体情况,例如平均的租金在多少,哪些地区的租金会比较便宜,一般的房型大小是多少的,包括房型的配套设备有哪些等等。

要做数据分析,首先得有明确的数据分析目标,我们需要获得哪些信息用于哪里?

数据分析的目标:
义乌哪个区房源比较多?
义乌哪里租房比较便宜?
市场的平均租金在多少范围?
市场的租金走势是如何的?
出租的房型通常是怎么样的?等等

我们知道Power Query可以直接通过函数获取网页的信息,我们要想获取这些信息,首先得分析网页的结构以便找到真实数据的存放地方。

1. 分析网页结构:
我们知道Power Query可以直接通过函数获取网页的信息,我们要想获取这些信息,首先得分析网页的结构以便找到真实数据的存放地方。
我们先打开搜索界面https://yw.zu.anjuke.com/fangyuan/p/,同时按F12调出浏览器的开发者调试工具,找到我们需要对应信息的文档。
通常来说,一般的网页抓取主要有Get方式和Post方式。
Get方式就是所有的参数在网页链接上会显示;Post的方式就是需要递交一定的参数来获取,数据的变化不体现在网页链接上。那我们来看下这个网站的结构是如何的,是Get类型的还是Post类型的。
对于我们数据分析来说,网页数据格式如果是Josn格式或者是Xml格式,那最好,我们可以通过Power Query直接解析生成,通过观察在抓包过程中,我们看到在XHR格式里面确实有一个Josn格式的文件,但是并不是我们想要的内容。
file

这部分内容我们仔细观察是在底部广告栏这里的数据,所以我们还需要另外查找。
file

我们在Doc文档里面找到我们所需要的数据内容的文件,然后观察获取的方式。
file

我们所需要的就是数据已经找到,那接下来就是要把这里面的数据给提取出来。我们发现这个文件是Get方式获取的。我们可以把数据折叠下,可以看到所有所需要的数据是在每一个<divclass="zu-itemmod"层级下面。那我们实际上就只需要提取所有<divclass="zu-itemmod"所包含的数据内容后再做清洗。最后我们通过观察得到是数据所处的位置在""和""之间,所有我们之后要提取的数据就会用着2个关键词作为提取位置的定位。
file
外我们通过翻页可以观察到https://yw.zu.anjuke.com/fangyuan/p2/红色字体实际上就是页数,之后我们在构建公式的时候这一个地方需要实现变量操作。

对于搜索页面的主要展示数据我们已经知道了数据所在的地方,那我们来看下明细页面里数据所在的地方。

同理在XHR文件格式里面所看到的数据并不是我们所希望得到的,我们所希望得到的数据依旧在Doc文件里面。
file
请注意,配套设备这里表明了带有has的代表有,没有has关键词的代表不提供,也就是图案这里是显示灰色额。
file
到目前为止,我们把网页的结构以及数据所处的位置分析好了,接着就是在Power Query中进行提取这些信息了的操作了。

2. 数据获取:

Power Query中提取网页数据内容的函数是Web.Contents,我们来看下这个函数的用法及解释。
file

Web.Contents(url as text, optionaloptions as nullablerecord) as binary
第1参数是链接的文本格式;第2个参数是一个可空的记录格式;返回的是二进制格式。
通常来说get获取的方式,只需要填写url地址即可,也就是可以忽略后面的第2的可选参数。
我们先以获取搜索页的第一页为例:
Web.Contents("https://yw.zu.anjuke.com/fangyuan/p1/")
file

如果我们单独输入这个公式,Power Query会自动加上Web.Page函数来做网页结果分析,但是网页结果的分析有多个函数,我们在此列一下有哪些函数可以作为网页二进制文件的分析。
file

在这里我们首先需要使用到的就是Text.FromBinary函数,我们把这个函数添加到Web.Contents之前用作解析获得的网页二进制文件。这个转换获取的基本就是把网页源码给全部复制到Power Query里面了,作为一个文本格式储存。
file

之前针对网页结构分析的时候我们已经知道我们所需要的数据是在哪里,那我们先通过2个间隔符之间的文本提取方式,用到的函数为Text.BetweenDelimiters,把大致的数据在源代码的基础上全部提取出来。具体函数用法参考之前的文章提取指定文本之间的文本数据
file

我们再此基础上通过Lines.FromText函数把所有的文本段落作为行来处理。
接下来就可以进行数据的提取了,我们先来处理标题的提取。
file

我们找到标题所在行,并尽量找一个唯一包含内容能作为关键词提取的,这里我们找到了" "作为关键词来进行提取,列表的提取函数为List.Select和文本包含函数Text.Contains相结合。我们需要的就是提取包含关键词的所在行,这样我们就能获得一个标题的列表了。
file

到了这一步基本上就基本已经把第一页的标题提取出来了。我们只需要进行下一步的清洗获得标准格式的数据即可。
接着我们用同样的方法来提取价格,地区,租赁类型,方型,楼层,详情链接等信息。
链接的筛选关键词:link
房型,面积,楼层的关键词:平米
地区关键词:
租金关键词:

3. 数据清洗:

在获得基本数据后,我们需要通过清洗来把数据进行整理,以便获得比较规范的格式。

例如我们在获得标题数据后,我们发现我们需要提取的完整数据是在">"和"<"两个分隔符之间的数据,那我们可以依旧使用文本提取公式Text.BetweenDelimiters来进行操作,但是这里是列表格式,我们需要进行批量操作的话则还需使用List.Transform函数来处理。也就是在我们已经提取完数据后再外面嵌套个List.Transform公式。
file

同理我们对其他数据进行清洗
清洗链接:提取两个"分隔符之间的文本,请注意"这里进行提取的话则需要使用""来进行处理。
file

最后我们把初步清洗完成的列表数据组合后转成表格格式。使用的函数为Table.FromColumns
file

最后把房型里面的数据再进行分割提取生成新的列表。可以直接通过分类,提取等操作方式来进行。最后把格式进行一下修整和类型定义。这样第一页的数据基本已经完成。我们如果想之后分析的更细,可以把楼层和房型再次根据需求提取,这里就不一一阐述了。

到此为止,已经把搜索页的第一页数据已经提取并整理完成,接下来就是详细页的发布日期以及配套设施了。
我们先以一个网页为基础来看下如何获取。
file

先通过Web.Contents获取二进制格式,然后用Lines.FromBinary来转换成行,之后通过List.Select来选择包含发布关键词的行,最后通过提取发布时间和<两个分隔符之间的时间。我们发现在Web.Contents里面是一个连接,也就是我们之前从搜索页面上获取的链接,这就可以直接作为我们添加列时候直接使用变量来替换了。
file

最后是一个配套设备的数据,我们先看下数据所在的位置。
file

数据是在li标签里面,但是如果通过筛选则无法找到唯一值作为筛选条件,我们要求的数据是peitao-info里面,但是需要在li标签的class属性包含has关键词。

我们通过仔细观察,发现所有我们要求的数据都是在has标签下的第2行,也就是说我们先找到包含has的peitao-itemhas的行,再往下数2行既是我们需要的数据所在行。
file

既然思路有了,那我们就可以用函数来操作了。
先通过这个嵌套函数获取网页代码数据Lines.FromBinary(Web.Contents())。
然后我们要找到我们需要提取数据所在的位置。通过List.Transform(List.PositionOfAny())函数嵌套来查找,这里需要注意的是,必须把整行的数据作为筛选条件,而不是关键词,同时偏移的位置是往下2行,则是+2,如果往上则是做减法。
file

既然有了需要提取的位置,那就简单了。用List.Range函数来做提取,List.Transform做批量处理,处理完后用List.Combine把数据合并,合并完成后批量处理文本分隔符之间的提取,最后通过/来把列表进行合并成单一的数据。
file
file

这是针对一个明细页的数据,我们可以把这个过程自定义为一个函数,可以在之后总表中进行添加自定义列进行连接获取并提取。只需要把链接地址作为一个变量,在原来的let外面再嵌套一层作为函数写法即可。
file
这样我们已经得到全部第一页我们希望获取的信息,最后就是做一个循环即可,把页面地址改成变量。
我们先添加一个需要抓取多少页的这个变量,然后在使用循环调取函数进行操作。Table.Combine(List.Transform({1..page},调用的函数))
file
最后在Power Query中我们有3个查询。页数,配套设备的自定义函数,以及最终的数据表。
file
到目前为止,数据获取,清洗已经全部完成,接下来我们就可以上载到Power Pivot里面了。
在这里再提醒一次,此类网站的数据一般会做防爬处理,只做学习研究用,如果你一下子爬多页数据,则可能会需要你进行验证。
file
file

4. 数据分析:
把清洗完的数据加载到Power Pivot
file

插入透视表,同时把数据源选择为使用数据模型。
file

这时我们可以观察到数据透视表这里的数据选项,在数据图标右下角有个标记,这就代表了是数据模型,而不是一般的表。因为我们这里只涉及到一个查询表上载到数据模型,所以就不存在所谓的关系。
file

接下来我们就写一些比较简单的度量值来做分析。通过右击数据源,使用添加度量值的方式来进行分析。
file

出租房源=COUNTROWS('房源信息')
最低租金=MIN('房源信息'[租金])
最高租金=MAX('房源信息'[租金])
最小面积=MIN('房源信息'[大小])
最大面积=MAX('房源信息'[大小])
file

这里只抓取了20页的数据,我们通过计算可以看到最大面积和最小面积以及最低最近和最高租金差异非常的大,如果我们直接使用平均租金或者平均面积的话,数据可能会失真,差不多和国家统计局计算平均收入一样了。所以在这里我们需要使用中位数来进行分析,这样才能看到大致的出租面积和租金,我们继续添加面积和租金的中位数。
面积中位数=MEDIAN('房源信息'[大小])
租金中位数=MEDIAN('房源信息'[租金])

把这两个数据插入到透视表中。

这样我们可以比较清晰的看到处于中间位置的面积和租金在108M2和3350元/月。
file
通过数据拖放,我们还可以得到一些随着时间的变化,出租房源以及租金的变化趋势。

5. 补充知识:

我们在之前的义乌租房市场分析中,在计算面积和租金是用的是中位数进行的分析。

1). 何时使用中位值替代平均值来进行分析?
通常来讲用哪种来进行分析,主要参考的是统计值的偏斜度。
使用中位数分析:偏斜度>1 或者 偏斜度<-1
平均数分析:-1>=偏斜度>=1

2). 偏斜度如何计算呢?
在Excel里面有一个函数SKEW是用于偏斜度的计算。
file

具体的计算我们不用细究,我们只做应用。
备注:至少3个以上数据才能使用,同时所有分析的数据不能全部一样。

我们通过计算,不管是面积还是租金偏斜度都达到了18以上,足够证明需要使用中位数来进行分析。