成都2020年二手房信息挖掘探析
本文将通过详细的Python数据视角,挖掘成都的房价概况(2020年3月),给你一个客观的,基于数据视角的成都房价以及区位现状。
1 数据来源
贝壳二手房爬取的源数据。
包括国内:北京,上海,天津,广州,深圳,成都,太原,沈阳,成都,长春,哈尔滨,呼和浩特的二手房数据。
数据源链接: 工作台 - Kesci.com
本文以成都为研究对象。
2 先说结论
- 楼层高度与二手房总价 & 单价负相关,也就是说,在成都你买越高的楼层越便宜;
- 与1对应,在成都同一时间段内,关注高楼层的人更多;
- 成都一栋楼盘,总楼层数越多,单价也相应地更高一些;
- 成都在2020年3月20日受关注度最高的小区是高新区的“润和原筑”,而且是1室1厅;
- 不论是单价还是总价,除了地下室外,成都二手房都是楼层越矮的越贵;
- 成都在2020年3月的二手房价格均价¥14,818.2,最高价¥143,590,最低价1,690.8;
- 单价最便宜的是位于彭州的集贤西街,属于低楼层;
- 单价最贵的是位于高新区的万景峰一期,属于中楼层;
- 成都高新区关注度最高,彭州关注度最低;
- 高新区均价最高(¥21,060),彭州均价最低(¥7,061);
- 天府新区南区总价均价最高(269W),彭州总价均价最低(84W);
- 平均面积是天府新区南区最大(164.74平),成华区平均面积最小(79.69平);
- 成都二手房的“4室4厅”最贵(单价¥33,665.15),“8室8厅”最便宜(单价¥5,537);
- 关注“6室5厅”的人最多,关注“8室8厅”的人最少;
3 分析过程
Python分析过程主要包括:
- 数据导入
- 拟研究字段处理
- 相关性计算
- 最受欢迎的小区
- 关注成都二手房的人的楼层偏好
- 楼层单价分布
- 价格区间描述
- 区位差异
- 房屋规格偏好
3.1 数据导入
# 导入相关包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 导入数据,总共两条
df1 = pd.read_csv("./贝壳二手房列表-成都38470条(1).csv",error_bad_lines=False,warn_bad_lines = False)
df2 = pd.read_csv("./贝壳二手房列表-成都38470条(2).csv",error_bad_lines=False,warn_bad_lines = False)
# 查看数据,以df1为例
df1.head(1)
# 查看数据信息
df1.info()
# 合并数据并剔除重复值
df_combine = pd.concat([df1,df2])
df_combine = df_combine.drop_duplicates()
3.2 获取拟研究字段
因为有些字段是网页链接,对本文所研究的内容并无作用,所以会选取要使用的字段。
这里选取了:区、小区名、houseinfo(房源描述)、关注、价格、单价、当前时间
df_combine = df_combine.loc[:,['区','小区名','houseinfo','关注','价格','单价','当前时间1']]
df_combine
3.3 舍弃空值字段
df_clean = df_combine.dropna(how='any',axis=0)
df_clean
3.4 重建字段
衍生出了:“楼层描述”、“总楼层数”、“修建日期”等多个字段。
# 使用正则表达式以及字符串来清晰数据并重建字段
df_clean.loc[:,'楼层描述'] = df_clean.loc[:,'houseinfo'].str[:3]
df_clean.loc[:,'总楼层数'] = df_clean.loc[:,'houseinfo'].str.findall("共(\d*)层").str[0]
df_clean.loc[:,'修建日期'] = df_clean.loc[:,'houseinfo'].str.findall("(\d*)年建").str[0]
df_clean.loc[:,'规格'] = df_clean.loc[:,'houseinfo'].str.findall(".室.厅").str[0]
df_clean.loc[:,'面积(M^2)'] = df_clean.loc[:,'houseinfo'].str.findall("(\d*.\d*)平米").str[0].astype(float)
df_clean.loc[:,'关注'] = df_clean.loc[:,'关注'].str.findall("\d+").str[0].astype(int)
df_clean.loc[:,'单价'] = df_clean.loc[:,'单价'].str.findall("单价(.*)元/平米").str[0].astype(float)
df_clean.loc[:,'当前时间1'] = df_clean.loc[:,'当前时间1'].str[:10].apply(lambda x:pd.to_datetime(x))
df_clean.rename(columns={'关注':'关注人数','当前时间1':'日期'},inplace=True)
df_clean.drop(['houseinfo'],axis=1,inplace=True)
df_clean['总价'] = df_clean['面积(M^2)'] * df_clean['单价']
df_clean.head()
# 再次清洗空值
df_clean = df_clean.dropna(how='any',axis=0)
df_clean.loc[:,'楼层描述mapping'] = df_clean['楼层描述'].map({'地下室':0,'低楼层':1,'中楼层':2,'高楼层':3})
df_clean.loc[:,'总楼层数'] = df_clean.loc[:,'总楼层数'].replace({'':0}).astype(int)
值得一提的是,在楼层描述字段中总共存在“高楼层”、“中楼层”、“低楼层”以及“地下室”四种类别,其中存在一处异常值“未知(”字段,故需要舍弃。
df_clean.query("楼层描述 == '未知('",engine='python')
df_clean = df_clean.drop(index=17196)
3.5 相关性计算
import seaborn as sns
from scipy.stats import spearmanr
print("楼层高矮与总价格的相关性:",spearmanr(df_clean['楼层描述mapping'],df_clean['总价'])[0])
print("楼层高矮与单价的相关性:",spearmanr(df_clean['楼层描述mapping'],df_clean['单价'])[0])
print("总楼层数与价格的相关性:",spearmanr(df_clean['总楼层数'],df_clean['总价'])[0])
print("面积与价格的相关性",spearmanr(df_clean['面积(M^2)'],df_clean['总价'])[0])
# output
楼层高矮与总价格的相关性: -0.080195841711472
楼层高矮与单价的相关性: -0.06859121715970777
总楼层数与价格的相关性: 0.19177558026957764
面积与总价的相关性 0.6603011835733246
楼层高度与单价及总价都呈负相关,即楼层越高,价格越低。
总楼层数与价格正相关,总楼盘拥有的层数越高,价格越高;
面积与总价依旧是万年不变的正相关。
3.6 最受欢迎的小区
df_clean.sort_values(by='关注人数',ascending=False)[:1]
最受欢迎的是来自于高新区的润和原著。
3.7 更关注于高楼层还是低楼层
# 楼层关注度
df_clean.groupby('楼层描述')['关注人数'].mean().to_frame().reset_index().sort_values(by='关注人数',ascending=False)
关注关注高楼层的人最多,地下室由于采光原因,关注度极低,可以说几乎无人问津。
3.8 楼层单价及总价分布
df_clean.groupby('楼层描述')['单价'].mean().to_frame().reset_index().sort_values(by='单价',ascending=False)
df_clean.groupby('楼层描述')['总价'].mean().to_frame().reset_index().sort_values(by='总价',ascending=False)
不论是单价还是总价,除了地下室外,成都二手房均是楼层越低越贵。
3.9 价格区间描述
成都全市二手房,均价14000+,最高价14W,最低价1600+。
df_clean['单价'].describe()
df_clean.query("单价 == 1690.800000")
df_clean.query("单价 == 143590.000000")
3.10 区位差异
(1)单价差异
# 单价差异
cd_house_average = df_clean.groupby('区')['关注人数','单价'].mean().reset_index().sort_values(by='单价',ascending=False).reset_index(drop=True)
fig,ax = plt.subplots(figsize=(10,8))
g = sns.barplot(data=cd_house_average,x='区',y='单价',ax=ax,palette='Blues_d')
for index,row in cd_house_average.iterrows():
g.text(row.name,row['单价']+200,"¥"+str(int(row['单价'])),ha='center',fontsize=10)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelrotation=45,axis='x',labelsize=9)
plt.tight_layout()
plt.savefig("成都单价图.jpg",dpi=80)
plt.show()
(2)面积差异
cd_house_cover = df_clean.groupby('区')['面积(M^2)'].mean().reset_index().sort_values(by='面积(M^2)',ascending=False).reset_index(drop=True)
fig,ax = plt.subplots(figsize=(10,8))
g = sns.barplot(data=cd_house_cover,x='区',y='面积(M^2)',ax=ax,palette='Blues_d')
for inex,row in cd_house_cover.iterrows():
g.text(row.name,row['面积(M^2)']+2,str(int(row['面积(M^2)']))+"$m^2$",ha='center',fontsize=9.2)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelrotation=45,axis='x',labelsize=9)
plt.tight_layout()
plt.savefig("成都面积图.jpg",dpi=80)
plt.show()
天府新区南区、彭州房源面积较大,相对地,锦江区、成华区寸土寸金。
(3)总价差异
cd_house_total = df_clean.groupby('区')['总价'].mean().reset_index().sort_values(by='总价',ascending=False).reset_index(drop=True)
fig,ax = plt.subplots(figsize=(10,8))
g = sns.barplot(data=cd_house_total,x='区',y='总价',ax=ax,palette='Blues_d')
for index,row in cd_house_total.iterrows():
g.text(row.name,row['总价']+10000,str(int(row['总价']/10000)) + '万',ha='center',fontsize=10)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.tick_params(labelrotation=45,axis='x',labelsize=9)
plt.tight_layout()
plt.savefig("成都总价图.jpg",dpi=80)
plt.show()
(4)规格偏好
cd_house_size_prefer = df_clean.groupby('规格')['关注人数','单价'].mean().reset_index()\
.sort_values(by='单价',ascending=False).reset_index()
fig,ax = plt.subplots(figsize=(10,8))
sns.scatterplot(x='规格',y='单价',data=cd_house_size_prefer,ax=ax,palette='Blues_d',s=120,)
ax.tick_params(axis='x',labelrotation=45,labelsize=9)
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.grid(linestyle='-.')
plt.tight_layout()
plt.savefig("成都房型规格偏好图.jpg",dpi=80)
plt.show()
4 总结
本文根据贝壳二手房平台的2020年3月成都真实数据,使用基于Python的数据分析,反映了目前成都房价的总体情况以及区域分布。由于数据为静态数据不能很好地反映房价变化走势以及最新动态,是本文的局限性所在,本文力求根据数据还原相对真实的成都房价情况,结论仅供参考。
参考资料
[1] 和鲸社区.贝壳二手房 数据. 工作台 - Kesci.com
[2] 成都区域划分. 成都区域划分- 本地宝