python数据分析实战(二)
这部分也是找的实战案例,之前有一点python的基础,实战比较能够快速理解。在这个实战过程中,碰到不懂的会去学习,所以,虽然是按照案例的思路来做,但是里面涉及的知识还是会另外补。
案例链接:https://segmentfault.com/a/1190000015440560
主要分为两个方面:一、数据初探,二、数据可视化
一、数据初探
1、导入数据包
第一步,导入需要的包,numpy,pandas,matplotlib,sklearn,seaborn
以及选择绘图的风格
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
#from Ipython.display import display
plt.style.use("fivethirtyeight")
sns.set_style({'font.sans-serif':['simhei','Arial']})
#检查python版本
from sys import version_info
if version_info.major!=3:
raise exception('请使用python 3 来完成此项目')
2、导入数据并观察数据
第二步,导入数据
df=pd.read_csv(r'F:\python学习\lianjia.csv')
df.head()
df.info()
结果如下:数据集有23676条记录,有12个字段,其中Elevator字段含有大量缺失值。
3、数据的描述统计
df.describe()
结果如下:
4、简单的数据整理
在这里通过lambda定义函数
#添加新字段房屋均价
df = df.copy()
df['PerPrice']=df.apply(lambda x:x.Price/x.Size,axis=1)
#重新摆放列的位置
x = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price']
df= pd.DataFrame(df,columns=x)
print(df.head(n=2))
结果如下:
二、数据可视化
1、Region特征分析
对于区域特征,我们可以分析不同区域房价和数量的对比。
代码如下:
df_house_count=df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index()
df_house_mean=df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index()
f,[ax1,ax2,ax3]=plt.subplots(3,1,figsize=(20,15)) #3行1列,ax1,ax2,ax3表示子图,f代表图片,figsize图片显示的尺寸
f.subplots_adjust(hspace=40)#用来调整子图的间距,hspace调整纵向间距,wspace调整横向间距
#直方图
sns.barplot(x='Region',y='PerPrice',palette="Blues_d",data=df_house_mean,ax=ax1)#sns.图名(x='X轴 列名', y='Y轴 列名', data=原始数据df对象)
ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15)
ax1.set_xlabel('区域')
ax1.set_ylabel('每平米单价')
#直方图
sns.barplot(x='Region',y='Price',palette="Greens_d",data=df_house_count,ax=ax2)
ax2.set_title('北京各大区二手房数量对比',fontsize=15)#字体大小
ax2.set_xlabel('区域')
ax2.set_ylabel('数量')
#箱线图
sns.boxplot(x='Region',y='Price',data=df,ax=ax3)
ax3.set_title('北京各大区二手房房屋总价',fontsize=15)
ax3.set_xlabel('区域')
ax3.set_ylabel('房屋总价')
f.tight_layout()
plt.show()
结果如下:
分析:
**二手房每平米单价:**西城区的二手房每平米单价是最高的,达到11万/m2,其次是东城大约10万/m2,然后是海淀约8.5万/m2,其他区的在2.2万/m2-7万/m2之间。不同区之间每平米单价的差距还是比较大的。
**二手房数量:**海淀区的二手房数量是最多的,但与朝阳区的基本持平,大约3000套。然后是丰台区,与海淀区、朝阳区相差不大。
**房屋总价:**房屋总价中位数较高的区域是东城区、西城区、朝阳区以及海淀区。房屋总价离散值较多且高,说明,虽然在同一区域,房屋的总价还是会存在一定的差距。
2、Size特征分析
图:distplot(直方图)、kdeplot(核密度图)、regplot(关系图)
转载一位作者关于这三个图的介绍:
链接如下:
https://blog.youkuaiyun.com/qq_40195360/article/details/86605860?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
代码如下:
#size特征分析
f,[ax1,ax2]=plt.subplots(1,2,figsize=(15,5))
f.subplots_adjust(wspace=1)
#房屋面积的分布情况
sns.distplot(df['Size'],bins=20,ax=ax1,color='r')
sns.kdeplot(df['Size'],shade=True,ax=ax1)#核密度估计图
#房屋面积和出售价格的关系
sns.regplot(x='Size',y='Price',data=df,ax=ax2)
plt.show()
结果如下:
房屋面积分布:
从左边的图可以看到,房屋面积的分布属于长尾分布,说明有较多的面积很大且超出正常范围的二手房。
房屋面积与价格的关系:
右图是size和price的关系图,size和price基本是呈现线性关系,符合基本去情况,即:面积越大,相应价格也会越高。但存在两种异常情况:第一,面积不到10平米,价格超出1000万;第二,有一个二手房面积超出1000平米,但价格却很低。针对这两个异常情况,需要去找原因。
我们先来看下面积不到10平米的这部分二手房的基本情况。
df.loc[df['Size']<10]
可以看到,这部分二手房是别墅,因为别墅的结构构造比较特殊,字段定义与二手商品房有点不同,导致爬虫爬取数据错位。也因为二手房不在我们的分析范围内,故将这部分数据移除。
经观察这个异常点不是普通的民用二手房,很可能是商用房,所以才有1房间0厅确有如此大超过1000平米的面积,这里选择移除。
移除异常数据后,再次作图,结果如下:
3、Layout特征分析
从下图可以看到,2室一厅的数量是最高的,其次是3室1厅,接下来是3室2厅,1室1厅。排名靠后的还有非常多,且数量都很低。大部分是X室X厅,但也会有部分的是X房间X卫,存在命名不规范的情况。
4、Renovation特征分析
我们先来简单看下Renovation的数据情况
代码:
df['Renovation'].value_counts()
结果如下:
没有其他名词,数据比较干净
作图:
f,[ax1,ax2,ax3]=plt.subplots(3,1,figsize=(5,20))
sns.countplot(df['Renovation'],ax=ax1)#统计次数
sns.barplot(x='Renovation',y='Price',data=df,ax=ax2)#默认统计平均值
sns.boxplot(x='Renovation',y='Price',data=df,ax=ax3)#箱线图
plt.show()
结果如下:
精装的二手房数量是最多的,其次是简装的。
从平均价格来看,毛坯房的价格是最高的,其次是精装。毛坯房的均价高,是因为其面积大,从第三个图可以看到。
毛坯房的波动情况比精装、简装都要大。
5、Elevator特征分析
看数据概述时,我们可以看到Elevator 有大量是缺失的,对于缺失值的处理,常用的方法是:第一,平均值、中位数填补法;第二,直接移除法;第三,根据其他特征建模预测。
这里采用填补法。但是有无电梯不是数值,无法用中位数和平均值进行填补,文中提供一种思路,根据普适规则来填补:一般楼层大于6的,有电梯,小于6的,没有电梯。根据这个简单的规则进行填补。
df.loc[(df['Floor']>6)&(df['Elevator'].isnull()),'Elevator']='有电梯'
df.loc[(df['Floor']<6)&(df['Elevator'].isnull()),'Elevator']='无电梯'
f,[ax1,ax2]=plt.subplots(1,2,figsize=(10,5))
sns.countplot(df['Elevator'],ax=ax1)
ax1.set_title('有无电梯数量对比',fontsize=15)
ax1.set_xlabel('是否有电梯')
ax1.set_ylabel('数量')
sns.barplot(x='Elevator',y='Price',data=df,ax=ax2)
ax2.set_title('有无电梯房价对比',fontsize=15)
ax2.set_xlabel('是否有电梯')
ax2.set_ylabel('总价')
plt.show()
结果观察到,有电梯的二手房数量居多一些,毕竟高层土地利用率比较高,适合北京庞大的人群需要,而高层就需要电梯。相应的,有电梯二手房房价较高,因为电梯前期装修费和后期维护费包含内了(但这个价格比较只是一个平均的概念,比如无电梯的6层豪华小区当然价格更高了)。
6、Year特征分析
关于下面使用到的grid,可看这个作者的介绍
https://blog.youkuaiyun.com/weixin_42398658/article/details/82960379
代码如下:
grid=sns.FacetGrid(df,row='Elevator',col='Renovation',palette='seismic',size=4)
grid.map(plt.scatter,'Year','Price')
grid.add_legend()
plt.show()
在Renovation和Elevator的分类条件下,使用 FaceGrid 分析 Year 特征,观察结果如下:
整个二手房房价趋势是随着时间增长而增长的;
2000年以后建造的二手房房价相较于2000年以前有很明显的价格上涨;
1980年之前几乎不存在有电梯二手房数据,说明1980年之前还没有大面积安装电梯;
1980年之前无电梯二手房中,简装二手房占绝大多数,精装反而很少;
7、Floor特征分析
f,ax1=plt.subplots(figsize=(20,5))
sns.countplot(x='Floor',data=df,ax=ax1)
ax1.set_title('房屋户型',fontsize=15)
ax1.set_xlabel('数量')
ax1.set_ylabel('户型')
plt.show()
结果如下:
下图中,六楼的二手房是最多的,且与其他楼层的差距非常大。其次是18楼。
总结
这个练习,大部分是关于图表的知识。在这个练习之后,如何用python做可视化,对于小白有一个初步的认识,后续还要继续学习图表原理以及图表的相关参数使用。