【数据分析】项目实战

成都二手房调查分析

2018-08-07  本文已影响78人  Ziger丶

背景:新住房政策颁布,影响了成都房屋销售市场。需要了解近期二手房市场的热门房屋信息,以调整贷款产品。
数据:爬取二手房交易网站近期数据,成都各个区域交易热度较高的房屋信息。
目标:分析成都各区域二手房市场走势,了解各区域交易情况,通过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个档位。

房屋价格分析

一下选择各个区域的热门房屋进行分析。


区域分析 房屋热度 房屋布局分析 房屋年限 决策树分析
可以知区域布局在二手房市场中影响比例最大,贷款业务中应当主要考虑这两个维度。 词云分析

【四】 结论报告

小面积房屋分析 分析结论
上一篇 下一篇

猜你喜欢

热点阅读