溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用Python計算全局莫蘭指數

發(fā)布時間:2021-10-09 17:09:10 來源:億速云 閱讀:1488 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關如何利用Python計算全局莫蘭指數,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

全局空間自相關

空間自相關(spatial autocorrelation)是指一些變量在同一個分布區(qū)內的觀測數據之間潛在的相互依賴性。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贊助的社區(qū)項目

  • 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) # 查看一條記錄

如何利用Python計算全局莫蘭指數

計算全局空間自相關指數Moran's I

  • 第一產業(yè)占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()

如何利用Python計算全局莫蘭指數

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()

計算Moran'I

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("正態(tài)分布假設下Z檢驗值為:",mi.z_norm)
print("正態(tài)分布假設下Z檢驗的P值為:",mi.p_norm)
Moran's I 值為: 0.7133088262106428
隨機分布假設下Z檢驗值為: 16.7858372659958
隨機分布假設下Z檢驗的P值為: 0.0
正態(tài)分布假設下Z檢驗值為: 16.826039087303325
正態(tài)分布假設下Z檢驗的P值為: 0.0

p<0.001,說明能夠在99.9%的置信度下證明GDP中第一產業(yè)占比存在空間聚集性,空間相關性顯著

繪制Moran's I散點圖

Moran散點圖分為四個象限,分別表示四種局部空間相關關系:

  • 第一象限(HH):高值區(qū)被高值包圍

  • 第二象限(LH):低值區(qū)被高值包圍

  • 第三象限(LL):低值區(qū)被低值包圍

  • 第四象限(HL):高值區(qū)被低值包圍

from splot.esda import plot_moran

plot_moran(mi, zstandard=True, figsize=(10,4))
plt.show()

如何利用Python計算全局莫蘭指數

根據概率分布圖,可以看出莫蘭指數的值遠大于大于隨機正態(tài)分布的期望,這表明空間現象并不是隨機分布的,而是具有一定相關性

根據散點圖結果,可以看出全局Moran’s I 指數為0.708,并且大于0.5,因此其空間相關性較高

以上就是如何利用Python計算全局莫蘭指數,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI