房价 – 高级回归技术
随着城市化进程的加速,人口流动和经济发展带来了房地产市场的繁荣。然而,房价的快速上涨也引发了一系列的社会问题,如住房供需失衡、投资风险增加等。因此,如何准确预测房价成为了一个具有重要实际意义的问题。
针对这一挑战,Kaggle竞赛提出了一个明确的目标:构建一个高效准确的房价预测模型。参赛者需要利用各种数据源,包括房屋交易记录、经济指标、地理信息等,通过机器学习算法对房价进行预测。这不仅要求参赛者具备扎实的数学和统计学基础,还需要熟悉各种机器学习算法的原理和应用。
一、分析目的
题目:您的工作是训练一个机器学习模型,该模型可以使用各种相关功能预测房屋销售价格。使用提供的数据集,对于测试集中的每个 Id,必须预测 SalePrice 变量的值。
二、数据获取
本数据集共有两个,均为题目中提供,导入python中进行下一步分析。
import pandas as pd
file_train_in = r'kaggleHouse PricesIn_datatrain.csv'
file_test_in = r'kaggleHouse PricesIn_datatest.csv'
# file_out = r'E:@DSpython练习kaggleHouse PricesOut_datapredict.csv'
train = pd.read_csv(file_train_in)
test = pd.read_csv(file_test_in)
本次竞赛有 81个列变量,描述了(几乎)爱荷华州埃姆斯住宅的各个方面,题目目标是预测每套房屋的最终价格。
三、数据分析 & 数据可视化
1、数据观察
先输出数据的前面几列,看一下数据的基本样式:
print(train.shape)
print(train.head())
我们可以观察到总共有 1460 行和 81 列的数据。
在81列里有 38 个特征具有整数值,3 个特征具有浮点值,43 个特征具有对象/字符串值。
2、输出数据的列
train.columns
数据列的解释如下:
- SalePrice – 销售价格 :以美元为单位的房产销售价格。这是您尝试预测的目标变量。
- 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: – 类型 1 完成平方英尺
- BsmtFinType2: – 第二完成区域的质量(如果存在)
- BsmtFinSF2: – 2型成品平方英尺
- BsmtUnfSF: – 地下室面积未完成的平方英尺
- TotalBsmtSF: – 地下室总平方英尺
- Heating: – 加热类型
- HeatingQC: – 加热质量和条件
- CentralAir:- 中央空调
- Electrical:- 电气系统
- 1stFlrSF:- 一楼平方英尺
- 2ndFlrSF: – 二楼平方英尺
- LowQualFinSF:- 低质量成品平方英尺(所有楼层)
- GrLivArea: – 地上(地面)生活区平方英尺
- BsmtFullBath: – 地下室全套浴室
- BsmtHalfBath: – 地下室半浴室
- FullBath: – 地上全浴室
- HalfBath: – 地上半浴
- Bedroom: – 地下室以上的卧室数量
- Kitchen: – 厨房数量
- KitchenQual: – 质量
- TotRmsAbvGrd: – 地上房间总数(不包括浴室)
- Functional: – 家庭功能评级
- Fireplaces: – 壁炉数量
- FireplaceQu: – 壁炉质量
- GarageType: – 车库位置
- GarageYrBlt: – 车库建成年份
- GarageFinish: – 车库的内部饰面
- GarageCars: – 车库容量的大小
- GarageArea: – 车库面积(平方英尺)
- GarageQual:- 车库质量
- GarageCond: – 车库状况
- PavedDrive: – 铺砌车道
- WoodDeckSF: – 以平方英尺为单位的木质甲板面积
- OpenPorchSF: – 开放式门廊面积(平方英尺)
- EnclosedPorch: – 以平方英尺为单位的封闭式门廊面积
- 3SsnPorch: – 三季门廊面积(平方英尺)
- ScreenPorch: – 以平方英尺为单位的屏幕门廊面积
- PoolArea: – 泳池面积(平方英尺)
- PoolQC:- 泳池质量
- Fence: – 围栏质量
- MiscFeature:- 其他类别中未涵盖的其他功能
- MiscVal: – 杂项功能的$Value
- MoSold:- 销售月份
- YrSold:- 销售年份
- SaleType: – 销售类型
- SaleCondition: – 销售条件
3、EDA和数据可视化
EDA(Exploratory Data Analysis),全名数据探索性分析。
在处理任何类型的数据之前,了解它们很重要,可以使用探索性数据分析(EDA),帮助我们更好地了解我们正在处理的数据并深入了解它们之间的关系。
SalePrice是最重要的数据,也是我们需要预测的数据。先来看看这个数据的一些特征吧。
(1)首先看一下对SalePrice的描述:
train['SalePrice'].describe()
SalePrece有1460个数据。平均值为180921.195890,标准差是79442.502883,最小值是34900.0,第25%个数据是129975.0,第50%个数据是163000.0,第75%个数据是214000.0,最大值是755000.0,如下图所示:
(2) 然后再看看是SalePrice是否符合某种正态数据分布:
下面代码的作用是将训练集中的房屋销售价格拟合成正态分布,并将其与正态分布进行比较。
在第一行中,norm.fit()
函数返回了一个元组(mu, sigma)
,其中mu
和sigma
分别是拟合后的正态分布的均值和标准差。
在第二行中,sns.distplot()
函数绘制了房屋销售价格的直方图,并将其与拟合后的正态分布进行比较。
在第三行中,plt.title()
函数设置了图表的标题。
在第四行中,plt.xlabel()
函数设置了x轴的标签。
在第五行中,plt.legend()
函数设置了图例。
最后一行中,plt.show()
函数显示了图表。
(mu, sigma) = norm.fit(train['SalePrice'])
plt.figure(figsize = (12,6))
sns.distplot(train['SalePrice'], kde = True, hist=True, fit = norm)
plt.title('SalePrice distribution vs Normal Distribution', fontsize = 13)
plt.xlabel("House's sale Price in $", fontsize = 12)
plt.legend(['Normal dist. ($mu=$ {:.2f} and $sigma=$ {:.2f} )'.format(mu, sigma)],loc='best')
plt.show()
SalePrice偏离正态数据分布,不是正态分布,不能使用正态分布曲线类型去处理分析数据。(也可以使用对数处理将SalePrice数据转换为正态分布的数据)
(3)了解数据分布
在此小节中分析一下我认为比较重要的一些数据列,重点去观察和熟悉一下这些数据列。
3.1 MSSubClass 建筑类数据列
使用value_counts()
函数计算了每个房屋建筑类型数量,并使用sort_index()
函数按照房屋类型的编号进行排序。
train["MSSubClass"].value_counts().sort_index(ascending = True)
条形图 — 可视化展示MSSubClass数据个数数量
绘制一个柱状图,显示训练集中不同房屋类型的销售数量。
在第一行中,plt.figure()
函数设置了图表的大小。
在第二行中,我们使用value_counts()
函数计算了每个房屋类型的建筑类数据类型,并使用sort_index()
函数按照房屋类型的编号进行排序。然后,我们使用plot()
函数绘制了柱状图,并使用color
参数设置了颜色。在第五行中,我们使用annotate()
函数添加了每个柱形上的标签。
在第七行中,我们使用tick_params()
函数设置了坐标轴的标签大小。
最后,在第八行和第十行中,我们分别设置了x轴和y轴的标签。
plt.figure(figsize = (20, 6))
ax = train["MSSubClass"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('MSSubClass: Identifies the type of dwelling involved in the sale', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.2 Street 街道道路通行类型数据列
注意:列出的单词(Grvl和Pave)是用于描述通往物业或建筑物的道路通道类型。这些数据通常用于房地产和物业管理,以指示通往物业的街道的状况和质量。
-
Grvl: 砾石 – 表示用于指示通往该物业的道路由砾石制成,砾石是一种由小石头制成的松散、粗糙的表面。
-
Pave: 铺砌 – 表示用于指示通往物业的道路已铺砌,这意味着它覆盖着坚硬、光滑的表面,例如混凝土或沥青。
有碎石路的房产可能更难进入或需要更多的维护,而有铺砌道路的房产可能更容易进入,需要的维护更少。
使用value_counts()
函数计算了每个房屋类型的街道类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
train["MSZoning"].value_counts().sort_index(ascending = True)
条形图 — 可视化展示Street数据个数数量
plt.figure(figsize = (25, 12))
ax = train["Street"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Gravel', 'Paved'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('Street: Type of road access to property', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
Cravel数量太少了,换个饼状图显示一下更强烈的对比。
饼状图 — 可视化展示Street数据数量
plt.figure(figsize = (25, 12))
counts = train['Street'].value_counts()
explode = (0,0.6)
counts.plot(kind = 'pie', fontsize = 12, explode = explode, autopct = '%1.1f%%', colors = colors)
plt.xlabel('Street: Type of road access to property', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.axis('equal')
plt.legend(labels = counts.index, loc = 'best')
plt.show()
3.3 LotShape 地段形状类型
注意:列出的单词(Reg,IR1,IR2和IR3)是用于描述物业或地块的一般形状。通常用于房地产和物业管理,以指示建筑物或结构所在的土地的大小和形状。
-
Reg: Regular – 常规 -用于指示属性具有规则的矩形形状。
-
IR1: Slightly irregular – 略微不规则 – 用于指示属性具有略微不规则的形状,例如梯形或一侧略长于另一侧的形状。
-
IR2: Moderately irregular – 中等不规则 -用于指示属性具有中等不规则形状,例如具有多个角度或不同长度边的形状。
-
IR3: Irregular – 不规则 – 用于指示属性具有高度不规则的形状,例如具有多个角度、曲线或其他不规则特征的形状。
具有规则形状的物业可能更容易构建或细分,而具有不规则形状的物业可能需要更具创意的设计解决方案,或者对于某些类型的开发不太理想。
使用value_counts()
函数计算了每个房屋类型的地段形状类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["LotShape"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示LotShape数据数量
plt.figure(figsize = (25, 12))
ax = train["LotShape"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Irregular', 'Moderately Irregular', 'Regular', 'Slightly Irregular'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('LotShape: General shape of property', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.4 LandContour 土地轮廓:房产的平整度
注意:列出的单词(Lvl,Bnk,HLS和Low)是用于描述财产或土地的平坦度或坡度。通常用于房地产和物业管理,以指示建筑物或结构所在的土地的地形和地形。
-
Lvl: Near flat/level – 接近平坦/水平 – 用于指示该物业相对平坦或水平,整个土地的海拔只有微小的变化。
-
Bnk: Banked – 银行 – 用于指示该物业从街道等级到该物业的建筑物或结构的快速而显着上升。
-
HLS: Hillside – 山坡 – 用于指示该物业从一侧到另一侧具有显着的坡度,其倾斜或下降比倾斜的轮廓更渐进。
-
Low: Depression – 洼地 – 用于表示该物业具有洼地或低洼区域,海拔低于周围土地。
具有水平等高线的物业可能更容易开发或建造,而具有倾斜或山坡轮廓的物业可能需要更广泛的场地准备或更难开发。
使用value_counts()
函数计算了每个房屋类型的土地轮廓类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["Utilities"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示LotShape数据数量
plt.figure(figsize = (20, 6))
ax = train["Utilities"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('All public Utilities', 'Electricity and Gas Only'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('Utilities: Type of utilities available', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.5 LotConfig 批次配置
注意:列出的单词(内部、角落、CulDSac、FR2 和 FR3)是用于描述物业或土地的地块配置。
-
Inside: Inside lot – 内部地段 – 此代码用于指示该物业位于街区内,而不是位于拐角处或街道尽头。
-
Corner: Corner lot – 拐角地段 – 此代码用于指示该物业位于两条街道相交的拐角处。
-
CulDSac: Cul-de-sac – 死胡同 – 此代码用于指示该物业位于死胡同或死胡同的尽头。
-
FR2: Frontage on 2 sides of property – 物业两侧的临街 – 此代码用于指示物业的两侧临街,通常位于拐角处或街道尽头。
-
FR3: Frontage on 3 sides of property – 物业三面临街 – 此代码用于表示物业三面临街,通常位于三条街道的交汇处。
位于拐角处的房产可能提供更多的隐私或具有更大的景观美化或户外生活空间的潜力,而位于死胡同的房产可能交通较少且更安静。
使用value_counts()
函数计算了每个房屋类型的批次配置类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["LotConfig"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示LotConfig数据数量
plt.figure(figsize = (25, 12))
ax = train["LotConfig"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 10)
ax.set_xticklabels(('Corner Lot', 'Cul-De-Sac', 'Frontage on 2 Sides of Property', 'Frontage on 3 Sides of Property', 'Inside Lot'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('LotConfig: Lot configuration', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.6 LandSlope 土地坡度:房产坡度
注意:列出的单词(Gtl,Mod和Sev)是用于描述财产或土地坡度。
-
Gtl: Gentle slope – 缓坡 – 此代码用于指示该物业具有相对平缓的坡度,该物业上方的海拔逐渐变化。
-
Mod: Moderate slope – 中等坡度 – 此代码用于指示该属性具有中等坡度,并且属性上方的高程有明显变化。
-
Sev: Severe slope – 严重坡度 – 此代码用于指示该物业具有陡峭的斜坡,并且该物业的高程发生了显着变化。
坡度平缓的房产可能更容易建造,并可能提供更多可用的户外空间,而坡度较重的房产可能需要特殊的施工技术,并且景观或开发可能更具挑战性。
使用value_counts()
函数计算了每个房屋类型的土地坡度类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["LandSlope"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示LotConfig数据数量
plt.figure(figsize = (25, 12))
ax = train["LandSlope"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Gentle', 'Moderate', 'Severe'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('LandSlope: Slope of property', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.7 Neighborhood 邻里:艾姆斯市区范围内的物理位置
注意:邻里是指爱荷华州埃姆斯市范围内的实际位置。艾姆斯市分为几个街区,每个街区都有自己独特的特色、人口统计和房地产市场。以下是提到的每个社区的简要说明:
-
Bloomington Heights (Blmngtn) : 布卢明顿高地(Blmngtn)
-
Bluestem (Blueste) :Bluestem是位于埃姆斯西侧的新开发项目。
-
Briardale (BrDale) :Briardale是一个位于埃姆斯东侧的旧社区。
-
Brookside (BrkSide) :Brookside是一个位于埃姆斯东南侧的成熟社区。
-
Clear Creek (ClearCr) :Clear Creek是位于埃姆斯西南侧的较新开发项目。
-
College Creek (CollgCr) :College Creek是位于埃姆斯东南侧的较新开发项目。
-
Crawford (Crawfor) :克劳福德是一个位于埃姆斯西侧的旧社区。
-
Edwards (Edwards) :爱德华兹是一个位于埃姆斯东南侧的旧社区。
-
Gilbert (Gilbert) :吉尔伯特是位于埃姆斯以北的一个小镇。
-
Iowa DOT and Rail Road (IDOTRR) :IDOTRR是位于埃姆斯东侧的一个较旧的社区。
-
Meadow Village (MeadowV) :草甸村是一个位于埃姆斯南侧的成熟社区。
-
Mitchell (Mitchel) :米切尔是一个位于埃姆斯北侧的成熟社区。
-
North Ames (Names) :北艾姆斯是一个位于埃姆斯北侧的成熟社区。
-
Northridge (NoRidge) :北岭是一个位于埃姆斯北侧的成熟社区。
-
Northpark Villa (NPkVill) :北园别墅是位于埃姆斯北侧的新开发项目。
-
Northridge Heights (NridgHt) :Northridge Heights是位于埃姆斯北侧的新开发项目。
-
Northwest Ames (NWAmes) :西北艾姆斯是一个位于埃姆斯西北侧的成熟社区。
-
Old Town (OldTown) :旧城区是一个位于埃姆斯南侧的成熟社区。
-
SWISU: SWISU:这个社区位于爱荷华州立大学的南部和西部,因此得名。
-
Sawyer and SawyerW:这两个社区彼此相邻,位于埃姆斯的西南部。
-
Somerst:该社区位于艾姆斯的东南角。
-
StoneBr:该社区位于艾姆斯北部。
-
Timber:该社区位于艾姆斯的东北角,拥有单户住宅和联排别墅。
-
Veenker:这个社区位于艾姆斯的北部,毗邻同名的高尔夫球场。
使用value_counts()
函数计算了每个房屋类型的邻里类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["Neighborhood"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示LotConfig数据数量
plt.figure(figsize = (20, 10))
ax = train["Neighborhood"].value_counts().sort_index(ascending = True).plot(kind = 'barh', color = colors, rot = 0)
ax.set_yticklabels(('Bloomington Heights', 'Bluestem', 'Briardale', 'Brookside', 'Clear Creek', 'College Creek', 'Crawford', 'Edwards', 'Gilbert', 'Iowa DOT and Rail Road', 'Meadow Village', 'Mitchell', 'North Ames', 'Northpark Villa', 'Northwest Ames', 'Northridge', 'Northridge Heights', 'Old Town', 'South & West of Iowa State University', 'Sawyer', 'Sawyer West', 'Somerset', 'Stone Brook', 'Timberland', 'Veenker'))
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('Neighborhood: Physical locations within Ames city limits', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.8 Condition1 条件1:靠近主要道路或铁路
注意:“条件 1”功能描述了靠近的主要道路或铁路。以下是每个条件的说明:
-
Artery: 动脉:该物业毗邻一条主干道,这是一条高容量的城市道路,旨在承载大量交通。
-
Feedr: 支线:该物业毗邻支线街道,该街道是一条将交通从当地街道运送到收集器街道或主干道的街道。
-
Norm: 标准:该物业位于正常位置,与列出的任何条件都没有特别接近。
-
RRNn: 该物业距离南北铁路线不到200英尺。
-
RRAn:该物业毗邻南北铁路线。
-
PosN:该物业靠近积极的场外特征,例如公园、绿化带或其他理想的位置。
-
PosA:该物业毗邻积极的场外功能。
-
RRNe: 该物业距离东西向铁路线不到200英尺。
-
RRAe: 该物业毗邻东西向铁路线。
使用value_counts()
函数计算了每个房屋类型的靠近主要道路或铁路类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["Condition1"].value_counts().sort_index(ascending = True))
条形图 — 可视化展示Condition1数据数量
plt.figure(figsize = (20, 6))
ax = train["Condition1"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 90)
ax.set_xticklabels(('Artery', 'Feedr', 'Norm', 'PosA', 'PosN', 'RRAe', 'RRAn', "RRNe", "RRNn"))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('Condition1: Proximity to various conditions', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.9 BldgType 房屋类型
注意:变量“BldgType”表示房产所代表的房屋类型。
-
1Fam:这是指单户独立住宅,这意味着该房屋是一个独立的结构,不附属于任何其他房屋。
-
2FmCon: 这是指两户住宅的改建,最初是作为单户住宅建造的,但已改建为两户住宅。
-
Duplx: 这是指复式公寓,即在同一栋建筑内有两个独立的居住单元的房产,通常一个单元在一楼,一个在上层。
-
TwnhsE: 这是指联排别墅终端单元,它是共享一堵墙的一排附属房屋中的一个单元。终端单元通常比其他单元大,并且可能具有其他窗口。
-
TwnhsI: 这是指单元内的联排别墅,这是一排共享一堵墙的附属房屋中的一个单元。这些单元通常比终端单元小,并且在一侧或多侧没有窗户。
使用value_counts()
函数计算了每个房屋类型的住宅类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["BldgType"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示Condition1数据数量
plt.figure(figsize = (20, 6))
ax = train["BldgType"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Single-Family Detached', 'Two-Family Conversion', 'Duplex', 'Townhouse Inside Unit', 'Townhouse End Unit'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('BldgType: Type of dwelling', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.10 HouseStyle 住宅风格
-
1Story: 一栋单层房屋,所有生活空间都在一层。
-
1.5Fin: 一栋一层半的房子,有一层完成的第二层。完成的楼层通常包括一个或多个卧室或额外的生活空间。
-
1.5Unf: 一栋一层半的房子,有未完成的第二层。未完成的关卡可用于存储,也可以稍后完成。
-
2Story: 一栋两层楼的房子,在两层有生活空间。通常,第一层包括客厅、厨房和餐厅等公共区域,而第二层则有卧室和浴室。
-
2.5Fin: 一栋两层半的房子,上面有一层完成的第二层和另外的半层。半层通常是较小的生活空间,例如阁楼或阁楼。
-
2.5Unf:一栋两层半的房子,上面有一个未完工的第二层和另外的半层。
-
SFoyer: 分体式门厅是两层房屋,两层之间有一个小入口。入口通常通向上层的主要生活空间和下层的额外生活空间或卧室。
-
SLvl: 错层式房屋是多层房屋,具有交错的楼层。主要的生活空间,如客厅和厨房,通常在一层,而卧室和额外的生活空间在另一层。
使用value_counts()
函数计算了每个房屋类型的住宅风格类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["HouseStyle"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HouseStyle数据数量
plt.figure(figsize = (20, 6))
ax = train["HouseStyle"].value_counts().sort_index(ascending = True).plot(kind = 'barh', color = colors, rot = 0)
ax.set_yticklabels(('One&One-Half', 'One&One-Half', 'One Story', 'Two&One-Half', 'Two&One-Half', 'Two Story', 'Split Foyer', 'Split Level'))
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('HouseStyle: Style of dwelling', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.11 OverallQual 整体质量:整体材料和表面处理质量
注意:这是一个变量,通常用于房地产或住房数据分析,以评估房屋的整体材料和饰面质量。
-
Very Poor (1) : 非常差(1):房子的材料和饰面质量极低。房屋的整体外观和功能受到严重损害。
-
Poor (2) : 差(2):房子的材料和饰面质量低劣。房屋的整体外观和功能受到严重影响。
-
Fair (3) : 一般(3):房子的材料和饰面质量一般。房子的整体外观和功能令人满意,但可能不美观。
-
Below Average (4) : 低于平均水平(4):房子的材料和饰面略低于平均水平。房屋的整体外观和功能可能会受到影响。
-
Average (5) : 平均(5):房子的材料和饰面质量一般。房子的整体外观和功能令人满意,但可能不美观。
-
Above Average (6) : 高于平均水平(6):房子的材料和饰面略高于平均水平。房子的整体外观和功能令人愉悦。 – Good (7) : 良好(7):房子有优质的材料和饰面。房子的整体外观和功能非常令人愉悦。
-
Very Good (8) : 非常好(8):房子有非常好的材料和饰面。房子的整体外观和功能非常好。
-
Excellent (9) : 优秀(9):房子拥有优质的材料和饰面。房子的整体外观和功能都非常出色。
-
Very Excellent (10) : 非常好(10):房子拥有最优质的材料和饰面。房子的整体外观和功能是非凡和豪华的。
使用value_counts()
函数计算了每个房屋类型的整体质量类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["OverallQual"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HouseStyle数据数量
plt.figure(figsize = (20, 6))
ax = train["OverallQual"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Very Poor', 'Poor', 'Fair', 'Below Average', 'Average', 'Above Average', 'Good', 'Very Good', 'Excellent', 'Very Excellent'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('OverallQual: Rates the overall material and finish of the house', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.12 OverallCond 总体状况评级
注意:“OverallCond”是用于评估房屋状况的变量。它以 1 到 10 的等级对房屋的整体状况进行评分,其中 10 分是最高分,1 分是最低分。
-
10: Very Excellent – 非常好 – 房子状况良好,几乎不需要维护。
-
9: Excellent – 优秀 – 房子状况良好,可能只需要轻微的外观改进。
-
8: Very Good – 非常好 – 房子状况非常好,可能需要小修或更新。
-
7: Good – 良好 – 房屋状况良好,但可能需要一些维修或更新以改善其外观和功能。
-
6: Above Average – 高于平均水平 – 房屋状况高于平均水平,但可能需要进行重大更新或维修才能达到现代标准。
-
5: Average – 平均 – 房子状况一般,没有重大问题,但可能需要一些更新或维修才能达到现代标准。
-
4: Below Average – 低于平均水平 – 房屋状况低于平均水平,可能需要进行重大维修或更新以改善其外观和功能。
-
3: Fair – 一般 – 房屋状况良好,可能需要大修或更新以改善其外观和功能。
-
2: Poor – 差 – 房屋状况不佳,可能需要进行重大维修或更新才能使其适合居住。
-
1: Very Poor – 非常差 – 房屋状况非常差,可能需要大量翻新或可能无法居住。
该变量可用于评估房屋的潜在价值,以及改善其状况可能需要的维护和维修水平。
使用value_counts()
函数计算了每个房屋类型的总体状况评级类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["OverallCond"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HouseStyle数据数量
plt.figure(figsize = (20, 6))
ax = train["OverallCond"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Very Poor', 'Poor', 'Fair', 'Below Average', 'Average', 'Above Average', 'Good', 'Very Good', 'Excellent'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('OverallCond: Rates the overall condition of the house', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.13 RoofMatl 屋顶材料
注意:“RoofMatl”是一个变量,用于描述用于建造房屋屋顶的材料。它是一个分类变量,可以采用不同的值,每个值代表特定类型的屋顶材料。
-
ClyTile: Clay or Tile -粘土或瓦片 – 这是指由粘土制成的屋顶瓦片,通常用于气候炎热干燥的地区。
-
CompShg: Standard (Composite) Shingle -标准(复合)瓦 – 这是指由复合材料(通常是沥青或玻璃纤维)制成的常见屋顶材料。
-
Membran: Membrane – 膜 – 这是指一种由橡胶或塑料膜制成的屋顶材料,该卷材在屋顶上拉伸并密封以形成防水屏障。
-
Metal: 金属 – 这是指一种由金属制成的屋顶材料,例如钢或铝,以其耐用性和使用寿命而闻名。
-
Roll: 卷 – 这是指一种由一卷材料制成的屋顶材料,例如沥青或毛毡,分层安装以形成防水屏障。
-
Tar&Grv: Gravel & Tar – 砾石和焦油 – 这是指一种由焦油和砾石层制成的屋顶材料,以其耐用性和承受恶劣天气条件的能力而闻名。
-
WdShake: Wood Shakes – 木摇 – 这是指一种由木瓦制成的屋顶材料,这些木瓦从原木上分离出来,形状以创造质朴和自然的外观。
-
WdShngl: Wood Shingles – 木瓦 – 这是指一种由木瓦制成的屋顶材料,这些木瓦由原木锯成,形状以创造光滑均匀的外观。
了解房屋上使用的屋顶材料类型有助于评估屋顶的耐用性和潜在使用寿命,以及保持屋顶良好状态所需的维护水平。此外,屋顶材料的类型也会影响房屋的整体美感。
使用value_counts()
函数计算了每个房屋类型的屋顶材料类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["RoofMatl"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示RoofMatl数据数量
plt.figure(figsize = (20, 6))
ax = train["RoofMatl"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('ClyTile', 'CompShg', 'Membran', 'Metal', 'Roll', 'Tar&Grv', 'WdShake', 'WdShngl'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('RoofMatl: Roof material', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.14 Exterior1st 外观1st:房屋的外部覆盖物
注意:“Exterior1st”是一个变量,用于描述房屋墙壁上使用的主要外部覆盖物或材料。它是一个分类变量,可以采用不同的值,每个值代表特定类型的外部覆盖物。
注意:“Exterior1st”是一个变量,用于描述房屋墙壁上使用的主要外部覆盖物或材料。它是一个分类变量,可以采用不同的值,每个值代表特定类型的外部覆盖物。
– AsbShng: Asbestos Shingles – 石棉带状疱疹 – 这是指一种由石棉瓦制成的外墙覆盖物,在20世纪中叶常用,然后由于健康问题而被禁止。
– AsphShn: Asphalt Shingles – 沥青瓦 – 这是指一种由沥青瓦制成的外墙覆盖物,通常用于屋顶,但也可用于墙壁。
– BrkComm: Brick Common – 普通砖 – 这是指一种由普通砖制成的外墙覆盖物,这是一种传统且耐用的材料,通常用于住宅建筑。
– BrkFace: Brick Face – 砖面 – 这是指一种由砖贴面制成的外墙覆盖物,它是涂在建筑物外部的一层薄薄的砖。
– CBlock: Cinder Block – 煤渣块 – 这是指一种由混凝土砌块制成的外墙,经久耐用,通常用于建造地下室和基础墙。
– CemntBd: Cement Board – 水泥板 – 这是指一种由水泥板制成的外墙覆盖物,这是一种耐用且防潮的材料,通常用于高湿度或潮湿的地区。
– HdBoard: Hard Board – 硬板 – 这是指一种由硬板制成的外罩,这是一种由木纤维和树脂制成的复合材料。
– ImStucc: Imitation Stucco – 仿灰泥 – 这是指一种由合成灰泥或EIFS(外墙外保温和饰面系统)制成的外墙覆盖物,由于其低成本和多功能性而是一种流行的材料。
– MetalSd: Metal Siding – 金属壁板 – 这是指一种由金属制成的外罩,如铝或钢,耐用且持久。
– Other: Other -其他 – 这是指其他值未涵盖的任何其他类型的外部覆盖物,例如石材贴面或土坯。
– Plywood: Plywood – 胶合板 – 这是指一种由胶合板制成的外墙覆盖物,这是一种耐用且具有成本效益的材料,通常用于住宅建筑。
– PreCast: PreCast – 预制 – 这是指一种由预制混凝土板制成的外墙覆盖物,通常用于商业和工业建筑。
– Stone: Stone – 石材 – 这是指一种由天然石材制成的外墙覆盖物,如花岗岩或石灰石,经久耐用,通常用于高端建筑。
– Stucco: Stucco -灰泥 – 这是指一种由传统灰泥制成的外墙覆盖物,这是一种水泥基材料,多层应用以产生纹理饰面。
– VinylSd: Vinyl Siding -乙烯基壁板 – 这是指一种由乙烯基制成的外墙覆盖物,这是一种低维护和成本效益的材料,通常用于住宅建筑。
– Wd Sdng: Wood Siding -木壁板 – 这是指一种由木壁板制成的外墙覆盖物,这是一种传统且有吸引力的材料,通常用于住宅建筑。
– WdShing: Wood Shingles – 木瓦 – 这是指一种由木瓦制成的外罩,木瓦由原木锯成,形状以营造质朴自然的外观。
了解房屋墙壁上使用的主要外墙覆盖物或材料可用于评估房屋的耐用性、维护要求和整体美学。此外,外墙覆盖物的类型也会影响房屋的能源效率以及湿气侵入或其他问题的可能性。
使用value_counts()
函数计算了每个房屋类型的房屋外部覆盖物类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["Exterior1st"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示RoofMatl数据数量
plt.figure(figsize = (20, 12))
ax = train["Exterior1st"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 90)
ax.set_xticklabels(('AsbShng', 'AsphShn', 'BrkComm', 'BrkFace', 'CBlock', 'CemntBd', 'HdBoard', 'ImStucc', 'MetalSd', 'Plywood', 'Stone', 'Stucco', 'VinylSd', 'WdSdng', 'WdShing'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 10), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('Exterior1st: Exterior covering on house', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.15 ExterQual 外部质量:外部材料质量
注: ExterQual 是数据集中的一个变量,表示建筑物外部所用材料的质量。
-
Excellent – 极好 – 这表明建筑物外部使用的材料质量最高,状况良好。
-
Gd: Good -良好 – 这表明建筑物外部使用的材料质量良好且状况良好。
-
TA: Average/Typical -平均/典型 – 这表明建筑物外部使用的材料具有平均或典型质量,并且处于可接受的状态。
-
Fa: Fair – 一般 – 这表明建筑物外部使用的材料质量一般,可能需要一些维修或改进。
-
Po: Poor – 差 – 这表明建筑物外部使用的材料质量差,需要重大维修或改进。
这些值通常用于对建筑物外部使用的材料的质量进行分类,以研究建筑实践的模式和趋势,并帮助潜在买家或租户就建筑物的状况做出明智的决定。
使用value_counts()
函数计算了每个房屋类型的外部质量类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["ExterQual"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示RoofMatl数据数量
plt.figure(figsize = (20, 6))
ax = train["ExterQual"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Excellent', 'Fair', 'Good', 'Average/Typical'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('ExterQual: Evaluates the quality of the material on the exterior', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.16 ExterCond: 外部材料的现状
注: ExterCond 是数据集中的一个变量或列,用于评估建筑物外部所用材料的当前状况。此变量通常用于评估建筑物外部的整体状态和质量,同时考虑磨损、风化和损坏等因素。ExterCond 的可能值为:
-
Ex: Excellent – 极好 – 这表明建筑物外部使用的材料状况良好,没有磨损或损坏的迹象。
-
Gd: Good – 良好 – 这表明建筑物外部使用的材料状况良好,只有轻微的磨损或损坏迹象。
-
TA: Average/Typical – 平均/典型 – 这表明建筑物外部使用的材料处于可接受的状态,有一些磨损或损坏的迹象可能需要注意。
-
Fa: Fair -一般 – 这表明建筑物外部使用的材料状况良好,有明显的磨损或损坏迹象,需要注意。
-
Po: Poor -差 – 这表明建筑物外部使用的材料状况不佳,有明显的磨损或损坏迹象,需要大量维修或更换。
这些值通常用于对建筑物外部所用材料的当前状况进行分类,以帮助潜在买家或租户就建筑物的整体状况和维护需求做出明智的决定。
使用value_counts()
函数计算了每个房屋类型的外部材料的现状类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["ExterCond"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示ExterCond数据数量
plt.figure(figsize = (20, 6))
ax = train["ExterCond"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Excellent', 'Fair', 'Good', 'Poor', 'Average/Typical'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('ExterCond: Evaluates the present condition of the material on the exterior', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.17 BsmtCond:地下室的一般状况
注: BsmtCond 是数据集中的一个变量,用于评估建筑物地下室的一般状况。地下室的状况是其安全性、实用性和宜居性的重要因素。
-
Ex: Excellent – 极好 – 这表明地下室状况良好,没有明显的损坏或恶化迹象。
-
Gd: Good – 良好 – 这表明地下室状况良好,有一些轻微的磨损迹象。
-
TA: Typical – 典型 – 这表明地下室处于典型状态,允许一些轻微潮湿或水损坏的迹象。
-
Fa: Fair – 一般 – 这表明地下室状况良好,有一些潮湿或开裂或沉降的迹象。
-
Po: Poor – 差 – 这表明地下室状况不佳,有严重的开裂、沉降或潮湿迹象。
-
NA: No Basement -没有地下室 – 这表示建筑物没有地下室。
这些值通常用于对建筑物中地下室的一般状况进行分类,以帮助潜在买家或租户了解地下室空间的安全性、实用性和宜居性。地下室的状况可能会对其作为生活空间、存储空间或其他用途的潜在用途以及它对财产整体价值的影响产生重大影响。
使用value_counts()
函数计算了每个房屋类型的地下室的一般状况类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["BsmtCond"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示ExterCond数据数量
plt.figure(figsize = (20, 6))
ax = train["BsmtCond"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Fair', 'Good', 'Poor', 'Typical'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('BsmtCond: Evaluates the general condition of the basement', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.18 KitchenQual 厨房质量
注意:“KitchenQual”是房地产和物业评估中使用的变量,用于描述物业厨房的质量。
-
Ex (Excellent) :(优秀):指质量上乘、具有高端饰面和功能且状况良好的厨房。
-
Gd (Good) : (良好):指质量好、饰面和功能好、状况良好的厨房。
-
TA (Typical/Average) : (典型/平均):指具有典型或平均质量的厨房,具有标准饰面和功能,并且处于平均水平。
-
Fa (Fair) : (一般):指质量一般,具有低端饰面和功能,并且可能存在一些明显的磨损或小问题。
-
Po (Poor) : (差):指质量差、饰面和功能过时或损坏的厨房,可能存在重大问题或需要大量维修或翻新。
评估物业厨房的质量很重要,因为它是影响物业整体价值和可取性的关键特征。具有现代饰面和功能的高品质厨房可以增加房产的价值,使其对买家或租房者更具吸引力。另一方面,劣质或过时的厨房会降低房产的价值,并可能使其对潜在买家或租房者来说不太受欢迎。厨房质量的评级也会影响房产的整体评估,因为这是买家或租房者在做出决定时考虑的一个重要因素。
使用value_counts()
函数计算了每个房屋类型的厨房质量类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["KitchenQual"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HeatingQC数据数量
plt.figure(figsize = (20, 6))
ax = train["KitchenQual"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Excellent', 'Fair', 'Good', 'Average/Typical'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('KitchenQual: Kitchen quality', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.19 Functional 家庭功能评级
注意:“功能”是在房地产和财产评估的上下文中使用的变量,用于描述财产的整体功能。
-
Typ (Typical Functionality) :(典型功能):指具有典型或正常功能且没有重大问题或缺陷的属性。
-
Min1 (Minor Deductions 1) : (次要扣除1):指有轻微缺陷或问题可能需要一些小修或改进的财产。
-
Min2 (Minor Deductions 2) : (次要扣除2):指具有更重大的次要缺陷或问题,可能需要更广泛的维修或改进的财产。
-
Mod (Moderate Deductions) : (中等扣除):指具有中度缺陷或可能需要重大维修或改进的问题的属性。
-
Maj1 (Major Deductions 1) :(主要扣除额1):指存在重大缺陷或问题,可能需要大量维修或改进的财产,但该财产仍被认为具有一定的价值。
-
Maj2 (Major Deductions 2) : (主要扣除额2):指具有非常严重的缺陷或问题的财产,这些缺陷或问题可能使财产无法居住或需要重大维修或改进以使其宜居。
-
Sev (Severely Damaged) : (严重损坏):指严重损坏或恶化的财产,可能使财产不安全或无法居住。
-
Sal (Salvage only) :(仅限打捞):指状况不佳以至于无法打捞并应拆除的财产。
评估房产的功能很重要,因为它会影响房产的安全性、宜居性和价值。具有轻微或中度缺陷的属性可能仍然具有价值,但可能需要维修或改进才能完全发挥作用和安全。有重大或严重缺陷的房产可能无法居住或需要大量维修或改进,这可能会使房产不那么理想或价值。房产功能的评级也会影响房产的整体评估,因为这是买家或租房者在做出决定时考虑的一个重要因素。
使用value_counts()
函数计算了每个房屋类型的家庭功能评级类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["Functional"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HeatingQC数据数量
plt.figure(figsize = (20, 6))
ax = train["Functional"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Major Deductions 1', 'Major Deductions 2', 'Minor Deductions 1', 'Minor Deductions 2', 'Moderate Deductions', 'Severely Damaged', 'Typical Functionality'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 12)
plt.xlabel('Functional: Home functionality (Assume typical unless deductions are warranted)', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.20 GarageQual 车库质量
注意:“车库质量”是用于房地产和财产评估的变量,用于描述财产中车库的质量。
-
Ex:指状况良好,为储藏室和车辆提供充足空间的优质车库。
-
Gd: 指状况良好并提供足够存储空间和车辆的优质车库。
-
TA: 指处于平均状态并为存储和车辆提供基本空间的典型或中等质量的车库。
-
Fa: 指状况不佳且可能存在一些结构或安全问题的优质车库。
-
Po:指状况非常差的劣质车库,可能需要大量维修或更换。
-
NA:指没有车库的房产。
车库的质量会影响其感知价值和实用性。质量优良或良好的车库可能被认为比质量一般或较差的车库更有价值和有用,因为它可以提供额外的生活空间、存储选择,并保护车辆免受天气和盗窃的影响。质量差的车库可能被认为价值较低,可能需要额外的工作才能使其正常运行或安全。车库的质量也会影响整体物业价值,因为高质量的车库可能会增加整个物业的感知价值。
使用value_counts()
函数计算了每个房屋类型的车库质量类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["GarageQual"].value_counts().sort_index(ascending=True))
条形图 — 可视化展示HeatingQC数据数量
plt.figure(figsize = (20, 6))
ax = train["GarageQual"].value_counts().sort_index(ascending = True).plot(kind = 'bar', color = colors, rot = 0)
ax.set_xticklabels(('Excellent', 'Fair', 'Good', 'Poor', 'Typical/Average'))
for p in ax.patches:
ax.annotate(int(p.get_height()), (p.get_x() + 0.25, p.get_height() + 1), ha = 'center', va = 'bottom', color = 'black')
ax.tick_params(axis = 'both', labelsize = 15)
plt.xlabel('GarageQual: Garage quality', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.ylabel('Number of Occurrences', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20);
plt.show()
3.21 PoolQC 泳池质量
注意:变量 PoolQC 表示属性中池的质量。有四种可能的选项:
-
Ex: Excellent -优秀
-
Gd: Good – 好
-
TA: Average/Typical – 平均/典型
-
Fa: Fair – 公平
If the property does not have a pool, the value would be “NA”. 如果属性没有池,则值将为“NA”。
使用value_counts()
函数计算了每个房屋类型的泳池质量类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["PoolQC"].value_counts().sort_index(ascending=True))
饼状图 — 可视化展示PoolQC数据数量
plt.figure(figsize = (20, 6))
counts = train["PoolQC"].value_counts()
explode = (0, 0, 0.05)
counts.plot(kind = 'pie', fontsize = 12, colors = colors, explode = explode, autopct = '%1.1f%%')
plt.xlabel('PoolQC: Pool quality', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.axis('equal')
plt.legend(labels = counts.index, loc = "best")
plt.show()
3.22 MiscFeature 其他类别中未涵盖的其他功能
注意:“杂项功能”是指房屋中未包含在任何其他类别中的任何其他功能。它可以包括标准家庭中通常找不到的各种功能。
-
Elev: 这是指安装在房屋中的电梯。电梯通常位于较大的房屋或具有多层的房屋中。
-
Gar2: 这是指车库部分中未描述的第二个车库。这可能是一个独立的车库,也可能是一个不被视为主车库的附属车库。
-
Othr: 这是指其他类别中未涵盖的任何其他杂项功能。这可能包括温室、凉亭或游戏屋等功能。
-
Shed: 这是指面积超过 100 平方英尺的棚子。棚屋通常用于存储目的,但也可以用作工作区或爱好区域。
-
TenC: 这是指位于酒店内的网球场。网球场通常位于较大的豪华住宅或拥有大型庞大房产的住宅中。
-
NA: 这是指属性中没有任何杂项功能。
使用value_counts()
函数计算了每个房屋类型的其他类别中未涵盖的其他功能类型,并使用sort_index()
函数按照房屋类型的编号进行排序。
print(train["MiscFeature"].value_counts().sort_index(ascending=True))
饼状图 — 可视化展示MiscFeature数据数量
plt.figure(figsize = (20, 6))
counts = train["MiscFeature"].value_counts()
explode = (0, 0, 0, 0.05)
counts.plot(kind = 'pie', fontsize = 12, colors = colors, explode = explode, autopct = '%1.1f%%')
plt.xlabel('MiscFeature: Miscellaneous feature not covered in other categories', weight = "bold", color = "#2F0F5D", fontsize = 14, labelpad = 20)
plt.axis('equal')
plt.legend(labels = counts.index, loc = "best")
plt.show()
3.23 SalePrice 房产的销售价格(以美元为单位)
注意:我们的目标特征是 SalePrice,我们知道这一点,因此,第一步是检查数据的分布。
print(train["plt.figure(figsize = (20, 6))
sns.histplot(train['SalePrice'], color = 'g');
plt.show()MiscFeature"].value_counts().sort_index(ascending=True))
观察:现在让我们检查目标特征的偏度和峰度:销售价格。
print("Skewness: %f" % train['SalePrice'].skew())
print("Kurtosis: %f" % train['SalePrice'].kurt())
偏度和峰度的值越大,表示数据分布的偏斜程度或尖峰程度越明显。
具体来说,偏度为0表示数据分布完全对称,正偏度表示数据分布向右偏斜,负偏度表示数据分布向左偏斜。
峰度为0表示数据分布是正常的钟形曲线,正峰度表示数据分布比正常的钟形曲线更尖锐,负峰度表示数据分布比正常的钟形曲线更平缓。
对于SalePrice数据列来说,数据向右偏斜,且比钟形曲线更加尖锐。
四、数据处理
1、数据的缺失情况观察
train.isnull().sum()
因数据列太多,train.isnull().sum()图数据缺失总结显示的不完整,但由train.info()详细信息可以得知(因为数据列太多,在此没有显示,仅摘抄下来数据的确实情况),数据的缺失情况:
列名 | 数据数量 |
---|---|
LotFrontage | 1201 |
Alley | 91 |
MasVnrType | 588 |
MasVnrArea | 1452 |
BsmtQual | 1423 |
BsmtCond | 1423 |
BsmtExposure | 1422 |
BsmtFinType1 | 1423 |
BsmtFinType2 | 1422 |
Electrical | 1459 |
FireplaceQu | 770 |
GarageType | 1379 |
GarageYrBlt | 1379 |
GarageFinish | 1379 |
GarageQual | 1379 |
GarageCond | 1379 |
PoolQC | 7 |
Fence | 281 |
MiscFeature | 54 |
2、缺失值热图观察
利用空值热图可视化的展示缺失值:
plt.figure(figsize = (20, 6))
sns.heatmap(train.isnull());
plt.show()
根据上面显示的热图,很明显某些列具有大量缺失值。因此,我打算调查哪些列包含多少百分比的空值。
3、计算总缺失值和错误值的百分比。
这段代码的作用是找出训练集中包含缺失值的特征,并计算每个特征中缺失值的百分比。
在第一行中,我们创建了一个空列表features_containing_null_values
。
在第二到四行中,我们遍历了训练集的所有列,并使用isnull()
函数检查每个特征中的缺失值数量是否大于1。如果是,则将该特征添加到features_containing_null_values
列表中。
在第五到六行中,我们计算了每个特征中缺失值的百分比,并按降序排列。
最后一行中,我们打印了结果。
features_containing_null_values = []
for features in train.columns:
if train[features].isnull().sum() > 1:
features_containing_null_values.append(features)
null_percentage = (train[features_containing_null_values].isnull().sum() / train.shape[0] * 100).sort_values(ascending=False)
print(null_percentage)
19 个属性具有缺失值,其中 5 个属性占所有数据的 50% 以上。大多数情况下,NA意味着缺少按属性描述的主题,例如缺少游泳池,围栏,没有车库和地下室。
找出训练集中数值类型和字符类型缺失列:
使用select_dtypes()
函数选择了数值型特征,包括整型和浮点型。
numerical_features = train.select_dtypes(include = ['int', 'float']).columns.tolist()
print("Number of Numerical features:", len(numerical_features))
print(numerical_features)
数值型数据分布:
list(set(train.dtypes.tolist()))
df_num = train.select_dtypes(include = ['float64', 'int64'])
print(df_num.head())
5 行× 37 列
数据太多了,就没有用表格展示出来,大家可以在下面的图片中看到具体的数值型数据的显示。
现在让我们绘制所有数值特征的分布:
df_num.hist(figsize=(30, 30), bins=50, xlabelsize=5, ylabelsize=5);
plt.show()
字符类型缺失值:
categorical_features = train.select_dtypes(include = ['object']).columns.tolist()
print("Number of Categorical features:", len(categorical_features))
print(categorical_features)
4、数据缺失值填补
我们将在分类列和数字列中分别填充缺失值。
在具有大尺度错误值的特征中进行数据插补可能会导致数据集中的偏差和噪声。
因此,我们可以简单地删除那些具有大量缺失值的特征。
对于几列,有很多 NaN 条目。
但是,阅读数据描述,我们发现这不是缺少数据:对于PoolQC,NaN不是缺少数据,而是意味着没有池,Fence,FireplaceQu等也是如此。这些数据列需要分类处理缺失值。
cols_fillna = ['PoolQC','MiscFeature','Alley','Fence','MasVnrType','FireplaceQu',
'GarageQual','GarageCond','GarageFinish','GarageType', 'Electrical',
'KitchenQual', 'SaleType', 'Functional', 'Exterior2nd', 'Exterior1st',
'BsmtExposure','BsmtCond','BsmtQual','BsmtFinType1','BsmtFinType2',
'MSZoning', 'Utilities']
for col in cols_fillna:
train[col].fillna('None',inplace=True)
test[col].fillna('None',inplace=True)
total = train.isnull().sum().sort_values(ascending=False)
percent = (train.isnull().sum()/train.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
print(missing_data.head())
这段代码的作用是将指定的列中的所有NaN值替换为None。在这段代码中,cols_fillna
是一个包含列名的列表,这些列中的NaN值具有特定的含义,例如没有游泳池等。然后,使用一个循环遍历cols_fillna
列表中的每个列名,并使用fillna
函数将该列中的NaN值替换为字符串’None’。最后,该代码打印出了一个包含缺失数据统计信息的DataFrame,如下图所示。
这段代码可以确保在处理数据时,指定列中的NaN值被正确地替换为’None’字符串,以便后续处理或分析不会受到NaN值的影响。
缺失值处理,分为字符串类型和数值类型数据处理,字符串数据采取使用众数填充,数值型数据处理采取平均值填充。最后输出train数据是否还有缺失值。
str=train.select_dtypes("object")
for column in str:
train[column].fillna(train[column].mode()[0], inplace=True)
test[column].fillna(test[column].mode()[0], inplace=True)
num=train.select_dtypes(["float64","int64"]).drop("SalePrice",axis=1)
for column in num:
train[column].fillna(train[column].median(), inplace=True)
test[column].fillna(test[column].median(), inplace=True)
#dataset[column].fillna(0, inplace=True)
print(train.isnull().sum().max())
print(test.isnull().sum().max())
到目前为止,我们都可以清楚地知道到数据集中没有缺失值(除了我们的目标特征 SalePrice,我们将预测,所以没关系),我们已经成功(截至目前)处理了它们。
将分类变量转换为数值变量,方便后面使用机器学习算法去预测数据。
dataset=pd.get_dummies(train,columns=str.columns)
dataset=pd.get_dummies(test,columns=str.columns)
然后就可以开始进行数据预测了。
五、预测数据
使用机器学习的CatBoostRegressor
模型。CatBoostRegressor
是一种机器学习中的回归模型它是CatBoost
库中的一个类,用于训练和应用回归模型。CatBoostRegressor
可以用于解决回归问题,例如预测房价、销售额等。它支持许多参数和选项,可以根据具体的问题进行调整和优化。
model = CatBoostRegressor(verbose = False, cat_features=cat_features)
model.fit(x, y)
y_pred = model.predict(x)
把数据保存下来,然后提交
print('预测值',y)
predict = [data_test['Id'],y_pred]
predict_df = pd.DataFrame(predict).T
predict_df.to_csv(filr_test_out,index=False)
提交的结果如下:
只有0.55791分,有点低,但是第一次做到这样我也挺满意的。house房价预测的变量数据列是在太多了,而且缺失值和分类类型数据也很多,有点难处理,下次一定会做的更好。