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, weight matrices, and the scale effects that decide what your units can even measure. Kriging & Interpolation turns sparse point data into uncertainty-aware surfaces using IDW, ordinary, universal, regression, indicator and cokriging with PyKrige and GSTools. Variogram Modeling characterises spatial continuity with empirical variograms, theoretical model fitting, directional anisotropy, and the diagnostics that catch a bad fit before it corrupts a surface. Python Workflows wires everything together into end-to-end pipelines with GeoPandas, PySAL, scikit-gstat, scikit-learn and Dask — spatial regression, geographically weighted regression, spatial machine learning, 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. Where a method is easy to reach for and easy to misuse, there is a decision guide that says plainly which one to pick and what evidence should decide it.

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

Decision guides — which method, and why

Most spatial mistakes are choices made by habit. These pages put two methods side by side, run both on the same data, and name the evidence that should decide between them.

Core Concepts
Moran's I vs Geary's C
Core Concepts
Getis-Ord Gi* vs Local Moran's I for Hot Spots
Core Concepts
Rook vs Queen Contiguity Weights
Kriging & Interpolation
Ordinary vs Universal Kriging
Python Workflows
Spatial Lag vs Spatial Error Model
Core Concepts
Choosing an Analysis Scale

All implementation articles

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

Hot Spot Analysis
Emerging Hot Spot Analysis Over Time in Python
Hot Spot Analysis
Getis-Ord Gi* Hot Spot Analysis in Python
Hot Spot Analysis
Getis-Ord Gi* vs Local Moran's I for Hot Spots
Point Pattern Analysis
Kernel Density Estimation Bandwidth Selection in Python
Point Pattern Analysis
Nearest Neighbour vs Ripley's K for Clustering
Point Pattern Analysis
Ripley's K Function Implementation Guide
Sampling Bias Mitigation
Correcting Spatial Sampling Bias with GeoPandas
Sampling Bias Mitigation
Declustering Weights with Cell and Polygon Methods
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
Choosing the Number of Regions with Spatial Constraints
Spatial Clustering Regionalization
SKATER vs Max-P Regionalization in Python
Spatial Clustering Regionalization
Spatially Constrained Clustering with Max-P Regions
Spatial Scale And Maup
Choosing an Analysis Scale for Spatial Statistics
Spatial Scale And Maup
Measuring MAUP Sensitivity Across Aggregation Levels
Spatial Weight Matrices
Building Custom Spatial Weights Matrices in Python
Spatial Weight Matrices
KNN vs Distance-Band Weights in libpysal
Spatial Weight Matrices
Rook vs Queen Contiguity Weights
Spatial Weight Matrices
Row-Standardising and Kernel Weights in libpysal
Stationarity Trend Analysis
Removing Spatial Trends with Polynomial Detrending
Stationarity Trend Analysis
Testing for Second-Order Stationarity in Python
Cokriging Multivariate Interpolation
Cokriging with a Secondary Variable in GSTools
Cokriging Multivariate Interpolation
Collocated Cokriging vs Regression Kriging
Indicator And Probability Kriging
Choosing Thresholds and Indicator Variograms
Indicator And Probability Kriging
Indicator Kriging for Threshold Exceedance Probability
Inverse Distance Weighting
IDW Interpolation with SciPy and GeoPandas
Inverse Distance Weighting
IDW vs Ordinary Kriging: Which to Use
Inverse Distance Weighting
Tuning the IDW Power Parameter with Cross-Validation
Ordinary Universal Kriging
Ordinary vs Universal Kriging: Which to Use
Ordinary Universal Kriging
Step-by-Step Ordinary Kriging with PyKrige
Ordinary Universal Kriging
Universal Kriging with External Drift in PyKrige
Regression Kriging
Combining Trend Models with Kriging Residuals
Regression Kriging
Regression Kriging vs Universal Kriging
Uncertainty Variance Mapping
Building Prediction Intervals from Kriging Variance
Uncertainty Variance Mapping
Mapping Kriging Variance Surfaces in Python
Uncertainty Variance Mapping
Sequential Gaussian Simulation for Uncertainty in Python
Cross Validation Strategies
Buffered Leave-One-Out Cross-Validation
Cross Validation Strategies
Choosing a Spatial Cross-Validation Strategy
Cross Validation Strategies
Environmental Stratification Cross-Validation in Python
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
Geographically Weighted Regression
Multiscale GWR vs Classic GWR
Geopandas Data Preparation
Optimizing GeoPandas Spatial Joins for Large Datasets
Geopandas Data Preparation
Reprojecting CRS for Accurate Distance Calculations
Geopandas Data Preparation
Validating and Fixing Invalid Geometries in GeoPandas
Memory Efficient Processing
Chunked Raster Processing with Dask-GeoPandas
Memory Efficient Processing
Parallel Spatial Workflows with Dask and Joblib
Memory Efficient Processing
Reducing Memory Bottlenecks in Geospatial Workflows
Memory Efficient Processing
Using GeoParquet for Large Spatial Datasets
Spatial Machine Learning
Random Forest with Spatial Features and Spatial CV
Spatial Machine Learning
Spatial Machine Learning vs Kriging
Spatial Regression Models
Choosing a Spatial Regression Model with Lagrange Multiplier Tests
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
Anisotropy Directional Variograms
Fitting a Nested Anisotropic Variogram Model
Empirical Variogram Estimation
Choosing Lag Bins and Bandwidth for Variograms
Empirical Variogram Estimation
Fitting Empirical Variograms with SciKit-GStat
Empirical Variogram Estimation
Robust Variogram Estimators for Outlier-Heavy Data
Theoretical Variogram Models
Estimating Nugget, Sill & Range Parameters
Theoretical Variogram Models
Fitting Spherical, Exponential & Gaussian Variogram Models
Theoretical Variogram Models
The Matern Variogram Model and the Smoothness Parameter
Variogram Diagnostics And Validation
Cross-Validating a Variogram Model in Python
Variogram Diagnostics And Validation
Diagnosing a Bad Variogram Fit