Kaggle宝典|使用Python进行全面的数据探索

算法工程师的日常工作中基础最多的便是数据,但是大多数的算法工程师在使用数据过程中,最缺少的还是对数据的整体把控和分析,更多靠的是业务经验。但是严谨的算法工程师在建模之前是需要对数据进行探索和分析的,以便于在建模过程中能给更快的做出更优的模型。

生活中最苦难的事情就是了解自己,建模过程中最苦难的事是了解数据!

了解数据是一件非常困难的事情,且非常耗时,因此从事数据科学很容易忽略前期的数据了解,而直接对数据进行应用。本文是一篇非完整的翻译文(在个人理解的基础上进行翻译,个人水平有限,如果文章有误,欢迎在评论区留言),来自于Kaggle(https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python), 感兴趣的可以直接点击文末的阅读原文跳转到原文处。

本文基于的是房价预测数据(https://www.kaggle.com/c/house-prices-advanced-regression-techniques) 对数据探索进行了整体的介绍和说明,读完本文之后,你会收获数据探索的基本思路和一些常见的分析方法,本篇文章较长,可以在文末查看本文PDF版本和代码的获取方式。

本文首先会说明使用的数据,其次会说明如何做数据探查和通过对数据集的探查得到的结论,然后会介绍具体的探查过程。文章主要包括以下几个部分:

  • 了解问题:研究每个变量,并对它们在这个问题中的意义和重要性进行分析
  • 单变量分析:这里主要是研究因变量
  • 多变量分析:分析自变量和因变量之间的关系
  • 基本的数据清洗:清洗数据和处理缺失值、异常值和分类变量
  • 假设检验:校验数据是否符合大多数变量的期望假设

下面就正式开始本文了。

加载数据所需要的package

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from scipy.stats import norm
from sklearn.preprocessing import StandardScaler
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

加载数据并显示数据的列

df_train = pd.read_csv('../input/train.csv')
df_train.columns

显示如下:

Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
       'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
       'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
       'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
       'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
       'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
       'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
       'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
       'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
       'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
       'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
       'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
       'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
       'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
       'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
       'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
       'SaleCondition', 'SalePrice'],
      dtype='object')

关于各个特征变量的含义可以参考文末给出的补充说明。

了解数据

查看数据的每个变量并了解他们的含义是很有必要的,虽然很耗时,但是看完数据之后自己会有一个主观的理解(下文内容均是基于房价数据进行的,所以要代入进去了,否则容易出戏)。

为了分析数据中的一些规律,可以创建包含下面列的excel表格:

  • 变量:变量名
  • 类型:变量的类型,有两种类型(类别型变量和连续变量)
  • 标识:变量的标识,在上述演示的数据集中变量可以分为三部分
    • 建筑(building)信息,表示的是建筑的物理属性(比如 Overall material and finish quality)
    • 空间(space)信息,表示房子的空间属性信息(比如 TotalBsmtSF )
    • 位置(location)信息,表示房子所在位置的信息(比如 Neighborhood)
  • 期望:对于房价可变影响的期望,可以使用高中低来表示
  • 结论:查看数据之后,对变量重要性的结论,同样可以使用高中低表示
  • 评论:我们产生的一般性结论

类型(Type)和标识(Segment)是在了解数据时不需要考虑太多的,更多的是在建模时进行使用,期望列(Expectation)很重要,因为他可以帮助我们去寻找有用的变量,填写这一项时,需要考虑:

  • 我们买房时会考虑这个变量吗
  • 如果考虑这个变量,他重要吗
  • 这个信息是否被其他变量包含了

其实上边提的三个问题,分别可以对应到特征工程中的特征选择、特征重要性、特征共线性

在进行上述的表格构建之后,可以分析变量与销售价格之间的散点图,来修正我们的结论。

通过这个过程,可以分析该数据集以下几个变量可能对结论产生重要的影响:

  • OverallQual
  • YearBuilt
  • TotalBsmtSF
  • GrLivArea

经过分析先得到了两个 building 变量和两个space 变量,这可能和我们对于房地产的认识有点偏差,因为大多数人关注的是位置(location)信息,这种快速的数据探查过程对分类变量不是太友好。比如,也希望把 Neigborhood 变量也作为重要的变量,但是经过分析之后排除了他,可能是因为使用的是散点图进行分析的,而不是箱线图(更适合于分类变量的可视化),我们可视化数据的方式通常会影响我们的结论。

下面就来看看具体的分析过程吧!

单变量分析

SalePrice即房屋售价,相当于建模过程中的label。

#descriptive statistics summary
df_train['SalePrice'].describe()

结果输出为:

count      1460.000000
mean     180921.195890
std       79442.502883
min       34900.000000
25%      129975.000000
50%      163000.000000
75%      214000.000000
max      755000.000000
Name: SalePrice, dtype: float64

describe() 函数会输出 dataframe的一些统计变量,比如总量、平均值、标准差、方差、最小值、最大值、四分位数等。

#histogram
sns.distplot(df_train['SalePrice']);

SalePrice数据描述

其中横坐标表示的是房价,纵坐标表示的是占比。从这个图中可以看出:

  • 该分布为偏态分布(与正态分布相对)
  • 该分布为正偏态分布(右偏)
  • 该分布的峰度
#skewness and kurtosis
print("Skewness: %f" % df_train['SalePrice'].skew())
print("Kurtosis: %f" % df_train['SalePrice'].kurt())

输出为:

Skewness: 1.882876
Kurtosis: 6.536282
  • skewness表示偏度
    • 是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征,定义上偏度是样本的三阶标准化矩
    • 偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)
  • kurtosis表示峰度
    • 又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度
    • 随机变量的峰度计算方法为:随机变量的四阶中心矩与方差平方的比值。峰度包括正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)

接下来看一下房价(SalePrice)和连续型变量的关系

#scatter plot grlivarea/saleprice
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))

展示如下:

SalePrice和GrLivArea的关系

从上图可以看出,GrLivArea和SalePrice基本呈线性关系。

#scatter plot totalbsmtsf/saleprice
var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))

结果展示为:

SalePrice和TotalBsmtSF的关系

从上图可以看出,TotalBsmtSF和SalePrice似乎也存在线性(或指数)的关系,但是也存在一些离群点,比如图片的右下角。

接下来看一下房价(SalePrice)和类别型变量的关系

#box plot overallqual/saleprice
var = 'OverallQual'
data = pd.concat([df_train['SalePrice'], df_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)

结果显示为:

SalePrice和OverallQual的关系

var = 'YearBuilt'
data = pd.concat([df_train['SalePrice'], df_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);

结果显示为:

SalePrice和YearBuilt的关系

总结:

  • GrLivArea、TotalBsmtSF似乎和SalePrice保持着线性关系,且TotalBsmtSF线性关系更强
  • OverallQual、YearBuilt似乎和Saleprice有关系,且OverallQual关系更强,从图中也可以看出随着OverallQual的增大,SalePrice也在增大,但是YearBuilt和SalePrice同步增长的关系并不强烈

上述只是分析了四个特征,大家可以根据同样的方法尝试分析更多的特征,可以初步筛选出那些和label关系比较强的特征

多变量分析

上述进行的特征分析,更多还是从主观角度出发,但是作为算法工程师,应该从客观的角度去看待问题,分析问题。

为了探索更多变量和特征之间多关系,可以从下面几个角度进行分析:

  • 相关矩阵(热力图形式)
  • SalePrice相关矩阵(缩小的热力图形式)
  • 关联最密切变量之间的散点图(类似于Jagger 形式)

相关矩阵

#correlation matrix
corrmat = df_train.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)

结果展示为:

相关矩阵热力图

热力图是分析变量之间关系必不可少的工具。图中有两个2*2的小方格需要关注(TotalBsmtSF、1stFirSF和GarageCars、GarageArea),这两个地方表示的是特征之间存在特征共线性,且共线性特别强。

SalePrice相关矩阵

#saleprice correlation matrix
k = 10 #number of variables for heatmap
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(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()

结果展示为:

SalePrice相关矩阵热力图

通过输出和saleprice最相关的10个变量可以看出:

  • OverallQual、GrLivArea、TotalBsmtSF和label有着很强的相关性
  • GarageCars、GarageArea两个特征之间也存在极强的相关性,所以在使用时保留一个即可,建议保留GarageCars,因为它SalePrice的相关性更强
  • TotalBsmtSF、1stFloor两个特征之间也存在极强的相关性,保留TotalBsmtSF即可
  • TotRmsAbvGrd、GrLivArea两个特征之间也存在极强的相关性,保留GrLivArea即可
  • YearBuilt和SalePrice略相关,更多的可以做一些时间序列相关的分析(留给读者进行)

关联最密切变量之间的散点图

#scatterplot
sns.set()
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(df_train[cols], size = 2.5)
plt.show()

结果展示为:

关联最密切变量之间的散点图

虽然前边的分析让我们对数据有了一定的了解,但上边的巨型散点图提供了一些新的关于变量之间的关系

  • TotalBsmtSF、GrLiveArea的关系图中,几乎所有点都集中在对角线的下半部分,表示的是地下室的面积要小于等于地上的面积
  • SalePrice、YearBuilt的关系图更像是一个指数函数曲线,表示价格上涨的更加快

基本的数据清洗

关于数据缺失有两个问题需要考虑

  • 是不是普遍丢失的
  • 丢失的数据是随机的还是有规则的

数据的缺失会造成样本量的减少,而且从实质性的角度考虑,我们需要确保数据丢失的过程不是认为造成的和没有掩藏一些真像。

#missing data
total = df_train.isnull().sum().sort_values(ascending=False)
percent = (df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
missing_data.head(20)

结果展示如下:

~ Total Percent
PoolQC 1453 0.995205
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageCond 81 0.055479
GarageType 81 0.055479
GarageYrBlt 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
BsmtExposure 38 0.026027
BsmtFinType2 38 0.026027
BsmtFinType1 37 0.025342
BsmtCond 37 0.025342
BsmtQual 37 0.025342
MasVnrArea 8 0.005479
MasVnrType 8 0.005479
Electrical 1 0.000685
Utilities 0 0.000000

分析上边的数据,了解应该如何处理丢失的数据。

  • 当某列数据的丢失率在15%以上时,应该删除
  • 对于一些缺失率比较高且与结果没有太大关系的数据也可以删除
  • Graph开头的几个变量具有相同的丢失率,丢失的数据应该都是同一批样本,这批数据应该删除
  • MasVnrArea、MasVnrType不是必须的,且和YearBuilt、OverallQual有很强的相关性,可以进行删除
  • Electrical 由于这只是一个观察值,因此删除该观察值但是保留该变量
#dealing with missing data
df_train = df_train.drop((missing_data[missing_data['Total'] > 1]).index,1)
df_train = df_train.drop(df_train.loc[df_train['Electrical'].isnull()].index)
#just checking that there's no missing data missing...
df_train.isnull().sum().max() 

异常值

同时应该关注一下异常值,因为异常值也会影响我们的模型,影响我们对结果的判断,异常值分析起来比较复杂,,应该引起更多的关注。 这里将通过“ SalePrice”的标准偏差和一组散点图进行快速分析。

单变量分析

关键的做法是定义一个阈值,来判断是否是异常值。因此将数据进行标准化(均值为0,方差为1)

#standardizing data
saleprice_scaled = StandardScaler().fit_transform(df_train['SalePrice'][:,np.newaxis]);
low_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][:10]
high_range= saleprice_scaled[saleprice_scaled[:,0].argsort()][-10:]
print('outer range (low) of the distribution:')
print(low_range)
print('\nouter range (high) of the distribution:')
print(high_range)

结果输出为:

outer range (low) of the distribution:
[[-1.83820775]
 [-1.83303414]
 [-1.80044422]
 [-1.78282123]
 [-1.77400974]
 [-1.62295562]
 [-1.6166617 ]
 [-1.58519209]
 [-1.58519209]
 [-1.57269236]]

outer range (high) of the distribution:
[[3.82758058]
 [4.0395221 ]
 [4.49473628]
 [4.70872962]
 [4.728631  ]
 [5.06034585]
 [5.42191907]
 [5.58987866]
 [7.10041987]
 [7.22629831]]

从输出的结果可以看出:

  • 低于阈值的值比较相似,且离0值不是太远
  • 高于阈值的值(7)距离0值较远

这里并不会删除这些高于阈值的异常值,但使用时要谨慎。

双变量分析

#bivariate analysis saleprice/grlivarea
var = 'GrLivArea'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))

结果展示如下:

双变量分析

图中右下侧有两个比较大的值很奇怪,并没有跟随人群的走势,可能是一些农业区域价值本身较低,这两个值并不能代表整体,因此不会被删除。

同时图右上有两个点,看起来像特殊情况,但是符合整体的曲线走势,因此也不会被删除。

#deleting points
df_train.sort_values(by = 'GrLivArea', ascending = False)[:2]
df_train = df_train.drop(df_train[df_train['Id'] == 1299].index)
df_train = df_train.drop(df_train[df_train['Id'] == 524].index)
#bivariate analysis saleprice/grlivarea
var = 'TotalBsmtSF'
data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)
data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000))

结果展示如下:

双变量分析

对于一些观察结果(比如TotalBsmtSF > 3000)想要清除,但这是不值得的,因为我们可以接受少量的分散值。

假设检验

接下来深入了解一下房价(SalePrice)是否符合假设检验。

下面四个假设应该被检验:

  • 正态性检验(Normality test):检验数据是否符合正态分布,解决数据的正态性可以避免很多问题(比如异方差性),这里只校验SalePrice
  • 均方检验(Homoscedasticity test):检验因变量在正常范围内的离散程度,均方检验是可取的,因为我们希望误差项在自变量上表现相同
  • 线性检验(Linearity test):评估线性度的最常见方法是检查散点图是否符合线性。 如果不是线性的,则需要进行数据转换。 但在上述的分析中,由于我们看到的大多数散点图似乎都符合线性关系,这里不再讨论。
  • 错误关联性检验(Absence of correlated errors test):表示的是两个错误的相关性,如果一个正向的错误造成了一个负向的错误,则认为这两个错误是相关的。这种情况通常发生在时间序列中,其中某些模式与时间有关。这里不展开讨论,不过常见的解决方案是:增加一个可以解释你获得的结果的变量。

寻找正态性

常见的两种方法:

  • 直方图——峰度和偏度
  • 正态概率图——数据分布应紧跟代表正态分布的对角线
#histogram and normal probability plot
sns.distplot(df_train['SalePrice'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train['SalePrice'], plot=plt)

结果展示为:

直方图
正态概率图

从上面第一张图可以看出,SalePrice并不遵循正态性,属于右偏分布(即正偏分布)。但是结合第二张图可以看出,数据并没有丢失,通过简单的数据转换便可以解决问题。

#applying log transformation
df_train['SalePrice'] = np.log(df_train['SalePrice'])
#transformed histogram and normal probability plot
sns.distplot(df_train['SalePrice'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train['SalePrice'], plot=plt)

结果展示为:

对数转换后的直方图
对数转换后的正态概率图
上面的代码中对SalePrice进行了log转换,数据变恢复了正态性。

接下来同样看下GrLivArea。

#histogram and normal probability plot
sns.distplot(df_train['GrLivArea'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train['GrLivArea'], plot=plt)

结果展示为:

直方图
正态概率图

从上图可以看出分布也是有偏的。

#data transformation
df_train['GrLivArea'] = np.log(df_train['GrLivArea'])
#transformed histogram and normal probability plot
sns.distplot(df_train['GrLivArea'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train['GrLivArea'], plot=plt)

结果展示为:

对数转换后的直方图

对数转换后的正态概率图

#histogram and normal probability plot
sns.distplot(df_train['TotalBsmtSF'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train['TotalBsmtSF'], plot=plt)

结果展示为:

直方图

正态概率图

经过上面的数据探查,我们可以得到以下结论:

  • 总体上数据存在偏度
  • 存在大量为0的观测值(比如没有地下室的房屋,)
  • 但是0值不允许我们进行对数转换

如果要在此处应用对数转换,我们需要创建一个二进制的变量表示是否包含地下室,然后将那些非零观测值进行对数转换,忽略那些空值,这样变便可以进行数据转换,而不受大量0值的影响。

#create column for new variable (one is enough because it's a binary categorical feature)
#if area>0 it gets 1, for area==0 it gets 0
df_train['HasBsmt'] = pd.Series(len(df_train['TotalBsmtSF']), index=df_train.index)
df_train['HasBsmt'] = 0 
df_train.loc[df_train['TotalBsmtSF']>0,'HasBsmt'] = 1
#transform data
df_train.loc[df_train['HasBsmt']==1,'TotalBsmtSF'] = np.log(df_train['TotalBsmtSF'])
#histogram and normal probability plot
sns.distplot(df_train[df_train['TotalBsmtSF']>0]['TotalBsmtSF'], fit=norm);
fig = plt.figure()
res = stats.probplot(df_train[df_train['TotalBsmtSF']>0]['TotalBsmtSF'], plot=plt)

结果展示为:

直方图

正态概率图

这种方法并不一定能够带来正向的效果,从经验来看是可行,具体需要去进行实验,这就是所谓的“高风险工程”

均方测试

校验两个度量变量均方差的最佳方法是图形展示。通过圆锥(在图形的一侧较小的色散,在相反侧的较大色散)或菱形(分布的中心有大量点)来表示偏离均等色散的形状。

#scatter plot
plt.scatter(df_train['GrLivArea'], df_train['SalePrice'])

均方测试

GrLivArea变量在进行对数转换之前,具有圆锥型,当前散点图不具有圆锥型,说明数据是正常的。

#scatter plot
plt.scatter(df_train[df_train['TotalBsmtSF']>0]['TotalBsmtSF'], df_train[df_train['TotalBsmtSF']>0]['SalePrice'])

均方测试

上面两个图对比可以看出, SalePrice和TotalBsmtSF在数据集中表现了相同的方差水平。

虚拟变量

#convert categorical variable into dummy
df_train = pd.get_dummies(df_train)
df_train.columns

结果输出为:

Index(['Id', 'MSSubClass', 'LotArea', 'OverallQual', 'OverallCond',
       'YearBuilt', 'YearRemodAdd', 'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF',
       ...
       'SaleType_ConLw', 'SaleType_New', 'SaleType_Oth', 'SaleType_WD',
       'SaleCondition_Abnorml', 'SaleCondition_AdjLand',
       'SaleCondition_Alloca', 'SaleCondition_Family', 'SaleCondition_Normal',
       'SaleCondition_Partial'],
      dtype='object', length=222)

总结

在整个数据探查过程中,仅对SalePrice进行了分析,并且使用了相关性最高的变量,且对缺失的数据和异常值进行了处理,测试了一些基本的统计假设,也尝试了将分类变量转换为虚拟变量。

上面只是一部分的数据探查工作,更多更详细的可能需要我们自己动手去实践。

补充说明

数据中各个特征的含义:

  • SalePrice - the property’s sale price in dollars. This is the target variable that you’re trying to predict.
  • MSSubClass: The building class
  • MSZoning: The general zoning classification
  • LotFrontage: Linear feet of street connected to property
  • LotArea: Lot size in square feet
  • Street: Type of road access
  • Alley: Type of alley access
  • LotShape: General shape of property
  • LandContour: Flatness of the property
  • Utilities: Type of utilities available
  • LotConfig: Lot configuration
  • LandSlope: Slope of property
  • Neighborhood: Physical locations within Ames city limits
  • Condition1: Proximity to main road or railroad
  • Condition2: Proximity to main road or railroad (if a second is present)
  • BldgType: Type of dwelling
  • HouseStyle: Style of dwelling
  • OverallQual: Overall material and finish quality
  • OverallCond: Overall condition rating
  • YearBuilt: Original construction date
  • YearRemodAdd: Remodel date
  • RoofStyle: Type of roof
  • RoofMatl: Roof material
  • Exterior1st: Exterior covering on house
  • Exterior2nd: Exterior covering on house (if more than one material)
  • MasVnrType: Masonry veneer type
  • MasVnrArea: Masonry veneer area in square feet
  • ExterQual: Exterior material quality
  • ExterCond: Present condition of the material on the exterior
  • Foundation: Type of foundation
  • BsmtQual: Height of the basement
  • BsmtCond: General condition of the basement
  • BsmtExposure: Walkout or garden level basement walls
  • BsmtFinType1: Quality of basement finished area
  • BsmtFinSF1: Type 1 finished square feet
  • BsmtFinType2: Quality of second finished area (if present)
  • BsmtFinSF2: Type 2 finished square feet
  • BsmtUnfSF: Unfinished square feet of basement area
  • TotalBsmtSF: Total square feet of basement area
  • Heating: Type of heating
  • HeatingQC: Heating quality and condition
  • CentralAir: Central air conditioning
  • Electrical: Electrical system
  • 1stFlrSF: First Floor square feet
  • 2ndFlrSF: Second floor square feet
  • LowQualFinSF: Low quality finished square feet (all floors)
  • GrLivArea: Above grade (ground) living area square feet
  • BsmtFullBath: Basement full bathrooms
  • BsmtHalfBath: Basement half bathrooms
  • FullBath: Full bathrooms above grade
  • HalfBath: Half baths above grade
  • Bedroom: Number of bedrooms above basement level
  • Kitchen: Number of kitchens
  • KitchenQual: Kitchen quality
  • TotRmsAbvGrd: Total rooms above grade (does not include bathrooms)
  • Functional: Home functionality rating
  • Fireplaces: Number of fireplaces
  • FireplaceQu: Fireplace quality
  • GarageType: Garage location
  • GarageYrBlt: Year garage was built
  • GarageFinish: Interior finish of the garage
  • GarageCars: Size of garage in car capacity
  • GarageArea: Size of garage in square feet
  • GarageQual: Garage quality
  • GarageCond: Garage condition
  • PavedDrive: Paved driveway
  • WoodDeckSF: Wood deck area in square feet
  • OpenPorchSF: Open porch area in square feet
  • EnclosedPorch: Enclosed porch area in square feet
  • 3SsnPorch: Three season porch area in square feet
  • ScreenPorch: Screen porch area in square feet
  • PoolArea: Pool area in square feet
  • PoolQC: Pool quality
  • Fence: Fence quality
  • MiscFeature: Miscellaneous feature not covered in other categories
  • MiscVal: $Value of miscellaneous feature
  • MoSold: Month Sold
  • YrSold: Year Sold
  • SaleType: Type of sale
  • SaleCondition: Condition of sale

本文PDF版本和代码获取方式,公众号内回复【python数据探索】即可获取下载链接。如果觉得不错,点赞+在看+分享 三连走起呀!


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!

Thinkgamer_ CSDN认证博客专家 图书作者 推荐系统研究者
ID:Thinkgamer,《推荐系统开发实战》一书作者,「搜索与推荐Wiki」公众号独立作者,信条是持续输出精品系列内容。从事推荐系统相关工作多年,包括但不局限于ML、DL、RL、NLP!
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值