转摘:https://segmentfault.com/a/1190000015440560segmentfault
1、数据初探网络
首先导入要使用的科学计算包numpy
,pandas
,可视化matplotlib
,seaborn
,以及机器学习包机器学习
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import matplotlib as mpl 5 6 import matplotlib.pyplot as plt 7 from IPython.display import display 8 plt.style.use("fivethirtyeight") 9 sns.set_style({'font.sans-serif':['simhei','Arial']}) 10 %matplotlib inline 11 12 13 # 检查Python版本 14 from sys import version_info 15 if version_info.major != 3: 16 raise Exception('请使用Python 3 来完成此项目')
而后导入数据,并进行初步的观察,这些观察包括了解数据特征的缺失值,异常值,以及大概的描述性统计。ide
1 # 导入二手房数据 2 lianjia_df = pd.read_csv('lianjia.csv') 3 display(lianjia_df.head(n=2))
初步观察到一共有11
个特征变量,Price
在这里是咱们的目标变量,而后咱们继续深刻观察一下。性能
1 # 检查缺失值状况 2 lianjia_df.info()
发现了数据集一共有23677
条数据,其中Elevator
特征有明显的缺失值。学习
lianjia_df.describe()
上面结果给出了特征值是数值的一些统计值,包括平均数,标准差,中位数,最小值,最大值,25%分位数,75%分位数。这些统计结果简单直接,对于初始了解一个特征好坏很是有用,好比咱们观察到 Size 特征
的最大值为1019平米,最小值为2平米,那么咱们就要思考这个在实际中是否是存在的,若是不存在没有意义,那么这个数据就是一个异常值,会严重影响模型的性能。spa
1 # 添加新特征房屋均价 2 df = lianjia_df.copy() 3 df['PerPrice'] = lianjia_df['Price']/lianjia_df['Size'] 4 5 # 从新摆放列位置 6 columns = ['Region', 'District', 'Garden', 'Layout', 'Floor', 'Year', 'Size', 'Elevator', 'Direction', 'Renovation', 'PerPrice', 'Price'] 7 df = pd.DataFrame(df, columns = columns) 8 9 # 从新审视数据集 10 display(df.head(n=2))
发现 Id
特征其实没有什么实际意义,因此将其移除。因为房屋单价分析起来比较方便,简单的使用总价/面积就可获得,因此增长一个新的特征 PerPrice
(只用于分析,不是预测特征)。另外,特征的顺序也被调整了一下,看起code
来比较舒服。blog
2、可视化分析排序
Region特征分析:对于区域特征,咱们能够分析不一样区域房价和数量的对比。
1 # 对二手房区域分组对比二手房数量和每平米房价 2 df_house_count = df.groupby('Region')['Price'].count().sort_values(ascending=False).to_frame().reset_index() 3 df_house_mean = df.groupby('Region')['PerPrice'].mean().sort_values(ascending=False).to_frame().reset_index() 4 5 f, [ax1,ax2,ax3] = plt.subplots(3,1,figsize=(20,15)) 6 sns.barplot(x='Region', y='PerPrice', palette="Blues_d", data=df_house_mean, ax=ax1) 7 ax1.set_title('北京各大区二手房每平米单价对比',fontsize=15) 8 ax1.set_xlabel('区域') 9 ax1.set_ylabel('每平米单价') 10 11 sns.barplot(x='Region', y='Price', palette="Greens_d", data=df_house_count, ax=ax2) 12 ax2.set_title('北京各大区二手房数量对比',fontsize=15) 13 ax2.set_xlabel('区域') 14 ax2.set_ylabel('数量') 15 16 sns.boxplot(x='Region', y='Price', data=df, ax=ax3) 17 ax3.set_title('北京各大区二手房房屋总价',fontsize=15) 18 ax3.set_xlabel('区域') 19 ax3.set_ylabel('房屋总价') 20 21 plt.show()
使用了pandas
的网络透视功能 groupby
分组排序。区域特征可视化直接采用 seaborn
完成,颜色使用调色板 palette
参数,颜色渐变,越浅说明越少,反之越多。
能够观察到:
Size特征分析 :
1 f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5)) 2 # 建房面积的分布状况 3 sns.distplot(df['Size'], bins=20, ax=ax1, color='r') 4 sns.kdeplot(df['Size'], shade=True, ax=ax1) 5 # 建房面积和出售价格的关系 6 sns.regplot(x='Size', y='Price', data=df, ax=ax2) 7 plt.show()
Size 分布:
经过 distplot
和 kdeplot
绘制柱状图观察 Size 特征的分布状况,属于长尾类型的分布,这说明了有不少面积很大且超出正常范围的二手房。
Size 与 Price 的关系:
经过 regplot
绘制了 Size 和 Price 之间的散点图,发现 Size 特征基本与Price呈现线性关系,符合基本常识,面积越大,价格越高。可是有两组明显的异常点:1. 面积不到10平米,可是价格超出10000万;2. 一个点面积超过了1000平米,价格很低,须要查看是什么状况。
1 df.loc[df['Size']< 10]
df.loc[df['Size']>1000]
经观察这个异常点不是普通的民用二手房,极可能是商用房,因此才有1房间0厅确有如此大超过1000平米的面积,这里选择移除。
df = df[(df['Layout']!='叠拼别墅')&(df['Size']<1000)]
从新进行可视化发现就没有明显的异常点了
Layout特征分析:
f, ax1= plt.subplots(figsize=(20,20)) sns.countplot(y='Layout', data=df, ax=ax1) ax1.set_title('房屋户型',fontsize=15) ax1.set_xlabel('数量') ax1.set_ylabel('户型') plt.show()
这个特征真是不看不知道,各类厅室组合搭配,居然还有9室3厅,4室0厅等奇怪的结构。其中,2室一厅占绝大部分,其次是3室一厅,2室2厅,3室两厅。可是仔细观察特征分类下有不少不规则的命名,好比2室一厅与2房间1卫,还有别墅,没有统一的叫法。这样的特征确定是不能做为机器学习模型的数据输入的,须要使用特征工程进行相应的处理。
Renovation 特征分析
1 df['Renovation'].value_counts()
精装 11345
简装 8497
其余 3239
毛坯 576
发现Renovation装修特征中居然有南北,它属于朝向的类型,多是由于爬虫过程当中一些信息位置为空,致使“Direction”朝向特征出如今这里,因此须要清除
或替
# 去掉错误数据“南北”,由于爬虫过程当中一些信息位置为空,致使“Direction”的特征出如今这里,须要清除或替换 df['Renovation'] = df.loc[(df['Renovation'] != '南北'), 'Renovation'] # 画幅设置 f, [ax1,ax2,ax3] = plt.subplots(1, 3, figsize=(20, 5)) 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()
观察到,精装修的二手房数量最多,简装其次,也是咱们平平常见的。而对于价格来讲,毛坯类型倒是最高,其次是精装修
Elevator 特征分析
初探数据的时候,咱们发现 Elevator 特征是有大量缺失值的,这对于咱们是十分不利的,首先咱们先看看有多少缺失值:
misn = len(df.loc[(df['Elevator'].isnull()), 'Elevator']) print('Elevator缺失值数量为:'+ str(misn))
Elevator 缺失值数量为:8237
这么多的缺失值怎么办呢?这个须要根据实际状况考虑,经常使用的方法有平均值/中位数填补法,直接移除,或者根据其余特征建模预测等。
这里咱们考虑填补法,可是有无电梯不是数值,不存在平均值和中位数,怎么填补呢?这里给你们提供一种思路:就是根据楼层 Floor 来判断有无电梯,通常的楼层大于6的都有电梯,而小于等于6层的通常都没有电梯。有了这个标准,那么剩下的就简单了。
1 # 因为存在个别类型错误,如简装和精装,特征值错位,故须要移除 2 df['Elevator'] = df.loc[(df['Elevator'] == '有电梯')|(df['Elevator'] == '无电梯'), 'Elevator'] 3 4 # 填补Elevator缺失值 5 df.loc[(df['Floor']>6)&(df['Elevator'].isnull()), 'Elevator'] = '有电梯' 6 df.loc[(df['Floor']<=6)&(df['Elevator'].isnull()), 'Elevator'] = '无电梯' 7 8 f, [ax1,ax2] = plt.subplots(1, 2, figsize=(20, 10)) 9 sns.countplot(df['Elevator'], ax=ax1) 10 ax1.set_title('有无电梯数量对比',fontsize=15) 11 ax1.set_xlabel('是否有电梯') 12 ax1.set_ylabel('数量') 13 sns.barplot(x='Elevator', y='Price', data=df, ax=ax2) 14 ax2.set_title('有无电梯房价对比',fontsize=15) 15 ax2.set_xlabel('是否有电梯') 16 ax2.set_ylabel('总价') 17 plt.show()
结果观察到,有电梯的二手房数量居多一些,毕竟高层土地利用率比较高,适合北京庞大的人群须要,而高层就须要电梯。相应的,有电梯二手房房价较高,由于电梯前期装修费和后期维护费包含内了(但这个价格比较只是一个平均的概念,好比无电梯的6层豪华小区固然价格更高了)。
Year 特征分析:
1 grid = sns.FacetGrid(df, row='Elevator', col='Renovation', palette='seismic',size=4) 2 grid.map(plt.scatter, 'Year', 'Price') 3 grid.add_legend()
在Renovation和Elevator的分类条件下,使用 FaceGrid
分析 Year 特征,观察结果以下:
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()
能够看到,6层二手房数量最多,可是单独的楼层特征没有什么意义,由于每一个小区住房的总楼层数都不同,咱们须要知道楼层的相对意义。另外,楼层与文化也有很重要联系,好比中国文化七上八下,七层可能受欢迎,房价也贵,而通常也不会有4层或18层。固然,正常状况下中间楼层是比较受欢迎的,价格也高,底层和顶层受欢迎度较低,价格也相对较低。因此楼层是一个很是复杂的特征,对房价影响也比较大。