背景:新住房政策颁布,影响了成都房屋销售市场。需要了解近期二手房市场的热门房屋信息,以调整贷款产品。
数据:爬取二手房交易网站近期数据,成都各个区域交易热度较高的房屋信息。
目标:分析成都各区域二手房市场走势,了解各区域交易情况,通过SPSS为房屋处置提供数据支持,做出可视化报告。
潜在风险:贷款项目受房价行情影响较大,存在房价波动、变现难等风险。目前二次抵押在所有住宅抵押项目中占比例较多。(二次抵押:房屋剩余价值进行抵押借款。二抵无法享受优先受偿权,因此风险较一抵稍大)
制定目标——获取数据——挖掘&分析——撰写报告
针对成都二手房市场,近期的变动做出分析与预测。
【一】 爬取数据
选择的是目前成都最大的二手房屋交易网站贝壳网,以热度为标准,爬取相关房屋信息。
import requests
from lxml import etree
import pandas as pd
import re
IO='https://cd.ke.com/ershoufang/?utm_source=baidu&utm_medium=ppc&utm_term=%E8%B4%9D%E5%A3%B3&utm_content=%E5%93%81%E7%89%8C_%E5%93%81%E7%89%8C&utm_campaign=%E6%88%90%E9%83%BD_%E5%93%81%E7%89%8C_%E7%B2%BE%E7%A1%AE'
r=requests.get(IO)
data=etree.HTML(r.text)
area=data.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div[1]/div/a/text()')
link=data.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div[1]/div[1]/a/@href')
#爬取房屋名(每个区域带看次数最多的前90户)
def Name(link):
NAME=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
name=data.xpath('''//div[4]/div[1]/ul/li/div[1]/div[1]//a[@class='CLICKDATA']/text()''')
A=A+name
NAME=NAME+A
NAME=pd.DataFrame(pd.Series(NAME),columns=['名字'])
return (NAME)
#爬取房屋总价
def All(link):
ALL=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
all=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[6]/div[1]/span/text()')
A=A+all
ALL=ALL+A
ALL=pd.DataFrame(pd.Series(ALL),columns=['总价(万元)'])
return (ALL)
#爬取房屋单价
def Price(link):
PRICE=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
price=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[6]/div[2]/span/text()')
a=[]
for i in price:
b=re.sub("\D", "",(i.split('/')[0]))
a.append(b)
A=A+a
PRICE=PRICE+A
PRICE=pd.DataFrame(pd.Series(PRICE),columns=['均价(¥/m^2)'])
return(RICE)
#爬取房屋查看人数
def Number(link):
NUMBER_1=[]
NUMBER_2=[]
for i in link:
A=[]
B=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
number=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[4]/text()')
number1=[]
number2=[]
for i in number:
a=re.sub("\D", "",(i.split('/')[0]))
b=re.sub("\D", "",(i.split('/')[1]))
number1.append(a)
number2.append(b)
A=A+number1
B=B+number2
NUMBER_1=NUMBER_1+A
NUMBER_2=NUMBER_2+B
NUMBER_1=pd.DataFrame(pd.Series(NUMBER_1),columns=['关注人数'])
NUMBER_2=pd.DataFrame(pd.Series(NUMBER_2),columns=['带看人数'])
return (NUMBER_1,NUMBER_2)
#房间布局,面积
def Style(link):
STYLE=[]
SIZE=[]
for i in link:
A=[]
B=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
s=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[2]/div/text()')
style=[]
size=[]
for i in s:
style.append(i.split('|')[1])
size.append(i.split('|')[2])
A=A+style
B=B+size
STYLE=STYLE+A
SIZE=SIZE+B
STYLE=pd.DataFrame(pd.Series(STYLE),columns=['布局'])
SIZE=pd.DataFrame(pd.Series(SIZE),columns=['面积(m^2)'])
return( STYLE,SIZE)
#所在小区
def Street(link):
NAME_2=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
where=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[2]/div/a/text()')
A=A+where
NAME_2=NAME_2+A
NAME_2=pd.DataFrame(pd.Series(NAME_2),columns=['小区'])
return(NAME_2)
#位置
def Location(link):
WHERE=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
where=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[3]/div/a/text()')
A=A+where
WHERE=WHERE+A
WHERE=pd.DataFrame(pd.Series(WHERE),columns=['具体方位'])
return (WHERE)
#建筑时间
def Age(link):
AGE=[]
for i in link:
A=[]
url='https://cd.ke.com'+'{}'.format(i)
for j in range(1,4):
if j== 1:
url1=url +'/co52/'
else:
url1=url +'/pg%dco52/' %j
r=requests.get(url1,timeout=5)
data=etree.HTML(r.text)
s=data.xpath('//div[4]/div[1]/ul/li/div[1]/div[3]/div/text()')
age=[]
for i in s:
a=re.sub("\D", "",i)
if len(a)<4:
age.append('NAN')
else:
age.append(a[-4:])
A=A+age
AGE=AGE+A
AGE=pd.DataFrame(pd.Series(AGE),columns=['建筑时间'])
return (AGE)
#汇总表格
if __name__ == '__main__':
NAME = Name(link)
NAME_2 = Street(link)
WHERE = Location(link)
STYLE,SIZE = Style(link)
ALL = All(link)
PRICE = Price(link)
NUMBER_1,NUMBER_2 = Number(link)
AGE = Age(link)
_房屋信息=pd.concat([NAME,NAME_2,WHERE,STYLE,SIZE,ALL,PRICE,NUMBER_1,NUMBER_2,AGE],axis=1)
return (_房屋信息)
爬取完成后导入Excel文件
【二】 数据清洗
根据业务经验选择出影响因素较大的特征维度进行分析。
文本数值化:因为房屋具体位置在分析中所占有的比例较高,因此带如SPSS操作时进行二次处理。
eg: 锦江区—东大路 替换为 1001
缺失值填充:若缺失值超过80%放弃此维度,有连续规律的进行计算后填充,无规律空值使用pd.NAN进行填充。
将数据简易清洗后得到额外两张表格
【三】 图表分析
通过Spss分析清洗后的数据,做出可视化分析报告。
目前成都各区域房价主要分层4个档位。
一下选择各个区域的热门房屋进行分析。
可以知区域和布局在二手房市场中影响比例最大,贷款业务中应当主要考虑这两个维度。