MCDA & Suitability Analysis
Purpose: produce suitability maps whose weights, scales, and assumptions are
explicit, consistent, and stress-tested. A suitability map without a
sensitivity analysis is an opinion with a legend.
Workflow
- Structure: goal → criteria (factors) → constraints. Constraints are
binary masks (legal exclusions, water bodies, slope > threshold) applied
at the END by multiplication; factors are continuous and weighted.
Keep them apart — encoding a constraint as a heavily-weighted factor is
a classic error that lets forbidden areas score "acceptable".
- Criteria layers: each factor as a raster on a COMMON grid (same CRS,
extent, cell size, snap). Resample categorical layers with nearest,
continuous with bilinear; document each.
- Standardization to a common suitability scale (0-1 or 0-255):
- Linear min-max for monotonic "more is better/worse".
- Fuzzy membership (sigmoid/linear with control points) when suitability
saturates — justify control points from domain knowledge.
- Categorical layers: explicit reclass table, shown to the user.
Direction check: confirm for EVERY layer whether high raw value means
high or low suitability (slope: low=good; distance-to-road: usually
low=good). Direction bugs survive to the final map invisibly.
- Weights (AHP below, or direct/ranked methods with rationale).
- Aggregation: weighted linear combination (WLC) default; OWA when
the decision-maker's risk attitude (AND-like vs OR-like) matters.
- Constraint mask multiply; classify the result (equal interval or
quantiles — say which and why); sensitivity analysis; validate
against known good/bad sites if any exist.
AHP with consistency enforcement
Pairwise comparisons on Saaty's 1-9 scale; weights from the principal
eigenvector; consistency ratio (CR) must be < 0.10 or the matrix goes back
for revision. Run scripts/ahp_weights.py to compute weights + CR from a
reciprocal comparison matrix (it validates reciprocity and reports λ_max).
Practices: elicit comparisons pair by pair with verbal anchors ("moderately
more important" = 3); with multiple experts, aggregate judgments by
geometric mean BEFORE computing weights; report the full matrix, weights,
λ_max and CR in the deliverable. If CR ≥ 0.10, identify the most
inconsistent triad and ask the expert to revisit it — do not silently
massage numbers.
Aggregation
suit = np.zeros_like(factors[0], dtype="float32")
for w_i, f in zip(weights, factors): # factors already standardized 0-1
suit += w_i * f
suit *= constraint_mask # binary 0/1, applied last
OWA variant: sort factor values per cell and apply order weights — full
AND (min) to full OR (max) continuum; use when stakeholders disagree on
risk tolerance and show 2-3 scenarios.
Sensitivity analysis — mandatory
A result that flips with a small weight change is not a result:
- One-at-a-time: perturb each weight ±20% (renormalize), recompute,
report % of area changing suitability class and a stability map (cells
that never change class across perturbations).
- Scenario: 2-3 alternative weight sets from different stakeholder
priorities; present side-by-side.
- If a Monte Carlo budget exists: sample weights from Dirichlet around the
AHP vector; per-cell probability of "highly suitable" is a far stronger
product than a single map.
Deliverable standard
Suitability map (classified + continuous), constraint mask map, weights
table with CR, standardization functions per criterion (with direction),
sensitivity/stability summary, and limitations paragraph (data currency,
resolution, criteria omitted). Route cartography to cartography-geoviz;
network-access criteria come from network-accessibility-analysis.
Pitfalls checklist
- Direction inversion on a criterion (the silent killer — double-check
distance-based factors).
- Mixing resolutions without declaring the resampling rule.
- CR ignored or unreported.
- Constraints blended as weights → forbidden zones scored medium.
- Classifying with quantiles then reading them as absolute suitability.
- No sensitivity analysis; single map presented as truth.
Execution contract
- Workflow: define decision and stakeholders; separate constraints from factors; standardize criteria; elicit and validate weights; aggregate; test sensitivity; communicate uncertainty.
- Decision rules: use MCDA for transparent criteria-ranked surfaces, network analysis for route-constrained access, and optimization when discrete placement or capacity decisions dominate.
- Verification protocol: check criterion direction and alignment, AHP consistency, constraint enforcement, weight and threshold perturbations, and stable-versus-fragile areas.
- Failure modes: reject the model when criteria double-count the same construct, weights lack provenance, constraints leak into compensation, or rankings collapse under plausible perturbations.
- Deliverables: continuous and classified suitability maps, constraints, criteria transformations, weights and consistency ratio, sensitivity results, and limitations.
- Source freshness: consult the authoritative source registry before applying methods or implementation APIs and record the checked date.
1---2name: mcda-suitability-analysis3description: Always invoke for spatial suitability, site selection, AHP, criteria weights, or weighted-overlay work, including audits of inconsistent pairwise judgments and requests for only a final map. Covers consistency, standardization, constraints, ranked surfaces, shortlists, and sensitivity. Route travel-time placement and location-allocation to network-accessibility-analysis.4license: MIT5---67# MCDA & Suitability Analysis89Purpose: produce suitability maps whose weights, scales, and assumptions are10explicit, consistent, and stress-tested. A suitability map without a11sensitivity analysis is an opinion with a legend.1213## Workflow14151. **Structure**: goal → criteria (factors) → constraints. Constraints are16 binary masks (legal exclusions, water bodies, slope > threshold) applied17 at the END by multiplication; factors are continuous and weighted.18 Keep them apart — encoding a constraint as a heavily-weighted factor is19 a classic error that lets forbidden areas score "acceptable".202. **Criteria layers**: each factor as a raster on a COMMON grid (same CRS,21 extent, cell size, snap). Resample categorical layers with nearest,22 continuous with bilinear; document each.233. **Standardization** to a common suitability scale (0-1 or 0-255):24 - Linear min-max for monotonic "more is better/worse".25 - Fuzzy membership (sigmoid/linear with control points) when suitability26 saturates — justify control points from domain knowledge.27 - Categorical layers: explicit reclass table, shown to the user.28 Direction check: confirm for EVERY layer whether high raw value means29 high or low suitability (slope: low=good; distance-to-road: usually30 low=good). Direction bugs survive to the final map invisibly.314. **Weights** (AHP below, or direct/ranked methods with rationale).325. **Aggregation**: weighted linear combination (WLC) default; OWA when33 the decision-maker's risk attitude (AND-like vs OR-like) matters.346. **Constraint mask** multiply; classify the result (equal interval or35 quantiles — say which and why); **sensitivity analysis**; validate36 against known good/bad sites if any exist.3738## AHP with consistency enforcement3940Pairwise comparisons on Saaty's 1-9 scale; weights from the principal41eigenvector; consistency ratio (CR) must be < 0.10 or the matrix goes back42for revision. Run `scripts/ahp_weights.py` to compute weights + CR from a43reciprocal comparison matrix (it validates reciprocity and reports λ_max).4445Practices: elicit comparisons pair by pair with verbal anchors ("moderately46more important" = 3); with multiple experts, aggregate judgments by47geometric mean BEFORE computing weights; report the full matrix, weights,48λ_max and CR in the deliverable. If CR ≥ 0.10, identify the most49inconsistent triad and ask the expert to revisit it — do not silently50massage numbers.5152## Aggregation5354```python55suit = np.zeros_like(factors[0], dtype="float32")56for w_i, f in zip(weights, factors): # factors already standardized 0-157 suit += w_i * f58suit *= constraint_mask # binary 0/1, applied last59```6061OWA variant: sort factor values per cell and apply order weights — full62AND (min) to full OR (max) continuum; use when stakeholders disagree on63risk tolerance and show 2-3 scenarios.6465## Sensitivity analysis — mandatory6667A result that flips with a small weight change is not a result:6869- **One-at-a-time**: perturb each weight ±20% (renormalize), recompute,70 report % of area changing suitability class and a stability map (cells71 that never change class across perturbations).72- **Scenario**: 2-3 alternative weight sets from different stakeholder73 priorities; present side-by-side.74- If a Monte Carlo budget exists: sample weights from Dirichlet around the75 AHP vector; per-cell probability of "highly suitable" is a far stronger76 product than a single map.7778## Deliverable standard7980Suitability map (classified + continuous), constraint mask map, weights81table with CR, standardization functions per criterion (with direction),82sensitivity/stability summary, and limitations paragraph (data currency,83resolution, criteria omitted). Route cartography to `cartography-geoviz`;84network-access criteria come from `network-accessibility-analysis`.8586## Pitfalls checklist8788- Direction inversion on a criterion (the silent killer — double-check89 distance-based factors).90- Mixing resolutions without declaring the resampling rule.91- CR ignored or unreported.92- Constraints blended as weights → forbidden zones scored medium.93- Classifying with quantiles then reading them as absolute suitability.94- No sensitivity analysis; single map presented as truth.9596## Execution contract9798- **Workflow:** define decision and stakeholders; separate constraints from factors; standardize criteria; elicit and validate weights; aggregate; test sensitivity; communicate uncertainty.99- **Decision rules:** use MCDA for transparent criteria-ranked surfaces, network analysis for route-constrained access, and optimization when discrete placement or capacity decisions dominate.100- **Verification protocol:** check criterion direction and alignment, AHP consistency, constraint enforcement, weight and threshold perturbations, and stable-versus-fragile areas.101- **Failure modes:** reject the model when criteria double-count the same construct, weights lack provenance, constraints leak into compensation, or rankings collapse under plausible perturbations.102- **Deliverables:** continuous and classified suitability maps, constraints, criteria transformations, weights and consistency ratio, sensitivity results, and limitations.103- **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) before applying methods or implementation APIs and record the checked date.