NFHS — National Family Health Survey¶
India's most comprehensive health and nutrition survey — district-level data on 100+ health indicators, free to download.
What Is NFHS?¶
The National Family Health Survey (NFHS) is India's version of the global Demographic and Health Survey (DHS). Conducted every 4–5 years by the International Institute for Population Sciences (IIPS), NFHS interviews hundreds of thousands of households across India to collect data on:
- Population & Fertility — Total fertility rate, contraception use, birth intervals
- Child Health & Nutrition — Stunting, wasting, underweight, anaemia in children under 5
- Women's Health — Anaemia, Body Mass Index, tobacco use, domestic violence
- Maternal Health — ANC registration, institutional delivery, postnatal care
- Family Planning — Unmet need, method use, sterilisation
- HIV/AIDS Awareness — Knowledge, testing, behaviour
NFHS-5 (2019-21) is the most recent round — it covered over 6.37 lakh households across all 36 states/UTs and provided district-level data for the first time in NFHS history.
NFHS Rounds¶
| Round | Year | Coverage | Key Addition |
|---|---|---|---|
| NFHS-1 | 1992–93 | State | Baseline health data |
| NFHS-2 | 1998–99 | State | Domestic violence added |
| NFHS-3 | 2005–06 | State | HIV testing |
| NFHS-4 | 2015–16 | District | First district-level data |
| NFHS-5 | 2019–21 | District | 707 districts, expanded indicators |
Key Indicators at a Glance (NFHS-5 National)¶
| Indicator | Value | Trend |
|---|---|---|
| Total Fertility Rate (TFR) | 2.0 | ↓ Declining |
| Children stunted (<5 yrs) | 35.5% | ↓ Improved |
| Children wasted (<5 yrs) | 19.3% | ↑ Worsened |
| Women with anaemia | 57.0% | ↑ Worsened |
| Institutional deliveries | 88.6% | ↑ Improved |
| Full immunisation (12–23 months) | 76.4% | ↑ Improved |
| Modern contraceptive use | 56.5% | ↑ Improved |
How to Download NFHS Data¶
Method 1: District Factsheets (No Login) 🟢¶
The easiest way — PDF factsheets for every district.
- Go to rchiips.org/nfhs/NFHS-5Reports/NFHS-5_INDIA_REPORT.pdf for the national report
- For state reports: rchiips.org/nfhs/factsheet_NFHS-5.shtml
- For district factsheets: Click your state → then your district → Download PDF
Each district factsheet contains 100+ indicators as tables.
Method 2: Excel Summary Tables (No Login) 🟢¶
For analysis in Excel or Python:
- Go to rchiips.org/nfhs/districtfactsheet_NFHS-5.shtml
- Scroll down to "Key Indicators" → Download the Excel file
- This Excel has all 707 districts in one sheet — perfect for analysis
Method 3: DHS Microdata (Login Required) 🟡¶
For unit-level (household + individual) data for custom analysis:
- Register at dhsprogram.com/data
- Submit a data request (academic use is approved quickly)
- Download
.dta(Stata) or.sav(SPSS) format - Use Python's
pyreadstator R'shavento read
Python Analysis: Compare States on Child Stunting¶
import pandas as pd
import matplotlib.pyplot as plt
# Load NFHS-5 district Excel (all states)
# Download from rchiips.org/nfhs/districtfactsheet_NFHS-5.shtml
df = pd.read_excel("nfhs5_key_indicators.xlsx", sheet_name="NFHS-5")
# Keep only relevant columns
df = df[['State', 'District', 'Children_Stunted_percent',
'Women_Anaemia_percent', 'Institutional_Delivery_percent']].copy()
# State-level averages
state_avg = df.groupby('State')[['Children_Stunted_percent',
'Women_Anaemia_percent']].mean().round(1)
state_avg = state_avg.sort_values('Children_Stunted_percent', ascending=False)
# Plot
fig, ax = plt.subplots(figsize=(12, 8))
state_avg['Children_Stunted_percent'].plot(kind='barh', ax=ax,
color='steelblue', alpha=0.8)
ax.set_xlabel('% Children Stunted (Height-for-Age <-2SD)')
ax.set_title('Child Stunting Rate by State — NFHS-5 (2019-21)')
ax.axvline(x=35.5, color='red', linestyle='--', label='National Average: 35.5%')
ax.legend()
plt.tight_layout()
plt.savefig('nfhs5_stunting_states.png', dpi=150, bbox_inches='tight')
plt.show()
print("\nTop 5 states with highest stunting:")
print(state_avg['Children_Stunted_percent'].head())
✏️ Practice Exercise¶
Exercise 2.2 — Analyse Your District's Health Profile
Goal: Find and compare health indicators for your district.
Time needed: 20 minutes
- Go to rchiips.org/nfhs/districtfactsheet_NFHS-5.shtml
- Find and download your state's Excel file
- Open it in Excel → Filter to your district
-
Answer:
-
What is your district's child stunting rate? Is it above or below the national average (35.5%)?
- What % of women in your district are anaemic?
- What % of deliveries happen in institutions (hospitals/PHCs)? Is it above 88.6% (national)?
- Which indicator is worst in your district compared to the state average?
Bonus — Map it in Python:
import geopandas as gpd
import pandas as pd
gadm = gpd.read_file("gadm41_IND_2.json")
gadm_state = gadm[gadm['NAME_1'] == 'Maharashtra'] # Change state
nfhs = pd.read_excel("nfhs5_key_indicators.xlsx")
nfhs_state = nfhs[nfhs['State'] == 'Maharashtra']
merged = gadm_state.merge(nfhs_state, left_on='NAME_2', right_on='District')
merged.plot(column='Women_Anaemia_percent', legend=True, cmap='Reds',
figsize=(10,8),
legend_kwds={'label': '% Women with Anaemia'})
Related Datasets¶
- Census of India — Population denominator for health indicators
- HMIS — Monthly health facility utilisation data
- UDISE+ — School data to link health + education
Next Dataset: SECC 2011 →