全局莫兰指数(莫兰指数) 和 局部莫兰 是用于计算Spatial autocorrelation(空间自相关性)。
所谓空间自相关性,是指特征信号是否与空间相邻位置存在相关性。
(维基百科:wiki)
大白话翻译就是,二维空间中,所谓的特征是否在空间中具有聚集性或完全随机。
如图:
完全随机 》》》》》》》》》》》》》》》》》》》》》》有空间聚集性
全局莫兰指数公式为:
I = n ∑ i = 1 n ∑ j = 1 n w i , j ∑ i = 1 n ∑ j = 1 n w i , j z i z j ∑ i = 1 n z i 2 I=frac{n}{sum_{i=1}^{n}sum_{j=1}^{n}w_{i,j}}frac{sum_{i=1}^{n}sum_{j=1}^{n}w_{i,j}z_{i}z_{j}}{sum_{i=1}^{n}z_{i}^{2}} I=∑i=1n∑j=1nwi,jn∑i=1nzi2∑i=1n∑j=1nwi,jzizj
公式里的 n n n代表数据点的个数, w w w是权重,这里是指每个点的欧式距离分之一; z z z是特征数据;从公式中可以看出,左上角 n n n,左下角权重和,右下角所有点的特征值权重平方和都是用来归一化的……重点在公式右上角, i i i是每个点自己, j j j是其他周围的点,所以 I I I是所有点的 自己和周围点特征乘积再被 w w w权重修正后的值。。。当类似脉冲信号的时候, z i z_{i} zi很大, z j z_{j} zj很小,所以I 不会很大;当类似随机信号的时候, z i z_{i} zi很大, z j z_{j} zj很大,而 w w w距离权重就会很小,所以 I 也很小;只有当自己和临近周围点都很大时候,即出现hotspo的时候,才会使 I I I很大。
python 实现:
python里的包是pysal 中,安装教程 github.
官网里面有教程,有时间可以看下:notebooks.
pysal 是面向地理的工具包,而我们的数据只是一般的散点,只有 x x x, y y y坐标值,所以需要把坐标数据转成pysal 可以识别的geodataframe.
import geopandas as gpd
df = pd.Dataframe(
{'feature1': ['Buenos Aires', 'Brasilia', 'Santiago', 'Bogota', 'Caracas'],
'feature2': ['Argentina', 'Brazil', 'Chile', 'Colombia', 'Venezuela'],
'x': [-34.58, -15.78, -33.45, 4.60, 10.48],
'y': [-58.66, -47.91, -70.66, -74.08, -66.86],
'z':[-58.66, -47.91, -70.66, -74.08, -66.86]}) #####我随机写的,不要在乎值
gdf = geopandas.GeoDataframe(
df, geometry=geopandas.points_from_xy(df.x, df.y))
就可以直接计算全局Moran I值:
from esda.moran import Moran w = Queen.from_dataframe(gdf) ###############权重 y =gdf.z ##########特征点 moran = Moran(y,w) moran.I ####### Moran 值
局部Moran I:
局部Moran I 不止能给出有没有聚集现象,而且也能给出聚集现象的位置。可以通过Moran scatterplot 给出:
第一象限: 高值 且周围的点也是 高值
第二象限 :低值且周围的点是高值
第三象限: 低值且周围的点是低值
第四象限:高值且周围的点是低值
再加入p_value 阈值修正,所以可以得到这些点
简略版的代码如下:
import esda lisa = esda.moran.Moran_Local(y.astype(np.float64),w) lisa.I #每个值的Morcan I lisa.q #置信概率值 #####需要你自己找代码画图



