北京二手房价|数据分析

作者: Hill_GM | 来源:发表于2019-03-06 11:17 被阅读3次

    一、报告背景:
    根据某房价平台数据,通过数据分析,知晓各区二手房价状况。

    二、目的:
    报告目的:通过数据完成一份Python的二手房价分析报告。
    分析目的:
    1、找到影响二手房价的因素是:区域?房间数?大厅数?面积数?楼层?有无地铁?有无学区?谁的影响因素最大?如何排序?
    2、寻找二手房低洼处投资。

    三、基本信息:
    数据来源:链接:https://pan.baidu.com/s/1dlFoncdPsQiZNfpsFKEjLg 提取码:u06i
    编程平台:Jupyter notebook
    图表精美:精简
    北京地图:

    四、代码解析:
    (1)、数据基本情况

    #导入库
    import pandas as pd 
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    #读取数据
    df=pd.read_csv(r"C:\Users\41174\Desktop\sndHsPr.csv")
    #价格单位元转化成万元
    df.price=df.price/10000
    
    #数据分析开始3部曲
    
    print(df.head())
    
    print(df.info())
    
    print(df.describe())
    

    如图,dist是地区,roomnum是房间数,halls是大厅数,AREA是房间面积,floor是楼层高度,AREA是面积(单位平方米),subway是地铁(1代表有,0代表无),school是学校(1代表有,0代表无),price,代表价格(单位万元)



    如图,dist和floor是字符串类型,其余都是数值型数据,同时没有脏数据和缺漏数据




    如图,数据样本量:16210 。在没有通过图表发现数据的整体异常值时,先以平均数为基准看基本情况,但通过后面的分析会发现,存在许多异常值,所以专业分析需要看中位数。现在先分析基本平均信息:roomnum 2.1,大厅1.2,面积91.7,地铁0.83,学校0.3,房价6.1万/每平方米。通过基本平均信息可以知道,房间正常属于大众型刚需型,基本有地铁,但无学校。

    根据《一出好戏》的3句经典台词分析:1、稀缺 2、消耗 3、希望。

    地铁、房间等基本配置都属于消耗资源,不会产生杠杆或者增值价值,属于消耗品,属于保值或贬值品。但学校属于孩子和未来的希望,属于增值品,同时又稀缺,疯抢和增值空间明显增大,但随着移动互联网的教育资源兴起,和教育改革,该现象期待改变。

    from scipy import stats
    print(df.price.describe())
    print('众数',stats.mode(df.price)[0][0])
    

    如图,价格(单位万/每平方米)平均数6.1,中位数5.7,众数5。

    dict1 = {
            u'chaoyang' : "朝阳",
            u'dongcheng' : "东城",
            u'fengtai' :  "丰台",
            u'haidian' : "海淀",
            u'shijingshan' : "石景山",
            u'xicheng': "西城"
            }
    #将拼音转化成中文
    df.dist=df.dist.apply(lambda x:dict1[x])
    
    print(pd.concat([(df[df.price==min(df.price)]),(df[df.price==max(df.price)])]))
    

    最高房价:西城3房,1厅,78平方米,低楼层,有地铁,无学区,价格15万每平方米。
    最低房价:丰台2房,2厅,101平方米,高楼层,无地铁,无学区,价格,1.8万每平方米。

    for i in range(7):
        if i !=3:
            print(df.columns.values[i],";")
            print(df[df.columns[i]].agg(['value_counts']).T)
            print("=======================================================================")
        else:
            continue
    print("AREA:")
    
    print(df.AREA.agg(['min','mean','median','max','std']).T)
    

    如图:
    房源:丰台区域房源最多2947套,石景山最少房源1947套。
    房数:2房最多7971套,5房最少102套。
    厅数:1厅最多11082套,3厅最少85套。
    楼层:几乎相等。
    地铁:有地铁13419套,没地铁2791套。
    学校:有学校4913套,没学校11297套。(稀缺)
    面积:最高299平方米,最低30平方米。
    总结:学区房最稀缺。

    (2)、图表基本情况

    #解决中文乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    sns.distplot(df.price,color='lightblue',bins=20,kde=True)
    plt.xlabel("单位面积房价(万元/平方米)")
    plt.ylabel("密度")
    plt.title('房价密度直方图')
    plt.show()
    

    如图,直方图曲线图右侧有较多异常值,属于正偏或右偏正态曲线,不能使用平均值,需要使用中位数,房价中位数是5.7万每平方米。

    (3)、盒须图

    ①、单因素分析

    df.groupby('dist').median().price.sort_values(ascending=False)
    df.boxplot(column='price',by='dist')
    plt.show()
    

    如图,显示各区价格盒须图,盒须图高低无序,通过什么方法让视图清晰可见,容易分析?

    #显示各区中位数从高到低排序。
    print(df.groupby('dist').median().price.sort_values(ascending=False))
    df.dist=df.dist.astype('category')
    #根据各区中位数排序,调整区域先后顺序。
    df.dist.cat.set_categories(['西城','东城','海淀','朝阳','丰台','石景山'],inplace=True)
    df.boxplot(column='price',by='dist')
    plt.show()
    

    如图,区域明显与价格成强相关。区域差异最大是西城与石景山,故后面分析时采用西城与石景山的分析。

    print(df.groupby('roomnum').median().price.sort_values(ascending=False))
    df.roomnum=df.roomnum.astype('object')
    df.roomnum=df.roomnum.astype('category')
    df.roomnum.cat.set_categories([4,1,5,3,2],inplace=True)
    df.boxplot(column='price',by='roomnum')
    plt.show()
    

    如图,房间数与价格成弱相关。

    print(df.groupby('halls').median().price.sort_index(ascending=False))
    df.halls=df.halls.astype('category')
    df.halls.cat.set_categories([0,1,2,3],inplace=True)
    df.boxplot(column='price',by='halls')
    plt.show()
    

    如图,大厅数与价格成弱相关。

    df.plot.scatter(x='price',y='AREA')
    plt.show()
    

    如图,面积与价格关系暂时无法确定。

    print(df.groupby('floor').median().price.sort_index(ascending=False))
    df.floor=df.floor.astype('category')
    df.floor.cat.set_categories(['middle','low','high'],inplace=True)
    df.boxplot(column='price',by='floor')
    plt.show()
    

    如图,楼层与价格成弱相关。

    print(df.groupby('subway').median().price.sort_index(ascending=False))
    df.subway=df.subway.astype('category')
    df.subway.cat.set_categories([1,0],inplace=True)
    df.boxplot(column='price',by='subway')
    plt.show()
    

    如图,地铁与价格成强相关。

    print(df.groupby('school').median().price.sort_index(ascending=False))
    df.school=df.school.astype('category')
    df.school.cat.set_categories([1,0],inplace=True)
    df.boxplot(column='price',by='school')
    plt.show()
    

    如图,学校与价格成强相关。

    综上可知,区域、地铁、学校与价格关系密切,其余因素关系不密切,忽略不计。

    ②、双因素分析

    print(df.groupby(['dist','school']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','school'],figsize=(12,6))
    plt.show()
    

    如图可知,
    1、(西城,1)-(西城,0)>(西城,1)-(东城,1),可知学区因素>区域因素,分析其余情况基本类似。
    2、(石景山,1)价格<(石景山,0),明显存在被低估的价格,很可能是潜力股,可以先调查后投资。

    print(df.groupby(['school','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['school','subway'],figsize=(12,6))
    plt.show()
    

    如图可知,(1,1)-(1,0)<(1,1)-(0,1),因此学区因素>地铁因素。

    print(df.groupby(['dist','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','subway'],figsize=(12,6))
    plt.show()
    

    如图,(西城,1)-(西城,0)>(西城,1)-(东城,1),因此学区因素>区域因素。

    ③、多因素分析

    print(df.groupby(['dist','school','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','school','subway'],figsize=(20,10))
    plt.xticks(rotation=90)
    plt.show()
    

    如图可知,(丰台,1,0)与(石景山,1,1)和(石景山,1,0)明显存在低估,可以先调查,然后投资。

    综合如上分析可知:
    1、单因素、双因素和多因素分析,可知学区因素>地区因素>地铁因素>其他因素。
    2、(丰台,1,0)与(石景山,1,1)和(石景山,1,0)明显存在低估,可以先调查,然后投资。

    五、完整代码

    #导入库
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    
    #读取数据
    df=pd.read_csv(r"C:\Users\41174\Desktop\sndHsPr.csv")
    #价格单位元转化成万元
    df.price=df.price/10000
    
    #数据分析开始3部曲
    
    print(df.head())
    
    print(df.info())
    
    print(df.describe())
    
    from scipy import stats
    print(df.price.describe())
    print('众数',stats.mode(df.price)[0][0])
    
    dict1 = {
            u'chaoyang' : "朝阳",
            u'dongcheng' : "东城",
            u'fengtai' :  "丰台",
            u'haidian' : "海淀",
            u'shijingshan' : "石景山",
            u'xicheng': "西城"
            }
    #将拼音转化成中文
    df.dist=df.dist.apply(lambda x:dict1[x])
    
    print(pd.concat([(df[df.price==min(df.price)]),(df[df.price==max(df.price)])]))
    
    
    for i in range(7):
        if i !=3:
            print(df.columns.values[i],";")
            print(df[df.columns[i]].agg(['value_counts']).T)
            print("=======================================================================")
        else:
            continue
    print("AREA:")
    
    print(df.AREA.agg(['min','mean','median','max','std']).T)
    
    #解决中文乱码问题
    plt.rcParams['font.sans-serif']=['SimHei']
    sns.distplot(df.price,color='lightblue',bins=20,kde=True)
    plt.xlabel("单位面积房价(万元/平方米)")
    plt.ylabel("密度")
    plt.title('房价密度直方图')
    plt.show()
    
    df.groupby('dist').median().price.sort_values(ascending=False)
    df.boxplot(column='price',by='dist')
    plt.show()
    
    #显示各区中位数从高到低排序。
    print(df.groupby('dist').median().price.sort_values(ascending=False))
    df.dist=df.dist.astype('category')
    #根据各区中位数排序,调整区域先后顺序。
    df.dist.cat.set_categories(['西城','东城','海淀','朝阳','丰台','石景山'],inplace=True)
    df.boxplot(column='price',by='dist')
    plt.show()
    
    print(df.groupby('roomnum').median().price.sort_values(ascending=False))
    df.roomnum=df.roomnum.astype('object')
    df.roomnum=df.roomnum.astype('category')
    df.roomnum.cat.set_categories([4,1,5,3,2],inplace=True)
    df.boxplot(column='price',by='roomnum')
    plt.show()
    
    print(df.groupby('halls').median().price.sort_index(ascending=False))
    df.halls=df.halls.astype('category')
    df.halls.cat.set_categories([0,1,2,3],inplace=True)
    df.boxplot(column='price',by='halls')
    plt.show()
    
    df.plot.scatter(x='price',y='AREA')
    plt.show()
    
    print(df.groupby('floor').median().price.sort_index(ascending=False))
    df.floor=df.floor.astype('category')
    df.floor.cat.set_categories(['middle','low','high'],inplace=True)
    df.boxplot(column='price',by='floor')
    plt.show()
    
    print(df.groupby('subway').median().price.sort_index(ascending=False))
    df.subway=df.subway.astype('category')
    df.subway.cat.set_categories([1,0],inplace=True)
    df.boxplot(column='price',by='subway')
    plt.show()
    
    print(df.groupby('school').median().price.sort_index(ascending=False))
    df.school=df.school.astype('category')
    df.school.cat.set_categories([1,0],inplace=True)
    df.boxplot(column='price',by='school')
    plt.show()
    
    print(df.groupby(['dist','school']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','school'],figsize=(12,6))
    plt.show()
    
    print(df.groupby(['school','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['school','subway'],figsize=(12,6))
    plt.show()
    
    print(df.groupby(['dist','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','subway'],figsize=(12,6))
    plt.show()
    
    print(df.groupby(['dist','school','subway']).median().price.sort_index(ascending=False).unstack())
    df.boxplot(column='price',by=['dist','school','subway'],figsize=(20,10))
    plt.xticks(rotation=90)
    plt.show()
    

    六、备注
    若有错误,还望指出,谢谢!

    相关文章

      网友评论

        本文标题:北京二手房价|数据分析

        本文链接:https://www.haomeiwen.com/subject/joctpqtx.html