本篇文章9110字,读完约23分钟
[简介] ]kaggle的房价预测竞赛始于2016年8月,结束于2017年2月。在此期间,超过2000人参加了比赛,参赛者使用先进的Return技术,根据我们给出的79个特征,准确预测了房子的售价。今天,我们以最高票数推出获奖方案:“利用python进行综合数据探索”,该方案在数据探索和特征工程方面表现出色。
作者pedro marcelino在比赛中使用的主要方法是注意科学的数据处理方法,并找到可以指导工作的强有力的文件。作者主要参考多元数据分析第三章“检查你的数据”,Hair等人,2014。作者将其研究方法分为以下三个步骤:
定义要解决的问题;
查阅相关文献;
修改它们以适应它们自己的要求。
“站在巨人的肩膀上。”——pedro marcelino
让我们看看作者是如何分析数据的。
了解你的数据
方法框架:
理解问题:看每一个变量,根据它们对问题的意义和重要性进行哲学分析。
单变量研究:只关注因变量(销售价格),并做出更深入的理解。
多元研究:分析因变量和自变量之间的关系。
基本清理:清理数据集,处理缺失数据、异常值和分类数据。
检验假设:检查数据是否与多元分析方法的假设一致。
开始前:
importpandasaspd
importmatplotlib.pyplotasplt
importseabornassns
importnumpyasnpfromscipy.stats
importnormfromsklearn.preprocessing .预处理
importstandardscalerfromscipy
importstats
导入警告
warnings.filterwarnings(忽略)
%matplotlibinline
#带来六包
df_train=pd.read_csv(../input/train.csv)
#检查装饰
df _火车.列
索引([ id,mssubclass,mszoning,lotfrontage,lotarea,street,
弄堂,lotshape,landcontour,utilities,lotconfig,
landslope,邻域,条件1,条件2,bldgtype,
房屋风格,整体质量,整体数量,年度建造,年度翻新,
屋顶样式,屋顶材料,外部1,外部2,masvnrtype,
masvnrarea,exterqual,extercond,foundation,bsmtqual,
bsmtcond,bsmtexposure,bsmtfintype1,bsmtfinsf1,
bsmtfintype2,bsmtfinsf2,bsmtunfsf,totalbsmtsf,加热,
heatingqc,centralair,electrical,1stflrsf,2ndflrsf,
lowqualfinsf,grlivarea,bsmtfullbath,bsmthalfbath,fullbath,
halfbath,bedroomabvgr,kitchenabvgr,kitchenqual,
totrmsabvgrd、functional、fireplacequ、garagetype、
garageyrblt,garagefinish,garagecars,garagearea,garagequal,
garagecond,paveddrive,wooddecksf,openporchsf,
enclosedporch,3ssnporch,screenporch门廊,poolarea,poolqc,
围栏,错误特征,错误值,mosold,yrsold,saletype,
销售条件,销售价格],
dtype=对象)
准备——我们能期待什么?
为了理解我们的数据,我们可以分析每个变量,并试图理解它们的含义以及与问题的相关程度。
首先,使用以下目录创建一个excel电子表格:
变量–变量名。
类型–变量的类型。此列中只有两个可能的值,“数据”或“类别”。“数据”表示变量的值是一个数字,“类别”表示变量的值是一个类别标签。
除法–表示变量的除法。我们定义了三个部分:建筑、空房间和位置。
期望值——我们希望这个变量影响房价的程度。我们使用类别标签“高”、“中”和“低”作为可能的值。
结论——我们对这个变量的重要性得出的结论。粗略浏览数据后,我们认为该列与“期望值”基本一致。
评论–我们看到的所有一般性评论。
我们首先阅读每个变量的描述文件,同时考虑这三个问题:
我们买房时会考虑这个因素吗?
如果是,这个因素有多重要?
这个因素带来的信息是否出现在其他因素中?
我们根据以上内容填写了电子表格,并仔细观察了“高期望值”的变量。然后,在这些变量和房价之间画一个散点图,并填入“结论”一栏,这恰好是我们期望值的修正。
我们总结了在这个问题中起重要作用的四个变量:
总体质量
一年建成的。
totalbsmtsf。
格里瓦里亚。
最重要的是——“房价”分析
描述性数据汇总:
df_train[ saleprice ]。描述()
计数1460.000000
平均值180921.195890
标准79442.502883
最小值34900.000000
25% 129975.000000
50% 163000.000000
75% 214000.000000
最大755000.000000
名称:saleprice,dtype: float64
绘制直方图
SNS . dist plot(df _ train[sale price
从直方图可以看出:
偏离正态分布
数据的正偏差
有高峰
数据偏斜度和峰度的测量:
打印(偏斜度:% f“% df _ train[sale price])。偏斜())
打印(峰度:% f“% df _ train[sale price])。kurt())
偏斜度:1.882876
峰度:6.536282
“房价”的相关变量分析
与数字变量的关系:
1.grlivarea和saleprice散点图
var = grlivarea
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
data.plot .散点图(x=var,y= saleprice,ylim=(0,800000));
可以看出,销售价格和grlivarea之间的关系非常密切,基本上是线性的。
2.总价和销售价格散点图
var = totalbsmtsf
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
data.plot .散点图(x=var,y= saleprice,ylim=(0,800000));
Totalbsmtsf也与销售率密切相关,从图中可以看出它基本上是指数分布的,但从最左边的一点可以看出totalbsmtsf在某些情况下对销售率没有影响。
与类别变量的关系
1.“整体质量”和“销售价格”的方框图
var =总体质量
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
f,ax =plt .子图(figsize=(8,6))
图=sns.boxplot(x=var,y = sale price,data=data)
图轴(ymin=0,ymax = 800000);
可以看出,销售价格和总体质量的分布趋势是一致的。
2.竣工年份和销售价格的方框图
var =年建造
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
f,ax =plt .子图(figsize=(16,8))
图=sns.boxplot(x=var,y = sale price,data=data)
图轴(ymin=0,ymax = 800000);PLT . XT picks(旋转= 90° );
这两个变量之间的关系没有很强的趋势,但可以看出,建设时间越短,房价越高。
摘要:
Grlivarea和totalbsmtsf似乎与销售价格呈线性相关,并且两者都呈正相关。对于totalbsmtsf,线性关系的斜率非常高。
总体质量和年建造量也与销售价格有关。总体质量更具有相关性,方框图显示了房价随着整体质量的提高而上升的趋势。
我们只分析了四个变量,但是还有很多其他的变量需要我们去分析。这里的诀窍是选择正确的特征(特征选择),而不是定义它们之间的复杂关系(特征工程)。
客观分析
1.相关系数矩阵
corrmat = df_train.corr()
f,ax = plt .子图(figsize=(12,9))
sns.heatmap(corrmat,vmax=.8,square = true);
首先,两个红色的方块吸引了我,第一个是totalbsmtsf和1stflrsf变量之间的相关系数,第二个是garagex变量组。两个例子都显示了这些变量之间的强相关性。事实上,相关程度达到多重共线性的情况。我们可以得出结论,这些变量包含几乎相同的信息,所以多重共线性确实出现了。
另一个有趣的点是销售价格的相关性。我们可以看到,之前分析的grlivarea、totalbsmtsf和总体质量是高度相关的,此外,还有很多其他的变量需要考虑,这也是我们的下一步。
2.销售价格相关系数矩阵
k = 10 #热图的变量数量
cols = corrmat.nlargest(k,saleprice )[ saleprice ]。指数
cm = NP . corr coef(df _ train[cols]. values . t)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm,cbar=true,annot=true,square=true,fmt = .2f,annot_kws={ size : 10},
yticklabels=cols.values,xticklabels=cols.values)
plt.show()
从图中可以看出:
总体质量、grlivarea和totalbsmtsf与销售价格有很强的相关性。
车库和车库面积也是高度相关的变量。车库里存放的汽车数量由车库面积决定。他们就像双胞胎,所以没有必要区分车库汽车和车库汽车,所以我们只需要其中一个变量。在这里,我们选择了车库汽车,因为它与销售价格有较高的相关性。
Totalbsmtsf和1stfloor与上述相同,因此我们选择totalbsmts。
几乎不需要考虑Fullbath。
Totrmsabvgrd和grlivarea在变量上也是双胞胎。
年份和销售价格似乎没有很强的相关性。
3.销售价格和相关变量之间的散点图
sns.set()
cols =[ saleprice,overallqual,grlivarea,garagecars,totalbsmtsf,fullbath,year build]
sns.pairplot(df_train[cols],size =2.5)
PLT . show();
虽然我们已经知道了一些主要特征,但是这个丰富的散点图给了我们一个关于变量之间关系的合理想法。
其中,totalbsmtsf和grlivearea之间的散点图非常有趣。我们可以看到,在这幅图中,一些点形成了一条线,就像一个边界。大多数点分布在这条线下,这也可以解释。地下室面积可以等于地上生活面积,但通常不希望地下室面积大于地上生活面积。
销售价格和建成年份之间的散点图也值得思考。在“点云”的底部,我们可以观察到几乎呈指数分布。我们还可以看到,“点云”的上端基本上呈现出相同的分布趋势。值得注意的是,最近几年的点数趋于超过这个上限。
缺失数据
缺失数据需要考虑的重要问题;
这些缺失数据的普遍性是什么?
缺失的数据是随机的还是有规律可循?
这些问题的答案非常重要,因为数据的缺乏意味着样本量的减少,这将阻碍我们的分析过程。此外,从实质性的角度来看,我们需要确保对缺失数据的处理不会偏离或隐藏任何难以忽视的事实。
total=df_train.isnull()。总和()。sort_values(升序=false)
百分比=(df_train.isnull)()。sum()/df_train.isnull()。计数())。sort_values(升序=false)
missing _ data = PD . concat([总计,百分比],轴=1,键=[总计,百分比])
缺少_data.head(20)
当超过15%的数据丢失时,我们应该删除相关变量,并假设这些变量不存在。
根据本文,应该删除一系列变量,如poolqc、miscfeature、alley等。这些变量不是很重要,因为它们基本上不是我们买房时要考虑的因素。
garagex变量组的缺失数据量是相同的。由于关于garages的最重要的信息可以用garagecars来表示,而这些数据只占缺失数据的5%,我们也将删除上面提到的garagex变量组。相同的逻辑适用于bsmtx变量组。
至于masvnrarea和masvnrtype,我们可以认为这些因素并不重要。此外,它们与我们已经考虑过的年度建造和整体质量有很强的相关性。因此,删除masvnrarea和masvnrtype不会丢失信息。
最后,因为在电学中只有一个丢失的观察,我们删除这个观察,但是保留这个变量。
df _ train = df _ train . drop(missing _ data[missing _ data[total]> 1])。索引,1)
df _ train = df _ train . drop(df _ train . loc[df _ train[electrical].isnull()]。索引)
df_train.isnull()。总和()。max()#只是检查没有丢失数据...
异常值
单因素分析
这里的关键是如何建立一个阈值,并将观察值定义为异常值。我们对数据进行归一化,这意味着数据值被转换为平均值为0、方差为1的数据。
sale price _ scaled = standard scaler()。fit _ transform(df _ train[sale price][:,NP . new axis]);
low _ range = sale price _ scaled[sale price _ scaled[:,0]。argsort()][:10]
high _ range = sale price _ scaled[sale price _ scaled[:,0]。argsort()][-10:]
打印(分布的范围外(低):)
打印(低范围)
打印(\ n分配的范围(高):)
打印(高范围)
归一化后,可以看出:
低范围内的值相似,分布在0左右。
高范围的值远离0,7: 00的值远离正常范围。
双变量分析
1.grlivarea和saleprice的二元分析
var = grlivarea
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
data.plot .散点图(x=var,y= saleprice,ylim=(0,800000));
从图中可以看出:
有两个具有高grlivarea值的异常值,我们可以猜测这种情况的原因。也许它们代表了农业区,这解释了为什么价格低廉。这两点显然不能代表典型的例子,所以我们将它们定义为异常值并删除它们。
图中的前两点是7: 00时的观测值。虽然它们看起来像特例,但它们仍然符合整体趋势,所以我们保留它们。
删除点
df _ train . sort _ values(by = grli varea,升序=false)[:2]
df _ train = df _ train . drop(df _ train[df _ train[id]= = 1299)。索引)
df _ train = df _ train . drop(df _ train[df _ train[id]= = 524)。索引)
2.总价和销售价格的双变量分析
var = totalbsmtsf
数据= PD . concat([df _ train[sale price],df_train[var]],axis=1)
data.plot .散点图(x=var,y= saleprice,ylim=(0,800000));
核心部分
谁是“房价”?
这个问题的答案要求我们验证基于数据的多元分析的假设。
我们已经清理了数据,发现了很多关于销售价格的信息。现在我们需要进一步了解销售价格是如何遵循统计假设的,这样我们就可以应用多元技术。
应该测量四个假设量:
常态
变化
线性的
缺少相关错误
常态:
我们应该注意以下两点:
直方图–峰度和偏斜度。
正态概率图——数据分布应该紧跟代表正态分布的对角线。
1.销售价格
绘制直方图和正态概率图:
SNS . dist plot(df _ train[sale price],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[sale price],plot=plt)
可以看出,房价分布是不正常的,呈现峰值和正偏差,但不遵循对角线。
这个问题可以通过对数变换来解决
执行对数变换:
df _ train[sale price]= NP . log(df _ train[sale price])
绘制变换直方图和正态概率图;
SNS . dist plot(df _ train[sale price],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[sale price],plot=plt)
2.grlivarea
绘制直方图和正态概率曲线:
SNS . dist plot(df _ train[grli varea],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[grli varea],plot=plt)
执行对数变换:
df _ train[grli varea]= NP . log(df _ train[grli varea])
绘制变换直方图和正态概率图;
SNS . dist plot(df _ train[grli varea],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[grli varea],plot=plt)
3.totalbsmtsf
绘制直方图和正态概率曲线:
SNS . dist plot(df _ train[total bsmtsf],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[total bsmtsf],plot=plt)
从图中可以看出:
显示偏斜度
大量观测值为0(没有地下室的房屋)
带有0的数据不能进行对数转换
我们设置了一个变量来获取基底的影响值(二元变量)。我们选择忽略零值,只对非零值进行对数变换。这样,我们可以在不损失基底影响的情况下转换数据。
df _ train[hasbsmt]= PD . series(len(df _ train[total bsmtsf]),index=df_train.index)
df_train[ hasbsmt ] =0
df _ train . loc[df _ train[total bsmtsf]> 0,hasbsmt ] =1
执行对数变换:
df _ train[total bsmtsf]= NP . log(df _ train[total bsmtsf])
绘制变换直方图和正态概率图;
SNS . dist plot(df _ train[total bsmtsf],fit = norm);
图=plt.figure()
RES = stats . prob plot(df _ train[total bsmtsf],plot=plt)
同质性:
衡量两个变量同质性的最好方法是图像。
1.销售价格和grlivarea之间的相同差异
绘制散点图:
PLT . spread(df _ train[grli varea],df_train[ saleprice
2.完全同质的销售价格
绘制散点图:
plt .散点(df _ train[df _ train[total bsmtsf]> 0][total bsmtsf],df _ train[df _ train[total bsmtsf]> 0][销售价格
可以看出,销售价格在整个totalbsmtsf可变范围内显示出相同的变化水平。
虚拟变量
将类别变量转换为虚拟变量:
df _ train = PD . get _ dummies(df _ train)
结论
在整个方案中,我们使用了多元数据分析中提出的许多方法。我们对变量进行了哲学分析,不仅只分析了销售价格,还结合了相关性最高的变量。我们处理缺失的数据和异常值,验证一些基本的统计假设,并将类变量转换为虚拟变量。
但是问题还没有结束。我们仍然需要预测房价的趋势。房价预测适合线性回归正则化方法吗?它适合组合方法吗?或者其他方法?
我希望你能有自己的发现。
雷锋。(公开号码:雷锋。新闻网:这篇文章最初包含在36个大数据中。
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
来源:搜狐微门户
标题:详解 Kaggle 房价预测竞赛优胜方案:用 Python 进行全面数据探索
地址:http://www.shwmhw.com/shxw/59717.html