一线城市二手房市场分析(数据分析)

该文使用Python的数据分析库pandas和可视化库matplotlib、seaborn对一线城市(上海、北京、深圳、广州)的二手房信息进行处理和可视化。内容包括:各城市户型分布的柱状图和饼状图,不同城市的二手房平均单价、平均面积和平均总价的比较,以及关注人数、单价和总价的平均值。此外,还分析了装修层次对房屋单价的影响和历年二手房数量及平均单价的变化趋势。
摘要由CSDN通过智能技术生成
# 导入库
import matplotlib.pyplot as plt  # 导入matplotlib可视化模块
import seaborn as sns            # 导入seaborn数据可视化模块
import pandas as pd
import numpy as np
from pandas import Series,DataFrame

In [2]:

# 取消警告提示
import warnings
warnings.filterwarnings('ignore')

In [3]:

# 设置中文字体
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

In [4]:

d1=pd.read_excel('一线城市二手房信息表.xlsx')
d1.head()
d1.info()
# 删除多余的列,由于楼层列内容不统一,无法做出有效分析,因此也进行删除,房产信息列信息在后面的字段有包含,因此也进行删除
d1=d1.drop(labels=['Unnamed: 0','房产信息','楼层'],axis=1)
d1.head()
# 将城市中的各个字母替换为中文名。
d1['城市']=d1['城市'].replace({'sh':'上海','bj':'北京','sz':'深圳','gz':'广州'})
d1['城市'].value_counts()
# 推测重复值出现的原因是网站在实时更新,因此房间的顺序会变化导致的
d1.duplicated().sum()
d1=d1.drop_duplicates(keep='first')
d1
# 1.查看户型分布,上海
data1_1=d1.loc[d1['城市']=='上海']['居室类型'].value_counts()
x=data1_1.index
y=data1_1.values
plt.figure(figsize=[16,6])

plt.subplot(121)
plt.bar(x,y,color='b')
plt.title('上海户型分布柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('房屋数量',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x, y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(122)
plt.pie(y,labels=x,autopct='%.2f%%',textprops={'fontsize': 10})
plt.title('上海户型分布饼状图',fontsize=12)
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad =-0.2) 

plt.show()
# 1.查看户型分布,北京
data1_2=d1.loc[d1['城市']=='北京']['居室类型'].value_counts()
x=data1_2.index
y=data1_2.values
plt.figure(figsize=[16,6])

plt.subplot(121)
plt.bar(x,y,color='b')
plt.title('北京户型分布柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('房屋数量',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x, y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(122)
plt.pie(y,labels=x,autopct='%.2f%%',textprops={'fontsize': 10})
plt.title('北京户型分布饼状图',fontsize=12)
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad =-0.2) 

plt.show()
# 1.查看户型分布,广州
data1_3=d1.loc[d1['城市']=='广州']['居室类型'].value_counts()
x=data1_3.index
y=data1_3.values
plt.figure(figsize=[16,6])

plt.subplot(121)
plt.bar(x,y,color='b')
plt.title('广州户型分布柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('房屋数量',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x, y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(122)
plt.pie(y,labels=x,autopct='%.2f%%',textprops={'fontsize': 10})
plt.title('广州户型分布饼状图',fontsize=12)
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad =-0.2) 

plt.show()
# 1.查看户型分布,深圳
data1_4=d1.loc[d1['城市']=='深圳']['居室类型'].value_counts()
x=data1_4.index
y=data1_4.values
plt.figure(figsize=[16,6])

plt.subplot(121)
plt.bar(x,y,color='b')
plt.title('深圳户型分布柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('房屋数量',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x, y):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(122)
plt.pie(y,labels=x,autopct='%.2f%%',textprops={'fontsize': 10})
plt.title('深圳户型分布饼状图',fontsize=12)
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad =-0.2) 

plt.show()
# 2.查看不同城市的二手房平均单价,平均面积,平均总价
dataA=d1.groupby('城市')['单价(元/平)','总价(万元)','面积(平米)'].mean().round(2)
x1=dataA.index
y1=dataA['单价(元/平)']
x2=dataA.index
y2=dataA['总价(万元)']
x3=dataA.index
y3=dataA['面积(平米)']

plt.figure(figsize=[21,6])

plt.subplot(131)
plt.bar(x1,y1,color='r')
plt.title('各户型单价柱状图',fontsize=12)
plt.xlabel('城市',fontsize=12)
plt.ylabel('平均单价(元/平)',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x1, y1):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(132)
plt.bar(x2,y2,color='g')
plt.title('各户型平均总价柱状图',fontsize=12)
plt.xlabel('城市',fontsize=12)
plt.ylabel('平均总价(万元)',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x2, y2):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(133)
plt.bar(x3,y3,color='b')
plt.title('各户型平均面积柱状图',fontsize=12)
plt.xlabel('城市',fontsize=12)
plt.ylabel('平均面积(平米)',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x3, y3):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.show()
# 2.查看不同户型房屋的平均关注人数、平均单价、平均总价
data2=d1.groupby('居室类型')['关注人数'].mean().round(2).sort_values(ascending=False).head(10)
data3=d1.groupby('居室类型')['单价(元/平)'].mean().round(2).sort_values(ascending=False).head(10)
data4=d1.groupby('居室类型')['总价(万元)'].mean().round(2).sort_values(ascending=False).head(10)
x1=data2.index
y1=data2.values
x2=data3.index
y2=data3.values
x3=data4.index
y3=data4.values

plt.figure(figsize=[21,6])

plt.subplot(131)
plt.bar(x1,y1,color='r')
plt.title('各户型平均关注人数柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('平均关注人数',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x1, y1):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(132)
plt.bar(x2,y2,color='g')
plt.title('各户型平均均价柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('平均均价(元/平)',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x2, y2):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.subplot(133)
plt.bar(x3,y3,color='b')
plt.title('各户型平均总价柱状图',fontsize=12)
plt.xlabel('户型',fontsize=12)
plt.ylabel('平均总价(万元)',fontsize=12)
plt.xticks(rotation=90)
plt.tick_params(labelsize=12)
for a, b in zip(x3, y3):
    plt.text(a,b,b,ha='center',va='bottom',fontsize=12)

plt.show()
# 3.分析关注人数、房屋均价、房屋面积、房屋总价几个变量之间的关系
sns.pairplot(d1[['面积(平米)', '总价(万元)','单价(元/平)','关注人数']])
plt.show()
# 4.分析不同城市不同装修层次的房屋单价
data5=pd.crosstab(index=d1['城市'],columns=d1['装修'],values=d1['单价(元/平)'],aggfunc=np.mean)
data5.plot(kind='bar',stacked=False)    # rot标签旋转角度
plt.title("不同城市不同装修层次的房屋单价")
plt.xlabel("城市")
plt.ylabel("单价(元/平)") 
plt.xticks(rotation=0) 
plt.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = -0.2)      # 防止标签与图形重叠,让标签在图形外展示
plt.show()
d1['建造年份']=d1['建造年份'].astype('object')
d1.info()
plt.figure(figsize=[30,10])   # 设置画布尺寸
data6=pd.crosstab(index=d1['建造年份'],columns=d1['城市']).reset_index().sort_index()
x = data6['建造年份']
y1 = data6['上海']
y2 = data6['北京']
y3 = data6['广州']
y4 = data6['深圳']
plt.title('各城市历年二手房数量',fontsize=20)  # 折线图标题
plt.xlabel('年份',fontsize=20)  # x轴标题
plt.ylabel('二手房数量',fontsize=20)  # y轴标题
plt.xticks(rotation=90,fontsize=20)
plt.plot(x, y1, marker='o', markersize=3)
plt.plot(x, y2, marker='o', markersize=3)
plt.plot(x, y3, marker='o', markersize=3)
plt.plot(x, y4, marker='o', markersize=3)

# 以下代码是显示折线图上的数据标签,但由于数据量多,折线图多,显示数据标签,图形会难以看清,因此先注释掉。
for a, b in zip(x, y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)  # 设置数据标签位置及大小
for a, b in zip(x, y2):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y3):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y4):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)


plt.xticks(rotation=90)      # 将x轴标签旋转90度
plt.legend(['上海','北京','广州','深圳'])  # 设置折线名称

plt.show()
plt.figure(figsize=[30,10])   # 设置画布尺寸
data7=pd.crosstab(index=d1['建造年份'],columns=d1['城市'],values=d1['单价(元/平)'],aggfunc=np.mean).round(0).reset_index().sort_index()
x = data7['建造年份']
y1 = data7['上海']
y2 = data7['北京']
y3 = data7['广州']
y4 = data7['深圳']
plt.title('各城市历年二手房平均单价变化趋势',fontsize=20)  # 折线图标题
plt.xlabel('年份',fontsize=20)  # x轴标题
plt.ylabel('平均单价(元/平)',fontsize=20)  # y轴标题
plt.xticks(rotation=90,fontsize=20)
plt.plot(x, y1, marker='o', markersize=3)
plt.plot(x, y2, marker='o', markersize=3)
plt.plot(x, y3, marker='o', markersize=3)
plt.plot(x, y4, marker='o', markersize=3)

# 以下代码是显示折线图上的数据标签,但由于数据量多,折线图多,显示数据标签,图形会难以看清,因此先注释掉。
for a, b in zip(x, y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)  # 设置数据标签位置及大小
for a, b in zip(x, y2):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y3):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
for a, b in zip(x, y4):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)


plt.xticks(rotation=90)      # 将x轴标签旋转90度
plt.legend(['上海','北京','广州','深圳'])  # 设置折线名称

plt.show()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值