Skip to content

NFHS — National Family Health Survey

India's most comprehensive health and nutrition survey — district-level data on 100+ health indicators, free to download.


Provider
IIPS & Ministry of Health (MoHFW)
Access Level
🟢 No Login — Direct Download
Formats Available
PDF Factsheets, Excel, DHS Microdata (login)
Coverage
National → District (707 districts in NFHS-5)
Latest Round
NFHS-5 (2019–21)

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.

  1. Go to rchiips.org/nfhs/NFHS-5Reports/NFHS-5_INDIA_REPORT.pdf for the national report
  2. For state reports: rchiips.org/nfhs/factsheet_NFHS-5.shtml
  3. 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:

  1. Go to rchiips.org/nfhs/districtfactsheet_NFHS-5.shtml
  2. Scroll down to "Key Indicators" → Download the Excel file
  3. 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:

  1. Register at dhsprogram.com/data
  2. Submit a data request (academic use is approved quickly)
  3. Download .dta (Stata) or .sav (SPSS) format
  4. Use Python's pyreadstat or R's haven to 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

  1. Go to rchiips.org/nfhs/districtfactsheet_NFHS-5.shtml
  2. Find and download your state's Excel file
  3. Open it in Excel → Filter to your district
  4. Answer:

  5. What is your district's child stunting rate? Is it above or below the national average (35.5%)?

  6. What % of women in your district are anaemic?
  7. What % of deliveries happen in institutions (hospitals/PHCs)? Is it above 88.6% (national)?
  8. 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'})


  • 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 →