成都二手房调查分析

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

房屋价格分析

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


区域分析
房屋热度
房屋布局分析
房屋年限

决策树分析

可以知区域布局在二手房市场中影响比例最大,贷款业务中应当主要考虑这两个维度。

词云分析

【四】 结论报告

小面积房屋分析
分析结论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容