一、报告背景:
根据某房价平台数据,通过数据分析,知晓各区二手房价状况。
二、目的:
报告目的:通过数据完成一份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()
六、备注
若有错误,还望指出,谢谢!