精华内容
下载资源
问答
  • 基于Python的可视化数据分析系统采Django框架进行开发,功能包括缺失值处理、异常值处理、重复值处理、探索性数据分析、决策树、线性回归、KNN分类、k-means聚类、PCA数据降维。数据可视化功能使用Echart进行设计,...
  • 关于二手房Python数据分析

    千次阅读 2020-07-02 02:10:09
    利用Python开发工具,从网站爬取某网站上的二手房数据,对数据源结合 Pandas、Numpy、Matplotlib、Sklearn 等技术进行分析,获得影响二手房买卖的具体因素。

    摘要

    利用Python开发工具,从网站爬取某网站上的二手房数据,对数据源结合 Pandas、Numpy、Matplotlib、Sklearn 等技术进行分析,获得影响二手房买卖的具体因素。

    1.引言

    网络爬虫是可以自动抓取网页上各种类型数据的程序。网络爬虫使用网页的链接地址查找网页的内容,并直接返回用户所需的数据,而无需手动操纵浏览器来获取它。爬虫是搜索引擎中的重要组成部分,可在互联网上为搜索引擎抓取数据。通用搜索引擎(例如谷歌和百度)等逐渐成为人们访问互联网的入口。但是,由于它们的通用性限制,在抓取网页时没有针对性,因而也无法对其抓取的结果进行针对特定领域的进一步分析,导致查询结果不够深入和专业化;另外,一般的搜索引擎通常会返回一些与用户所寻找的主题无关的结果,从而造成信息过载。
    本文提出的爬虫程序通过模拟登录二手房网站,获取相关数据,并将这些数据保存到本地,为进一步的数据挖掘和分析提供了方便。最后,本文使用Python可视化方法对数据进行简单的数据分析。

    2.系统结构

    2.1 Python
    Python的作者是荷兰人Guido von Rossum。1982年,Guido在阿姆斯特丹大学获得了数学和计算机科学的硕士学位。 与今天相比,在他那个时代,个人计算机的主频和RAM非常低,这导致计算机配置非常低。为了使程序在个人计算机上运行,所有编译器的核心都经过了优化,因为如果不进行优化,则较大的数组会填满内存。Guido希望编写一种新语言,该语言应该具有功能齐全,易于学习,易于使用并且可以扩展的功能。 1989年,Guido开始为Python语言编写编译器。
    2.2 Pandas
    Pandas是用于Python的数据分析包。 它包含许多高级数据结构和操作工具,可以让人们使用Python进行数据分析更加轻松快捷。
    2.3 Numpy
    Numpy是使用Python进行科学计算的基础包。它包括一个功能强大的N维数组对象Array。它具有成熟的函数库,例如矩阵数据类型和矢量处理等。
    2.4 Matplotlib
    数据可视化是数据分析的结果,可以更直观,更优雅地显示结果。Matplotlib库是Python数据可视化的重要类库之一。它包含大量的数据可视化资源,包括地图,3D等。
    Matplotlib有四个部分:
    (1)Matplotlib的基本figure类型;
    (2)调整figure和样式以及颜色;
    (3)在图形上添加注释(包括坐标轴范围,长宽比或坐标轴等);
    (4)其他复杂图形。

    3.具体实现

    3.1 数据获取
    为了对北京二手房买卖影响因素的具体分析,于是利用Python语言对某网站上的北京二手房数据进行网络爬虫获取,以表格形式展示:爬虫数据

    3.2代码实现

    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib as mpl
    
    import matplotlib.pyplot as plt
    from IPython.display import display
    plt.style.use("fivethirtyeight")
    sns.set_style({'font.sans-serif':['simhei','Arial']})
    
    
    # 导入链家二手房数据
    lianjia_df = pd.read_csv('D:\lianjia.csv')
    display(lianjia_df.head(n=10))
    
    # 检查缺失值情况
    #lianjia_df.info()
    
    lianjia_df.describe()
    
    # 添加新特征房屋均价
    df = lianjia_df.copy()
    df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size']
    
    # 重新摆放列位置
    columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
    df = pd.DataFrame(df, columns = columns)
    
    # 重新审视数据集
    display(df.head(n=10))
    
    # 对二手房区域分组对比二手房数量和每平米房价
    df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
    df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
    
    f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15))
    sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1)
    ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15)
    ax1.set_xlabel('区域')
    ax1.set_ylabel('每平米单价')
    
    sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2)
    ax2.set_title('北京各大区二手房数量对比',fontsize=15)
    ax2.set_xlabel('区域')
    ax2.set_ylabel('数量')
    
    sns.boxplot(x='Region', y='Price', data=df, ax=ax3)
    ax3.set_title('北京各大区二手房房屋总价',fontsize=15)
    ax3.set_xlabel('区域')
    ax3.set_ylabel('房屋总价')
    
    plt.show()
    
    f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
    # 建房时间的分布情况
    sns.distplot(df['Size'], bins=20, ax=ax1, color='r')
    sns.kdeplot(df['Size'], shade=True, ax=ax1)
    # 建房时间和出售价格的关系
    sns.regplot(x='Size', y='Price', data=df, ax=ax2)
    plt.show()
    
    
    df.loc[df['Size']< 10]
    plt.show()
    
    df.loc[df['Size']>1000]
    plt.show()
    
    df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
    plt.show()
    
    f, ax1= plt.subplots(figsize=(20,20))
    sns.countplot(y='Layout', data=df, ax=ax1)
    ax1.set_title('房屋户型',fontsize=15)
    ax1.set_xlabel('数量')
    ax1.set_ylabel('户型')
    plt.show()
    
    df['Renovation'].value_counts()
    
    # 去掉错误数据“南北”,因为爬虫过程中一些信息位置为空,导致“Direction”的特征出现在这里,需要清除或替换
    df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
    
    # 画幅设置
    f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5))
    sns.countplot(df['Renovation'], ax=ax1)
    sns.barplot(x='Renovation', y='Price', data=df, ax=ax2)
    sns.boxplot(x='Renovation', y='Price', data=df, ax=ax3)
    plt.show()
    
    misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])
    print('Elevator缺失值数量为:'+ str(misn))
    
    # 由于存在个别类型错误,如简装和精装,特征值错位,故需要移除
    df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']
    
    # 填补Elevator缺失值
    df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
    df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'
    
    f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10))
    sns.countplot(df['Elevator'], ax=ax1)
    ax1.set_title('有无电梯数量对比',fontsize=15)
    ax1.set_xlabel('是否有电梯')
    ax1.set_ylabel('数量')
    sns.barplot(x='Elevator', y='Price', data=df, ax=ax2)
    ax2.set_title('有无电梯房价对比',fontsize=15)
    ax2.set_xlabel('是否有电梯')
    ax2.set_ylabel('总价')
    plt.show()
    
    grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',height=4)
    grid.map(plt.scatter, 'Year', 'Price')
    grid.add_legend()
    
    
    f, ax1= plt.subplots(figsize=(20,5))
    sns.countplot(x='Floor', data=df, ax=ax1)
    ax1.set_title('楼层特征分析',fontsize=15)
    ax1.set_xlabel('数量')
    ax1.set_ylabel('楼层')
    plt.show()
    

    4.实验结果分析

    1. 根据初步观察,可以发现一共有11个特征变量,价格(Price)在这里是我的目标变量。

    初步观察
    2. 深入观察发现了数据集一共有23677条数据,其中Elevator特征有明显的缺失值。

    深入观察
    在这里,上面的结果给出了特征值是数值的一些统计值,包括平均数,标准差,中位数,最小值,最大值,25%分位数,75%分位数。这些统计结果简单直接,对于初始了解一个特征好坏非常有用,举个例子就是我观察到的Size(即房屋面积)特征的最大值为1019平米,最小值为2平米,那么我就要思考这个在实际中是不是存在的,如果不存在就没有意义,那么这个数据就是一个异常值,会严重影响模型的性能。
    当然,这只是我的初步观察,后续我再用数据可视化来清晰地展示,并证实我的猜测。
    3.进一步分析后,我发现ID这个值其实没有什么实际意义,所以将其移除。由于房屋单价分析起来比较方便,简单的使用总价与面积比就可得到,所以增加一个新的特征PerPrice(即每平方米的价格,只用于分析,不是预测特征)。另外,特征的顺序也调整了一下,看起来比较舒服。特征顺序调整

    1. 接着我对区域特征进行可视化分析,通过下图我可以分析不同区域房价和数量的对比。
      不同区域房价和数量对比
      这里我使用了pandas的网络透视功能groupby分组排序。区域特征可视化直接采用seaborn完成,颜色使用调色板palette参数,颜色渐变,越浅说明越少,反之越多。然后可以观察到:
      (1)二手房均价:西城区的房价最贵均价大约11万/平方米,因为西城在二环以里,且是热门学区房的聚集地。其次是东城大约10万/平方米,然后是海淀大约8.5万/平方米,其它均低于8万/平方米。
      (2)二手房房数量:从数量统计上来看,目前二手房市场上比较火热的区域。海淀区和朝阳区二手房数量最多,差不多都接近3000套,毕竟大区,需求量也大。然后是丰台区,近几年正在改造建设,有赶超之势。
      (3)二手房总价:通过箱型图看到,各大区域房屋总价中位数都都在1000万以下,且房屋总价离散值较高,西城最高达到了6000万,说明房屋价格特征不是理想的正态分布。

    2. 通过distplot和kdeplot绘制柱状图观察 Size (面积)特征的分布情况(如下图),属于长尾类型的分布,这说明了有很多面积很大且超出正常范围的二手房。

     Size特征的分布情况
    6. 然后我再分析一下面积与价格之间的关系,通过regplot绘制了Size 和 Price 之间的散点图(如下图),可以发现 Size 特征基本与Price呈现线性关系,符合基本常识:面积越大,价格越高。但是有两组明显的异常点:一个是面积不到10平米,但是价格超出10000万;另一个是一个点面积超过了1000平米,价格很低,所以需要查看是什么情况。

    Size 和 Price 之间的散点图
    经过查看发现这组数据是别墅,出现异常的原因是由于别墅结构比较特殊(无朝向无电梯),字段定义与二手商品房不太一样导致爬虫爬取数据错位。也因为别墅类型二手房不在我的考虑范围之内,故将其移除再次观察Size分布和Price关系。

     别墅
    观察另一个异常点不是普通的民用二手房,很可能是商用房,所以才有1房间0厅确有如此大超过1000平米的面积,这里选择移除。

    1房间0厅
    重新进行可视化发现就没有明显的异常点了。

     重新进行可视化

    再进一步可视化分析,发现各种厅室组合搭配,竟然还有9室3厅,4室0厅等奇怪的结构。其中,2室一厅占绝大部分,其次是3室一厅,2室2厅,3室两厅。但是仔细观察特征分类下有很多不规则的命名,比如2室一厅与2房间1卫,还有别墅,没有统一的叫法。这样的特征是不能作为机器学习模型的数据输入的,需要使用特征工程进行相应的处理。

    房屋户型
    7. 接着再进行Renovation 特征分析
    精装 11345 简装 8497 其他 3239 毛坯 576 南北 20
    发现Renovation装修特征中有南北,它属于朝向的类型,这里可能是因为爬虫过程中一些信息位置为空,导致“Direction”朝向特征出现在这里,所以需要清除或替换掉。
    进一步可视化分析观察到,精装修的二手房数量最多,简装其次。而对于价格来说,毛坯类型却是最高,其次是精装修。

     Renovation 特征分析
    8. 接着对有无电梯(Elevator)特征分析,初探数据的时候,我发现Elevator特征是有大量缺失值的,然后先看看有多少缺失值:

     Elevator缺失值
    根据上图我们知道一共有8237条缺省值,有点大,为了解决,根据实际情况考虑,常用的方法有平均值/中位数填补法,直接移除,或者根据其他特征建模预测等。这里我考虑填补法,但是有无电梯不是数值,不存在平均值和中位数,所以我就是楼层 Floor 来判断有无电梯,一般的楼层大于6的都有电梯,而小于等于6层的一般都没有。

    有无电梯相关数据对比
    再进一步分析观察到,有电梯的二手房数量居多一些,因为高层土地利用率比较高,适合北京庞大的人群需要,而高层就需要电梯。相应的,有电梯二手房房价较高,因为电梯前期装修费和后期维护费包含内了(但这个价格比较只是一个平均的概念,比如无电梯的6层豪华小区价格就更高了)。
    9. 接着对Year(年份)进行分析:
    根据图24我们可以了解到,在Renovation(装修)和Elevator的分类条件下,使用FaceGrid分析 Year 值,观察结果为:整个二手房房价趋势是随着时间增长而增长的;2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;1980年之前几乎不存在有电梯二手房数据,说明1980年之前还没有大面积安装电梯;1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少。
    Year特征分析

    10.然后对楼层(Floor)观察可以看到,6层二手房数量最多,但是单独的楼层特征没有什么意义,因为每个小区住房的总楼层数都不一样。通常情况下,中层比较受欢迎,价格也相对较高,底层和顶层较不受欢迎,价格也相对较低。 因此,楼层是非常复杂的特征,其也对房价具有较大的影响。
     Floor特征分析
    图25 Floor特征分析

    5.总结和展望

    这次的数据分析,算是比较全面的分析了北京二手房数据,也对于基于python的数据分析也有了更深层次的理解。但是还有一些待改进的地方,比如:
    需要保证爬虫所得到的数据源是否准确,在进行数据分析时,需要先对所得数据进行筛选,不然可能会造成分析结果出现误差。所以,在以后的学习里,我会这对这些问题加倍注意,争取做出更加合理的数据分析。

    参考文献:
    [1] 邓英、夏帮贵.Python3基础教程[M].北京:人民邮电出版社,2016
    [2] 张俊红.Python数据分析[M].北京:电子工业出版社,2019
    [3] 张良均. Python数据分析与挖掘实战[M]. 机械工业出版社, 2016.
    [4] IvanIdris, 伊德里斯, 张驭宇. Python数据分析基础教程:NumPy学习指南[M]. 人民邮电出版社, 2014.

    展开全文
  • 一、数据分析的流程思路 1、明确分析目的和思路/提出假设 2、数据收集 3、数据处理/整理 4、数据分析/验证假设 5、数据展现/可视化图表 6、报告撰写 二、分析目的 需求01:每平米二手房单价(总价,按月均价) 需求...

    一、数据分析的流程思路

    1、明确分析目的和思路/提出假设

    2、数据收集

    3、数据处理/整理

    4、数据分析/验证假设

    5、数据展现/可视化图表

    6、报告撰写

    二、分析目的

    1. 需求01:每平米二手房单价(总价,按月均价)
    2. 需求02:各大区房屋面积总和,降序排序
    3. 需求03:按照周来分析,每一周中的北京市的二手房交易的数量是上涨还是下降趋势,还是基本不变?
    4. 需求04:按照周来分析,每一周的二手房成交的单位均价的走势怎么样?
    5. 需求05:按大区/小区/地区分析平均挂牌周期

    三、数据收集

    已有某地产网站的数据,存储在csv文件中。

    四、数据处理

    4.1 引入python数据分析库

    import numpy as np #用于常规的数据运算
    import pandas as pd  #用于数据分析,包括数据的引入,特征的提取以及数据的清洗转移等
    import matplotlib as mpl #用于数据的可视化
    import matplotlib.pyplot as plt #方便快速绘制2D图表
    

    4.2 设置绘图中文支持

    mpl.rcParams["font.family"] = "SimHei" #设置字体
    mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负号
    plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
    
    % matplotlib inline #将那些用于matplotlib绘制的图显示在页面里而不是弹出一个窗口
    

    4.3 读取数据

    lianjia = pd.read_csv("XXXXXXXX.csv",  encoding="utf-8",  sep="\t") # 读取csv文件
    pd.set_option("max_colwidth", 60)     # 设置每个字段,最多显示60个字符
    pd.set_option("max_columns", 50)      # 设置每个dataframe显示 50个字段
    lianjia.head(3) #查看前三行
    

    结果:

    成交价(万)	成交时间	所在小区	户型	建筑面积	挂牌价格(万)	成交周期(天)	调价(次)	带看(次)	关注(人)	浏览(次	链家编号	交易权属	挂牌时间	房屋用途	房屋年限	房权所属	房屋户型	所在楼层	户型结构	套内面积(㎡)	建筑类型	房屋朝向	建成年代	装修情况	建筑结构	供暖方式	梯户比例	产权年限	配备电梯	xx1	xx2
    0	大兴	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    1	297	2019-10-29 成交	格林云墅	3189.95	300	608	1.0	4.0	43.0	6424	1.01E+11	商品房	2018/3/1	普通住宅	满两年	非共有	3111卫	中楼层(9)	暂无数据	73.63	塔楼	南 北	2014	精装	钢混结构	集中供暖	一梯两户	70	有	NaN	NaN
    2	366	2019-10-29 成交	三羊里	2189.79	368	31	0.0	3.0	4.0	118	1.01E+11	商品房	2019/9/29	普通住宅	满两年	非共有	2111卫	中楼层(6)	平层	80.44	板楼	南 北	2009	其他	钢混结构	集中供暖	一梯两户	70	无	NaN	NaN
    

    查看数据整体结构

    lianjia.info() #查看数据整体结构
    

    结果:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 38393 entries, 0 to 38392
    Data columns (total 32 columns):
    成交价(万)     38393 non-null object
    成交时间       38379 non-null object
    所在小区       38379 non-null object
    户型         38379 non-null object
    建筑面积       38379 non-null object
    挂牌价格(万)    38379 non-null object
    成交周期(天)    38379 non-null object
    调价(次)      38379 non-null float64
    带看(次)      38379 non-null float64
    关注(人)      38379 non-null float64
    浏览(次       38379 non-null object
    链家编号       38379 non-null object
    交易权属       38379 non-null object
    挂牌时间       38379 non-null object
    房屋用途       38379 non-null object
    房屋年限       38379 non-null object
    房权所属       38379 non-null object
    房屋户型       38379 non-null object
    所在楼层       38379 non-null object
    户型结构       38379 non-null object
    套内面积(㎡)    38379 non-null object
    建筑类型       38379 non-null object
    房屋朝向       38379 non-null object
    建成年代       38379 non-null object
    装修情况       38379 non-null object
    建筑结构       38379 non-null object
    供暖方式       38379 non-null object
    梯户比例       38379 non-null object
    产权年限       38379 non-null object
    配备电梯       38379 non-null object
    xx1        3022 non-null object
    xx2        3022 non-null object
    dtypes: float64(3), object(29)
    memory usage: 9.4+ MB
    

    4.4 数据预处理

    4.4.1 处理大区

    成交价比其他字段非空数据要多,经查看原始表是因为大区存放在这个字段下。下面新增加一个大区字段。

    lianjia["大区"] = lianjia["成交价(万)"]    # 把  "成交价(万)"  这个字段的值赋值给  大区  这个字段
    lianjia[["大区", "成交价(万)"]].head(10) #查看新增加字段
    
    大区	成交价(万)
    0	大兴	大兴
    1	297	297
    2	366	366
    3	226	226
    4	548	548
    5	245	245
    6	254	254
    7	193	193
    8	280	280
    9	347	347
    

    将大区字段中的数字替换为区名

    lianjia["大区"] = lianjia["大区"].str.replace("-", "").replace("\d+", np.nan, regex=True) #去掉特殊符号-,将数字替换为nan
    lianjia["大区"].fillna(inplace=True, method="ffill") #将空值替换为前面的区名
    lianjia.dropna(axis=0, inplace=True, thresh=20) #删除大区nan nan nan这样的行
    
    # 将大区字段挪到第一列
    lianjia_daqu = lianjia["大区"]
    lianjia.drop("大区", axis=1, inplace=True)
    lianjia.insert(0, "大区", lianjia_daqu)
    display(lianjia[["大区", "成交时间", "所在小区", "户型", "建筑面积"]].sample(10))#查看结果
            大区	成交时间     	所在小区	        户型	建筑面积
    6654	房山	2019-08 成交	碧桂园小区二区	1058
    15175	门头沟	2019-09 成交	新桥路小区	    2151.47
    29127	西城	2019-05-12 成交	龙爪槐胡同	    2167.36
    25210	通州	2019-06 成交	海棠湾一期	    2291.07
    1797	大兴	2019-07 成交	丽园C区	        32141.48
    33204	昌平	2019.09.03	    新龙城	        21100.2
    36054	东城	1905/7/11	    前门东大街	    3169.79
    5760	朝阳	2019-09-04 成交	富力城D区	    2185.04
    12756	海淀	2019-09-30 成交	定慧北里	        3182.44
    32146	亦庄开发区	2017-03-07 成交	荣京丽都	    1041.44
    

    4.4.2 处理xx1,xx2

    从前面的info列表可以看到xx1,xx2两个字段绝大多数是缺失值

    display(lianjia["xx1"].unique())   # 查看xx1去重后的值 
    display(lianjia["xx2"].unique())   # 查看xx2去重后的值
    array([nan, '70', '40', '50', '未知'], dtype=object)  
    array([nan, '有', '无', '暂无数据'], dtype=object)
    ### 删除 xx1, xx2 这两列
    lianjia.drop(axis=1, columns=["xx1", "xx2"], inplace=True) #删除xx1,xx2这两列
    

    所有字段均无缺失值

    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 35357 entries, 1 to 35369
    Data columns (total 31 columns):
    大区         35357 non-null object
    成交价(万)     35357 non-null object
    成交时间       35357 non-null object
    所在小区       35357 non-null object
    户型         35357 non-null object
    建筑面积       35357 non-null object
    挂牌价格(万)    35357 non-null object
    成交周期(天)    35357 non-null object
    调价(次)      35357 non-null float64
    带看(次)      35357 non-null float64
    关注(人)      35357 non-null float64
    浏览(次       35357 non-null object
    链家编号       35357 non-null object
    交易权属       35357 non-null object
    挂牌时间       35357 non-null object
    房屋用途       35357 non-null object
    房屋年限       35357 non-null object
    房权所属       35357 non-null object
    房屋户型       35357 non-null object
    所在楼层       35357 non-null object
    户型结构       35357 non-null object
    套内面积(㎡)    35357 non-null object
    建筑类型       35357 non-null object
    房屋朝向       35357 non-null object
    建成年代       35357 non-null object
    装修情况       35357 non-null object
    建筑结构       35357 non-null object
    供暖方式       35357 non-null object
    梯户比例       35357 non-null object
    产权年限       35357 non-null object
    配备电梯       35357 non-null object
    dtypes: float64(3), object(28)
    memory usage: 8.6+ MB
    

    4.4.3 处理时间

    #查看跟日期有关的所有字段
    display(lianjia[["成交时间", "成交周期(天)", "挂牌时间"]].sample(10))
    display(lianjia[["成交时间", "成交周期(天)", "挂牌时间"]].dtypes)
    

    在这里插入图片描述

    # 先把 "成交时间" 这个字段上的  " 成交"  字符串去掉
    lianjia["成交时间"] = lianjia["成交时间"].str.replace(" 成交", "")
    # 统一时间格式
    lianjia["成交时间"] = pd.to_datetime(lianjia["成交时间"])
    lianjia["挂牌时间"] = pd.to_datetime(lianjia["挂牌时间"])
    # 计算成交周期,并转换为天数
    lianjia["成交周期(新)"] = lianjia["成交时间"] - lianjia["挂牌时间"]
    lianjia["成交周期(天)"] = lianjia["成交周期(新)"].dt.days
    #获取成交时间年、周
    lianjia["成交时间(年)"] = lianjia["成交时间"].dt.year
    lianjia["成交时间(周)"] = lianjia["成交时间"].dt.week
    

    4.4.4 处理其他字段

    lianjia[["大区", "所在小区", "户型", "建筑面积"]].loc[[30922, 32852, 8784, 31629]]
    	    大区	    所在小区	        户型	建筑面积
    30922	亦庄开发区	林肯公园二期C区	#NAME?	--
    32852	昌平	    首开智慧社	    车位	6.99 户型结构
    8784	房山	    行宫园一里	    #NAME?	--
    31629	亦庄开发区	新海南里      	#NAME?	--
    #删除户型为车位的行,并不需要分析车位,而且对应的建筑面积也不规范
    lianjia.drop(lianjia[(lianjia["户型"] == "车位")].index, inplace=True)
    #删除户型为#NAME?,删除建筑面积为--的行
    lianjia.drop(lianjia[(lianjia["户型"] == "#NAME?") | (lianjia["建筑面积"] == "--")].index, inplace=True)
    
    # 建筑面积中文字符和空格变为空,并转换为浮点值
    lianjia["建筑面积"] = lianjia["建筑面积"].str.replace("[\s\u4e00-\u9fa5]", "", regex=True)
    lianjia["建筑面积"] = lianjia["建筑面积"].astype(np.float32)
    
    lianjia[["成交价(万)", "挂牌价格(万)", "调价(次)", "带看(次)", "关注(人)", "浏览(次"]].sample(10)
            成交价(万)	挂牌价格(万)调价(次)带看(次) 关注(人)浏览(次
    10648	290	        290	            0.0	    2.0	    8.0	     288
    30125	363	        390	            0.0	    6.0	    14.0	 3680
    14244   648   	    680	            0.0	    0.0	    0.0	   暂无数据
    21619	209-214 	226	            1.0	    2.0	    3.0	     155
    27061	327-334 	355	            1.0	    6.0	    132.0	 1423
    4598	499	        480	            0.0	    27.0	42.0	 924
    35070	805   	    850	            1.0	    24.0	51.0	 13856
    5253	437	        437	            1.0	    46.0	82.0	 962
    1369	293-324	    暂无数据   	    0.0	    0.0	    0.0	   暂无数据
    12051	586	        600	            1.0   	84.0	55.0	 5399
    
    # 成交价类似293-324,取两个数字的平均值
    #函数按照-拆分,如果是一个数字则直接返回该数字,如果是两个数字则计算平均值后返回
    def handle(value):
        values2 = str(value).split("-")
        if len(values2) == 1:
            return value
        else:
            result = (float(values2[0]) + float(values2[1])) / 2
            return str(result)
    
    lianjia["成交价(万)"] = lianjia["成交价(万)"].map(handle)    #  调用函数进行映射
    lianjia["成交价(万)"] = lianjia["成交价(万)"].astype(np.float32)
    #处理
    lianjia["挂牌价格(万)"] = lianjia["挂牌价格(万)"].str.replace("暂无数据", "0")
    lianjia["浏览(次"] = lianjia["浏览(次"].str.replace("暂无数据", "0")
    #转换数据类型
    lianjia["挂牌价格(万)"] = lianjia["挂牌价格(万)"].astype(np.float32)
    lianjia["成交周期(天)"] = lianjia["成交周期(天)"].astype(np.float32)
    lianjia["浏览(次"] = lianjia["浏览(次"].astype(np.float32)
    
    lianjia[[ "链家编号", "交易权属", "房屋用途", "房屋年限"]].sample(10)
            链家编号	   交易权属	房屋用途	 房屋年限
    30379	1.01E+11	商品房	普通住宅	 暂无数据
    32736	1.01E+11	商品房	普通住宅	 暂无数据
    4078	1.01E+11	商品房	普通住宅	 满五年
    9624	1.01E+11	商品房	普通住宅	 满五年
    7003	1.01E+11	商品房	普通住宅	 满五年
    31937	1.01E+11	商品房	公寓	 暂无数据
    13796	1.01E+11	商品房	普通住宅	 暂无数据
    5560	1.01E+11	已购公房	普通住宅	 满五年
    11346	1.01E+11	商品房	普通住宅  满五年
    598 	1.01E+11    商品房	普通住宅	 满五年
    lianjia[[ "房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]].sample(10)
            房权所属	房屋户型	    所在楼层  	  户型结构	套内面积(㎡)
    29047	非共有	2211卫	低楼层(7)	平层	暂无数据
    17853	共有	2111卫	顶层(6)	    平层	暂无数据
    29596	暂无数据	2112卫	中楼层(19)	平层	暂无数据
    14038	非共有	2111卫	高楼层(18)	暂无数据	暂无数
    27348	非共有	1011卫	中楼层(26)	暂无数据	18.53
    31512	非共有	2111卫	中楼层(6)	平层	77.18
    25027	非共有	1011卫	低楼层(7)	暂无数据	暂无数据
    687	    非共有	1111卫	中楼层(15)	平层	46.22
    3567	共有	3111卫	低楼层(6)	平层	暂无数据
    15897	非共有	1111卫	底层(6)	    平层	暂无数据
    
    #使用相同户型面积填充套内面积
    temp_df1 = lianjia[~lianjia["套内面积(㎡)"].str.contains("暂无|建|数")][["房权所属", "房屋户型", "所在楼层",                                  "户型结构", "套内面积(㎡)"]]
    temp_df2 = lianjia[lianjia["套内面积(㎡)"].str.contains("暂无|建|数")][["房权所属", "房屋户型", "所在楼层",                                    "户型结构", "套内面积(㎡)"]]
    temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("暂无数据", np.nan)
    temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("暂无数", np.nan)
    temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("\d+\s+.*", np.nan, regex=True)
    lianjia_new5 = pd.concat((temp_df1, temp_df2))
    lianjia[["房权所属", "房屋户型", "所在楼层",  "户型结构", "套内面积(㎡)"]]  = lianjia_new5[["房权所属",                             "房屋户型", "所在楼层",  "户型结构", "套内面积(㎡)"]]
    lianjia[["房权所属", "房屋户型", "所在楼层",  "户型结构", "套内面积(㎡)"]].tail(10)
            房权所属	房屋户型	    所在楼层	     户型结构	套内面积(㎡)
    35360	暂无数据	2111卫	中楼层(6)	平层	NaN
    35361	非共有	2211卫	底层(6)	    平层	NaN
    35362	非共有	3112卫	高楼层(21)	平层	117.11
    35363	暂无数据	1111卫	底层(5)	    平层	NaN
    35364	非共有	3111卫	高楼层(6)	平层	84.11
    35365	暂无数据	3111卫	高楼层(6)	平层	NaN
    35366	非共有	1001卫	低楼层(28)	平层	NaN
    35367	暂无数据	1001卫	低楼层(28)	平层	NaN
    35368	非共有	1211卫	高楼层(6)	平层	NaN
    35369	非共有	2212卫	高楼层(6)	平层	NaN
    # 类型转换
    lianjia["套内面积(㎡)"] = lianjia["套内面积(㎡)"].astype(np.float32)
    # 使用每种户型的面积的平均值来进行替换
    lianjia["套内面积(㎡)"] = lianjia["套内面积(㎡)"].fillna(
    lianjia.groupby("房屋户型")["套内面积(㎡)"].transform("mean"))
    
    lianjia[[ "建筑类型", "房屋朝向", "建成年代", "装修情况", "建筑结构"]].sample(10)
            建筑类型	房屋朝向	建成年代	装修情况	建筑结构
    28721	板楼	南 北	1960	简装	混合结构
    21679	板楼	南 北	2009	其他	钢混结构
    20617	板楼	东 西	2004	简装	混合结构
    30381	板楼	南 北	2001	简装	混合结构
    32116	板楼	南 北	2013	简装	钢混结构
    2539	板楼	南 北	2003	精装	混合结构
    15401	板楼	南 北	1980	精装	混合结构
    21363	板楼	南 北	2012	简装	钢混结构
    13273	板楼	南 北	1996	其他	混合结构
    5942	板楼	南 西 北	2007	其他	钢混结构
    lianjia[[ "供暖方式", "梯户比例", "产权年限", "配备电梯"]].sample(10)
            供暖方式	梯户比例	产权年限	配备电梯
    22469	集中供暖	一梯四户	7029064	集中供暖	两梯七户	7023215	集中供暖	一梯三户	7026982	集中供暖	一梯三户	703056	集中供暖	一梯三户	7025895	集中供暖	一梯两户	7033206	自供暖	一梯四户	7031214	自供暖	两梯三户	707638	集中供暖	一梯九户	7023420	集中供暖	一梯三户	70#产权年限未知的用70填充
    lianjia["产权年限"] = lianjia["产权年限"].str.replace("未知", "70")
    lianjia["产权年限"] = lianjia["产权年限"].astype(np.int32)
    # 删除 成交周期(新) 这个字段
    lianjia.drop("成交周期(新)", axis=1, inplace=True)
    

    4.4.5 检查处理后的数据

    lianjia.info()
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 34520 entries, 1 to 35369
    Data columns (total 34 columns):
    大区         34520 non-null object
    成交价(万)     34520 non-null float32
    成交时间       34520 non-null datetime64[ns]
    所在小区       34520 non-null object
    户型         34520 non-null object
    建筑面积       34520 non-null float32
    挂牌价格(万)    34520 non-null float32
    成交周期(天)    34520 non-null float32
    调价(次)      34520 non-null float64
    带看(次)      34520 non-null float64
    关注(人)      34520 non-null float64
    浏览(次       34520 non-null float32
    链家编号       34520 non-null object
    交易权属       34520 non-null object
    挂牌时间       34520 non-null datetime64[ns]
    房屋用途       34520 non-null object
    房屋年限       34520 non-null object
    房权所属       34520 non-null object
    房屋户型       34520 non-null object
    所在楼层       34520 non-null object
    户型结构       34520 non-null object
    套内面积(㎡)    34475 non-null float32
    建筑类型       34520 non-null object
    房屋朝向       34520 non-null object
    建成年代       34520 non-null object
    装修情况       34520 non-null object
    建筑结构       34520 non-null object
    供暖方式       34520 non-null object
    梯户比例       34520 non-null object
    产权年限       34520 non-null int32
    配备电梯       34520 non-null object
    成交周期()    34520 non-null timedelta64[ns]
    成交时间(年)    34520 non-null int64
    成交时间(周)    34520 non-null int64
    dtypes: datetime64[ns](2), float32(6), float64(3), int32(1), int64(2), object(19), timedelta64[ns](1)
    memory usage: 8.3+ MB
    lianjia.sample(3)
    大区	成交价(万)	成交时间	所在小区	户型	建筑面积	挂牌价格(万)	成交周期(天)	调价(次)	带看(次)	关注(人)	浏览(次	链家编号	交易权属	挂牌时间	房屋用途	房屋年限	房权所属	房屋户型	所在楼层	户型结构	套内面积(㎡)	建筑类型	房屋朝向	建成年代	装修情况	建筑结构	供暖方式	梯户比例	产权年限	配备电梯	成交周期()	成交时间(年)	成交时间(周)
    17501	门头沟	160.0	2017-12-20	双峪路小区	2153.779999	180.0	151.0	1.0	85.0	144.0	8739.0	1.01E+11	商品房	2017-07-22	普通住宅	满两年	非共有	2111卫	底层(5)	平层	38.150002	板楼	南 北	1980	简装	混合结构	集中供暖	一梯三户	70151 days	2017	51
    1675	大兴	203.0	2019-07-11	康泰园	1160.099998	203.0	492.0	1.0	62.0	192.0	10405.0	1.01E+11	商品房	2018-03-06	普通住宅	暂无数据	非共有	1111卫	底层(18)	平层	46.389999	板楼	南 北	2009	简装	钢混结构	集中供暖	一梯两户	70492 days	2019	28
    14601	海淀	938.5	2019-08-01	今日家园	41179.509995	1380.0	66.0	1.0	21.0	17.0	842.0	1.01E+11	商品房	2019-05-27	普通住宅	暂无数据	非共有	4113卫	中楼层(9)	跃层	156.351532	板楼	南 北	2000	精装	钢混结构	集中供暖	一梯六户	7066 days	2019	31
    

    五、分析需求

    5.1 每平米二手房单价

    # 总建筑面积
    lianjia["建筑面积"].sum()
    2961666.2
    # 总成交金额
    lianjia["成交价(万)"].sum()
    15145877.0
    # 计算每平米单价
    result = lianjia["成交价(万)"].sum() / lianjia["建筑面积"].sum()
    display(str(result) + "万")
    '5.1139717万'
    

    5.2 各大区房屋面积总和,降序排序

    result_df = lianjia.groupby("大区")["建筑面积"].agg({"建筑面积":"sum"})
    result_df = result_df.sort_values("建筑面积", ascending=False)
    display(result_df)
    	建筑面积
    大区	
    亦庄开发区	300565.843750
    昌平	289278.125000
    顺义	286023.375000
    房山	259237.218750
    大兴	253338.468750
    通州	251888.953125
    朝阳	247918.687500
    海淀	238134.578125
    门头沟	230544.812500
    丰台	229984.734375
    西城	202130.656250
    石景山	165606.250000
    其他(平谷密云怀柔延庆)	7014.509766
    

    5.3 每周的北京市的二手房交易的数量变化?

    result_df = lianjia.groupby(["成交时间(年)","成交时间(周)"]).size()
    display(result_df.loc[2019].head(60))
    成交时间(周)
    1      459
    2      110
    3      144
    4      157
    5      283
    6        1
    7       46
    8      104
    9      620
    10     190
    11     176
    12     151
    13     171
    14     690
    15     270
    16     286
    17     292
    18    1252
    19     365
    20     445
    21     439
    22    1642
    23     418
    24     470
    25     486
    26     651
    27    1625
    28     602
    29     700
    30     913
    31    2432
    32     660
    33     733
    34     769
    35    2596
    36     956
    37    1007
    38     994
    39    1229
    40    1541
    41     861
    42     988
    43    1157
    44     508
    dtype: int64
    
    year = 2019
    mpl.rcParams["font.size"] = 12
    plt.figure(figsize=(12,6))
    plt.bar(result_df.loc[year].index, result_df.loc[year].values)
    plt.xticks(result_df.loc[year].index)
    plt.yticks(np.linspace(0, 2750, 20))
    font = {"family":"Kaiti",
           "style":"oblique",
            "weight":"normal",
            "color":"green",
            "size": 20
           }
    plt.xlabel("周", fontdict=font)
    plt.ylabel("成交数", fontdict=font)
    plt.grid(axis="y", color="g", ls=":", lw=1)
    plt.title(str(year) + "年北京市各周二手房成交量", fontdict=font, color= "r")
    

    在这里插入图片描述成交量在每四周左右会有一个大幅上涨。有可能是在月初或者月末的时间点,需要进一步探查。

    5.4 每周的二手房成交的单位均价的走势

    result_df = lianjia.groupby(["成交时间(年)","成交时间(周)"])[["成交价(万)", "建筑面积"]].agg({"成交价(万)":"sum", "建筑面积":"sum"})
    result_df["单位均价"] = result_df["成交价(万)"] / result_df["建筑面积"]
    display(result_df.loc[2019].head(60))
    year = 2019
    mpl.rcParams["font.size"] = 12
    plt.figure(figsize=(12,6))
    plt.plot(result_df.loc[year].index, result_df.loc[year]["单位均价"])
    

    在这里插入图片描述
    单位均价程上升趋势,到20周后保持平稳。

    result_df2= lianjia.groupby(["成交时间(年)","成交时间(周)"])["成交周期(天)"].agg(
    {"成交周期(天)":"mean"})
    display(result_df2.loc[2019].head(60))
    year = 2019
    
    mpl.rcParams["font.size"] = 12
    
    plt.figure(figsize=(12,6))
    
    plt.bar(result_df2.loc[year].index, result_df2.loc[year]["成交周期(天)"])
    
    plt.xticks(result_df.loc[year].index)
    plt.yticks(np.linspace(0, 225, 10))
    font = {"family":"Kaiti",
           "style":"oblique",
            "weight":"normal",
            "color":"green",
            "size": 20
           }
    plt.xlabel("周", fontdict=font)
    plt.ylabel("成交周期(天)", fontdict=font)
    plt.grid(axis="y", color="g", ls=":", lw=1)
    plt.title(str(year) + "年北京市各周二手房成交周期", fontdict=font, color= "r")
    

    在这里插入图片描述
    第6、18、22、27、31、35、40周成交周期较长还需进一步分析

    展开全文
  • 最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们...

    1 内容简介

    首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗;然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的规律;最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们进行购房决策。

    2 应用技术介绍

    1)Python网络爬虫技术

    Requests

    Beautifulsoup

    2)Python数据分析技术

    Numpy

    Matplotlib

    Pandas

    3)k-means聚类算法

    4)高德地图开发者应用JS API

    3 数据采集及数据清洗

    3.1 数据采集

    该部分通过网络爬虫程序抓取链家网上所有南京二手房的数据,收集原始数据,作为整个数据分析的基石。

    3.1.1 链家网网站结构分析

    链家网二手房主页界面如图1、图2,主页上面红色方框位置显示目前南京二手房在售房源的各区域位置名称,中间红色方框位置显示了房源的总数量,下面红色方框显示了二手房房源信息缩略图,该红色方框区域包含了二手房房源页面的URL地址标签。图2下面红色方框显示了二手房主页上房源的页数。

    链家网二手房主页截图上半部分:

    1089052-20180807234711807-1075688077.png

    图1 链家网二手房主页

    链家网二手房主页截图下半部分:

    1089052-20180807234832028-1832322058.png

    1089052-20180807234749707-266752581.png

    图2 链家网二手房主页

    二手房房源信息页面如图3、图4。我们需要采集的目标数据就在该页面,包括基本信息、房屋属性和交易属性三大类。各类信息包括的数据项如下:

    1)基本信息:小区名称、所在区域、总价、单价。

    2)房屋属性:房屋户型、所在楼层、建筑面积、户型结构、套内面积、建筑类型、房屋朝向、建筑结构、装修情况、梯户比例、配备电梯、产权年限。

    3)交易属性:挂牌时间、交易权属、上次交易、房屋用途、房屋年限、产权所属、抵押信息、房本备件。

    1089052-20180807234942433-711175166.png

    图3 二手房房源信息页面

    1089052-20180807235015336-456508537.png

    图4 二手房房源信息页面

    3.1.3 网络爬虫程序关键问题说明

    1)问题1:链家网二手房主页最多只显示100页的房源数据,所以在收集二手房房源信息页面URL地址时会收集不全,导致最后只能采集到部分数据。

    解决措施:将所有南京二手房数据分区域地进行爬取,100页最多能够显示3000套房,该区域房源少于3000套时可以直接爬取,如果该区域房源超过3000套可以再分成更小的区域。

    2)问题2:爬虫程序如果运行过快,会在采集到两、三千条数据时触发链家网的反爬虫机制,所有的请求会被重定向到链家的人机鉴定页面,从而会导致后面的爬取失败。

    解决措施:①为程序中每次http请求构造header并且每次变换http请求header信息头中USER_AGENTS数据项的值,让请求信息看起来像是从不同浏览器发出的访问请求。②爬虫程序每处理完一次http请求和响应后,随机睡眠1-3秒,每请求2500次后,程序睡眠20分钟,控制程序的请求速度。

    3.2 数据清洗

    对于爬虫程序采集得到的数据并不能直接分析,需要先去掉一些"脏”数据,修正一些错误数据,统一所有数据字段的格式,将这些零散的数据规整成统一的结构化数据。

    3.2.1 原始数据主要需要清洗的部分

    主要需要清洗的数据部分如下:

    1)将杂乱的记录的数据项对齐

    2)清洗一些数据项格式

    3)缺失值处理

    3.2.3 数据清洗结果

    数据清洗前原始数据如图8,清洗后的数据如图9,可以看出清洗后数据已经规整了许多。

    1089052-20180807235037925-898236412.png

    图8 清洗前原始数据截图

    1089052-20180807235059934-46760527.png

    图9 清洗后的数据截图

    4 数据可视化分析

    在数据清洗完成后,我们就可以开始对数据进行可视化分析。该阶段主要是对数据做一个探索性分析并将结果可视化呈现,帮助人们更好、更直观的认识数据,把隐藏在大量数据背后的信息集中和提炼出来。本文主要对二手房房源的总价、单价、面积、户型、地区等属性进行了分析。

    数据可视化分析主要步骤如下:1)数据加载;2)数据转换;3)数据可视化呈现。

    4.1 数据加载

    数据分析和建模的大量工作都是用在数据准备上的,如:清理、加载、转换等。清洗完成后的数据仍然存储在文本文件(CSV格式)中,要对数据进行可视化分析,必须先要将数据按一定结果加载到内存中。我们使用Pandas提供的DataFrame对象来加载和处理我们清洗后的数据,Pandas同时提供将表格型数据读取为DataFrame对象的函数。数据加载处理过程中需要注意的主要问题如下:

    1)数据项的行列索引的处理;

    2)数据类型推断和数据转换;

    3)缺失值的处理。

    4.2 数据整体质量分析

    4.2.1 数据基本情况

    数据加载后,数据基本情况如图10。从图中可以看到加载后的数据一共20527行、25列,占用内存3.9+MB。在数据类型上,一共有3列float64类型,2列int64类型,20列object类型。除了户型结构、套内面积、抵押信息三列数据项缺失值比较多之外,其他列数据项的缺失值都不多,所以数据整体的质量还不错。

    1089052-20180807235116790-1182737388.png

    图10 数据基本情况图

    4.2.2 整体数据文件词云

    从整体数据文件词云(见图11),我们可以得到在南京二手房房源信息中经常出现的高频词,如商品房、普通住宅、一梯两户、钢混结构、精装等。我们可以通过这些高频词,十分粗略的了解整个数据文件中的基本内容。

    1089052-20180807235137235-14016643.png

    图11 整体数据文件词云

    4.2.3 南京各区域二手房房源数量折线图

    南京各区域二手房房源数量折线图(见图13)横轴为南京各个行政区域名称,纵轴为房源数量(套)。从图中可以看出,江宁在售的房源数量最多,高达5000多套,占了总量的1/4。与之相反的是六合区,六合区在售的房源数量仅有1套,数量太少,其他各区的数量相差不多。所以我们后面关于六合区的分析会存在一定误差。

    1089052-20180807235207079-34093247.png

    图13 南京各区域二手房房源数量折线图

    4.2.4 南京二手房房屋用途水平柱状图

    南京二手房房屋用途水平柱状图(见图14)横轴为房源数量(套),纵轴为房屋用途类型。从图中我们可以看出,房屋用途类型有:普通住宅、别墅、商业办公、酒店式公寓、车库5中类型。其中我们主要关心的普通住宅类型的房源数量近20000套,占总量绝大部分。所以在本文中,我们没有剔除掉房屋用途为其他类型的记录,因为这些类型在所有房源样本中占比相当少,不会影响后面的分析结果,同时它们也属于二手房的范畴内。

    1089052-20180807235228206-1020986823.png

    图14 南京二手房房屋用途水平柱状图

    4.2.5 数据整体质量总结

    通过前面的分析,我们可以看出该数据文件的整体质量还不错。虽然存在一些缺失值比较多的数据项,但我们比较关注一些数据项缺失值不多。这些缺失值较多的都是一些次要的数据项,不影响我们的分析。在房屋用途类型上,数据文件中一共包括了5种类型的二手房房源信息,其中普通住宅类型占比98%以上,所以我们后面分析基本可以看成是针对普通住宅类型的二手房进行的分析,这也符合我们期望。整个数据文件中唯一不足的是六合区域的二手房房源样本点太少,这使我们对六合区域的分析会存在一定的误差。

    4.3 南京二手房基本信息可视化分析

    二手房基本信息可视化分析主要针对二手房:区域、总价、单价、建筑面积四个属性的分析。

    4.3.1 南京各区域二手房平均单价柱状图

    南京各区域二手房平均单价柱状图(见图15)横轴为南京各区域名称,纵轴为单价(元/平米)。从图中我们可以看到建邺区和鼓楼区二手房平均单价最高,近40000元/平米。建邺区是市中心城区,近几年发展势头很好,房价一路飙升,现在已经成了南京最贵的区域之一。鼓楼区作为南京市的核心地带,拥有众多商场和学区房,其均价一直高升不下。从整体上来看,南京市各个区域(除去存在误差的六合区)均价都已经超过了20000元/平米。这些可以体现出近几年南京市房价猛涨的结果。浦口区虽然相比房价已经很低了,但相较于浦口前几年的房价,差不多是翻了一番。

    1089052-20180807235258460-1804661142.png

    图15 南京各区域二手房平均单价

    4.3.2 南京各区域二手房单价和总价箱线图

    南京各区域二手房单价箱线图(见图16)横轴为南京各区域名称,纵轴为单价(元/平米)。二手房平均单价虽然是一个重要参考数据,但平均值不能有效的表示出数据整体上的分布情况,特别是数据中一些离散值的分布情况,这些信息的表现则需要借助箱线图。从图16中可以看出,建邺和鼓楼两个区域房源单价正常值分布都不是太集中,50%的单价分布在30000-50000的区间内,区间跨度比其他区都要大。虽然建邺区平均单价略高于鼓楼区,但鼓楼区的异常值特别多,单价超过50000的房源数不胜数,最高单价有达到100000的,单价上限远高于建邺区,而建邺区异常值相对较少。综合以上情况来看,鼓楼区应该是南京市单价最高的区域。与鼓楼区相邻的玄武区和秦淮区单价正常值分布较为集中50%的数据都分布在30000-40000之间,但这两个异常值也比较多,单价上限也非常高。这些区域单价如此多的异常值,跟这些区域集中的教育和医疗资源有着密不可分的关系。

    1089052-20180807235317129-564403034.png

    图16 南京各区域二手房单价箱线图

    南京各区域二手房总价箱线图(见图17和图18)横轴为南京各区域名称,纵轴为单价(万元)。图18对图17纵轴进行了缩放,更易于观察,其他方面没有区别。从总价这个维度来看,鼓楼、建邺这两个单价最高区域,总价非常的高,500万元的二手房以分布在正常值范围内了。南京其他各区域二手房价格大部分都集中在200-400万元之间,下四分位数十分靠近200万。江宁、栖霞虽然在单价不高,但总价不低,尤其是近几年房价涨幅比较高的江宁,500万以上异常值都已经比较多了。浦口区总价数据分布最为集中,绝大部分数据都200-300万区间内。

    1089052-20180807235326403-467443820.png

    图17 南京各区域二手房总价箱线图

    1089052-20180807235345837-1332617154.png

    图18 南京各区域二手房总价箱线图

    4.3.3 南京二手房单价最高Top20

    南京二手房单价最高Top20水平柱状图(见图19)横轴为单价(元/平米),纵轴为小区名字。从图中可以看出,单价前20的房源都已经超过9万,并且都集中在鼓楼区,这也印证了上面箱线图中鼓楼区如此多异常值的存在。

    1089052-20180807235400112-1947951118.png

    图19 南京二手房单价最高Top20

    4.3.4 南京二手房单价和总价热力图

    南京二手房单价热力图(见图20)和南京二手房总价热力图(见图21)红色区域代表房源密集度高且房价高的区域。从图中可以看出鼓楼、玄武、秦淮、建邺上半部分是密集度最高的区域。这4个区域处于南京市正中心的位置,交通方便,医疗、教育等资源集中,这些因素一起造就了这些区域高价格。

    1089052-20180807235421495-422232125.png

    图20 南京二手房单价热力图

    1089052-20180807235429586-1791235555.png

    图21 南京二手房总价热力图

    4.3.5 南京二手房总价小于200万的分布图

    南京二手房总价小于200万的房源一共有6000多套,分布图见图23。从图中我们可以看出,除了鼓楼区和建邺区比较少,其他区域低于200万的房子还是有的。

    1089052-20180807235453206-896785675.png

    图23 南京二手房总价小于200万的分布图

    4.3.6 南京二手房建筑面积分析

    南京二手房建筑面积分布区间图(图24)横轴为房源数量(套),纵轴为分布区间(平米)。从图中可以看出在建筑面积50-100区间内房源数量最多,超过了10000套。其次是100-150区间与小于50的区间。

    1089052-20180807235509834-190807432.png

    图24 南京二手房建筑面积分布区间柱状图

    南京各区域平均建筑面积柱状图(图25)横轴为各区域名字,纵轴为建筑面积(平米)。从图中可以看出玄武、秦淮、鼓楼这几个单价比较高的老城区平均建筑面积最小,平均面积80平米左右。反而是江宁、浦口这两个单价最低的区域平均建筑面积最大,平均面积大小超过了100平米。

    1089052-20180807235524050-1923657410.png

    图25 南京各区域二手房平均建筑面积柱状图

    4.3.7 南京二手房单价、总价与建筑面积散点图

    南京二手房总价与建筑面积散点图(图26)横轴为建筑面积(平米),纵轴为总价(万元)。从图中可以看出,总价与建筑面积这两个变量符合正相关关系。数据点分布比较集中,大多数都在总价0-1500万元与建筑面积0-400平米这个区域内。

    1089052-20180807235546721-1212491639.png

    图26 南京二手房总价与建筑面积散点图

    南京二手房单价与建筑面积散点图(图27)横轴为建筑面积(平米),纵轴为单价(元/平米)。从图中可以看出建筑面积与单价并无明显关系,同样样本点分布也较为集中,离散值不多,但单价特别高的房源,建筑面积都不是太大,可能因为这些房源一般都位于市中心。

    1089052-20180807235557667-1281072203.png

    图27 南京二手房单价与建筑面积散点图

    4.4 南京二手房房屋属性可视化分析

    4.4.1 南京二手房房屋户型占比情况

    从南京二手房房屋户型饼状图(图28)中可以看出,2室1厅与2室2厅作为标准配置,一共占比接近一半。其中3室2厅和3室1厅的房源也占比不少,其他房屋户型的房源占比就比较少了。

    1089052-20180807235625641-1599313021.png

    图28 南京二手房房屋户型饼状图

    4.4.2 南京二手房房屋装修情况

    从南京二手房房屋装修情况饼状图(图29)可以看出,近60%的房源的房屋装修情况都是其他,可能因为房源全部为二手房的缘故,大家都自主装修过的。

    1089052-20180807235644405-889362876.png

    图29 南京二手房装修情况饼状图

    4.4.3 南京二手房房屋朝向分布情况

    南京二手房房屋朝向柱状图(图30)横轴为房屋朝向,纵轴为房源数量(套)。从图中我们可以看出,只有少数几种的朝向比较多,其余的都非常少,明显属于长尾分布类型(严重偏态)。这也符合我们的认识,房屋朝向一半以上都是坐北朝南的。

    1089052-20180807235659270-373465246.png

    图30 南京二手房房屋朝向分布柱状图

    4.4.4 南京二手房建筑类型占比情况

    从南京二手房建筑类型饼状图(图31)中,我们可以看出房源的建筑类型65.6%都是板楼,现在房地产商喜欢开发的塔楼反而较少,这和南京二手房建筑时间都比较久远相符。

    1089052-20180807235712196-1462850450.png

    图31 南京二手房建筑类型饼状图

    5 数据聚类分析

    该阶段采用聚类算法中的k-means算法对所有二手房数据进行聚类分析,根据聚类的结果和经验,将这些房源大致分类,已达到对数据概括总结的目的。在聚类过程中,我们选择了面积、总价和单价这三个数值型变量作为样本点的聚类属性。

    5.1 k-means算法原理

    5.1.1 基本原理

    k-Means算法是一种使用最普遍的聚类算法,它是一种无监督学习算法,目的是将相似的对象归到同一个簇中。簇内的对象越相似,聚类的效果就越好。该算法不适合处理离散型属性,但对于连续型属性具有较好的聚类效果。

    5.1.2 聚类效果判定标准

    使各个样本点与所在簇的质心的误差平方和达到最小,这是评价k-means算法最后聚类效果的评价标准。

    1089052-20180807235727686-358715110.png

    5.1.3 算法实现步骤

    1)选定k值

    2)创建k个点作为k个簇的起始质心。

    3)分别计算剩下的元素到k个簇的质心的距离,将这些元素分别划归到距离最小的簇。

    4)根据聚类结果,重新计算k个簇各自的新的质心,即取簇中全部元素各自维度下的算术平均值。

    5)将全部元素按照新的质心重新聚类。

    6)重复第5步,直到聚类结果不再变化。

    7)最后,输出聚类结果。

    5.1.4 算法缺点

    虽然K-Means算法原理简单,但是有自身的缺陷:

    1)聚类的簇数k值需在聚类前给出,但在很多时候中k值的选定是十分难以估计的,很多情况我们聚类前并不清楚给出的数据集应当分成多少类才最恰当。

    2)k-means需要人为地确定初始质心,不一样的初始质心可能会得出差别很大的聚类结果,无法保证k-means算法收敛于全局最优解。

    3)对离群点敏感。

    4)结果不稳定(受输入顺序影响)。

    5)时间复杂度高O(nkt),其中n是对象总数,k是簇数,t是迭代次数。

    5.2 算法实现关键问题说明

    5.2.1 K值的选定说明

    根据聚类原则:组内差距要小,组间差距要大。我们先算出不同k值下各个SSE(Sum of

    squared

    errors)值,然后绘制出折线图(图32)来比较,从中选定最优解。从图中,我们可以看出k值到达5以后,SSE变化趋于平缓,所以我们选定5作为k值。

    1089052-20180807235738163-1364579116.png

    图32 不同k值下SSE值折线图

    5.2.2 初始的K个质心选定说明

    初始的k个质心选定是采用的随机法。从各列数值最大值和最小值中间按正太分布随机选取k个质心。5.2.3

    关于离群点

    离群点就是远离整体的,非常异常、非常特殊的数据点。因为k-means算法对离群点十分敏感,所以在聚类之前应该将这些"极大”、"极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。离群点的判定标准是根据前面数据可视化分析过程的散点图和箱线图进行判定。根据散点图和箱线图,需要去除离散值的范围如下:

    1)单价:基本都在100000以内,没有特别的异常值。

    2)总价:基本都集中在3000以内,这里我们需要去除3000外的异常值。

    3)建筑面积:基本都集中在500以内,这里我们需要去除500外的异常值。

    5.2.4 数据的标准化

    因为总价的单位为万元,单价的单位为元/平米,建筑面积的单位为平米,所以数据点计算出欧几里德距离的单位是没有意义的。同时,总价都是3000以内的数,建筑面积都是500以内的数,但单价基本都是20000以上的数,在计算距离时单价起到的作用就比总价大,总价和单价的作用都远大于建筑面积,这样聚类出来的结果是有问题的。这样的情况下,我们需要将数据标准化,即将数据按比例缩放,使之都落入一个特定区间内。去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行计算和比较。

    我们将单价、总价和面积都映射到500,因为面积本身就都在500以内,不要特别处理。单价在计算距离时,需要先乘以映射比例0.005,总价需要乘以映射比例0.16。进行数据标准化前和进行数据标准化后的聚类效果对比如下:图32、图33是没有数据标准化前的聚类效果散点图;图34、图35是数据标准化后的聚类效果散点图。

    数据标准化前的单价与建筑面积聚类效果散点图:

    1089052-20180807235838717-1399283192.png

    图32 数据标准化前的单价与建筑面积散点图

    数据标准化前总价与建筑面积聚类效果散点图。

    1089052-20180807235854888-783527978.png

    图33 数据标准化前总价与建筑面积散点图

    数据标准化后单价与建筑面积聚类效果散点图。

    1089052-20180807235909758-1187451581.png

    图34 数据标准化后单价与建筑面积散点图

    数据标准化后总价与建筑面积聚类效果散点图。

    1089052-20180807235915486-364826957.png

    图35 数据标准化后总价与建筑面积散点图

    5.3 聚类结果分析

    聚类结果如下

    1)聚类结果统计信息如下:

    1089052-20180807235925363-454865949.png

    2)聚类后的单价与建筑面积散点图和总价与建筑面积散点图见图34、图35。

    3)聚类结果分组0、1、2、3、4的区域分布图分别如下:图36、图37、图38、图39、图40。

    聚类结果分组0的区域分布图如下:

    1089052-20180807235944722-1868656941.png

    图36 聚类结果0区域分布图

    聚类结果分组1的区域分布图如下:

    1089052-20180807235955340-1239578166.png

    图37 聚类结果1区域分布图

    聚类结果分组2的区域分布图如下:

    1089052-20180808000005487-1734571944.png

    图38 聚类结果2区域分布图

    聚类结果分组3的区域分布图如下:

    1089052-20180808000033817-977192.png

    图39 聚类结果3区域分布图

    聚类结果分组4的区域分布图如下:

    1089052-20180808000043293-1109823540.png

    图40 聚类结果4区域分布图

    根据以上聚类结果和我们的经验分析,我们大致可以将这20000多套房源分为以下4类:

    a、大户型(面积大,总价高),属于第0类。平均面积都在200平以上,这种大户型的房源相对数量较少,主要分布在鼓楼、建邺、江宁、栖霞等地(具体可从各类中的区域分布图可知)。

    b、地段型(单价高),属于第2、4类。这种房源围绕南京市中心位置集中分布,地理位置极好,交通方便,主要分布鼓楼、玄武、建邺、建邺等地(具体可从各类中的区域分布图可知)。

    c、大众蜗居型(面积小、价格相对较低、房源多),属于第3类。这类房源分布范围广,主要围绕在各地铁线两边。典型的区域有秦淮、鼓楼、江宁、玄武、浦口等地。

    d、高性价比型(面积相对大,单价低),属于第1类。典型的区域有栖霞、浦口、江宁等地。

    展开全文
  • 链家二手房信息 # 导入需要的库:科学计算包numpy, pandas 可视化包matplotlib, seaborn 机器学习包 sklearn import numpy as np import pandas as pd import matplotlib as mpl import seaborn as sns import ...

    链家二手房信息

    # 导入需要的库:科学计算包numpy, pandas  可视化包matplotlib, seaborn 机器学习包 sklearn
    import numpy as np
    import pandas as pd
    import matplotlib as mpl
    import seaborn as sns
    
    import matplotlib.pyplot as plt 
    from IPython.display import display
    
    # 可以在引入Matplotlib后通过运行plt.style.use(style_name)来修改绘图的风格。所有可用的风格在plt.style.available中列出。
    # 比如,尝试使用plt.style.use('fivethirtyeight')、plt.style.use('ggplot')或者plt.style.use('seaborn-dark')。
    # 为了更好玩,可以运行plt.xkcd(),然后尝试绘制一些别的图形。
    plt.style.use("fivethirtyeight")
    
    # 防止出现中文乱码,应修改 seabron 配置文件
    sns.set_style({'font.sans-serif':['simhei','Arial']})
    %matplotlib inline
    
    # 导入数据,并进行初步观察
    lianjia_df = pd.read_csv('lianjia.csv')
    display(lianjia_df.head())

    上传的数据形式如下:

     

     - Direction    方向  
    - District    地址  
    - Elevator   是否有电梯  
    - Floor   楼层  
    - Garden   家园  
    - Id    ID  
    - Layout   布局  
    - Price   价格  
    - Region   地区  
    - Renovation   装修  
    - Size   面积  
    - Year   年份  

    lianjia_df.info()

    查看链家数据信息:

        数据总共有23677条,Elevator 字段有缺失值。

    # 对数据进行描述性分析
    lianjia_df.describe()

     

     

    price 平均数 610
          标准差 411  
          中位数 499  
          最小值 60  
          最大值 6000  
    • 这些统计结果简单直接,对于初始了解一个特征好坏非常有用,比如我们观察到 Size 特征 的最大值为1019平米,最小值为2平米,那么我们就要思考这个在实际中是不是存在的,如果不存在没有意义,那么这个数据就是一个异常值,会严重影响模型的性能。

    # 添加房屋均价
    df = lianjia_df.copy()
    df['PerPrice'] = round(lianjia_df['Price']/lianjia_df['Size'], 2)
    
    # 重新摆放列位置
    columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
    df = pd.DataFrame(df, columns =columns)
    
    df.head()

     

    • ID没有什么用,我们将其移除,房屋单价分析比较简单,价格/总面积,所以增加一个特征PerPrice.另外,特征的顺序也调整了一下,使它更方便分析。

    数据可视化分析 

    Region 分析:

    # 对二手房区域分组对比二手房数量和每平米价格
    df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
    df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
    
    # 画三个图,长,高figsize = (20, 15)
    f, [ax1, ax2, ax3] = plt.subplots(3, 1, figsize = (20, 20))
    # (每平米单价对比图) 
    sns.barplot(x = 'Region', y = 'PerPrice', palette = "Blues_d", data = df_house_mean, ax = ax1)
    ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15)
    ax1.set_xlabel('区域')
    ax1.set_ylabel('每平米单价')
    
    # 各区域二手房数量(使用箱线图)
    sns.barplot(x = 'Region', y = 'Price', palette = "Greens_d", data = df_house_count, ax = ax2)
    ax2.set_title('北京各大区二手房数量对比', fontsize=15)
    ax2.set_xlabel('区域')
    ax2.set_ylabel('数量')
    
    # 各大区二手房房屋总价
    sns.boxplot(x = 'Region', y = 'Price', data = df, ax = ax3)
    ax3.set_title('北京各大区二手房房屋总价', fontsize=15)
    ax3.set_xlabel('区域')
    ax3.set_ylabel('房屋总价')
    
    plt.show()
    

    • 二手房均价:西城区的房价最贵均价大约11万/平,因为西城在二环以里,且是热门学区房的聚集地。其次是东城大约10万/平,然后是海淀大约8.5万/平,其它均低于8万/平。
    • 二手房房数量:从数量统计上来看,目前二手房市场上比较火热的区域。海淀区和朝阳区二手房数量最多,差不多都接近3000套,毕竟大区,需求量也大。然后是丰台区,近几年正在改造建设,有赶超之势。
    • 二手房总价:通过箱型图看到,各大区域房屋总价中位数都都在1000万以下,且房屋总价离散值较高,西城最高达到了6000万,说明房屋价格特征不是理想的正太分布。

     

    Size特征分析

    # 画两幅图
    f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
    # 建房时间的分布  kdeplot(核密度估计图)  
    # 核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。
    # 通过核密度估计图可以比较直观的看出数据样本本身的分布特征。
    sns.distplot(df['Size'], bins=20, ax=ax1, color='r')
    sns.kdeplot(df['Size'], shade=False, ax=ax1)
    # 建房时间和出售价格的关系
    sns.regplot(x='Size', y='Price', data=df, ax=ax2)
    plt.show()

    得到如下的图:

    • 左图用 distplot 和 kdeplot 绘制柱状图体现了 Size 特征的分布,从图中可以看出,超过100平的房子挺多的,还有一部分超过200平的,这明显不符合常规。
    • 右图绘制了Size 与 Price 的关系: regplot 绘制了 Size 和 Price 之间的散点图,可以看出 Size 特征基本与Price呈现线性关系,符合基本理论,面积越大,价格越高。但出现了两组明显的异常点:
      1. 面积不到10平米,但是价格超出10000万;
      2. 一个点面积超过了1000平米,价格很低,需要查看是什么情况。  
    # 找出异常值 ,此时都是别墅,不在分析范围内,所以移除
    df.loc[df['Size']< 10]
    得到如下结果:
    
    # 这条数据 1019平,无厅,可能是商品房,所以移除
    df.loc[df['Size'] > 1000]
    得到的结果如下:
    

    去除异常值后我们重新画图:

    # 去除异常值
    df = df[(df['Layout'] != '叠拼别墅') & (df['Size'] < 1000)]
    # 重新画图   图中无明显异常值
    f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
    # 建房时间的分布情况
    sns.distplot(df['Size'], bins=20, ax=ax1, color='r')
    sns.kdeplot(df['Size'], shade=True, ax=ax1)
    # 建房时间和出售价格的关系
    sns.regplot(x='Size', y='Price', data=df, ax=ax2)
    plt.show()
    得到的结果是:

     

    Layout特征分析

    f, ax1 = plt.subplots(figsize = (20, 20))
    sns.countplot(y = 'Layout', data = df, ax = ax1)
    ax1.set_title('房屋户型',fontsize=20)
    ax1.set_xlabel('数量')
    ax1.set_ylabel('户型')
    plt.show()

     得到的结果是:

    • 此特征比较混乱,各种叫法都有,没有统一的形式,应该做相应的处理

    Renovation (装修)特征分析

    df['Renovation'].value_counts()
    # 去掉错误数据“南北”,去除 Renovation 中的异常值,
    df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation']
    
    # 画出分类直方图
    f, [ax1, ax2, ax3] = plt.subplots(3, 1, figsize =(10, 15))
    sns.countplot(df['Renovation'], ax = ax1)
    sns.barplot(x = 'Renovation', y = 'Price', data = df, palette = "Set3", ax = ax2)
    sns.boxplot(x = 'Renovation', y = 'Price', data = df, ax = ax3)
    plt.show()

     

     

    • 精装修的房屋数量是最多的,毛坯房数量最少;对价格来说,精装修房屋价格较高,但毛配方的价格最高。

    Elevator(电梯) 特征分析

    # 查询是否有缺失值,
    misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator'])
    print('缺失值的数量是:', misn)
    
    df['Elevator'].value_counts()
    • 如果有缺失值,常用的方法有:平均值/中位数填补法,直接移除,或者根据其他特征建模预测等。也可根据业务进行填补。
    # 如果有错误值,需要移除,
    df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator']
    
    # 填补 Elevator 缺失值
    df.loc[(df['Floor'] > 6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯'
    df.loc[(df['Floor'] <= 6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯'
    
    f, [ax1, ax2] = plt.subplots(1, 2, figsize = (20, 10))
    sns.countplot(df['Elevator'], ax = ax1)
    ax1.set_title('有无电梯数量对比', fontsize = 15)
    ax1.set_xlabel('是否与电梯')
    ax1.set_ylabel('数量')
    
    sns.barplot(x = 'Elevator', y = 'Price', data = df, ax = ax2)
    ax2.set_title('有无电梯房价对比', fontsize = 15)
    ax2.set_xlabel('是否有电梯')
    ax3.set_ylabel('总价')
    plt.show()
     
    
    • 观察可知,二手房有电梯的房屋数量居多,说明楼层较高,这样,土地的利用率也比较高,适合北京庞大人口的需要;
    • 第二幅图,有电梯的房屋价格比无电梯的较高,因为包含了电梯的装修费和维护费;

    Year(建房日期) 特征分析

    # 在数据集的不同子集上绘制同一图的多个实例 格子图
    grid = sns.FacetGrid(df, row = 'Elevator', col = 'Renovation', palette = 'seismic', size = 4)
    grid.map(plt.scatter, 'Year', 'Price')
    grid.add_legend()
    得到的图如下:

    • 把Renovation和Elevator进行分类,使用 FaceGrid (网格面)分析 Year 特征,观察结果如下:
      • 整体来说,房价随着时间在增长。
      • 90年代末以后的二手房,房价明显上涨;
      • 1980年之前几乎不存在有电梯的房子;
      • 1980年之前,无电梯的房子大多都是简装。

    Floor (楼层)特征分析

    f, ax1 = plt.subplots(figsize=(20, 5))
    sns.countplot(x='Floor', data=df, ax= ax1)
    ax1.set_title('房屋户型', fontsize =15)
    ax1.set_xlabel('楼层')
    ax1.set_ylabel('数量')
    plt.show()

    • 二手房中,楼层为6的房屋最多,达到了7600套。
    展开全文
  • 2)Python数据分析技术 Numpy Matplotlib Pandas 3) 存储 Mysql Redis 3.房源数据采集 1)分析网站 可以看到上面可见的有四个区域,后面数据跑完发现抓取到一个其他区域(不在列表上) 可以看到有
  • 本篇文章利用爬到数据的进行数据分析。 在这篇文章中,用到pandas、seaborn、Matplotlib等工具,分析工具用到提琴图、箱型图、散点图等。 描述性分析 首先导入各种需要的库方便后续一切操作,并读取数据表,直接...
  • 最近呢,对链家平台上的北京二手房数据做了个可视化分析,对目前北京的二手房交易情况有了个大致了解,最终得到一个很实在的结论:奋斗一辈子也买不到一个厕所这句话不是骗人的,是真的;关于具体分析内容客官请看...
  • 最近呢,对链家平台上的北京二手房数据做了个可视化分析,对目前北京的二手房交易情况有了个大致了解,最终得到一个很实在的结论:奋斗一辈子也买不到一个厕所这句话不是骗人的,是真的;关于具体分析内容请看下文 ...
  • 基于Python的南京二手房数据爬取及分析.pdf
  • 最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们...
  • Python数据分析——上海市二手房价格分析

    万次阅读 多人点赞 2018-05-08 12:47:12
    自学数据分析与机器学习已有两月,近期房价问题引人深思,即兴做个上海市房价的数据分析小项目。上网一查上海市新楼盘价格,高的不忍直视,索性退而求其次,分析上海二手房的价格。一、数据收集常规做法是编写网络...
  • 链家二手房信息、交易记录爬虫,部分数据分析
  • 根据链家网二手房交易信息对二手房交易数据进行分析 用到的数据包含147169条交易信息,每条交易信息包括["房型","成交时间","地址","价格","朝向","装修&...
  • 最后,采用一个聚类算法对所有二手房数据进行聚类分析,并根据聚类分析的结果,将这些房源大致分类,以对所有数据的概括总结。通过上述分析,我们可以了解到目前市面上二手房各项基本特征及房源分布情况,帮助我们...
  • 利用Python对链家网北京二手房进行简单数据分析

    万次阅读 多人点赞 2018-06-17 11:52:22
    #首先我用爬虫获取到了链家二手房的一万多条信息,我在爬去的时候对空置进行了处理本文主要讲述如何通过pandas对爬虫下来的链家数据进行相应的二手房数据分析,主要分析内容包括各个区,各个小区的房源信息情况#导入...
  • 本篇文章主要是介绍一个北京二手房数据分析的项目,目的是熟悉python数据分析的及可视化的一些常用方法。 数据获取 通过编写python脚本(爬虫)从二手房交易数据网站上获取北京二手房数据集 数据解释 Direction:...
  • 哈哈,现在开始正式进行爬虫书写首先,需要分析一下要爬取的网站的结构:作为一名河南的学生,那就看看郑州的二手房信息吧! 在上面这个页面中,我们可以看到一条条的房源信息,从中我们发现了什么,发现了连郑州的...
  • 该项目是使用Python对北京二手房经纪人成交数据进行分析的一个综合实例,包括pandas/numpy/matplotlib绘图的应用,涉及到数据读取、清洗、离散化等处理,使用了分组分析、假设验证分析和相关性分析分析方法。...
  • Python源码集锦-北京二手房价格数据分析预测
  • 今天要分享的教程是爬取各大城市的二手房数据,抛开以前的文章不谈,下面的内容应该足够你实现这篇爬虫。以下是正文:1. 确定目标今天我们的目标官网链接是:https://www.lianjia...
  • 该项目是使用Python对北京链家二手房经纪人成交数据进行分析的一个综合实例,包括pandas/numpy/matplotlib绘图的应用,涉及到数据读取、清洗、离散化等处理,使用了分组分析、假设验证分析和相关性分析分析方法。...
  • 之前我们爬取了贝壳找房上的北京二手房信息,具体可以查看python爬取贝壳找房之北京二手房源信息,现在我们针对获取的数据进行分析及可视化的展示,本文代码和数据均存放在github上 数据预处理 由于我们爬取的数据...
  • 每一个二手房数据,都在网页的 li 标签里面,咱们可以获取网页返回的数据,然后通过解析,就可以获取到自己想要的数据了~ 获取网页数据 import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT ...
  • python爬取二手房交易信息并分析 第一步:编写爬虫 爬取某平台上海市十个区共900条二手房的交易信息 #爬取上海十个区的二手房价信息 import requests from bs4 import BeautifulSoup import csv #...
  • Python数据分析实战之北京二手房房价分析

    千次阅读 多人点赞 2018-10-09 00:00:00
    北京二手房房价分析与预测目的:本篇给大家介绍一个数据分析的初级项目,目的是通过项目了解如何使用Python进行简单的数据分析。数据源:博主通过爬虫采集的链家全网北京二手房...
  • 题记: 继上篇对安居客二手房数据进行爬取之后,接下来是对安居客进行数据预处理。 一:
  • 基于《用python写网络爬虫》示例修改的爬取58武汉各区二手房信息。
  • python 二手房信息爬虫

    2018-06-09 17:12:23
    python 二手房信息爬虫,实验文档和说明,网站web的html结构可能要自己调一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,148
精华内容 859
关键字:

python二手房数据分析

python 订阅