python上海房价数据分析统计服_(干货)数据分析案例--以上海二手房为例

如果你手上有一批数据,你可能应用统计学、挖掘算法、可视化方法等技术玩转你的数据,但你没有数据的时候,我该怎么玩呢?接下来就带着大家玩玩没有数据情况下的数据分析。

本文从如下几个目录详细讲解数据分析的流程:

1、数据源的获取;

2、数据探索与清洗;

3、模型构建(聚类算法和线性回归);

4、模型预测;

5、模型评估;

一、数据源的获取

正如本文的题目一样,我要分析的是上海二手房数据,我想看看哪些因素会影响房价?哪些房源可以归为一类?我该如何预测二手房的价格?可我手上没有这样的数据样本,我该如何回答上面的问题呢?

互联网时代,网络信息那么发达,信息量那么庞大,随便找点数据就够喝一壶了。前几期我们已经讲过了如何从互联网中抓取信息,采用Python这个灵活而便捷的工具完成爬虫,例如:

当然,上海二手房的数据仍然是通过爬虫获取的,爬取的平台来自于链家,页面是这样的:

我所需要抓取下来的数据就是红框中的内容,即上海各个区域下每套二手房的小区名称、户型、面积、所属区域、楼层、朝向、售价及单价。先截几张Python爬虫的代码,源代码和数据分析代码写在文后的链接中,如需下载可以到指定的百度云盘链接中下载。

上面图中的代码是构造所有需要爬虫的链接。

上面图中的代码是爬取指定字段的内容。

爬下来的数据是长这样的(总共28000多套二手房):

二、数据探索与清洗(一下均以R语言实现)

当数据抓下来后,按照惯例,需要对数据做一个探索性分析,即了解我的数据都长成什么样子。

1、户型分布

# 户型分布

library(ggplot2)

type_freq

# 绘图

type_p

type_p

我们发现只有少数几种的户型数量比较多,其余的都非常少,明显属于长尾分布类型(严重偏态),所以,考虑将1000套一下的户型统统归为一类。

# 把低于一千套的房型设置为其他

type

house$type.new

type_freq

# 绘图

type_p

type_p

2、二手房的面积和房价的分布

# 面积的正态性检验

norm.test(house$面积)

# 房价的正态性检验

norm.test(house$价格.W.)

上面的norm.test函数是我自定义的函数,函数代码也在下文的链接中,可自行下载。从上图可知,二手房的面积和价格均不满足正态分布,那么就不能直接对这样的数据进行方差分析或构建线性回归模型,因为这两种统计方法,都要求正态性分布的前提假设,后面我们会将讲解如何处理这样的问题。

3、二手房的楼层分布

原始数据中关于楼层这一变量,总共有151种水平,如地上5层、低区/6层、中区/11层、高区/40层等,我们觉得有必要将这151种水平设置为低区、中区和高区三种水平,这样做有助于后面建模的需要。

# 把楼层分为低区、中区和高区三种

house$floow

# 各楼层类型百分比分布

percent

df

df

df

可见,三种楼层的分布大体相当,最多的为高区,占了36.1%。

4、上海各地区二手房的均价

# 上海各区房价均价

avg_price

#绘图

p

p

很明显,上海二手房价格最高的三个地区为:静安、黄埔和徐汇,均价都在7.5W以上,价格最低的三个地区为:崇明、金山和奉贤。

5、房屋建筑时间缺失严重

建筑时间这个变量有6216个缺失,占了总样本的22%。虽然缺失严重,但我也不能简单粗暴的把该变量扔掉,所以考虑到按各个区域分组,实现众数替补法。这里构建了两个自定义函数:

library(Hmisc)

# 自定义众数函数

stat.mode

if (rm.na == TRUE){

y = x[!is.na(x)]

}

res = names(table(y))[which.max(table(y))]

return(res)

}

# 自定义函数,实现分组替补

my.impute

miss.col = NULL, method = stat.mode){

impute.data = NULL

for(i in as.character(unique(data[,category.col]))){

sub.data = subset(data, data[,category.col] == i)

sub.data[,miss.col] = impute(sub.data[,miss.col], method)

impute.data = c(impute.data, sub.data[,miss.col])

}

data[,miss.col] = impute.data

return(data)

}

# 将建筑时间中空白字符串转换为缺失值

house$建筑时间[house$建筑时间 == '']

#分组替补缺失值,并对数据集进行变量筛选

final_house

#构建新字段,即建筑时间与当前2016年的时长

final_house

#删除原始的建筑时间这一字段

final_house

最终完成的干净数据集如下:

接下来就可以针对这样的干净数据集,作进一步的分析,如聚类、线性回归等。

三、模型构建

这么多的房子,我该如何把它们分分类呢?即应该把哪些房源归为一类?这就要用到聚类算法了,我们就使用简单而快捷的k-means算法实现聚类的工作。但聚类前,我需要掂量一下我该聚为几类?根据聚类原则:组内差距要小,组间差距要大。我们绘制不同类簇下的组内离差平方和图,聚类过程中,我们选择面积、房价和单价三个数值型变量:

tot.wssplot

#假设分为一组时的总的离差平方和

tot.wss

for (i in 2:nc){

#必须指定随机种子数

set.seed(seed)

tot.wss[i]

}

plot(1:nc, tot.wss, type="b", xlab="Number of Clusters",

ylab="Within groups sum of squares",col = 'blue',

lwd = 2, main = 'Choose best Clusters')

}

# 绘制不同聚类数目下的组内离差平方和

standrad

myplot

当把所有样本当作一类时,离差平方和达到最大,随着聚类数量的增加,组内离差平方和会逐渐降低,直到极端情况,每一个样本作为一类,此时组内离差平方和为0。从上图看,聚类数量在5次以上,组内离差平方降低非常缓慢,可以把拐点当作5,即聚为5类。

# 将样本数据聚为5类

set.seed(1234)

clust

table(clust$cluster)

# 按照聚类的结果,查看各类中的区域分布

table(final_house$区域,clust$cluster)

# 各户型的平均面积

aggregate(final_house$面积, list(final_house$type.new), mean)

# 按聚类结果,比较各类中房子的平均面积、平均价格和平均单价

aggregate(final_house[,3:5], list(clust$cluster), mean)

从平均水平来看,我大体可以将28000多套房源合成为如下几种说法:

a、大户型(3室2厅、4室2厅),属于第2类。平均面积都在130平以上,这种大户型的房源主要分布在青浦、黄埔、松江等地(具体可从各类中的区域分布图可知)。

b、地段型(房价高),属于第1类。典型的区域有黄埔、徐汇、长宁、浦东等地(具体可从各类中的区域分布图可知)。

c、大众蜗居型(面积小、价格适中、房源多),属于第4和5类。典型的区域有宝山、虹口、闵行、浦东、普陀、杨浦等地

d、徘徊型(大户型与地段型之间的房源),属于第3类。典型的区域有奉贤、嘉定、青浦、松江等地。这些地区也是将来迅速崛起的地方。

# 绘制面积与单价的散点图,并按聚类进行划分

p

p

p + scale_colour_manual(values = c("red","blue", "green", "black", "orange"))

接下来我想借助于已有的数据(房价、面积、单价、楼层、户型、建筑时长、聚类水平)构建线性回归方程,用于房价因素的判断及预测。由于数据中有离散变量,如户型、楼层等,这些变量入模的话需要对其进行哑变量处理。

# 构造楼层和聚类结果的哑变量

# 将几个离散变量转换为因子,目的便于下面一次性处理哑变量

final_house$cluster

final_house$floow

final_house$type.new

# 筛选出所有因子型变量

factors

# 将因子型变量转换成公式formula的右半边形式

formula

dummy

pred

head(pred)

# 将哑变量规整到final_house数据集中

final_house2

# 筛选出需要建模的数据

model.data

# 直接对数据进行线性回归建模

fit1

summary(fit1)

从体看上去还行,只有建筑时长和2室0厅的房型参数不显著,其他均在0.01置信水平下显著。不要赞赞自喜,我们说,使用线性回归是有假设前提的,即因变量满足正态或近似于正态分布,前面说过,房价明显在样本中是偏态的,并不服从正态分布,所以这里使用COX-BOX变换处理。根据COX-BOX变换的lambda结果,我们针对y变量进行转换,即:

# Cox-Box转换

library(car)

powerTransform(fit1)

根据结果显示,0.23非常接近上表中的0值,故考虑将二手房的价格进行对数变换。

fit2

summary(fit2)

这次的结果就明显比fit1好很多,仅有楼层的中区在0.1置信水平下显著,其余变量均在0.01置信水平下显著,而且调整的R方值也提高到了94.3%,即这些自变量对房价的解释度达到了94.3%。

最后我们再看一下,关于最终模型的诊断结果:

# 使用plot方法完成模型定性的诊断

opar

par(mfrow = c(2,2))

plot(fit2)

par(opar)

从上图看,基本上满足了线性回归模型的几个假设,即:残差项服从均值为0(左上),标准差为常数(左下)的正态分布分布(右上)。基于这样的模型,我们就可以有针对性的预测房价啦~

今天的学习过程就到这里,如果有疑问可以给我留言或者加微信(lsx19890717)详聊。本文中的爬虫代码、R语言脚本和数据均可在如下链接中获取:

大家也可以加小编微信:tswenqu,进R语言中文社区 交流群。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
影响上海房价的因素众多,包括但不限于地理位置、供求关系、经济发展水平、政策调控、人口流动、基础设施建设等。要进行相关的数据挖掘和分析,你可以使用Python编程语言,结合Pandas库处理数据,NumPy进行数值计算,以及Scikit-learn或TensorFlow等机器学习库来进行预测模型构建。以下是一个简单的步骤概述: 1. 数据收集: - 网络爬虫:获取公开的房地产数据(如链家、安居客等平台),包括房价、面积、区域、时间戳等信息。 - 政策数据:政府发布的房价调控政策、土地供应计划等。 2. 数据预处理: - 数据清洗:去除缺失值、异常值,统一数据格式。 - 特征工程:将文本数据转化为数值特征(如通过词袋模型处理区域描述),归一化或标准化数据。 3. 特征选择与分析: - 使用相关性分析确定哪些特征对房价影响最大。 - 可能会用到特征重要性评估方法,如随机森林或Lasso回归。 4. 模型建立: - 回归模型:可以选择线性回归、岭回归、Lasso回归等预测房价变化。 - 时间序列分析:如果数据有时间序列特性,可以考虑ARIMA或长短期记忆网络(LSTM)。 5. 模型训练与评估: - 划分训练集和测试集,训练模型并调整参数。 - 用交叉验证确保模型泛化能力,评估指标可能包括均方误差、R²分数等。 6. 结果解读与可视化: - 分析模型预测结果,解释各因素对房价的影响程度。 - 生成图表展示房价走势和影响因素的关系。 相关问题: 1. 上海房价数据的主要来源是什么? 2. 在特征工程中如何处理非结构化的区域描述信息? 3. 如何根据模型预测结果优化影响房价的关键因素策略?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值