Spatial Statistics · Python · Geostatistics

Build rigorous, reproducible
geostatistical pipelines in Python.

From spatial autocorrelation and variogram fitting to kriging interpolation, spatial regression, and memory-efficient processing at scale — a production playbook for spatial data scientists, environmental analysts, and Python GIS teams.

Why spatial data needs its own methods

Spatial data violates the i.i.d. assumption. Observations near each other are correlated, scale changes everything, and naive cross-validation silently inflates accuracy. This site documents the methods, code, and design patterns that let you ship spatial models that actually generalise.

Four topic areas anchor the site: Core Concepts covers the mathematical foundations — spatial dependence, stationarity, autocorrelation, hot-spot analysis, and weight matrices. Kriging & Interpolation turns sparse point data into uncertainty-aware surfaces using IDW, ordinary, universal, and regression kriging with PyKrige. Variogram Modeling characterises spatial continuity with empirical variograms, theoretical model fitting, and directional anisotropy. Python Workflows wires everything together into end-to-end pipelines with GeoPandas, PySAL, scikit-gstat, and Dask — including spatial regression, geographically weighted regression, cross-validation, and memory-efficient processing.

Every page ships copy-ready Python, explicit validation diagnostics, and documented failure modes — the parts that matter in production but rarely appear in tutorials.

The four areas

Start with whichever fits your current question. Each area links to sub-topics and deep-dive articles.

Core Concepts — topics

Sub-topics within Core Concepts of Spatial Statistics & Geostatistics.

Kriging & Interpolation — topics

Sub-topics within Kriging, Interpolation & Surface Generation Techniques.

Python Workflows — topics

Sub-topics within Python Workflows for Spatial Modeling & Regression.

Variogram Modeling — topics

Sub-topics within Variogram Modeling & Semivariance Analysis.

Start here — implementation guides

The most-used walkthroughs. Each one is self-contained: copy the code, run it, ship it.

Kriging & Interpolation
Step-by-Step Ordinary Kriging with PyKrige
Core Concepts
How to Calculate Moran's I in PySAL
Python Workflows
Spatial K-Fold Cross-Validation Setup
Core Concepts
Ripley's K-Function Implementation Guide
Core Concepts
Correcting Spatial Sampling Bias with GeoPandas
Python Workflows
Implementing Spatial Lag Models in Python
Variogram Modeling
Fitting Empirical Variograms with SciKit-GStat
Python Workflows
How to Run Geographically Weighted Regression in mgwr

All implementation articles

Every hands-on guide on the site, organised by area.

Hot Spot Analysis
Getis-Ord Gi* Hot Spot Analysis in Python
Point Pattern Analysis
Ripley's K Function Implementation Guide
Sampling Bias Mitigation
Correcting Spatial Sampling Bias with GeoPandas
Spatial Autocorrelation Metrics
Computing Local Moran's I (LISA) in Python
Spatial Autocorrelation Metrics
How to Calculate Moran's I in PySAL
Spatial Autocorrelation Metrics
Moran's I vs Geary's C: Which to Use
Spatial Clustering Regionalization
Spatially Constrained Clustering with Max-P Regions
Spatial Weight Matrices
Building Custom Spatial Weights Matrices in Python
Spatial Weight Matrices
Rook vs Queen Contiguity Weights
Stationarity Trend Analysis
Testing for Second-Order Stationarity in Python
Inverse Distance Weighting
IDW Interpolation with SciPy and GeoPandas
Ordinary Universal Kriging
Ordinary vs Universal Kriging: Which to Use
Ordinary Universal Kriging
Step-by-Step Ordinary Kriging with PyKrige
Regression Kriging
Combining Trend Models with Kriging Residuals
Uncertainty Variance Mapping
Mapping Kriging Variance Surfaces in Python
Cross Validation Strategies
Buffered Leave-One-Out Cross-Validation
Cross Validation Strategies
Spatial Block Cross-Validation in Python
Cross Validation Strategies
Spatial K-Fold Cross-Validation Setup in Python
Geographically Weighted Regression
Choosing GWR Bandwidth with Golden-Section Search
Geographically Weighted Regression
How to Run Geographically Weighted Regression in mgwr
Geopandas Data Preparation
Optimizing GeoPandas Spatial Joins for Large Datasets
Geopandas Data Preparation
Reprojecting CRS for Accurate Distance Calculations
Memory Efficient Processing
Chunked Raster Processing with Dask-GeoPandas
Memory Efficient Processing
Reducing Memory Bottlenecks in Geospatial Workflows
Memory Efficient Processing
Using GeoParquet for Large Spatial Datasets
Spatial Regression Models
Implementing Spatial Lag Models in Python
Spatial Regression Models
Spatial Lag vs Spatial Error Model: How to Choose
Anisotropy Directional Variograms
Detecting & Modeling Geometric Anisotropy in Python
Empirical Variogram Estimation
Choosing Lag Bins and Bandwidth for Variograms
Empirical Variogram Estimation
Fitting Empirical Variograms with SciKit-GStat
Theoretical Variogram Models
Estimating Nugget, Sill & Range Parameters
Theoretical Variogram Models
Fitting Spherical, Exponential & Gaussian Variogram Models