# 导入库 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()