房地产投资潜力分析(使用熵权法、主成分分析、因子分解进行排序)

您所在的位置:网站首页 房地产排序 房地产投资潜力分析(使用熵权法、主成分分析、因子分解进行排序)

房地产投资潜力分析(使用熵权法、主成分分析、因子分解进行排序)

2024-07-12 15:10| 来源: 网络整理| 查看: 265

文章目录 前言一、数据描述二、变量描述性统计1.单变量直方图2.相关系数图3.散点图矩阵 三、城市房地产投资潜力分析1.变量选择及逆指标的变换(1)指标选取投资潜力指标:投资风险指标: 2.指标变换方法 2.熵权法3.主成分分析(1)变换后数据之间的相关性(2)主成分法结果 4.因子分解(1)巴特利球形度检验、KMO检验(2)因子解释(3)因子得分熵权值法 5.三种方法的比较 总结

前言

课程作业: 某房地产开发公司拟在长江三角洲、珠江三角洲和环渤海地区中选择有投资价值潜力的目标城市进行投资 - 如何衡量投资潜力? - 给出一些指标 请对备选城市进行综合评价,遴选出具有投资潜力的城市

一、数据描述

数据如下所示

城市GDP人均可支配收入城市化水平人均使用面积户籍人口数量商品房销售均价商品房销售面积商品房施工面积0深圳5684.392256783.719.7196.839230784.633122.101北京9006.202198984.320.11213.3087922176.6010438.602杭州3440.991902762.121.0666.317751762.504545.333上海10296.972066888.716.51368.1070383025.4010938.754广州6068.411985169.519.4760.7265451316.885460.375宁波2864.501967459.018.7560.405437601.102200.006天津4337.731428375.726.1948.8850131458.604271.147南京2774.001753862.120.4607.235002932.403264.448苏州4820.261445162.120.4615.554958932.405058.099大连2569.701335057.517.5572.104844628.802196.1010珠海749.601767159.425.092.634731178.88678.5511台州1467.481903657.232.8564.664726259.721238.3212绍兴1678.191948657.225.4435.504500366.001355.3613常州1560.001664962.128.4354.704500479.401701.9014南通1758.341405862.129.4769.794500473.271165.8615无锡3300.001818970.031.3457.804315626.002322.1716嘉兴1340.001782852.032.1335.504299359.501393.7017舟山333.201752552.022.296.58429991.80300.0018东莞2624.632532065.045.2168.314192379.431431.2719湖州760.891750353.027.0257.894134195.19887.51

可以看到有很多变量是与经济指标相关的,就意味着这些变量有可能是高度相关的,接下来就是对变量进行描述性统计。

二、变量描述性统计 1.单变量直方图

代码如下:

import pandas as pd import matplotlib.pyplot as plt # 导入包 data=pd.read_excel('城市投资潜力.xlsx') # 读入数据 plt.rcParams['font.sans-serif']=['simhei'] # 添加中文字体为黑体 plt.rcParams['axes.unicode_minus'] =False def draw(data): data.hist(figsize=(16,14)) #plt.savefig("Plots.jpg",dpi=300, pad_inches = 0) plt.title('各变量的频数分布图') plt.show() draw(data.iloc[:,1:])

直方图

可以看到,大部变量都是右偏,分布较不规律,但可能因为样本个数较少导致的。

2.相关系数图

代码如下:

import seaborn as sns import matplotlib.pyplot as plt import numpy as np data1=data.iloc[:,1:] #定义数值型变量 import numpy as np print(np.var(data1)) fig, ax = plt.subplots(figsize = (9,9)) corr = data1.corr() sns.heatmap(corr, vmax=1,vmin = 0, xticklabels= True, yticklabels= True, square=True, cmap="YlGnBu")

相关系数矩阵

可以看到有的变量之间的相关系数较高,如商品房销售面积和商品房施工面积,户籍人口数量和商品房销售面积、商品房施工面积等,所以后续考虑对这些变量进行筛选

3.散点图矩阵

代码如下:

import mglearn import matplotlib.pyplot as plt grr = pd.plotting.scatter_matrix(data.iloc[:,1:],figsize=(15,15),marker='o',hist_kwds={'bins':20},cmap=mglearn.cm3)

散点图矩阵

从散点图矩阵中可以看出

GDP与商品房施工面积、商品房销售面积、城市化水平等变量相关性比较高商品房销售面积和商品房施工面积相关性较高

所以对数据进行主成分分析、因子分析有一定依据

三、城市房地产投资潜力分析 1.变量选择及逆指标的变换 (1)指标选取

参考 https://www.sohu.com/a/423745747_796547 选取指标

投资潜力指标: 经济发展情况(GDP):正向指标,衡量地区经济发展状况。人口规模(户籍人口数量):正向指标,衡量地区房地产潜在的总需求。需求规模(商品房销售面积):正向指标,衡量报告期内房地产市场的需求。购买力水平 (人均可支配收入):正向指标,衡量房地产市场的购买力城市化水平:正向指标,衡量城市发展状况及经济水平。商品房销售均价:正向指标衡量人均使用面积:负向指标,人均使用面积=住宅使用面积/居住人口,衡量了一个城市现有住宅,人均使用面积越小说明还有发展潜力.供给规模(商品房施工面积):负向指标,施工面积反映了1~2年内的期房和现房供应量,衡量了竞争关系。 投资风险指标: 供求风险=施工面积/销售面积.负向指标,施工面积反映了1~2年内的期房和现房供应量;施工面积/销售面积比值的变化反映供求是否平衡发展,该指标的异常变化能对下一年度的价格走势起到一定预示性作用。购买力风险=商品房销售均价/人均可支配收入,负向指标,衡量现在房价水平是否合理

由上分析可知,人均使用面积、商品房施工面积、供求风险、购买力风险为逆向指标,需要进行逆向化处理

2.指标变换方法

参考文献:《综合评价中指标标准化方法研究》李美娟

对负向指标进行转换及所有指标的归一化处理:(变量取值范围不变,且保留了变量的变异程度信息)

负向指标转换: x i , j ′ = m a x 1 ≤ i ≤ n x i , j − x i , j + m i n 1 ≤ i ≤ n x i , j x^{'}_{i,j}=\mathop{max}\limits_{1 \leq i \leq n} x_{i,j} -x_{i,j}+\mathop{min}\limits_{1 \leq i \leq n} x_{i,j} xi,j′​=1≤i≤nmax​xi,j​−xi,j​+1≤i≤nmin​xi,j​所有变量归一化处理 y i , j = x i , j ∑ i = 1 n x i , j , ( 1 ≤ i ≤ n , 1 ≤ j ≤ m ) y_{i,j}=\frac{x_{i,j}}{\sum_{i=1}^{n}x_{i,j}},(1\leq i\leq n,1\leq j\leq m) yi,j​=∑i=1n​xi,j​xi,j​​,(1≤i≤n,1≤j≤m)为避免由于样本个数n较多造成 y i , j y_{i,j} yi,j​较小的情形,乘以n y i , j ′ = y i , j × n , ( 1 ≤ i ≤ n , 1 ≤ j ≤ m ) y^{'}_{i,j}=y_{i,j} \times n,(1\leq i\leq n,1\leq j\leq m) yi,j′​=yi,j​×n,(1≤i≤n,1≤j≤m)

这种方法保留了以下优点:

(l)经标准化处理后的标准值较真实地反映原指标值之间的关系,考虑了指标值之间的差异性;

(2)正、逆向指标均化为正向指标,即均具有指标值越大越好的特性;

(3)不管决策矩阵 X X X中的指标值是正数还是负数,都适用,经过该标准化处理后,标准化指标值满足, 0 < y < m 0 0 , e j ≥ 0 e_j=-k\sum_{i=1}^{n}p_{i,j}ln(p_{i,j}),p=1/ln(n)>0,e_j\geq0 ej​=−ki=1∑n​pi,j​ln(pi,j​),p=1/ln(n)>0,ej​≥0计算信息熵冗余度(差异) d j = 1 − e j , j = 1 , ⋯   , m d_j=1-e_j,j=1,\cdots,m dj​=1−ej​,j=1,⋯,m计算各项指标的权重 w j = p j ∑ j = 1 m p j , j = 1 , ⋯   , m w_j=\frac{p_j}{\sum_{j=1}^{m}p_j},j=1,\cdots,m wj​=∑j=1m​pj​pj​​,j=1,⋯,m

代码如下:

import math from numpy import array def cal_weight(x): '''熵值法计算变量的权重''' # 求k rows = x.index.size # 行 cols = x.columns.size # 列 k = 1.0 / math.log(rows) lnf = [[None] * cols for i in range(rows)] # 矩阵计算-- 信息熵 p=array(p) x = array(x) lnf = [[None] * cols for i in range(rows)] lnf = array(lnf) for i in range(0, rows): for j in range(0, cols): if x[i][j] == 0: lnfij = 0.0 else: p = x[i][j] / x.sum(axis=0)[j] lnfij = math.log(p) * p * (-k) lnf[i][j] = lnfij lnf = pd.DataFrame(lnf) E = lnf d = 1 - E.sum(axis=0)# 计算冗余度 w = [[None] * 1 for i in range(cols)]# 计算各指标的权重 for j in range(0, cols): wj = d[j] / sum(d) w[j] = wj# 计算各样本的综合得分,用最原始的数据 w = pd.DataFrame(w) return w w = cal_weight(trans_data.iloc[:,1:]) # 调用cal_weight w.index = trans_data.columns.tolist()[1:] w.columns = ['weight'] print(w) print('运行完成!') weight

GDP 0.272662 人均可支配收入 0.012789 城市化水平 0.012700 户籍人口数量 0.186742 商品房销售均价 0.035685 商品房销售面积 0.317972 人均使用面积 0.018868 商品房施工面积 0.096012 供求风险 0.016948 购买力风险 0.029620 运行完成!

score=np.dot(trans_data.iloc[:,1:],w) score=pd.DataFrame(score) score.columns = ['熵权值法得分'] score['城市']=data['城市'] score=score[['城市','熵权值法得分']] score['熵权值法排名']=score['熵权值法得分'].rank(ascending=False) score 城市熵权值法得分熵权值法排名0深圳1.0833246.01北京2.1551662.02杭州1.0105158.03上海2.6438101.04广州1.4740793.05宁波0.90065310.06天津1.4543704.07南京1.0229537.08苏州1.1538885.09大连0.87518511.010珠海0.41330919.011台州0.65128116.012绍兴0.67392513.013常州0.67169614.014南通0.82854412.015无锡0.9008959.016嘉兴0.60103317.017舟山0.35238520.018东莞0.66468315.019湖州0.46830518.0 3.主成分分析 (1)变换后数据之间的相关性 import seaborn as sns import matplotlib.pyplot as plt import numpy as np data1=trans_data.iloc[:,1:] #定义数值型变量 import numpy as np print(np.var(data1)) fig, ax = plt.subplots(figsize = (9,9)) corr = data1.corr() sns.heatmap(corr, vmax=1,vmin = 0, xticklabels= True, yticklabels= True, square=True, cmap="YlGnBu")

经过变换过后变量间的相关系数矩阵图 从变量的相关性分析中可以看到,有多个变量相关,首先考虑对变量进行主成分分析,且上述变量主要分了两类

from pca import pca model = pca() # 初始化保留所有主成分 # 其他形式 model = pca(n_components=2)保留两个主成分 model = pca(n_components=0.95)方差贡献度达95%为止 data2=trans_data.iloc[:,1:]# 数据准备index为城市名,其余列保留 data2.index=data.iloc[:,0] results = model.fit_transform(data2)#拟合 fig, ax = model.plot()# 画出累计方差贡献度图,选取两个主成分比较合适

主成分分析方差贡献度 从结果中可以看到,两个主成分就可以解释95%的变异,所以保留两个主成分进行后续分析

model = pca(n_components=2) results = model.fit_transform(data2)#拟合 fig, ax = model.scatter()# 前两个主成分画图 fig, ax = model.biplot(n_feat=4)# Make biplot with the number of features

主成分分析 主成分分析结果

(2)主成分法结果

采用对各个主成分对方差的贡献程度进行加权,可以看到主成分1主要与商品房销售面积、GDP、人均使用面积、商品房施工面积有关,主成分2主要与户籍人口数量、人均可支配收入、城市化水平、商品房销售均价、供求风险、购买力风险

model.results['topfeat'] PCfeatureloadingtype0PC1商品房销售面积0.643434best1PC2户籍人口数量-0.659184best2PC1GDP0.555985weak3PC2人均可支配收入0.276068weak4PC2城市化水平0.127721weak5PC2商品房销售均价0.445650weak6PC1人均使用面积0.067279weak7PC1商品房施工面积-0.259490weak8PC2供求风险-0.195134weak9PC2购买力风险-0.137929weak def min_max(x): re=[(i-min(x))/(max(x)-min(x)) for i in x] return re # 按方差贡献计算各主成分的权重 explained_var=model.results['explained_var'] w_pca = pd.DataFrame([explained_var[0],explained_var[1]-explained_var[0]]/explained_var[1]) #累计值要扣除 w_pca.index = ['PC1','PC2'] w_pca.columns = ['weight'] print(w_pca) #综合得分 score_pca=np.dot(pca_df,w_pca) score_pca=pd.DataFrame(score_pca) score_pca.columns = ['主成分分析-熵权值法得分'] score_pca['城市']=data['城市'] score_pca=score_pca[['城市','主成分分析-熵权值法得分']] score_pca.sort_values(by='主成分分析-熵权值法得分',ascending=False) 4.因子分解 (1)巴特利球形度检验、KMO检验 print('巴特利球形度检验') from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity chi_square_value,p_value=calculate_bartlett_sphericity(data2) print('卡方值:',chi_square_value,'P值', p_value) #相关性检验kmo要大于0.5 from factor_analyzer.factor_analyzer import calculate_kmo kmo_all,kmo_model=calculate_kmo(data2) print('KMO检验:',kmo_model)

输出:

巴特利球形度检验 卡方值: 273.419703800147 P值 7.400205772134435e-35 KMO检验: 0.6117754048691861

巴特利球形度检验拒绝原假设说明变量之间存在相关性,适合做因子分析,相关性检验kmo值为0.5

from factor_analyzer import FactorAnalyzer #因子分析 fa = FactorAnalyzer(8, rotation='varimax',method='principal',impute='mean')#初始化,方法为 fa.fit(data2) ev, v = fa.get_eigenvalues() print('相关矩阵特征值:',ev) #Create scree plot using matplotlib plt.figure(figsize=(8, 6.5)) plt.scatter(range(1,data2.shape[1]+1),ev) plt.plot(range(1,data2.shape[1]+1),ev) plt.title('碎石图',fontdict={'weight':'normal','size': 25}) plt.xlabel('因子',fontdict={'weight':'normal','size': 15}) plt.ylabel('特征值',fontdict={'weight':'normal','size': 15}) plt.grid()# plt.savefig('E:/suishitu.jpg') plt.show() #确定因子个数 n_factors = sum(ev>1)

相关矩阵特征值: [5.90893406e+00 1.54019996e+00 1.27561274e+00 6.96807251e-01 3.58371733e-01 1.45974929e-01 3.72301362e-02 2.26174313e-02 9.24062839e-03 5.01113610e-03] 因子分解碎石图

确定最优因子个数为两个,继续观察因子特征

(2)因子解释 fa2 = FactorAnalyzer(2, rotation="varimax") fa2.fit(data2) #fa2.loadings_ import seaborn as sns df_cm = pd.DataFrame(np.array(fa2.loadings_), index=data2.columns) plt.figure(figsize = (14,14)) ax = sns.heatmap(df_cm, annot=True, cmap="BuPu") # 设置y轴的字体的大小 ax.yaxis.set_tick_params(labelsize=15) plt.title('Factor Analysis', fontsize='xx-large') # Set y-axis label plt.ylabel('指标', fontsize='xx-large') plt.savefig('factorAnalysis.png', dpi=500)

因子特征图 可以看到两个因子,因子一为城市总体水平相关,因子二为人均水平

(3)因子得分熵权值法 fa_result=fa2.transform(data2) fa_df=pd.DataFrame(fa_result,columns=['因子1','因子2']) fa_df['城市']=data['城市'] fa_df=fa_df[['城市','因子1','因子2']] fa_df #查看各个城市因子得分情况 fa2.get_factor_variance() #三行分别为:特征值、方差贡献率、累计方差贡献率 w_fa = pd.DataFrame(fa2.get_factor_variance()[1]/fa2.get_factor_variance()[2][1]) #计算权重 w_fa.index = ['因子1','因子2'] w_fa.columns = ['weight'] print(w_fa) print('运行完成!')

因子矩阵如下:

城市因子1因子20深圳0.7228350.5451531北京2.0471061.5285302杭州-0.0211860.7255613上海2.2082020.7489444广州0.9719900.3894315宁波-0.8549491.0599026天津0.522120-0.5822107南京-0.2860800.0734278苏州0.988533-0.5555119大连0.079789-0.09042510珠海-1.004297-0.11801911台州-0.831413-0.77823312绍兴-1.2172250.62844113常州-0.150640-1.14680114南通0.313035-1.49872115无锡-0.235692-0.51946416嘉兴0.692051-2.63596817舟山-0.723960-0.53722818东莞-2.6361414.22933719湖州-0.584076-1.466145

特征值、方差贡献率、累计方差贡献率如下: (array([4.92525528, 2.14625952]), array([0.49252553, 0.21462595]), array([0.49252553, 0.70715148]))

因子权重分别为:因子1:0.696492;因子2:0.303508。

#综合得分 score_fa=np.dot(fa_df.iloc[:,1:],w_fa) score_fa=pd.DataFrame(score_fa) score_fa.columns = ['因子分解-熵权值法得分'] score_fa['城市']=data['城市'] score_fa=score_fa[['城市','因子分解-熵权值法得分']] score_fa.sort_values('因子分解-熵权值法得分',ascending=False) #因子得分排序 城市因子分解-熵权值法得分1北京0.8574393上海0.8461364广州0.6525060深圳0.6235688苏州0.6131106天津0.5448712杭州0.5245739大连0.50301716嘉兴0.47850914南通0.4742927南京0.45765815无锡0.43869113常州0.4231865宁波0.41948017舟山0.36770612绍兴0.34832019湖州0.34675110珠海0.34593311台州0.34160218东莞0.303508 5.三种方法的比较

三种方法排名汇总

#score['熵权值法排名']=score['熵权值法得分'].rank(ascending=False) score_fa['因子分解-熵权值法排名']=score_fa['因子分解-熵权值法得分'].rank(ascending=False) score_pca['主成分分析-熵权值法排名']=score_pca['主成分分析-熵权值法得分'].rank(ascending=False) result=score.merge(score_fa,how='left',on='城市') result=resulrge(score_pca,how='left',on='城市') result[['城市','熵权值法排名','主成分分析-熵权值法排名','因子分解-熵权值法排名']] 城市熵权值法排名主成分分析-熵权值法排名因子分解-熵权值法排名深圳6.05.04.0北京2.02.01.0杭州8.07.07.0上海1.01.02.0广州3.03.03.0宁波10.09.014.0天津4.04.06.0南京7.08.011.0苏州5.06.05.0大连11.011.08.0珠海19.019.018.0台州16.016.019.0绍兴13.015.016.0常州14.013.013.0南通12.012.010.0无锡9.010.012.0嘉兴17.017.09.0舟山20.020.015.0东莞15.014.020.0湖州18.018.017.0

可以看到,三种方法排序略有差异,但也有共性:

具有较高的投资潜力(三种方法投资潜力排名前5的城市有(并集)):上海、北京、广州、深圳、天津、苏州具有较差的投资潜力(三种方法投资潜力排名后5的城市有(并集)):东莞、舟山、湖州、嘉兴、珠海、台州、绍兴投资潜力中等(其余):杭州、宁波、南京、大连、常州、南通、无锡

查看投资潜力较弱的城市,归纳特征:

weak_city='东莞、舟山、湖州、嘉兴、珠海、台州、绍兴'.split('、') trans_data[trans_data['城市'].isin(weak_city)] #trans_data为经过负向指标处理及归一化后的数据,各个均值都为1,均为越大越好 城市GDP人均可支配收入城市化水平户籍人口数量商品房销售均价商品房销售面积人均使用面积商品房施工面积供求风险购买力风险珠海0.2223160.9638820.9175870.1677660.8696210.2232020.9980961.3134131.0345061.111000台州0.4352251.0383380.8836021.0226770.8687020.3240730.7859671.2437920.8168061.181462绍兴0.4977171.0628830.8836020.7887510.8271600.4566870.9872181.2292361.0546451.244216嘉兴0.3974170.9724460.8032750.6076370.7902140.4485760.8050041.2244671.0158651.207275舟山0.0988200.9559190.8032750.1749200.7902140.1145461.0742451.3604951.1518581.192179东莞0.7784121.3811051.0040940.3048330.7705460.4734440.4487351.2197951.0392341.480923湖州0.2256650.9547190.8187220.4670740.7598850.2435540.9437041.2874240.8661731.225195

因为三种方法来说GDP都是衡量投资潜力的重要指标,尽管这些城市商品房施工面积、供求风险、购买力风险都低于平均水平(负向指标经过逆向处理,看到的结果为越大越好,越大说明风险越低,且均值为1),但这些城市GDP较低,所以在三种方法中排序都靠后,不具有很强的投资潜力。

总结

本篇博客的主要是学习了指标排序,在无监督的情况下,如何进行排序,投资指导意义方面分析不强,20年完成的一次课程小作业。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3