用Python分析波士顿的房价,酸爽!!!

947790b179438ee6a158c39118ff32c3.png

这个是Kaggle专栏的第二篇,赛题名是:House Prices - Advanced Regression Techniques。在本文中你将会学习到:

  • 单、多变量分析

  • 相关性分析

  • 缺失值和异常值处理

  • 哑变量转换

f79795b3e565c1c89f1cc3e97dd15252.png

原notebook地址:

https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

一、排名榜

让我们看下排名榜,第一名真的是碾压其他选手呀~所以,今天我们一起看看这个第一名的方案到底是多棒?

0c738cc08e013200fe3b4739b69be1eb.png

二、数据介绍

这份波士顿房价的数据集有4份数据,训练集train+测试集test+数据集的描述description+提交模板sample

2077bf87a5407354a87b711b90a4498b.png

其中训练集有81个特征,1460条数据;测试集81个特征,1459条数据。看下部分属性介绍:

7b371efcd5310ec70576001614c9573f.png f161ad98faee3dcf6055e0e590e336db.png

三、数据EDA

导入模块和数据,并进行数据探索:

导入库

import pandas as pd
import numpy as np
# 绘图相关
import plotly.express as px
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use("fivethirtyeight")# 数据建模
from scipy.stats import norm
from scipy import stats
from sklearn.preprocessing import StandardScaler# 警告
import warnings
warnings.filterwarnings('ignore')
%matplotlib inline

导入数据

1bc23a7e7ecb21b23c9751830db54444.png

数据信息

训练集整体是1460*81;而且很多的存在字段都存在缺失值

a2eaa96c936341b8de7e8e30c3731c5b.png

描述统计信息:

872c4691f4edea9465dcfd37caec1e90.png

四、销售价格SalePrice分析

原notebook文档中,作者分析了很多自己关于这个题目和字段的看法,具体不阐述。下面介绍的是重点部分:

统计信息

单单看这个字段的统计信息:

e9ead57a8f27aaa6d9b67484a9878d33.png

分布直方图如下,我们明显感受到:

  • 价格的分布偏离了正态分布

  • 有明显的正偏度现象

  • 有明显的峰值出现

4d8e0e4c2dbc2777cc9aae8bd52eb487.png

偏度和峰度(skewness and kurtosis)

知识加油站:偏度和峰度

详细的解释参见文章:https://zhuanlan.zhihu.com/p/53184516

  • 偏度:衡量随机变脸概率分布的不对称性,是相对于平均值不对称程度的度量,通过对偏度系数的测量,我们能够判定数据分布的不对称程度以及方向。

  • 峰度:是研究数据分布陡峭或者平滑的统计量,通过对峰度系数的测量,我们能够判定数据相对于正态分布而言是更陡峭还是更平缓。峰度接近0,数据呈现正态分布;峰度>0,高尖分布;峰度<0,矮胖分布

偏度的两种分布情况:

  • 如果是左偏,则偏度小于0

  • 如果是右偏,则偏度大于0

d84c8b01560595d6eb8ea8b55f5de3a5.png

峰度的两种分布情况:

  • 如果是高瘦型,则峰度大于0

  • 如果是矮胖型,则峰度小于0

8f76d73d2172af97f06132d540c223c4.png
# 打印销售价格的偏度和峰度print("Skewness(偏度): %f" % train['SalePrice'].skew())
print("Kurtosis(峰度): %f" % train['SalePrice'].kurt())Skewness(偏度): 1.882876
Kurtosis(峰度): 6.536282

偏度和峰度值都是正的,明显说明数据是右偏且高尖分布

SalePrice和数值型字段的关系

首先我们考察和居住面积的关系:

8f8357249b8d66f325ba91c4ef938388.png
plt.figure(1,figsize=(12,6))
sns.scatterplot(x="GrLivArea",y="SalePrice",data=data)
plt.show()
09bae16ff46030d1a5d7c69602e27675.png
# plotly版本
px.scatter(data,x="GrLivArea",y="SalePrice",trendline="ols")
969b5d9dbd7de4b25855ba6530ae2834.png

TotalBsmtSF VS SalePrice

# 2、TotalBsmtSF 
data = train[["SalePrice","TotalBsmtSF"]]plt.figure(1,figsize=(12,6))
sns.scatterplot(x="TotalBsmtSF",y="SalePrice",data=data)
plt.show()
edde4949fbaa131b9985079b2506e41f.png

小结:我们可以观察到这两个特征和销售价格之间是存在一定的线性关系。

价格和分类型字段的关系

1、OverallQual VS SalePrice

# 1、OverallQual:整体房屋质量# 总共10个类别
train["OverallQual"].value_counts()
5     397
6     374
7     319
8     168
4     116
9      43
3      20
10     18
2       3
1       2
Name: OverallQual, dtype: int64
data = train[["SalePrice","OverallQual"]]# 房屋整体质量和房价的关系
# 绘制子图:1号位
f,ax = plt.subplots(1,figsize=(12,6))
fig = sns.boxplot(x="OverallQual",y="SalePrice",data=data)
# y轴的刻度范围
fig.axis(ymin=0,ymax=800000)
plt.show()
67611eb963eb66c487a8a11a4bb0736e.png

2、YearBuilt VS SalePrice

住宅建造年份和销售价格的关系

data = train[["SalePrice","YearBuilt"]]# 建造年份和房价的关系
f,ax = plt.subplots(1,figsize=(16,8))
fig = sns.boxplot(x="YearBuilt",y="SalePrice",data=data)
# y轴的刻度范围
fig.axis(ymin=0,ymax=800000)
plt.show()
bad0aece8e7e7d45465b547dd81d9e94.png

小结:销售价格和住宅的整体质量有很强的关系;但是和建筑年份的关系不大。但是在实际的买房过程中,我们还是会很在意年份

小结

对上面分析的一点小结:

  1. 地面生活区(GrLivArea)、地下室面积(GrLivArea)和销售价格SalePrice都是呈现正向的线性相关

  2. 房屋的整体质量(OverallQual)和建造年份(YearBuilt)好像也和销售价格线性相关。常识来说,整体的质量越好,价格越贵

五、相关性分析

为了探索众多属性之间的关系,进行如下的分析:

  • 两两属性间的相关性(热力图)

  • 销售价格saleprice和其他属性的关系(热力图)

  • 关联性最大的属性间的关系(散点图)

整体相关性

分析每两个属性的相关性,并绘制热力图

1d0304fb16fe8e93cf116b21ac44abbc.png 5ae7abbf12a792be9eb8294d0da81e37.png

上图中有两个值得关注的点:

  • TotalBsmtSF and 1stFlrSF

  • GarageCar and GarageArea

这两组变量都是强相关的,我们后续的分析只取其中一个

缩放相关矩阵(销售价格saleprice)

上面的热力图中选择和SalePrice相关性最强的前10个特征来绘制热力图

db98131e9e1c491d3532903f41d53906.png 19ba41126944fbf0402dde4af79c7ac3.png
sns.set(font_scale=1.25)
hm = sns.heatmap(cm,  # 绘图数据cbar=True,  # 是否将颜色条作为图例,默认Trueannot=True,  # 是否显示数值square=True,  # 是否使热力图每个单元为正方形,默认为Falsefmt='.2f',  # 保留两位小数annot_kws={'size':10},xticklabels=cols.values, # xy轴设置yticklabels=cols.values)plt.show()
fc825e57ccb77ee67ad6cebd91df0f23.png

小结1

通过上面的缩放热力图,我们可以得到下面的结论:

  • 'OverallQual', 'GrLivArea' and 'TotalBsmtSF'是真的和'SalePrice'呈现强相关

  • 'GarageCars' and 'GarageArea' 也是两个相关性比较强的特征;而且他们都是同时出现,后续选取GarageCars进行分析

  • 建筑年限'YearBuilt'相对来说,相关性比较低

变量离散图

将销售价格SalePrice和几个相关性比较强的特征放在一起,绘制变量离散图

sns.set()
# 待分析的变量
cols = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'YearBuilt']
sns.pairplot(train[cols],size=2.5)
plt.show()
f4cf8c351e7c4a2dfa045974ac7a6f0d.png

小结2

正对角线方向上是变量的直方图,解释变量和被解释变量SalePrice,其他的则是散点图。

如果图中呈现直线或者横线的散点,则说明该变量是离散的,比如第1行4列的变量,y轴是SalePrice,x轴是YearBuilt,直线说明YearBuilt是离散的

六、缺失值处理

针对缺失值的情况,主要是讨论两点:

  • 缺失值分布情况怎么样?

  • 缺失值是随机的?还有具有某种规律

缺失值占比

1、查看每个字段的缺失值情况

# 每个字段的缺失值数量:降序
total = train.isnull().sum().sort_values(ascending=False)
total.head()
PoolQC         1453
MiscFeature    1406
Alley          1369
Fence          1179
FireplaceQu     690
dtype: int64

2、转成百分比

# 每个字段的缺失值 / 总数
percent = (train.isnull().sum() / train.isnull().count()).sort_values(ascending=False)
percent.head()
PoolQC         0.995205
MiscFeature    0.963014
Alley          0.937671
Fence          0.807534
FireplaceQu    0.472603
dtype: float64

3、数据合并,整体的缺失值情况:

15d6b64997ac4f4c9b4e7e2d5b29130d.png

删除缺失值

原文中分析了很多,最后的结论:

In summary, to handle missing data,

1、we'll delete all the variables with missing data, except the variable 'Electrical'.

2、In 'Electrical' we'll just delete the observation with missing data.

# 步骤1:需要删除的字段
missing_data[missing_data["Total"] > 1].index
Index(['PoolQC', 'MiscFeature', 'Alley', 'Fence', 'FireplaceQu', 'LotFrontage','GarageYrBlt', 'GarageCond', 'GarageType', 'GarageFinish', 'GarageQual','BsmtFinType2', 'BsmtExposure', 'BsmtQual', 'BsmtCond', 'BsmtFinType1','MasVnrArea', 'MasVnrType'],dtype='object')
# 第一步
train = train.drop(missing_data[missing_data["Total"] > 1].index,1)
# 第二步
train = train.drop(train.loc[train["Electrical"].isnull()].index)
38c2b5c571abe6f5e481a1583ee7ecdf.png

七、离群点out liars

查找离群点

## 数据标准化standardizing data
# np.newaxis 增加数据维度,一维变成二维
saleprice_scaled = StandardScaler().fit_transform(train["SalePrice"][:,np.newaxis])
saleprice_scaled[:5]
array([[ 0.34704187],[ 0.0071701 ],[ 0.53585953],[-0.5152254 ],[ 0.86943738]])
# 查看前10和最后10位的数据
# argsort:返回的是索引值;默认是升序排列,最小的在最前面,最大的在最后low_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][:10]high_range = saleprice_scaled[saleprice_scaled[:,0].argsort()][-10:]print(low_range)
print('----------')
print(high_range)
226f155d59ba923cff23cfdf30d94494.png

小结3

  • low_range接近,且离0比较近

  • high_range离0很远;且7+的数据就应该是离群点了

单变量分析1

data = train[["SalePrice","GrLivArea"]]
data.plot.scatter(x="GrLivArea",y="SalePrice",ylim=(0,800000))
plt.show()
37ed8baf2e7b3fd3bdfbd424b3bca6e0.png

很明显的,两个变量(属性)存在一种线性关系

删除离群点

指定删除某个字段为具体值的方法:

08c8b6ff8558e936bbeff535620eb985.png

单变量分析2

data = train[["SalePrice","TotalBsmtSF"]]   # 待分析的两个变量
data.plot.scatter(x="TotalBsmtSF",y="SalePrice",ylim=(0,800000))
plt.show()
bc37eae89371ab45d6be6251ba2f8047.png

八、深入理解SalePrice

主要从以下几个方面来深入研究销售价格:

  • Normality:归一化

  • Homoscedasticity:同方差性

  • Linearity:线性特质

  • Absence of correlated errors:相关误差

Normality归一化(SalePrice)

sns.distplot(train["SalePrice"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["SalePrice"], plot=plt)
0498c23e5cc72d90ce2f59038c500ab5.png

我们发现:销售价格不是正态分布的,出现了右偏度;同时也不遵循对数变化的规律。

为了解决这个问题:实施对数变换

## 对数变换
train["SalePrice"] = np.log(train["SalePrice"])sns.distplot(train["SalePrice"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["SalePrice"], plot=plt)
480ed065c21c7e5137e84fd3ea1d6b38.png

实施对数变换后效果好了很多的

Normality-归一化(GrLivArea)

sns.distplot(train["GrLivArea"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["GrLivArea"], plot=plt)

对数变换前的效果:

95f4bf29d6b927ec7b6bcb4fddeaec53.png

执行对数变换及效果:

# 执行相同的对数操作
train["GrLivArea"] = np.log(train["GrLivArea"])sns.distplot(train["GrLivArea"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["GrLivArea"], plot=plt)
dcac1c038f239091b61b7aac04b9ac6a.png

Normality-归一化(TotalBsmtSF)

sns.distplot(train["TotalBsmtSF"],fit=norm)
fig = plt.figure()
res = stats.probplot(train["TotalBsmtSF"], plot=plt)

处理之前的效果:

a518e30e2b5cfc894f0517fcc5276609.png

如何处理上面的特殊部分?

# 增加一列数据
train['HasBsmt'] = 0# 当TotalBsmtSF>0 则赋值1
train.loc[train['TotalBsmtSF']>0,'HasBsmt'] = 1# 对数转换:等于1的部分
train.loc[train['HasBsmt']==1,'TotalBsmtSF'] = np.log(train['TotalBsmtSF'])# 绘图
data = train[train['TotalBsmtSF']>0]['TotalBsmtSF']
sns.distplot(data,fit=norm)
fig = plt.figure()
res = stats.probplot(data, plot=plt)
00b1a2c3d087ba00cb21c2816e3d8e11.png

九、同方差性

检验两个变量之间的同方差性最好的方法就是作图。

The best approach to test homoscedasticity for two metric variables is graphically

1、讨论:'SalePrice' 和'GrLivArea'之间的关系

ed02e53c7cef928b98dd7d225eb8a2d8.png

2、讨论SalePrice' 和 'TotalBsmtSF'

53ad48ed574fb376eb92dfbe96ad7e88.png

We can say that, in general, 'SalePrice' exhibit equal levels of variance across the range of 'TotalBsmtSF'. Cool!

从上面的两张图中,我们看到:销售价格和另外两个变量都是呈现一定的正向关系

十、生成哑变量

虚拟变量( Dummy Variables) 又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。

Pandas中的get_dummies函数能够实现:

train = pd.get_dummies(train)  # 生成哑变量
train
82b8526cdb8a70d8e5c32655cd8357d3.png

十一、总结

至此,我们完成了以下的内容:

  1. 整体变量间的相关性分析

  2. 重点分析了变量“SalePrice”

  3. 处理缺失值和异常值(离群点)

  4. 做了一些统计分析,将分类变量变成了哑变量

自己需要后续补充深入学习的点:

  • 多元统计分析

  • 偏度和峰度

  • 哑变量的深入

  • 标准化和归一化

 
 

推荐阅读:

入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

量化: 定投基金到底能赚多少钱?  | 我用Python对去年800只基金的数据分析

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24138.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据分析-房价的影响因素图解

摘 要 这两年OF一直在关注房价&#xff0c;抛开政策、炒房等一些外部因素&#xff0c;对于房屋本身来说&#xff0c;哪些是影响房价的主要因素&#xff1f;OF在众多因素中挑选了几个进行分析&#xff1a;房屋年龄、面积、层数&#xff08;1/1.5/2/2.5/...&#xff09;、卧室数…

python做波士顿房价预测

#1. 导入相关包 import numpy as np #导入numpy科学计算包 import pandas as pd #导入pandas数据分析包 from pandas import Series, DataFrame #Series是类似于一维数组的对象 import matplotlib.pyplot as plt #导入绘图的包 import sklearn.datasets as datasets #直接从…

python实现波士顿房价预测---(1)

波士顿房价预测 目标 这是一个经典的机器学习回归场景&#xff0c;我们利用Python和numpy来实现神经网络。该数据集统计了房价受到13个特征因素的影响&#xff0c;如图1所示。 对于预测问题&#xff0c;可以根据预测输出的类型是连续的实数值&#xff0c;还是离散值&#xff…

加州房价篇 (一) : 了解数据

让我们先从加利福尼亚州的房价说起 如果没有接触过机器学习&#xff0c;需要先进行环境配置 在每次开始之前都需要先运行以下代码,不报错方可继续 # Python 的版本需要大于3.5 import sys assert sys.version_info > (3, 5)# Scikit-Learn的版本需要大于0.20 import sklear…

我用python分析买房数据

首先说明&#xff0c;这是一篇技术文章。 明年打算买房&#xff0c;媳妇这段时间总去看房子&#xff0c;这种状态持续了两个月&#xff0c;最近终于消停了。现在整个市场不明朗&#xff0c;我们也不确定换到哪里。不如先整理点数据&#xff0c;至少能监控一些区域价格&#xf…

波士顿房价数据集怎么不见了?

波士顿数据下载 消失的波士顿 OoO 做线性回归的同学大概率会用到一个数据集&#xff0c;即波士顿房价数据集&#xff0c;然而当你从sklearn下载该数据集时&#xff0c;你会惊讶地发现居然下载不了了&#xff01;&#xff01;&#xff01;起初我以为是什么别的原因导致数据集可能…

【Python数据分析】波士顿房价分析小例子

一、导入模块 %matplotlib inline #将生成的图片嵌入网页中 import matplotlib.pyplot as plt from sklearn import datasets from sklearn.feature_selection import SelectKBest,f_regression from sklearn.linear_model import LinearRegression …

基于pyspark的波士顿房价预测案例

目录 一、问题描述&#xff1a; 二、机器学习预测模型概述&#xff1a; 三、数据获取 四、数据预处理 五、模型训练 六、模型评估 本实验包含线性回归模型、梯度上升回归、决策树、随机森林、梯度回归树五种模型的创建和比较以及加载&#xff01; 一、问题描述&#xff…

python广深地区房价数据的爬取与分析

Python房产数据分析 1、数据爬取2、明确需求与目的数据预览提出问题 3.数据预处理数据清洗缺失值异常值(对连续性标签做处理&#xff09;异常值(对离散标签做处理&#xff09; 4、数据分析问题1、广东省房价的总体情况如何&#xff1f;问题2、高端小区都有哪些&#xff1f;问题…

ChatGPT的介绍与运用

ChatGPT的发展 ChatGPT是OpenAI团队开发的一种基于语言模型的对话系统 GPT-1&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;是OpenAI发布的第一个基于Transformer架构的语言模型。GPT-1于2018年发布&#xff0c;它使用了无监督学习的方法&#…

离线语音交互技术路线之语音合成(TTS)篇

在ChatGPT大行其道之际&#xff0c;我心血来潮想要研究研究如何实现离线语音交互&#xff0c;把它和ChatGPT相结合&#xff0c;自己尝试实现个语音助手玩玩。本篇文章主要先从整体上分析了离线语音交互的技术实现路线&#xff0c;以及每个环节可能用到的参考技术&#xff0c;然…

Linux中文显示乱码问题

终端输入命令回显的时候中文显示乱码&#xff0c;出现这个情况一般是由于没有安装中文语言包&#xff0c;或者设置的默认语言有问题导致的。 Linux系统与windows系统在编码上有显著的差别。Windows中的文件的格式默认是GBK(gb2312)&#xff0c;而Linux系统中文件的格式默认是UT…

解决中文乱码问题大全

相信大家在开发过程中遇到很多中文乱码的问题,为此小编在这里汇集了很多不同情况下怎么解决中文乱码,希望对大家有所帮助 1、IDEA控制台输出乱码 修改idea配置文件:找到idea的安装目录,在bin目录下找到dea64.exe.vmoptions和idea.exe.vmoptions这两个文件,分别在这两个文…

解决中文乱码的方法

今天跟路飞学习爬虫时&#xff0c;遇到的中文乱码。他提出了一种解决方法&#xff0c;而我在弹幕上也看到了一种方法。 法1&#xff1a;在响应数据时加一句 response.encoding response.apparent_encoding 法2&#xff1a; #通用处理中文乱码的解决方法img_name img_name.en…

中文乱码问题整理总结

目录 1、字符编码 2、乱码产生的原因 3、乱码解决方案 3.1、解决HTML页面中的中文问题&#xff1a; 3.2、解决JSP页面中的中文问题 3.3、解决Servlet响应结果的中文问题 3.4解决页面数据传输的中文问题 3.5、解决HTTP(get)请求中的中文问题 3.6、解决MySQL数据库的中文…

php echo中文乱码问题

用echo输出的中文显示成乱码&#xff0c; 其实应该是各种服务器脚本都会遇到这个问题&#xff0c; 根本还是编码问题&#xff0c; 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 这时候要正常显示中文需要转化一下编码方式&#xff0c;比如 echo iconv(“…

中文出现乱码最常见的几种方式解析

1、出现古文夹杂日韩文&#xff0c;以GBK读取UTF-8编码 2、出现方块形&#xff0c;以UTF-8读取GBK 3、各种符号&#xff0c;以ISO8859-1方式读取UTF-8 4、拼音码&#xff0c;带声调的字母&#xff0c;以ISO8859-1方式读取GBK 5、长度为奇数时&#xff0c;最后的字符变成问号&am…

SEO百度搜索引擎优化30min了解网站排名

目录 seo优化 介绍seo是什么 网站更新&#xff1a; 网站排名在21世纪的意义: 网站为电商引流 百度算法规则 排名流程 seo策略 规则——“学会在线球里玩” 单页面收录显示 必要条件——链接数量 日志统计——及时优化seo策略 降低识别难度 收录越多排名就越大吗 …

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记

毕设项目《基于STM32的智能乒乓球捡球小车的设计与实现》从零开始过程笔记 小车实物 前言 本文是后来记录而写&#xff0c;如有不足之处&#xff0c;欢迎批评指正。 如果您觉得文章写得不错&#xff0c;欢迎一键三连。&#xff08;比心 orz&#xff09; 目录 毕设项目《基于S…

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里

最强的文本生成模型GPT-4 一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展 四、与之前 GPT 系列模型比较五…