En esta segunda parte, se utilizarán algunas de las herramientas del Análisis Exploratorio de Datos Espaciales (ESDA, por sus siglas en inglés), como las aprendidas en la práctica de Autocorrelación Espacial, sobre los datos generados por el Modelo de Hägerstrand, con el objetivo de comprender cuál es la relación entre algunos Estadísticos Espaciales y las Distribuciones observadas a través del modelo.
Para esto, nuevamente se hará uso de las herramientas proporcionadas por la librería pysal
; específicamente, el calculo de la I de Moran que, como ya se ha estudiado, se trata de un estadístico que permite medir la Autocorrelación Espacial Global de las entidades. Para comenzar con el análisis utilizando este estadístico, se comenzará con la Difusión Aleatoria:
# Importación de librerias
%pylab inline
from haggerstrand.diffusion import SimpleDiffusion
# Instanciar la clase
r = SimpleDiffusion(N=50 , M=50 , mif_size=9 , pob=20 , initial_diff=[(20,20)] , p0=0.3 , max_iter=15)
# Generación del modelo de Difusión Aleatoria
r.random_diffusion()
# Obtención de gráfica
img_r = plt.imshow(r.result[: , : , r.max_iter - 1] , vmin = 0 , vmax = 20)
plt.colorbar(img_r)
plt.show()
Ahora, es posible calcular la I de Moran utilizando pysal
; para repasar cómo obtener éste estadístico, revisa nuevamente la práctica de Autocorrelación Espacial, específicamente, en la sección titulada Autocorrelación Espacial Global:
# Importación de 'pysal'
import pysal as ps
# Generación de Matriz de Pesos Espaciales
m_reina = ps.lib.weights.lat2W(nrows = r.N , ncols = r.M , rook = False)
# Cálculo de I de Moran
moran_r = ps.explore.esda.Moran(r.result[: , : , r.max_iter - 1].flatten() , m_reina)
Los pasos realizados en la celda anterior son los siguientes:
.lat2W()
; ésta calcula la matriz utilizando como base una topología regular, como es el espacio creado en la clase SimpleDiffusion
compuesto por celdas idénticas, y al que se le coloca el número de filas (N
) y columnas (M
) de este espacio. El argumento rook
únicamente define si la Matriz de Contigüidad seguirá el criterio de Torre (True
) o de Reina (False
)..Moran()
, colocando como argumento la línea r.result[: , : , r.max_iter - 1]
que llama la última rebanada de la Matriz de Resultados, y a la cual se le aplica la función .flatten()
para convertir la matriz en una lista (Array), que es la forma en la que necesita ser ingresada en .Moran()
.Pueden llamarse las propiedades de la variable moran
para obtener los resultados del análisis:
print("La I de Moran es " + str(moran_r.I))
print("El valor esperado, bajo la suposición de normalidad, es " + str(moran_r.EI))
print("La significancia es de " + str(moran_r.p_sim))
¿Cómo se interpretan los valores anteriores?
Realizando el mismo ejercicio para el caso de la Difusión Espacial, se tiene:
# Instanciar la clase
s = SimpleDiffusion(N=50 , M=50 , mif_size=9 , pob=20 , initial_diff=[(20,20)] , p0=0.3 , max_iter=15)
# Generación del modelo de Difusión Espacial
s.spatial_diffusion()
# Obtención de gráfica
img_s = plt.imshow(s.result[: , : , s.max_iter - 1] , vmin = 0 , vmax = 20)
plt.colorbar(img_s)
plt.show()
# Cálculo de I de Moran
moran_s = ps.explore.esda.Moran(s.result[: , : , s.max_iter - 1].flatten() , m_reina)
print("La I de Moran es " + str(moran_s.I))
print("El valor esperado, bajo la suposición de normalidad, es " + str(moran_s.EI))
print("La significancia es de " + str(moran_s.p_sim))
Puede observarse que la I de Moran no sólo tiene un valor mucho más grande en la Difusión Espacial a comparación de la Difusión Aleatoria, sino también es mucho más significativa. Éste es justo el resultado esperado pues, debido a que los resultados del Modelo de Hägerstrand dependen de la distancia entre las celdas, los datos comienzan a asemejarse a las Vecindades, lo cual inmediatamente genera una Autocorrelación Espacial Positiva.
Experimenta con los diferentes parámetros del algoritmo, determinados al momento de instanciar la clase SimpleDiffusion
, y observa cómo se modifica la I de Moran. Determina, ¿cuál es el parámetro más importante?
En el siguiente ejemplo, se disminuye el Número de Iteraciones (max_iter
) para el algoritmo de Difusión Espacial:
# Instanciar la clase
s = SimpleDiffusion(N=50 , M=50 , mif_size=9 , pob=20 , initial_diff=[(20,20)] , p0=0.3 , max_iter=10)
# Generación del modelo de Difusión Espacial
s.spatial_diffusion()
# Obtención de gráfica
img_s = plt.imshow(s.result[: , : , s.max_iter - 1] , vmin = 0 , vmax = 20)
plt.colorbar(img_s)
plt.show()
# Cálculo de I de Moran
moran_s = ps.explore.esda.Moran(s.result[: , : , s.max_iter - 1].flatten() , m_reina)
print("La I de Moran es " + str(moran_s.I))
print("El valor esperado, bajo la suposición de normalidad, es " + str(moran_s.EI))
print("La significancia es de " + str(moran_s.p_sim))
Aunque los modelos anteriores ayudan a visualizar perfectamente el fenómeno de difusión desde el punto de vista teórico, en la realidad es difícil observar fenómenos de difusión tan puros como el de Difusión Espacial. Para esto, la librería también posee el método .mixed_diffusion()
, que pretende mezclar los dos tipos de difusión estudiados hasta ahora (Aleatoria y Espacial) a través de una proporción:
# Instanciar la clase
m = SimpleDiffusion(N=50 , M=50 , mif_size=9 , pob=20 , initial_diff=[(20,20)] , p0=0.3 , max_iter=15)
# Generación del modelo de Difusión Mixta (Proporción del 50%)
m.mixed_diffusion(0.5)
# Obtención de gráfica
img_m = plt.imshow(m.result[: , : , m.max_iter - 1] , vmin = 0 , vmax = 20)
plt.colorbar(img_m)
plt.show()
Al colocar un valor dentro de la función .mixed_diffusion()
, en este caso 0.5, se le menciona al algoritmo que la mitad de la difusión se realice de acuerdo al Modelo de Hägerstrand, mientras que la otra mitad la realice aleatoriamente; como tal, si la proporción es de 0, el fenómeno se vuelve completamente Aleatorio y, si se hace 1, es completamente Espacial. Calculando la I de Moran con esta Difusión Mixta:
# Cálculo de I de Moran
moran_m = ps.explore.esda.Moran(m.result[: , : , m.max_iter - 1].flatten() , m_reina)
print("La I de Moran es " + str(moran_m.I))
print("El valor esperado, bajo la suposición de normalidad, es " + str(moran_m.EI))
print("La significancia es de " + str(moran_m.p_sim))
Experimenta con los diferentes valores de la proporción, así como los parámetros del propio algoritmo.