如何采集指定年份的poi_房价关键影响因素分析:从数据采集到建模全过程
生活随笔
收集整理的這篇文章主要介紹了
如何采集指定年份的poi_房价关键影响因素分析:从数据采集到建模全过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
決定房價高低的關鍵性因素分析
房價數據從采集到建模的詳細過程
以寧波為例
作? ? ? 者:數字567作者簡介:作者本人是CDA數據科學家,同時也是寧波校區的副校長本文共計6000字左右,如果不喜歡技術過程,可以直接閱讀文末分析結論。房價一直以來是全國老百姓熱議的話題,總結起來,無論對于剛需者還是投資者,無非關注兩方面的問題:(1)房價的發展趨勢是跌還是漲?這就需要對房價的時間發展趨勢進行分析預判。(2)哪個區域的房子更具投資價值?這個問題可以理解為某個時間節點下的數據挖掘問題。本文探索和回答的是第二個問題,圍繞這個目標567做了一件很多人喜聞樂見的事,展示了如何利用爬蟲數據進行數據分析的全流程。需要說明的是,雖然大部分人對于房價的影響因素都有所了解,但是哪些因素是關鍵的?關鍵因素對于房價的作用到底是如何促進和抑制的?像這類問題是大部人沒法回答的,這也就體現了數據分析的價值所在。因此,本文將回答兩方面的問題:(1)影響房價高低的因素中哪些是關鍵的;(2)這些關鍵因素哪些是制約因素,哪些是促進因素。1.數據采集
1.1 數據獲取
本人最怕浪費時間,所以直接用現成工具進行采集,共獲得3000多條數據(僅用于研究和學習,不用于任何商業目的)。數據導出為csv格式,方便各種工具調用和分析。1.2空間坐標補全
原始數據最大的問題是沒有空間坐標信息,但是不同區域的房價一般存在顯著差異,比如限購圈內的房子很可能就比限購圈外貴,所以補充坐標信息,以反映房子所在區位情況是必不可少的一步。同樣,為了節約時間,簡單地百度關鍵詞“python獲取百度坐標”,熟練地使用復制粘貼技能,并對代碼稍作更正,就能實現坐標獲取的目的。以下代碼定義了一個函數,用于坐標的獲取:import json,urllib,math# 根據地址獲取經緯度def getlnglat(address): url = 'http://api.map.baidu.com/geocoder/v2/' output = 'json' ak = 你的百度密鑰 # 瀏覽器端密鑰 address =urllib.parse.quote(address) # 由于本文地址變量為中文,為防止亂碼,先用quote進行編碼 uri = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak try: req = urllib.request.urlopen(uri) res = req.read().decode() temp = json.loads(res) # 緯度 lat = temp['result']['location']['lat'] # 經度 lng = temp['result']['location']['lng'] # 地址查找失敗 if math.isclose(lat,39.910925,rel_tol=1e-5): lat = None if math.isclose(lng, 116.413384, rel_tol=1e-5): lng = None except Exception as e: print(e) lng = None lat = None????return?lng,?lat有了上面這段代買,我們就可以根據小區名稱獲取對應的百度坐標了。將小區名稱另存為文本,在Python中簡單2行代碼即可搞定!f=open('./小區名稱.txt').readlines()xy=[[getlnglat('寧波'+addr.split('\n')[0])[0],getlnglat('寧波'+addr.split('\n')[0])[1]] for addr in f]with open('result.csv','a') as res: for each in xy:????????res.writelines(str(each[0])+','+str(each[1])+'\n')這樣坐標的問題就解決了。
1.4數據清洗
原始數據準備就緒,但是接踵而至的問題很多:(1)數據是不是直接可用?顯然不是;(2)哪些數據是重要的,哪些是不重要的?這個判斷有利于減少工作量;(3)坐標怎么利用?等。1.4.1坐標修正
坐標不對,分析結論和實際情況很可能大相徑庭!因此,懷著對百度的不信任,需要人工復查一遍坐標。打開arcgis,將小區可視化在地圖上。總體上來看,采集的數據點分布比較符合實際情況,呈現“中心密、郊區疏“的分布,且與各區縣的經濟發展情況大體一致。但是明顯可以看到有些點已經超出了寧波市域范圍,需要手動修正。于是,我們可以初步觀察下高房價都集中在哪些區域。圖中比較亮的連片的區域事實上就是寧波的那些核心片區了。如天一附近、東部新城、南部新城等。均價熱力圖分布1.4.2增加經驗性決策因素
從采集的原始數據字段來看,數據集并未體現很多我們關心的房價影響因素,這些因素有政策層面的、區位層面的、以及周邊開發層面的等。因此我們需要進一步進行數據加工。首先,567找到了寧波的限購圈范圍,據此在arcgis中標志出小區是否在限購圈內,下圖(右)中的藍色點表示在限購圈內,以此反映限購政策對房價的影響。其次,為了分析地鐵站對房價的影響,需要識別小區對應的最近地鐵站點,進而計算小區與地鐵站的距離。567使用了arcgis中的空間關聯方法實現了此步操作。最后,為了體現小區的區位(核心區、郊區、城鄉結合部等),567假設周邊設施種類越多且設施數量越多則區位能級越高。為了補充這個數據,需要采集電子地圖上的POI數據,這個有點小麻煩。同樣,為了節約時間,567直接花了百來塊大洋買了一份。這里567使用的是網格匹配法,將小區和POI均關聯至所在網格(1000米X1000米),以網格聚合數據作為小區的POI數量和POI類型數。POI數據樣表網格匹配1.4.3數據的初步清洗
數據的初步清洗是為下一步的分析和建模做準備,這與建模階段的數據清洗有所區別,你可以理解為粗加工和精加工的區別。因為567超級喜歡強大的powerquery,所以這里使用powerbi進行清洗,主要做了以下工作:?刪除毫無意義的字段:鏈接、地址、經紀人等;?規范化數據表達:將帶單位的面積、總價、建筑面積、首付等轉化成數值類型,建造年份轉化為日期等;?奇葩格式規整:去除數據中的空格、換行符、回車符等。?統一類別表達:將五花八門的房屋朝向表述,統一規范為東西、南北等。
?去重:去除明顯重復的數據,最后剩下的可用數據僅有1300多條。
1.4.4提取彩蛋性決策因素
從采集的數據中,我們發現有很多文本類描述信息,這些信息中非規范地表達了很多有用信息,比如學區房、在小區中的位置、采光等。這些在567看來就是非常重要的“彩蛋“性因素,能利用起來就能提高模型的分析價值。為了從文本信息中獲取更多信息,一個簡單的思路是對文本信息進行分詞和權重計算,據此提煉新的決策因素。針對分詞,567直接使用現成jieba包,百度抄一段代碼即可。分詞完還需要統計各個詞的詞頻或者權重,這里利用jieba包自帶的TF/IDF算法計算了下權重,原理可以自行拓展閱讀。# -*- coding:utf-8 -*-import jiebaimport jieba.analyse as anls #關鍵詞提取import codecsimport refrom collections import Counterclass WordCounter(object): def count_from_file(self, file, top_limit=0): with codecs.open(file, 'r', 'utf-8') as f: content = f.read() content = re.sub(r'\s+', r' ', content)#修飾空格 content = re.sub(r'\.+', r' ', content) return self.count_from_str(content, top_limit=top_limit) def count_from_str(self, content, top_limit=0): if top_limit <= 0: top_limit = 100 tags = jieba.analyse.extract_tags(content, topK=1000)#基于TF/IDF 計算詞的權重 words = jieba.cut(content) counter = Counter() for word in words: if word in tags: counter[word] += 1 return counter.most_common(top_limit)if __name__ == '__main__': counter = WordCounter() result = counter.count_from_file(r'./文本信息.txt', top_limit=100) with open('詞權重.csv','a') as wf: for each in result:????????????wf.writelines(each[0]+','+str(each[1])+'\n')關鍵詞權重分布最終獲得了如下關鍵詞的權重:權重(>900):南北通透權重(600-700):精裝權重(200-400):樓層、配套、方便、花園、成熟、地段、品質、采光、地鐵權重(<200):三房、全新、拎包、一表生、方正、滿二、電梯、滿五、毛胚、邊套、唯一住房、洋房、中庭、露臺、小學、全亮、視野、素質住戶、東首、得房率、急賣、學籍、商圈、特價、車位、車棚。結論1:詞權重越高,在本數據集合里意味著用詞較為頻繁,因此意味著區分度可能不是很高。反而權重較小的詞比如一表生、東首、車位等,更可能體現房子的區位優勢、小區中的位置優勢以及性價比優勢等。結論2:根據上述分析,在已有字段基礎上,考慮增加采光程度、是否拎包入住、是否學區房、小區內的位置(中庭、東首、邊套等)、是否送車位、是否送車棚、得房率高否、是否帶露臺、是否急賣等字段。先來解決簡單的問題,直接從每條記錄的文本中提取關鍵信息,并轉化為字段添加至房價數據表中,代碼如下。到這里,567認為已經把公開的、輕易就能獲取到的數據整理好了,那么就可以進行初步的探索和分析了。jieba.load_userdict("關鍵詞詞典.txt")#需要定義一個詞典來存放關鍵詞f=codecs.open('./文本信息.txt',encoding='utf-8').readlines()txts=[x.split('\t')[1].split('\n')[0] for x in f]ty={"配套是否成熟":['配套','商圈'], "采光程度":['采光佳','采光無遮擋','采光全天候','采光好','采光充足','采光無影響','采光溫和'], "是否拎包入住":['拎包'], "是否學區房":['一表生','學籍','讀書'], "是否有電梯":['電梯'], "小區位置":['中庭','東首','邊套'], "是否送車位":['車位'], "是否送車棚":['車棚'], "得房率高否":['得房率'], "是否帶露臺":['露臺'], "是否急賣":['急賣'] }#注意,txts中的第一個是字段名稱items=[]item={}for txt in txts: words=jieba.lcut(txt,cut_all=False) item={} for each in words: for i in range(len(ty.values())): vl=list(ty.values())[i]#值 key=list(ty.keys())[i]#key if each in vl: item[key]=each items.append(item)df=pd.DataFrame(items).fillna(0)df.replace({'配套':1,'商圈':1, '采光佳':'好','采光無遮擋':'好','采光全天候':'好','采光好':'好','采光充足':'充足','采光無影響':'無影響','采光溫和':'無影響', '拎包':1, '一表生':1,'學籍':1,'讀書':1, '電梯':1, '車位':1, '車棚':1, '得房率':1, '露臺':1, '急賣':1 },inplace=True)df['采光程度']=df['采光程度'].replace(0,'無影響')df['小區位置']=df['小區位置'].replace(0,'其他')df.to_csv('增加文本挖掘字段.csv',encoding='gbk')2.數據探索
2.1異常值
利用箱線圖發現,均價和面積存在幾個明顯的異常值,過于極端的數據直接刪除,部分異常值依然保留,留待建模過程中通過其他方法進行處理。2.2數據探索性分析
為了節約時間,這里聚焦分析這一重點,至于作圖規不規范、美不沒關,請忽略。2.2.1目標變量分布
從下圖可以看出,均價具有較為明顯的“正態”分布的特性,因此不需要進一步處理。寧波中心城的均價大概在2.5萬/平米~3.0萬/平米之間。房價頻率分布2.2.2交叉分析
進一步,我們可以分析不同因素對均價的影響,這是為了建立起建模前的一條底線,即我們在追求模型的精度時,不能罔顧實際情況,這就需要有對實際情況的大致了解,也就是交叉分析的意義所在,下面舉例說明。面積:面積與房價有一定關系,但并非咱們經驗認為的小面等同于高價,大面積等同于低價,90~140平米之間存在明顯的低谷。這與寧波首套房要繳納的契稅規定有關:140平方米及以上的非普通住宅、商鋪、寫字樓,140平方米以下的非家庭唯一住房,繳1.5%;面積90平方米以上140平方米以下的家庭唯一住房,繳0.75%;面積90平方米及以下的家庭唯一住房,繳0.5%。明明面積越大,納稅越高,為什么低谷出現在90~140平米之間呢?567猜測,賣得起140平米以上住宅的都基本都是“富人“,房子的品質肯定不用說了,這點稅對于他們來說基本可以忽略。我們可以稱140平米以上的區間是”富人游戲圈“。套型:總體上室/廳比例越高,均價越高,說明市場偏向實用性,用腳想想也能明白,一個房子里整太多客廳幾乎就意味著空間的浪費。另外,這里我們也能得到一個啟發,可以構造一個新的字段即室/廳比來解釋房價。是否限購:正如預期,限購區外的房價明顯低于限購區內的房價。與地鐵站的距離:從圖中可以看出,地鐵站對房價的影響還是比較明顯的,總體上離地鐵站越近,均價越高。是否學區房:這個字段是我們從文本信息中提煉出來的,可以發現,學區效應還是非常明顯的,即學區意味著高房價。3.建模
經過以上復雜的騷操作,我們終于來到了激動人心的建模環節。由于這一部分代碼過于復雜,567只講思路和結果,代碼部分就不予展示了。3.1數據清洗
這一步數據清洗,就是567前文中提到的精加工,由于數據量不大,且數據并不復雜,因此使用到的方法也相對簡單,主要工作內容包括:?識別變量類型:數值型變量和分類型變量需要分別進行處理;?缺失值填補:567利用了xgboost進行自動插值;?異常值處理:567采用的是蓋帽法。3.2特征選擇
對于數值型變量,采用相關系數進行統計分析,P值小于0.05的特征予以保留。對于類別型變量,采用方差檢驗判斷特征的重要性,同樣對于P值小于0.05的特征予以保留。3.3模型比選和調參
567使用了pycaret進行模型比選,可以發現Catboost和XGboost整體預測效果最好,且兩個模型效果較為接近,同時慮到xgb具有良好的兼容性、以及運行時間較短,最終選擇xgb進行調參。567使用了網格搜索法進行超參數調優,調參后模型預測性能明顯提升,模型在測試集上的解釋能力達到了75%,這個結果還是比較讓人滿意的。initial-train XGB: error=203940.108, r2=0.997initial-test XGB: error=16346142.845, r2=0.755當然,以上繁雜的過程,如dummy等,被省略了。關鍵的一步,我們還需要驗證殘差,發現殘差具有較好的正態分布特性。綜上,認為模型還是比較合適的。殘差分布圖3.4模型解釋
這里咱們就回到了本次分析的目的,如果你還記得的話,我們需要回答兩個問題:(1)影響房價高低的因素中哪些是關鍵的;(2)這些關鍵因素哪些是制約因素,哪些是促進因素。因此,模型解釋是建模過程中非常關鍵的一步,一般模型自帶的特征分析功能往往不是非常理想,所以567使用了SHAP分析方法對模型進行解釋。針對第一個問題我們分析了特征的重要性排名,這里567只提下關鍵因素和重要因素,這些也是建議買房者需要著重考慮的因素。?關鍵因素:可以發現在所有可能對房價有影響的因素中,是否限購這種政策類因素是最為顯著的,這也就印證了無數的事實,限制意味著爆發!?重要因素:POI類型數量、POI數量體現了小區周邊開發的成熟度,這兩個因素對房價影響也較為明顯。此外,樓層數、與地鐵站距離、面積大小,也是房價高低的考慮因素。針對第二個問題我們給出了SHAP圖,這里567也只撿重要的講一下。?圖怎么看:SHAP圖中每一行代表一個影響因素,橫坐標為SHAP值(值越高說明影響越大,正值表示對房價有促進作用,負值表示對房價有抑制作用)。一個點代表一個樣本,顏色表示該樣本的影響因素值(紅色高,藍色低)。需要注意的是,這里的影響因素是經過dummy處理的,所以是否限購_0,紅色的點其實表示的是”是”,藍色的點表示的是“否“。?關鍵影響因素:限購政策對于房價具有絕對影響,限購圈內的房價明顯高于限購圈外的房價;?重要影響因素:(1)周邊配套越成熟能顯著推高房價,這里POI類型數量(反映了業態的豐富程度)比POI數量本省更具有明顯的正向推動作用;(2)由于寧波老房子普遍較低,因此在寧波樓層越高,很可能就是那些新開的樓盤;(3)離地鐵站的距離的作用,在SHAP圖中并不明顯,所以后面我們單獨進行分析;(4)房屋面積方面,90-120平米的房價會是比較尷尬的,這個區間內面積越大,均價越低;(5)4室的房子對房價拉動作用明顯,可以理解為4室的戶型在市場上最符合購房者的空間布置需求;(6)房齡越大,價格竟然越高,這是567沒有料想到的,但是如果結合周邊配套進行考慮,其實也能夠理解了,一般房子越老,周邊配套越成熟,也很可能就是你心儀的學區房。最后,為了更加清晰地看到軌道站點遠近對于房價的影響,567繪制了距離與SHAP值得關系,在各種因素的交互影響(3條線)和目前得軌道線網下,適中的距離對于房價拉動作用更為明顯,其中效應最明顯是在距離軌道站點1-3公里范圍內。這些小區本身位于鄞州公園、萬達廣場、印象城等附近,休閑娛樂便利,同時1-3公里距離是共享單車、公共自行車等交通工具接駁的適宜范圍,所以地鐵站進一步提升了這些小區的交通便利性。離軌道越近的小區價格提升作用不明顯也比較容易理解,寧波市軌道交通的線站位選擇原則一般盡量避免直穿成熟區,以減少拆遷成本,所以周邊的配套往往并不完善。本文出品:注冊數據分析師(ID: cda302)
歡迎加入大數據分析交流群學習討論進群請添加微信cda00j,通過邀請入群
?CDA課程咨詢
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何采集指定年份的poi_房价关键影响因素分析:从数据采集到建模全过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝马奔驰保时捷等 《狂飙》剧组光买车就花
- 下一篇: 访问页面要看什么数据包_股市看盘,我们要