1.进行各数值变量的相关性分析
import seaborn as sns
import pandas as pd
corrmat = train.corr() ##corrmat是相关性矩阵
corrmat
表中具体数值是变量间的相关系数
2.根据相关系数绘制相关系数热力图
热力图可以迅速查看变量相关性。
颜色越浅的地方说明两个变量的相关性越强。
观察saleprice和其他变量的关系发现GrLivArea(地上居住面积)、OverallQual(整体质量)、GarargeCars(车库能装几辆车)等变量的颜色比较浅,说明它们对房价的预测能力可能比较强。
另外可以看到其他变量中也可能存在强相关关系,这可能是因为多重共线性导致,对于这部分特征,后续也要考虑进行处理。
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
heatmap用法
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)¶
- data:矩阵数据集,可以使numpy的数组(array),如果是pandas的dataframe,则df的index/column信息会分别对应到heatmap的columns和rows
- linewidths,热力图矩阵之间的间隔大小
- vmax,vmin, 图例中最大值和最小值的显示值,没有该参数时默认不显示
seaborn热力图用法参考
seaborn热力图参数介绍
3.选出前10个与房价强相关的变量查看相关系数
pandas nlargest用法
#选出前10个与房价强相关的变量
k=10
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cols
#查看10个变量的相关系数
cols_cor = train[cols].corr()
cols_cor
#绘制热力图
sns.set(font_scale=1.25)
sns.heatmap(cols_cor, vmax=.8, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10})
通过热力图观察,可以发现
- ‘OverallQual’(房屋整体材料和装修水平), ‘GrLivArea’(地上生活区总面积) and ‘TotalBsmtSF’ (地下室总面积)和房价强相关
- “GarageCars”(车库可放车数量)和“GarageArea”(车库面积)也是相关性很强的变量。然而GarageCars和GarageArea就像一对孪生兄弟互相相关性就很强,无法分辨它们(放在一起也会产生多重共线性问题)。因此,我们在分析中只需要这些变量中的一个(我们可以保留“GarageCars”,因为它与“SalePrice”的相关性更高)。
- “TotalBsmtSF”(地下室面积)和“1stFloor”道理如上,似乎都是代表地下室面积,这里不确定这两个变量含义的区别,不过它们也有很强的相关性
4. 再深入看一下这些强相关变量和房价的关系
(1)GrLivArea (地上生活区总面积)
var = 'GrLivArea'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))
#GrLivArea代表含义是居住面积,发现和房价有比较明显的正相关关系
#我们可以在右下角看到两个明显的outlier,价格很低,但面积巨大,我们可以考虑删除掉这两个异常值。
(2)TotalBsmtSF(地下室总面积)
#TotalBsmtSF含义为地下室面积,发现地下室面积与房价似乎有更强的潜在线性关系,同时在右侧似乎也有一个异常值存在
var = 'TotalBsmtSF'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
(3)GarageArea车库面积
#GarageArea含义为车库面积,可以看到车库面积和房价也存在一定的正相关关系
var = 'GarageArea'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));
对于连续型变量,我们可以用散点图的方式查看它们和房价之间的关系,下面我们再来看一下离散型变量,对于离散型变量,我们可以用箱型图去查看特征不同取值中房价的分布情况。
(4)OverallQual(房屋整体材料和装修水平)
var = 'OverallQual'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(8, 6))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
(5)YearBuilt房屋建造时间
#再看一下房屋的建造时间和价格的关系,可以看到房屋的建造时间虽然没有和房价有明显的线性关系,但最近建造的新房屋,整体的价格会比较高,这个在后面的特征工程中会用到,注意
var = 'YearBuilt'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(16, 8))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
plt.xticks(rotation=90);
(6)Fireplaces壁炉数量
#上面是一些比较容易想到的变量,再看壁炉数量和房价的关系,壁炉越多,房价越高
var = 'Fireplaces'
data = pd.concat([train['SalePrice'], train[var]], axis=1)
f, ax = plt.subplots(figsize=(16, 8))
fig = sns.boxplot(x=var, y="SalePrice", data=data)
fig.axis(ymin=0, ymax=800000);
plt.xticks(rotation=90);