Methodology

Summary of how the District-Level Pharmaceutical Market Attractiveness Index is constructed, validated, and projected.

What is the MAI?

The Market Attractiveness Index (MAI)is a composite score that ranks each of India's 785 districts by their potential for pharmaceutical market opportunity. It combines two fundamental dimensions:

  • Demand Potential — how large and urgent is the healthcare need in this district? (Population, disease burden, chronic risk factors, acute disease incidence)
  • Realizability / Access — can the market actually be served? (Healthcare infrastructure density, road connectivity, diagnostic lab availability)

The index exists in three variants: MAI_Overall, MAI_Chronic (for chronic disease portfolios), and MAI_Acute (for acute / infectious disease portfolios).

Data Sources

All data comes from free, publicly available Indian government sources. No paid datasets are used. Key sources include:

SourceVariablesGranularity
Census 2011Population, literacy, sex ratio, urbanization, age structureDistrict
NFHS-5 (2019-21)Diabetes, hypertension, obesity, tobacco/alcohol use, child morbidity, sanitation, water accessDistrict
NASA VIIRS (Black Marble)Nightlight intensity (income proxy), nightlight growth rateSatellite → District
Rural Health Statistics (MoHFW)Doctors per capita, PHC/CHC density, hospital beds, ambulance densityDistrict
PMGSYRoad/village connectivity indexDistrict
NVBDCP / IDSPMalaria, dengue, TB incidenceDistrict

All variables are documented in data_dictionary.csv with source URLs, year, granularity, and known limitations.

How the Index is Built

The index construction follows four steps:

Step 1: Sub-Domain Composites

Within each domain (e.g., Demand-Chronic, Realizability-Acute), raw variables are first normalized to a 0–1 scale using min-max normalization. Variables where higher values indicate worse conditions (e.g., open defecation rate) are inverted so that higher always means "more attractive."

A redundancy check is performed: if two variables correlate above 0.8, one is combined or dropped to avoid double-counting. The remaining variables are then weighted using AHP (Analytic Hierarchy Process) weights derived from epidemiological literature, and combined into a sub-domain composite score.

Step 2: Axis Scores

Sub-domain composites are combined into two axis scores per therapy type:

  • Demand_Overall = blend of chronic + acute demand composites
  • Realizability_Overall = blend of chronic + acute access composites

Step 3: Composite Index (Geometric Mean)

The final MAI score uses a geometric mean, not a simple weighted average:

MAI = Demandα × Realizability(1-α)

The geometric mean is chosen deliberately: a district with enormous demand but zero infrastructure scores low (not moderate), because that demand is currently uncapturable. A simple weighted sum would let one high axis compensate for a near-zero other axis, which is commercially misleading.

Default α = 0.5 (equal weight). Sensitivity is tested at α ∈ [0.4, 0.6].

Step 4: 2×2 Quadrant Classification

Each district is placed into one of four quadrants based on whether its Demand and Realizability scores are above or below the within-state median (not the national median — a national split would simply reproduce a rich-state-vs-poor-state map).

Star Market
High Demand + High Realizability
Emerging
High Demand + Low Realizability
Underserved
Low Demand + High Realizability
Deprioritize
Low Demand + Low Realizability

Future Opportunity Projection

The future projection is not a black-box forecast. It uses a simple, transparent formula:

Future_MAI = Current_MAI + β × TrendSlope

TrendSlope is computed from actually-available historical deltas:

  • Census 2001 → 2011 (urbanization growth, population growth)
  • NFHS-4 (2015-16) → NFHS-5 (2019-21) (chronic risk factor changes)
  • VIIRS multi-year nightlight series (income growth proxy)

β = 0.3(default) represents "how much weight we give a 10-year historical trend over a ~5-year forward window." This is sensitivity-tested at β ∈ {0.2, 0.3, 0.4}.

No synthetic data is used. No machine learning predictions are made. The future projection should be interpreted as "if historical structural trends continue at a moderated pace."

Data Confidence & Imputation

Not all variables are available at district level for all 785 districts. When data is missing, a hierarchical imputation strategy is applied:

  1. Try the district-level value first.
  2. Fall back to the state-level average (flagged as imputed_state_avg).
  3. Fall back to the national average only if state-level is also missing (flagged as imputed_national_avg).

Every district carries a confidence score = 1 − (fraction of input variables that were imputed). A district with confidence 1.0 had all data from actual district-level sources; a district with confidence 0.4 had 60% of its input values imputed.

On the map, low-confidence districts are shown with a diagonal hatch pattern overlay — not just a duller color — so the distinction is visible in greyscale print and to colorblind users.

In the rankings table, the confidence indicator is always visible as a dot + text label (never color-only), per accessibility best practice.

Validation (Proxy-Based)

Since no "ground truth" pharmaceutical sales data by district is publicly available, the index is validated against proxy measures of healthcare market activity:

  • PMJAY claims volume/value — from the National Health Authority dashboard (free)
  • HMIS OPD/IPD footfall — from the NHM HMIS portal (free)
  • Jan Aushadhi Kendra count per district — from PMBJP (free, underused by other teams)
  • Per-capita OOP health expenditure — from NSSO/NFHS

Results are reported as Spearman rank correlations (ρ). Example: "MAI_Overall correlates at Spearman ρ = 0.67 with district PMJAY claims volume, suggesting face validity as a proxy for realized healthcare demand."

We never claim the index is "validated" or state an "accuracy." Proxy-based validation provides face validity evidence, not ground-truth calibration.

Robustness & Sensitivity

Two robustness checks are performed:

  1. AHP vs Entropy weighting comparison: The sub-domain weights are recomputed using a fully data-driven entropy method (no manual judgments). The resulting district ranking is Spearman-correlated against the AHP-based ranking. High correlation = the index is robust to weighting methodology. Low correlation = specific domains that disagree are disclosed.
  2. α sensitivity: The demand-vs-realizability balancing parameter α is tested at 0.4, 0.5, and 0.6. If rankings shift dramatically, it means the index is sensitive to this assumption — this is disclosed, not hidden.

Reproducibility

The entire pipeline is reproducible from source. A new user can run:

pip install -r requirements.txt && python pipeline/run_all.py

This regenerates district_index_final.csv from raw government data downloads (network access to listed portals required, no API keys). Every intermediate step is deterministic and logged.

Extending the Framework

Adding a New Therapy Category

The framework extends to any new therapy category (e.g., oncology, pediatrics) without code changes to the pipeline architecture:

  1. Define a new Demand-TherapyX composite by selecting domain-relevant variables (e.g., age-specific incidence rates for pediatrics).
  2. Build AHP pairwise comparison matrices for the new domain using clinical literature.
  3. Add the variable list to 04_construct/build_subdomain_composites.py and re-run the pipeline.

The geometric-mean MAI formula automatically accommodates any number of sub-domain composites — the only constraint is that each variable must have a named free source documented in data_dictionary.csv.

District Boundary Changes

India periodically creates new districts by bifurcating existing ones. When this happens:

  1. Update the LGD crosswalk in 02_reconcile/build_district_master.py with the new district code and its parent boundary.
  2. Download updated boundary geometries into scratch/LGD_Districts.parquet.
  3. Re-run from stage 02 onward. The pipeline uses LGD codes as the join key everywhere, so boundary changes only affect the crosswalk and geometry files — no logic changes required.

Adding New Variables

To incorporate a newly available indicator (e.g., a future NFHS-6 or a new HMIS metric):

  1. Add a row to data_dictionary.csv with source, year, granularity, and limitations.
  2. Add the variable name to the relevant domain list in 04_construct/build_subdomain_composites.py.
  3. Add the column to the CSV parser in data.ts for dashboard display.

The pipeline's imputation, normalization, and AHP weighting steps are automatic for any new numeric column — no manual recoding needed.

DistrictDx — Pharmaceutical Market Attractiveness Index · Built for Sun Pharmaceutical Industries