您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何利用Python計算全局莫蘭指數,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
空間自相關(spatial autocorrelation)是指一些變量在同一個分布區內的觀測數據之間潛在的相互依賴性。Tobler(1970)曾指出“地理學第一定律:任何東西與別的東西之間都是相關的,但近處的東西比遠處的東西相關性更強”
全局莫蘭指數(Global Moran's I)是最常用的空間自相關指數,用來反映全局的空間相關性,其計算公式為:
$$ I = \frac N W \frac {\sum_i \sum_j w_{ij} (x_i-\bar x) (x_j-\bar x)} {\sum_i (x_i-\bar x)^2}$$
式中,$N$表示空間單元的數量,$i$和$j$表示空間單元的位置索引,$x$為分析的變量,$\bar x$表示分析變量的均值,$w_{ij}$表示空間權重矩陣,$W$表示空間權重矩陣的和
Moran's I大于0時,表示數據呈現空間正相關,其值越大空間相關性越明顯;Moran's I小于0時,表示數據呈現空間負相關,其值越小空間差異越大;Moran's I為0時,空間呈隨機性
解讀莫蘭指數的時候,需要有P值和Z得分來判定,P值小于0.05(通過95%置信度檢驗),且Z得分超過臨界值1.65(拒絕零假設設定的閾值)
PySAL是一個基于Python進行探索性空間數據分析的開放源碼庫,是由亞利桑那州立大學GeoDa Center for Geospatial Analysis and Computation贊助的社區項目
libpysal:是Python空間分析庫核心庫,它提供了四個模塊,構成了PySAL系列的空間分析工具:
空間權重: libpysal.weights
輸入和輸出:libpysal.io
計算幾何學:libpysal.cg
內置示例數據集 libpysal.examples
esda 是一個用于空間數據探索性分析的開放源碼 Python 庫,它是 PySAL (Python Spatial Analysis Library)的一個子包,包括全局和局部空間自相關分析的方法。
import esda import pandas as pd import geopandas as gpd from geopandas import GeoDataFrame import libpysal as lps import numpy as np import matplotlib.pyplot as plt from shapely.geometry import Point import contextily as ctx from pylab import figure, scatter, show %matplotlib inline
root_dir="/root/learning/pysal/實驗1/"
gdf = gpd.read_file(root_dir+'data/econ90040212.shp') # 讀取數據
gdf.columns.values #字段名
array(['CODE', 'COUNT', 'SUM_AREA', 'FIRST_ANAM', 'OID_', 'CODE_1', 'DATAFLAG', 'TOTPOP', 'TOTPOP_10K', 'RURPOP_10K', 'TOWNPOP_10', 'AGRPRODUCT', 'AGRLBR_10K', 'AGRSTOTGDP', 'FSTGDPRATE', 'SCNDGDPRAT', 'THRDGDPRAT', 'Province', 'geometry'], dtype=object)
gdf.head(1) # 查看一條記錄
第一產業占GDP比重FSTGDPRATE
為變量
ax=gdf.plot(figsize=(8,8),column="FSTGDPRATE") ax.set_axis_off()
可以看出有一定的空間聚集性,但聚集性程度的大小需要通過Moran's I的計算進一步衡量
df = gdf wq = lps.weights.Queen.from_dataframe(df)# 使用Quuen式鄰接矩陣 wq.transform = 'r' # 標準化矩陣
('WARNING: ', 98, ' is an island (no neighbors)') ('WARNING: ', 108, ' is an island (no neighbors)') ('WARNING: ', 137, ' is an island (no neighbors)') ('WARNING: ', 138, ' is an island (no neighbors)') ('WARNING: ', 139, ' is an island (no neighbors)') /usr/local/lib/python3.6/dist-packages/libpysal/weights/weights.py:172: UserWarning: The weights matrix is not fully connected: There are 6 disconnected components. There are 5 islands with ids: 98, 108, 137, 138, 139. warnings.warn(message)
可以看到有5個單元沒有鄰接對象
接下來將計算得到的權重矩陣繪制出來進行觀察
centroids = gdf.geometry.centroid # 計算多邊形幾何中心
fig = figure(figsize=(8,8)) plt.plot(centroids.x, centroids.y,'.') for k,neighs in wq.neighbors.items(): #print(k,neighs) origin = centroids[k] for neigh in neighs: segment = centroids[[k,neigh]] plt.plot(segment.x, segment.y, '-') plt.title('Queen Neighbor Graph') plt.axis('off') plt.show()
wr = lps.weights.Rook.from_dataframe(df) # 使用Rook式鄰接矩陣 # wr.transform = 'r' # 標準化矩陣
fig = figure(figsize=(8,8)) plt.plot(centroids.x, centroids.y,'.') for k,neighs in wr.neighbors.items(): #print(k,neighs) origin = centroids[k] for neigh in neighs: segment = centroids[[k,neigh]] plt.plot(segment.x, segment.y, '-') plt.title('Rook Neighbor Graph') plt.axis('off') plt.show()
y=gdf["FSTGDPRATE"] mi = esda.moran.Moran(y, wq) print("Moran's I 值為:",mi.I) print("隨機分布假設下Z檢驗值為:",mi.z_rand) print("隨機分布假設下Z檢驗的P值為:",mi.p_rand) print("正態分布假設下Z檢驗值為:",mi.z_norm) print("正態分布假設下Z檢驗的P值為:",mi.p_norm)
Moran's I 值為: 0.7133088262106428 隨機分布假設下Z檢驗值為: 16.7858372659958 隨機分布假設下Z檢驗的P值為: 0.0 正態分布假設下Z檢驗值為: 16.826039087303325 正態分布假設下Z檢驗的P值為: 0.0
p<0.001,說明能夠在99.9%的置信度下證明GDP中第一產業占比存在空間聚集性,空間相關性顯著
Moran散點圖分為四個象限,分別表示四種局部空間相關關系:
第一象限(HH):高值區被高值包圍
第二象限(LH):低值區被高值包圍
第三象限(LL):低值區被低值包圍
第四象限(HL):高值區被低值包圍
from splot.esda import plot_moran plot_moran(mi, zstandard=True, figsize=(10,4)) plt.show()
根據概率分布圖,可以看出莫蘭指數的值遠大于大于隨機正態分布的期望,這表明空間現象并不是隨機分布的,而是具有一定相關性
根據散點圖結果,可以看出全局Moran’s I 指數為0.708,并且大于0.5,因此其空間相關性較高
以上就是如何利用Python計算全局莫蘭指數,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。