原文链接:https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python/notebook
在这篇文章中,我对原文的结论翻译并加入自己的一些理解,如有不当之处,请在评论提出建议和意见,谢谢~
在这个Kernel中,我们将针对房价预测问题,利用Python对这组数据进行全面而非详尽地分析。
本文的主要任务:
-
理解问题:研究并分析每个变量对于该问题的意义和重要性;
-
单变量研究:只关注于因变量“SalePrice”,并尝试了解关于它更多信息;
-
多变量研究:尝试理解因变量与自变量之间的关系;
-
清洗数据:清洗数据并处理缺失值、异常值并分类数据;
-
测试假设:检测数据是否满足要求。
准备工作
in[1]
#调用库
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') #利用warnings模块来忽略匹配的警告
%matplotlib inline #魔术命令“%”,当输入plt.plot()后,不必再输入 plt.show(),图像将自动显示出来
in[2]
#导入训练集
df_train = pd.read_csv('C:/Users/dell/Desktop/input/train.csv')
in[3]
#查看列名
df_train.columns
out[3]
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表格:
- Variable - 变量名称.;
- Type - 变量类型的标识。可定义两个:‘numerical’指值为数字的变量、‘categorical’指值为类别的变量;
- Segment - 变量段的标识。可定义三个:‘building’指与一个建筑的物理特性有关的变量,例如“OverallQual”、‘space’指关于房屋控件属性的变量,例如“TotalBsmtSF”、‘location’指房屋所在地信息的变量,例如“Neighborhood”;
- Expectation - 变量对于“SalePrice”的影响的期望。可设定‘High’、‘Medium’、‘Low’作为分类标尺;
- Conclusion - 在快速浏览数据后,我们对变量重要性的结论。可与‘Expectation’使用相同分类标尺;
- Comments - 我们对该变量任何一般性意见。
虽然‘Type’和‘Segment’只是未来可能的参考,但是‘Expectation’很重要。在填写这一栏时,我们应该在阅读所有变量描述后,逐一地问自己:
- 我们买房时会考虑该因素吗?(例如,我们是否在意‘砖石贴面类型?’)
- 如果考虑该因素,那么它有多重要呢?(例如,在外部使用优质材料而不是劣质材料时会有什么影响?)
- 该因素是否与其他因素重复了呢?(例如,“LandContour”给出了房产的平整度,那么还需要知道“LandSlope”吗?)
在经过这一系列分析后,我们可以筛选表格并关注于具有高期望值的变量(High Expenctation)。并通过画出这些变量与“SalePrice”的散点图,填入“Conclusion”栏,它是对我们预期的一个修正。
由此,我得出以下结论:
在该问题中,下列变量和该问题相关并且很重要:
- OverallQual 整体材料和表面质量
- YearBuilt 原始施工日期
- TotalBsmtSF 地下室总面积
- GrLivArea 居住面积
其中,“OverallQual”和“YearBuilt”是两个‘building’变量,而“TotalBsmtSF”和“GrLivArea”是两个‘space’变量。而这似乎违背了房地产商对于房屋位置的关注程度。这种快速检查数据的方式有点苛刻,例如,我们预期“NigBuffID”更相关,但在检查数据后排除了它。这也可能与我们数据可视化呈现的方式是有关系的,这里我们使用的是散点图而不是箱线图,散点图更适合于分类变量可视化。可视化数据的方式通常能够影响我们的结论。
但这次的分析主要目的是对我们的数据和预期结果有更多建设性的思考。上述的分析也已经达到了我们的目的。
二、单变量研究-分析“SalePrice”
首先,利用pandas的describe()函数给出“SalePrice”数据部分统计量。
in[4]:
df_train['SalePrice'].describe()
out[4]:
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
我们再来看下“SalePrice”的分布情况。
in[5]:
sns.distplot(df_train['SalePrice']); #数据分布直方图
out[5]:
我们可以看到,数据偏离整体分布,并且存在峰值。再来看下偏值与峰值的具体数据:
in[6]:
print("Skewness: %f" % df_train['SalePrice'].skew()) #skew()样本偏度值
print("Kurtosis: %f" % df_train['SalePrice'].kurt()) #kurt()样本峰度值