Kaggle项目:House Price

整理了一下Kaggle上入门级别的数据分析项目,本文参考了若干Kaggle上学员的思路和Discussions。
以下是Kaggle的House Prices的项目地址

一、数据概览

House prices模型预测,data包中包含了三组数据train.csvtest.csvdata_description.txt(这个文本非常、非常、非常重要)
首先对数据进行简单的预览

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

数据引入,观察前几行数据

	train_data=pd.read_csv(r'data/train.csv')
	test_data = pd.read_csv(r'data/test.csv')
	train_data.info()#数据总览

在这里插入图片描述
由于数据实在是太多了,这里只显示了前10的变量。除去Id、SalePrice外还有79个变量,并且同时存在着部分缺省值。为了更加了解每个变量的含义,我们需要仔细阅读项目集下的data_description文本,下面是有关MSSubClass变量的意义。

MSSubClass: Identifies the type of dwelling involved in the sale.
20 1-STORY 1946 & NEWER ALL STYLES
30 1-STORY 1945 & OLDER
40 1-STORY W/FINISHED ATTIC ALL AGES
45 1-1/2 STORY - UNFINISHED ALL AGES
50 1-1/2 STORY FINISHED ALL AGES
60 2-STORY 1946 & NEWER
70 2-STORY 1945 & OLDER
75 2-1/2 STORY ALL AGES
80 SPLIT OR MULTI-LEVEL
85 SPLIT FOYER
90 DUPLEX - ALL STYLES AND AGES
120 1-STORY PUD (Planned Unit Development) - 1946 & NEWER
150 1-1/2 STORY PUD - ALL AGES
160 2-STORY PUD - 1946 & NEWER
180 PUD - MULTILEVEL - INCL SPLIT LEV/FOYER
190 2 FAMILY CONVERSION - ALL STYLES AND AGES

该文本介绍了每个变量的含义,以及缺省值代表的意义,在进行深入分析前我们可以初步概览一下各个variable的意义,先有个概括,从中标记几个(你认为)重点的变量,后面仔细分析的时候再进行排除和验证。通过’主观’筛选后,接下来就是对数据的‘客观’分析

二、数据分析

1.因变量SalePrice的分析

train_data['SalePrice'].describe()
sns.distplot(train_data.SalePrice,fit = norm)
plt.title('SalePrice_distribution')
print('Skewness:%f' % train_data.SalePrice.skew())
print('Kurtosiss:%f' % train_data.SalePrice.kurt())

Skewness:1.882876
Kurtosis:6.536282

在这里插入图片描述
图中黑线部分为正态分布的曲线,蓝色部分为SalePrice的直方分布图,通过偏度(Skewness)和峰度(Kurtosis),可以看出SalePrice的分布为右偏分布,且峰度较大,或许可以通过对其进行对数转换,将其转换为正态分布。但这里只是个概览,有关数据处理在后面一同处理。

2.‘相关’自变量的分析

corrmat = train_data.corr()
plt.subplots(figsize=(12,9))
sns.heatmap(corrmat,vmax = 0.9,square = True) #热力图函数,你值得拥有
plt.title('variables\' correlation')

在这里插入图片描述
看来与SalePrice相关的变量还是很多,还需要继续筛选,abs(corr)大于0.5为中度相关,按照这个规定从中继续挑选吧

highcor_var = corrmat.loc[corrmat.SalePrice.abs()>0.5].sort_values(by
='SalePrice',ascending = False).index#寻找相关性大于0.5的变量,从大到小排序
highcor_data = train_data.loc[:,highcor_var]
fig,ax = plt.subplots(figsize = (9,9))
fig = sns.heatmap(highcor_data.corr(),annot = True,square = True) 
plt.title('the highest variables')
print(highcor_var)

Index([‘SalePrice’, ‘OverallQual’, ‘GrLivArea’, ‘GarageCars’, ‘GarageArea’,
‘TotalBsmtSF’, ‘1stFlrSF’, ‘FullBath’, ‘TotRmsAbvGrd’, ‘YearBuilt’,
‘YearRemodAdd’],
dtype=‘object’)

看来中度相关的变量就在这10个变量之中,但先别着急往下分析,这幅图中还包含着其他的信息——部分变量间存在高度相关,因此需要去除,降低拟合冗余:
1.GrLivArea与TotRmsAbuGrd高度相关,增加拟合冗余,因此舍弃相关度较低的TotRmsAbvGrd
2.GarageCars与GarageArea高度相关,都代表的是车库容量,因此可用相关度较高的GarageCar代表
3.TotalBsmtSF与1stFlrSF高度相关,其代表的是一楼的‘院子’大小,可用相关度较高的TotalBsmtSF代表
接下来对OverallQual’,‘GrLivArea’, ‘GarageCars’, 'TotalBsmtSF, ‘FullBath’,‘YearBuilt’,'YearRemodAdd进行作图分析(有关数据处理的部分还是留在数据处理环节进行)

2.1OverallQual变量

OverallQual:Rates the overall material and finish of the house,即房屋总体评分

y_data = data.SalePrice #方便后续书写
var1 = data.OverallQual
fig,ax = plt.subplots(figsize=(12,9))
fig = sns.boxplot(x=var1,y=y_data)#箱线图能很好的反映分布情况,适用于分类型变量
fig.axis(ymin = 0,ymax = 800000)
plt.title('OverallQual and SalePrice relation[box]')

在这里插入图片描述
虽然存在部分离散点,但从分布情况来看,评价越高的房子其房价也越高(符合常理)

2.2GriLivArea变量

GriLivArea:Above grade (ground) living area square feet,即住房面积

var2 = data.GrLivArea 
fig,ax = plt.subplots(figsize=(10,7))
fig = sns.scatterplot(x=var2,y=y_data) 
fig.axis(ymin = 0,ymax = 800000)
plt.title('GrLivArea  and SalePrice relation[scatter]')

在这里插入图片描述
虽然存在部分离散点,但可以看出SalePrice与GrLivArea之间存在呈正相关,可能存在指数相关。不如再进一步进行数据分类,以50为组间间隔,将GrLivArea分为不同组,并对房价取对数,观察他们的关系

bins = list(range(0,3000,50))
bins.append(var2.max())
var2_bins = pd.cut(var2,bins)
fig,ax = plt.subplots(figsize=(16,8))
fig = sns.boxplot(x = var2_bins,y=np.log10(y_data))
plt.xticks(rotation = 90)
plt.title('GrLivArea and SalePrice relation[box]')

在这里插入图片描述
这次倒是显示的非常明显,SalePrice和GrLivArea之间存在指数关系,但需要注意的是,图中我将大于3000以上的点分为一组,尤其是在散点图最右侧的两个“低价”数据

2.3GarageCars变量

GarageCars: Size of garage in car capacity,即车库容量,注意该变量与GarageArea变量高度相关
(尝试利用GarageArea/GarageCars替代这两项,但其结果并不理想)

var3 = data.GarageCars #车库容量大小
fig,ax = plt.subplots(figsize = (10,7))
fig = sns.boxplot(x = var3,y = y_data)
plt.title('GarageCars and SalePrice relation[box]')

在这里插入图片描述
似乎出现了点意外?GarageCars为4时,房价突然下降。

train.loc[train.GarageCars == 4,'SalePrice']

out:
420 206300
747 265979
1190 168000
1340 123000
1350 200000
Name: SalePrice, dtype: int64

仅有4组数据,有可能是样本过少的原因,也有可能是其他因素影响,但先记录这些‘特异点’,可能成为为后续优化模型的关键

2.4TotalBsmtSF变量

TotalBsmtSF: Total square feet of basement area,即地下室总面积,该变量与1stFlrSF高度,或许现实中,一楼多大地下室就多大?

var4 = data.TotalBsmtSF #类似与GrLivArea或许可进一步分类?
fig,ax = plt.subplots(figsize=(12,9
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值