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:
| Source | Variables | Granularity |
|---|---|---|
| Census 2011 | Population, literacy, sex ratio, urbanization, age structure | District |
| NFHS-5 (2019-21) | Diabetes, hypertension, obesity, tobacco/alcohol use, child morbidity, sanitation, water access | District |
| NASA VIIRS (Black Marble) | Nightlight intensity (income proxy), nightlight growth rate | Satellite → District |
| Rural Health Statistics (MoHFW) | Doctors per capita, PHC/CHC density, hospital beds, ambulance density | District |
| PMGSY | Road/village connectivity index | District |
| NVBDCP / IDSP | Malaria, dengue, TB incidence | District |
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).
Future Opportunity Projection
The future projection is not a black-box forecast. It uses a simple, transparent formula:
Future_MAI = Current_MAI + β × TrendSlopeTrendSlope 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:
- Try the district-level value first.
- Fall back to the state-level average (flagged as imputed_state_avg).
- 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:
- 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.
- α 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.pyThis 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:
- Define a new Demand-TherapyX composite by selecting domain-relevant variables (e.g., age-specific incidence rates for pediatrics).
- Build AHP pairwise comparison matrices for the new domain using clinical literature.
- 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:
- Update the LGD crosswalk in 02_reconcile/build_district_master.py with the new district code and its parent boundary.
- Download updated boundary geometries into scratch/LGD_Districts.parquet.
- 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):
- Add a row to data_dictionary.csv with source, year, granularity, and limitations.
- Add the variable name to the relevant domain list in 04_construct/build_subdomain_composites.py.
- 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