房價影響因素挖掘
1、數據清洗、整合
① 將“house_rent”、“house_sell”分別讀取
② 分別計算平方米建築面積的月租金、每平方米建築面積的房價
③ 將數據按照小區名合並
====>>>
① 刪除缺失值
② 按照小區做均值分析
import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 不發出警告
''' (1)讀取數據 ''' import os os.chdir(r'C:\Users\Administrator\Desktop\python數據分析\項目\10房價') # 創建工作路徑 df01 = pd.read_csv('house_rent.csv',engine = 'python') df02 = pd.read_csv('house_sell.csv',engine = 'python') # 讀取數據 df01.dropna(inplace = True) df02.dropna(inplace = True) # 刪除缺失值 ''' (2)計算指標並按照租金、售價匯總 ''' df01['rent_area'] = df01['price']/df01['area'] data_rent = df01[['community','rent_area','lng','lat']].groupby(by = 'community').mean() data_sell = df02[['property_name','average_price','lng','lat']].groupby(by = 'property_name').mean() data_rent.reset_index(inplace = True) data_sell.reset_index(inplace = True) #數據計算並匯總 data = pd.merge(data_rent,data_sell,left_on ='community',right_on='property_name') data = data[['community','rent_area','average_price','lng_x','lat_x']] data.rename(columns={'average_price':'sell_area', 'lng_x':'lng', 'lat_x':'lat'}, inplace = True) # 調整列名
房屋的租售比一般 200--300的區別比較合適
比如100平方米的房子,均價2萬,總共200萬;
假如貸款 3成,即600000萬,按照6%左右的利率去算,貸款140萬,期限30年; 用貸款計算器算下:
140萬貸款30年,6.37%利率,本息合計3142656.29,每月還款8729.6元;租金跑贏每月的還款8729.6,租金假如是8800,
租售比8800/100/20000=0.0044 1/0.0044=227.27;假如你買的房子能跑贏匯率,大概在200--300之間。如果在這個區間內,或者小於200則是非常有投資價值的。
如果大於200,甚至超過500,則可能存在泡沫風險。
''' (3)計算房屋租售比 ''' # 計算“房屋售租比”,並做初步判斷 # “房屋售租比”=“每平方米建築面積的房價”/“每平方米建築面積的月租金” # 含義可以簡單理解為:“在保持當前的房價和租金條件不變的情況下,完全收回投資需要多少個月?” # **一般而言,按照國際經驗,在一個房產運行情況良好的區域,應該可以在200-300個月內完全回收投資。 # **如果少於200個月(17年)就能收回投資,說明這個地區有較高的投資價值; # **如果一個地區需要高於300個月(25年),比如1200個月(100年)才能回收投資,則說明該地區有潛在的房產泡沫風險。 data['sell_rent'] = data['sell_area']/data['rent_area'] print('上海房屋租售比中位數為%i個月' % data['sell_rent'].median()) # 計算售租比,及中位數
# 繪制直方圖 data['sell_rent'].plot.hist(stacked=True,bins=100,color = 'green',alpha=0.5,grid=True,figsize = (10,4)) plt.title('房屋售租比-直方圖')
# 繪制箱型圖 color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray') data['sell_rent'].plot.box(vert=False, grid = True,color = color,figsize = (10,4)) plt.title('房屋售租比-箱型圖')


一個尷尬的結論
如果按照中位數725個月來看,假設從25歲研究生一畢業,就立刻全款買了一套房,然后放出去收租
那么約85歲時,這60年來陸陸續續所收的租金總數就可以達到了25歲時買房所付的錢啦
**這里還沒考慮凈現值折算問題
① 如果僅靠租金收入的話,上海全市平均回收投資需要725個月。而這種格局的維持,必須有賴於購房者對上海的房價上升的持續預期。
也就是說,在上海,投資房產絕不是利率收益,而是預期收益(其實城市越小租金回報反而越高)
② 上海不是這么看住房投資的(絕大多數房子房租收入跑不贏商貸利率,否則按照這個思路看那肯定是買一個虧一個)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 不發出警告 ''' (1)導出數據 ''' data.to_csv('pro10data.csv') print('finish')
上海市人口密度、路網密度、餐飲價格和“房屋每平米均價”是否有關系呢?
上海市人口密度、路網密度、餐飲價格和“房屋每平米均價”是否有關系呢? 要求: ① 首先,導出整理好的數據,並qgis中繪制空間格網圖,查看房屋每平米均價、房屋每平米租金及售租比數據的空間分布 ② 第二,空間統計,分別按照格網對人口密度、路網密度、餐飲價格進行指標統計並標准化 ③ 第三,加載上海中心點point空間數據,計算每個網格到市中心距離 ④ 第四,將空間格網的“房屋每平米均價”按照距市中心的距離排序,並制作散點圖,看看能否挖掘出什么信息 *** 這里市中心點坐標為:lng-353508.848122,lat-3456140.926976 (投影坐標系) 提示: ① 導出csv數據,用dataframe.to_csv() ② qgis加載數據后,以“net_population”為格網數據做空間統計 ③ 注意qgis數據都為投影坐標系 ④ 人口密度指標 → 已有“net_population”數據 路網密度指標 → 以格網為空間單元,計算道路長度 餐飲價格指標 → 以格網為空間單元,計算餐飲設施的人均均價數據 *** 最后數據導入python中,標准化得分至0-1區間 *** 導入數據后要填充空值為0 *** qgis中可以用結果net數據作為下一個分析數據,以此將統計結果匯總在一張屬性表內 *** 格網數據在導出前,先轉為點數據,並計算經緯度,這里用投影經緯度,好依據中心點坐標計算離市中心距離 ⑤ 清洗數據,去除“售租比”為0的數據
都轉成投影坐標系 ===>>圖層轉成投影坐標系
人口的指標已經有了net_polulation
路網密度指標:Z值
矢量--分析工具---計算線條總長度

餐飲的價格指標
計算多邊形內點的數目

每個單元格內小區里邊租金的均值和房價的均值
datapoin是pro10data的投影坐標系

得到net03數據,分別按照不同的指標進行核算,先按照房價sell_area
加載上海市行政區數據,設置下樣式



再看看它的租金水平:rent_area

離市中心的距離,只要算出格網點就可以了
把柵格從網格變成點
矢量--幾何工具--導出多邊形的點(質心) 得到netpoint,就不把它做投影了,需要的就是它的投影坐標系的點坐標
添加X、Y坐標,

同理lat
得到:

導出得到result02.xlsx的數據
import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 不發出警告 ''' (1)導出數據 ''' data.to_csv('pro10data.csv') ''' (2)加載數據 ''' data_q3 = pd.read_csv(r'C:\Users\Administrator\Desktop\python數據分析\項目\10房價\result02.csv',engine = 'python') data_q3.fillna(0,inplace = True) ''' (3)指標標准化處理 ''' def f1(data,col): return (data[col]-data[col].min())/(data[col].max()-data[col].min()) # 創建函數 data_q3['人口密度指標'] = f1(data_q3,'Z') data_q3['路網密度指標'] = f1(data_q3,'長度') data_q3['餐飲價格指標'] = f1(data_q3,'人均消費_') # 指標標准化 data_q3['離市中心距離'] = ((data_q3['lng'] - 353508.848122)**2 + (data_q3['lat']-3456140.926976)**2)**0.5 # 計算市中心距離 data_q3_test = data_q3[['人口密度指標','路網密度指標','餐飲價格指標','sell_area_','離市中心距離']] data_q3_test = data_q3_test[data_q3_test['sell_area_']>0].reset_index() del data_q3_test['index'] # 清洗數據,去除“房屋每平米均價”為0的數據 #查看整個指標相關性 plt.figure(figsize = (15, 6)) plt.scatter(data_q3_test['人口密度指標'],data_q3_test['sell_area_'],s = 2,alpha = 0.2) plt.figure(figsize = (15, 6)) plt.scatter(data_q3_test['路網密度指標'],data_q3_test['sell_area_'],s = 2,alpha = 0.2) plt.figure(figsize = (15, 6)) plt.scatter(data_q3_test['餐飲價格指標'],data_q3_test['sell_area_'],s = 2,alpha = 0.2) plt.figure(figsize = (15, 6)) plt.scatter(data_q3_test['離市中心距離'],data_q3_test['sell_area_'],color = 'red',s = 2,alpha = 0.2) data_q3_test.corr().loc['sell_area_'] #查看指標之間相關系數 print('finish')





# 結論
① 在上海全市層面,“離市中心距離”與“房屋每平米均價”相關性最強
② “人口密度”及“路網密度”和“房屋每平米均價”為中等相關
③ “餐飲價格”與“房屋每平米均價”為弱相關
④ “房屋每平米均價”數據的離散程度卻和空間距離有關 → “房屋每平米均價”越靠近市中心越離散,越遠離市中心則越收斂
按照離市中心距離每10km,分別再次判斷人口密度、路網密度、餐飲價格和“房屋每平米均價”的相關程度
按照離市中心距離每10km,分別再次判斷人口密度、路網密度、餐飲價格和“房屋每平米均價”的相關程度 要求: ① 按照空間距離分別迭代計算三指標和“房屋每平米均價”的關系 ② 繪制折線圖查看:隨着市中心距離增加,不同指標相關系系數變化情況 *** 用bokeh制圖 ====>>> ① 用for循環迭代空間距離,然后篩選數據並計算相關性 ② bokeh可以通過多次調用figure.line()來繪制多條折線圖
import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 不發出警告 ''' # 按照空間距離分別迭代計算三指標和“房屋每平米均價”的關系 (1)按照市中心距離來分析指標相關性 ''' dis = [] # 距離空列表 rkmd_pearson = [] # 人口密度相關性系數空列表 lwmd_pearson = [] # 路網密度相關性系數空列表 cyjg_pearson = [] # 餐飲價格相關性系數空列表 zxjl_pearson = [] # 中心距離相關性系數空列表 for distance in range(10000,70000,10000): datai = data_q3_test[data_q3_test['離市中心距離'] <= distance] r_value = datai.corr().loc['sell_area_'] # 篩選數據並計算相關系數 dis.append(distance) rkmd_pearson.append(r_value.loc['人口密度指標']) lwmd_pearson.append(r_value.loc['路網密度指標']) cyjg_pearson.append(r_value.loc['餐飲價格指標']) zxjl_pearson.append(r_value.loc['離市中心距離']) # 添加列表值 print('離市中心距離小於等於%i米:' % distance) print('數據量為%i條' % len(datai)) print('人口密度與房屋每平米均價的相關系數為:%.3f' % r_value.loc['人口密度指標']) print('路網密度與房屋每平米均價的相關系數為:%.3f' % r_value.loc['路網密度指標']) print('餐飲價格與房屋每平米均價的相關系數為:%.3f' % r_value.loc['餐飲價格指標']) print('離市中心距離與房屋每平米均價的相關系數為:%.3f' % r_value.loc['離市中心距離']) print('-------\n') ''' (2)折線圖繪制 ''' # 繪制折線圖查看:隨着市中心距離增加,不同指標相關性系數變化情況 from bokeh.models import HoverTool from bokeh.plotting import figure,show,output_file from bokeh.models import ColumnDataSource df_r = pd.DataFrame({'rkmd_pearson':rkmd_pearson, 'lwmd_pearson':lwmd_pearson, 'cyjg_pearson':cyjg_pearson, 'zxjl_pearson':zxjl_pearson}, index = dis) source = ColumnDataSource(data=df_r) # 創建數據 hover = HoverTool(tooltips=[("離市中心距離", "@index"), ("人口密度相關系數", "@rkmd_pearson"), ("道路密度相關系數", "@lwmd_pearson"), ("餐飲價格相關系數", "@cyjg_pearson"), ("中心距離相關系數", "@zxjl_pearson"),]) # 設置標簽顯示內容 output_file(r'C:\Users\Administrator\Desktop\python數據分析\項目\10房價\pro1001.html') p = figure(plot_width=900, plot_height=350, title="隨着市中心距離增加,不同指標相關性系數變化情況", tools=[hover,'box_select,reset,xwheel_zoom,pan,crosshair']) # 構建繪圖空間 p.line(x='index',y='rkmd_pearson',source = source,line_alpha = 0.8, line_color = 'green',line_dash = [15,4],legend="人口密度相關系數") p.circle(x='index',y='rkmd_pearson',source = source, size = 8,color = 'green',alpha = 0.8,legend="人口密度相關系數") # 繪制折線圖1 p.line(x='index',y='lwmd_pearson',source = source,line_alpha = 0.8, line_color = 'blue',line_dash = [15,4],legend="道路密度相關系數") p.circle(x='index',y='lwmd_pearson',source = source, size = 8,color = 'blue',alpha = 0.8,legend="道路密度相關系數") # 繪制折線圖2 p.line(x='index',y='cyjg_pearson',source = source,line_alpha = 0.8, line_color = 'black',line_dash = [15,4],legend="餐飲價格相關系數") p.circle(x='index',y='cyjg_pearson',source = source, size = 8,color = 'black',alpha = 0.8,legend="餐飲價格相關系數") # 繪制折線圖3 p.line(x='index',y='zxjl_pearson',source = source,line_alpha = 0.8, line_color = 'red',line_dash = [15,4],legend="中心距離相關系數") p.circle(x='index',y='zxjl_pearson',source = source, size = 8,color = 'red',alpha = 0.8,legend="中心距離相關系數") # 繪制折線圖4 p.legend.location = "center_right" show(p) # 繪制折線圖

# 結論 # ① “人口密度”、“道路密度”、“離市中心距離”和“房屋均價”有着明顯的相關性,而“餐飲價格”和“房屋均價”相關性較弱 # ② 隨着離市中心的距離越遠,指標的相關性在數據上體現更明顯,而這個分界線大概在20-30km處,這正是上海中心城區和郊區的分界 # → 上海房價市場的“中心城區-郊區”分化特征 # ③ 中心城區的房產市場對指標因素的影響更加敏銳,而郊區則更遲鈍 → 越靠近市中心,影響因素越復雜
