机器学习流程

  • 需求分析
  • 数据采集
  • 数据清洗
  • 数据分析
  • 模型结果

需求分析

数据采集

数据清洗

数据分析

模型结果

1、需求分析
因为家住在合肥,希望通过分析下二手房的房价看看做个参考
2、数据采集
之前准备在安居客上爬二手房的数据,但是安居客的robots.txt文件禁止爬取内容,我之前试了不少次安居客都警告我不能爬了,所以我掉转转战链家,链家的网站是 link.,爬取了50页的数据,代码如下:

#链家合肥二手房数据爬取
from openpyxl import load_workbook,Workbook
import requests
import openpyxl as op
from bs4 import BeautifulSoup
import numpy as np
hp=[]
hl=[]
#爬取50页的数据
for i in range(1,51,1):#伪装请求头headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0'}res=requests.get('https://hf.lianjia.com/ershoufang/pg'+str(i)+'/',headers=headers)house_info=BeautifulSoup(res.text,'html.parser')#爬取房价(how much/m**2)house_price=house_info.find_all('div',class_='unitPrice')# house_basic=house_info.find_all('div',class_="houseInfo")#爬取二手房地址house_loc=house_info.find_all('div',class_="positionInfo")for i in house_price:hp.append(i.text)for k in house_loc:hl.append(k.text)
#写入已有的excel文件
def write(num_list,col_num):                                                 bg = op.load_workbook(r"hefei_secondary_hand_house.xlsx")       sheet = bg.active                                  for i in range(1, len(num_list)+1):                        sheet.cell(i,col_num,num_list[i - 1])                   bg.save("hefei_secondary_hand_house.xlsx")
write(hl,8)
write(hp,9)

我们看看爬取的数据(部分截图):

3、数据清洗
爬取的数据比较混乱,比如说有些房子只有结构的信息(比如板塔结合),而没有建造时间,而有些房子既有建造时间也有结构的信息,所以我们要将有些没有建造时间的数据进行删除,这样方便我们分析。对于几室几厅,我们可以对其进行相加;对于多少平米,我们去掉后面的平米并将数据化为int;朝向、状态和结构是分类变量,我们可以之后创建哑变量;对于楼层我们可以对低楼层进行总楼层/4向上取整作为变量的值,对于中楼层进行总楼层整除2作为变量的值,对于高楼层进行总楼层乘3向下取整再整除4作为变量的值;建造时间变量的值修改为(2022-建造时间);房价均价取出整数部分;小区位置参考博客link.,计算小区位置与安徽省政府的距离作为变量的值。具体jupyter代码如下:

import pandas as pd
import math
data=pd.read_excel('hefei_secondary_hand_house.xlsx',engine='openpyxl',header=None,\names=['户型','面积','朝向','状态','楼层位置','建造时间','结构','小区位置','均价'])
#删除数据
need_del=[]
for i in range(len(data['建造时间'])):if data['建造时间'][i][-2]!='建':need_del.append(i)
data.drop(data.index[need_del],inplace=True)
data= data.reset_index(drop=True)
for i in range(len(data['户型'])):data['户型'][i]=int(data['户型'][i][0])+int(data['户型'][i][2])
for i in range(len(data['面积'])):data['面积'][i]=float(data['面积'][i][1:-3])
for i in range(len(data['朝向'])):if len(data['朝向'][i])<=4:data['朝向'][i]='单面'elif len(data['朝向'][i])<=6:data['朝向'][i]='双面'else:data['朝向'][i]='三面'
for i in range(len(data['状态'])):data['状态'][i]=data['状态'][i].replace(" ","")
for i in range(len(data['楼层位置'])):if data['楼层位置'][i][-2]=='层':data['楼层位置'][i]=int(data['楼层位置'][i][1:-2])elif data['楼层位置'][i][1]=='下':data['楼层位置'][i]=2else:if data['楼层位置'][i][1]=='低':data['楼层位置'][i]=math.ceil(int(data['楼层位置'][i][6:-3])/4)elif data['楼层位置'][i][1]=='中':data['楼层位置'][i]=int(data['楼层位置'][i][6:-3])//2else:data['楼层位置'][i]=(int(data['楼层位置'][i][6:-3])*3)//4
for i in range(len(data['建造时间'])):data['建造时间'][i]=2022-int(data['建造时间'][i][1:-3])
for i in range(len(data['结构'])):data['结构'][i]=data['结构'][i].replace(" ","")
#为了方便后面使用高德地图的地理编码API,把地址改成逐级递减的形式
for i in range(len(data['小区位置'])):data['小区位置'][i]=data['小区位置'][i].replace(" ","")
for i in range(len(data['小区位置'])):arr='合肥市'for j in range(len(data['小区位置'][i].split('-'))-1,-1,-1):arr+=data['小区位置'][i].split('-')[j]data['小区位置'][i]=arrarr=''
for i in range(len(data['均价'])):data['均价'][i]=data['均价'][i].replace(" ","")data['均价'][i]=data['均价'][i].replace(",","")
for i in range(len(data['均价'])):data['均价'][i]=int(data['均价'][i][:-3])
#最后将数据写入csv文件
data.to_csv('data_stats.csv',header=True,index=None,encoding='utf-8')

查看部分数据:
接下来就是利用高德开放平台,网址link.,注册一个,注册好了点击控制台,点击应用管理,创建新应用,查看link.申请一个key,然后就可以得到每个地方的经纬度了。具体代码如下:

import requests
import json
from math import sin, asin, cos, radians, fabs, sqrt
import pandas as pd
EARTH_RADIUS = 6371      # 地球平均半径大约6371kmdef hav(theta):s = sin(theta / 2)return s * sdef get_distance_hav(lat0,lng0,lat1,lng1):# 用haversine公式计算球面两点间的距离# 经纬度转换成弧度lat0 = radians(lat0)lat1 = radians(lat1)lng0 = radians(lng0)lng1 = radians(lng1)dlng = fabs(lng0 - lng1)dlat = fabs(lat0 - lat1)h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)distance = 2 * EARTH_RADIUS * asin(sqrt(h))      # kmreturn round(distance,2)
#这是安徽省政府的经纬度
base_lat_lng=[31.733195, 117.325963]
xq_location=pd.read_csv('data_stats.csv')
for j in range(len(xq_location['小区位置'])):arr=[]url = 'https://restapi.amap.com/v3/geocode/geo'       # 输入API问号前固定不变的部分params = {'key':'5957eabb12999886bf8dbdc76bdb7791',   # 注册高德地图,创建应用获得的key,这是我自己创建的key'address': xq_location['小区位置'][j]}                      # 将两个参数放入字典res = requests.get(url, params)results = json.loads(res.text)# 打印结果for i in range(len(results["geocodes"][0]["location"].split(','))-1,-1,-1):arr.append(float(results["geocodes"][0]["location"].split(',')[i]))xq_location['小区位置'][j]=get_distance_hav(base_lat_lng[0],base_lat_lng[1],arr[0],arr[1])arr=[]
#将数据清洗后的结果写入csv文件
xq_location.to_csv('hefei_sechouse_data_stats.csv',header=True,index=None,encoding='utf-8')

4、数据分析与可视化
sklearn中的linear_model

#jupyter
import pandas as pd
import numpy as np
from sklearn.utils import shuffle
from sklearn import linear_model
from sklearn.metrics import mean_squared_error,r2_score
datasets=pd.read_csv('hefei_sechouse_data_new.csv')
data_array=np.array(datasets)
data,target=data_array[:,0:-1],np.log(data_array[:,-1])
X,y=shuffle(data,target,random_state=123)
offset=int(X.shape[0]*0.8)
X_train,y_train=X[:offset],y[:offset]
X_test,y_test=X[offset:],y[offset:]
y_train=y_train.reshape((-1,1))
y_test=y_test.reshape((-1,1))
# print("X_train's shape",X_train.shape)
# print("X_test's shape",X_test.shape)
# print("y_train's shape",y_train.shape)
# print("y_test's shape",y_test.shape)
X_train,y_train
------------------分隔线------------------
sk_lasso=linear_model.Lasso(alpha=0.1)
clf=linear_model.Ridge(alpha=0.01)
regr=linear_model.LinearRegression(fit_intercept=True,normalize=False)
sk_lasso.fit(X_train,y_train)
clf.fit(X_train,y_train)
regr.fit(X_train,y_train)
y_pred_lasso=sk_lasso.predict(X_test)
y_pred_ridge=clf.predict(X_test)
y_pred=regr.predict(X_test)
# print("mean squared error: %.2f"% mean_squared_error(y_test,y_pred))
print('R Square score: %.2f'% r2_score(y_test,y_pred))
print('LASSO R Square score: %.2f'% r2_score(y_test,y_pred_lasso))
print('Ridge R Square score: %.2f'% r2_score(y_test,y_pred_ridge))
# print(sk_lasso.coef_)
print(regr.coef_)
print(sk_lasso.coef_)
print(clf.coef_)

未引入哑变量:
R Square score: 0.25
LASSO R Square score: 0.26
Ridge R Square score: 0.25
[[ 0.01842696 -0.00057685 0.01486218 -0.01579192 0.00080404 0.00033422
0.01900491 -0.02674357]]
[ 0.00000000e+00 -3.23163258e-05 0.00000000e+00 -0.00000000e+00
0.00000000e+00 -0.00000000e+00 0.00000000e+00 -2.41732531e-02]
[[ 0.0184266 -0.00057684 0.0148615 -0.01579173 0.00080405 0.00033421
0.01900436 -0.02674356]]

如果引入哑变量,可以用stats模块来进行分析
代码如下:

from statsmodels.formula.api import ols
house=pd.read_csv('hefei_sechouse_data_stats.csv')
norminal_data1=house['朝向']
norminal_data2=house['状态']
norminal_data3=house['结构']
dummies1=pd.get_dummies(norminal_data1)
dummies1.drop(columns=['三面'],inplace=True)
dummies2=pd.get_dummies(norminal_data2)
dummies2.drop(columns=['其他'],inplace=True)
dummies3=pd.get_dummies(norminal_data3)
dummies3.drop(columns=['暂无数据'],inplace=True)
results=pd.concat(objs=[house,dummies1,dummies2,dummies3],axis=1)
results=results.drop(columns=['朝向','状态','结构'])
# results
tmp='+'.join(results.drop(columns=['均价']).columns)
lm=ols(formula='均价 ~ {}'.format(tmp),data=results).fit()
lm.summary()


我们可以观察到R_squared的值为0.182,很小,模型拟合的很不好,所以我们还是用R_squared值更高的上述模型进行预测:

stats_array=np.array(results)
data_new,target_new=np.hstack((stats_array[:,0:5],stats_array[:,6:])),np.log(stats_array[:,5])
X_new,y_new=shuffle(data_new,target_new,random_state=123)
offset=int(X_new.shape[0]*0.8)
X_train_,y_train_=X_new[:offset],y_new[:offset]
X_test_,y_test_=X_new[offset:],y_new[offset:]
y_train_=y_train_.reshape((-1,1))
y_test_=y_test_.reshape((-1,1))
# print("X_train's shape",X_train.shape)
# print("X_test's shape",X_test.shape)
# print("y_train's shape",y_train.shape)
# print("y_test's shape",y_test.shape)
#X_train_,y_train_
# from linear_regression import *
# loss_his,params,grads=linear_train(X_train,y_train,0.01,200000)
# print(params)
sk_lasso_=linear_model.Lasso(alpha=0.01)
clf_=linear_model.Ridge(alpha=1000)
regr_=linear_model.LinearRegression(fit_intercept=True,normalize=False)
sk_lasso_.fit(X_train_,y_train_)
clf_.fit(X_train_,y_train_)
regr_.fit(X_train_,y_train_)
y_pred_lasso_=sk_lasso_.predict(X_test_)
y_pred_ridge_=clf_.predict(X_test_)
y_pred_=regr_.predict(X_test_)
# # print("mean squared error: %.2f"% mean_squared_error(y_test,y_pred))
# print('R Square score: %.3f'% r2_score(y_test_,y_pred_))
# print('LASSO R Square score: %.3f'% r2_score(y_test_,y_pred_lasso_))
# print('Ridge R Square score: %.3f'% r2_score(y_test_,y_pred_ridge_))
# # print(sk_lasso_.coef_)
# print(regr_.coef_)
# print(sk_lasso_.coef_)
# print(clf_.coef_)
#选取一个小区的二手房,参数写明,进行预测
near_my_home=[5,95.35,8,4,16.8,1,0,1,0,0,0,0,1,0]
pre=np.array([near_my_home])
y_pre_lasso=sk_lasso_.predict(pre)
y_pre_ridge=clf_.predict(pre)
y_pre=regr_.predict(pre)
print(np.exp(y_pre))
print(np.exp(y_pre_lasso))
print(np.exp(y_pre_ridge))

均价:
[[17133.67911903]]
[16501.90102646]
[[16604.71670699]]

5、 模型结果
该房子在链家上挂出的价格为16419RMB,LASSO回归预测的结果最为接近。

合肥二手房房价分析(多元线性回归)相关推荐

  1. 深圳二手房房价分析及预测

    分析目标: 通过处理后的房价数据,筛选对房价有显著影响的特征变量. 确定特征变量,建立深圳房价预测模型并对假设情景进行模拟 数据预处理 import pandas as pd import os fi ...

  2. 成都二手房房价分析-数据挖掘

    PricesDataAnalysis 本项目使用jupyter notebook开发,主要目的是分析成都二手房房价,项目地址. 数据:爬取二手房交易网站近期数据,成都各个区域交易热度较高的房屋信息. ...

  3. 【项目实战】北京二手房房价分析与预测

    项目简介 本项目根据个人需求进行北京二手房信息的数据分析,通过数据分析观察住房特征规律,利用机器学习模型进行简单的预测. 数据源 通过爬虫爬取第三方房屋中间商网站(链家和安居客)获取数据源,仅供学习使 ...

  4. 北京二手房房价分析(建模篇)

    数据科学俱乐部 中国数据科学家社区 本篇将继续上一篇数据分析用Python分析北京二手房房价之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目.结合两篇文章通过数据分析和挖掘的方法可以达到二手 ...

  5. 数据挖掘实战项目——北京二手房房价分析

    本次实战项目的主要目的是分析北京二手房房价,项目源自博文:入门Python数据分析最好的实战项目(一)和入门Python数据分析最好的实战项目(二).本篇文章仅记录博主在学习过程中的思路. 数据分析 ...

  6. 深圳二手房房价分析与建模预测(附数据集)

    之前帮师兄做了一个预测房价课题的demo,但是感觉效果不好,考虑到当时数据来源是长沙的房价数据,这次决定自己收集深圳的二手房数据来建模预测. 原本是准备上网找现成的数据集,结果很多github上的代码 ...

  7. spss多元线性回归散点图_案例分析 | 多元线性回归及SPSS操作

    一.案例 案例来源:中华护理杂志2018年3期 关于护士触摸舒适感的现状调查及其影响因素分析. 方法:2017年3月-5月,采用方便抽样的方法选取某市3所三级甲等医院的100名护士,采用护士一般资料调 ...

  8. 济南二手房房价分析报告

    author:qq:1318791335 # -*- coding: utf-8 -*- import numpy as np import pandas as pd import seaborn a ...

  9. 分析武汉二手房房价信息

    分析武汉二手房房价信息 1. 爬取数据源获取原始数据 2. 分析数据 1)分析武汉各区的二手房均价排名 2)查找武汉二手房均价前30位的区域 3)查找武汉二手房均价前20位的小区名称 4)分析各种户型 ...

  10. R语言波士顿房价分析

    最近帮GF用R语言做了一个波士顿房价的多元线性回归的作业,因为也是初次学习,可能内容会有一些问题,希望大家一起学习交流. R用的是3.5.3版本,下载都是来自China.Lanzhou. ###### ...

最新文章

  1. SQL Server 个人手册
  2. 考前自学系列·计算机组成原理·存储器画图
  3. c编程:输入一个数字n,则n代表n行,每行输入2个数字a,b计算每行的a+b问题。
  4. linux中添加一个用户到指定用户组的两种方式,修改一个用户到指定用户组的一种方式...
  5. heavy hitter是什么意思?
  6. 【线性代数公开课MIT Linear Algebra】 第十八课 行列式的性质
  7. 【CIKM2020】如何更为合适地评测推荐算法? Top-N物品推荐算法评测设置回顾
  8. Java多线程系列--【JUC锁04】-公平锁(二)
  9. 如何看apk支持的最低Android版本,目标Android版本?
  10. 1138: C语言合法标识符 C语言
  11. STM32F1基于正点原子HAL库IIC驱动SH1106芯片的OLED屏
  12. testflight测试的直播软件,TestFlight - Apple
  13. 博士五年,我在清华做时序数据库
  14. 维数定理(手推!):证明dim(v1)+dim(v2) = dim(v1+v2) + dim(v1∩v2)
  15. 多视角人脸正面化生成综述:Multi-view Frontal Face Image Generation: A Survey
  16. 智能化城市中数字孪生技术的发展趋势及在各领域的运用详情分析
  17. Windows server 2008 关闭135端口
  18. Redis | 安装Redis和启动Redis服务
  19. python求总数_python – 获取Pandas列的总数
  20. USB转网口转485转232转TTL等多接口互转调试工具,无需拨动开关自动切换连接

热门文章

  1. 软件环境常识 --dev sit uat
  2. 腾讯校招20道选择题含答案
  3. 访问计算机计算机网络密码忘记了怎么办,无线网密码忘记了怎么办?
  4. 苏宁易购为京东量身打造北京攻略
  5. ARM发展史,初步汇总
  6. Linuxmint 19双显卡切换的巨坑
  7. Live Streaming Paper--流媒体超低时延传输论文汇总
  8. 《实战java程序设计---上》
  9. 【机器学习详解】KNN分类的概念、误差率及其问题
  10. 计算机打字速度在线测试,在线测试打字速度(一分钟打字速度测试)