UPI usage in Gautam Buddha Nagar, Ghaziabad and Gurugram districts
In this article (8 sections)
Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).
NPCI's UPI Statewise Statistics break usage down to the district. So you can ask a genuinely local question: how does UPI activity in Gautam Buddha Nagar (Noida and Greater Noida), Ghaziabad, Gurugram, Faridabad and Delhi's districts compare, and how much of the difference survives once you think about population and ticket size? This project answers it for a run of months. It builds the ranking and the value-per-transaction comparison, and makes the per-person question honest instead of impressive.
Getting the district table
Go to NPCI's UPI Ecosystem Statistics and open the UPI Statewise Statistics tab. Other tabs on the page include Chargeback, Top 50 Member Performance, UPI Applications, P2P and P2M Transactions, Top 15 PSPs and Merchant Category Classification. There is a month selector, a Download control and a "Show archived" option for older months.
The table we observed has these columns:
| Column | Meaning |
|---|---|
| Sr. No. | rank in the table |
| State / Union Territory | state name in capitals |
| District | district name in capitals |
| Volume (in Mn ) | transactions, millions |
| Volume Contribution (%) | share of the national total |
| Value (in Cr.) | rupees, crore |
| Value Contribution (%) | share of the national total |
Download one file per month. District naming matters for NCR: look up exactly how the table spells Gautam Buddha Nagar and Gurugram, which was formerly Gurgaon, before you filter. The page does not state whether a transaction is placed by the payer's location, the payee's, or a bank's records. Do not infer that. Write "as attributed by NPCI" in your chart subtitles.
Why a recruiter at an NCR fintech would read this
Location analysis is everyday work for payments, lending and retail companies: where to place field sales, which districts to pilot a merchant product in, where usage is thin. A project on your own region shows initiative. The denominator discussion shows maturity. Most portfolio projects rank raw totals and stop. Yours will explain why raw totals flatter big, commercially dense districts.
Cleaning issues specific to this table
- Percent columns arrive as strings with a "%" sign. Strip it and divide by 100.
- Values use Indian digit grouping ("63,832.60"). Remove the commas before converting.
- Delhi is split into several districts. Decide whether to compare districts or aggregate Delhi, and say which.
- Month-to-month, a district can drop out of or enter the listed rows. Confirm whether the download contains all districts or only a top slice before computing shares.
- Archived months may differ in format. Check each file's header.
Code on synthetic district rows
These rows are synthetic. The district names are real, but the numbers are invented and should not be read as NPCI data.
import pandas as pd
raw = pd.DataFrame({
"State / Union Territory": ["UTTAR PRADESH", "UTTAR PRADESH", "HARYANA", "HARYANA", "DELHI", "DELHI"],
"District": ["GAUTAM BUDDHA NAGAR", "GHAZIABAD", "GURUGRAM", "FARIDABAD", "SOUTH", "NORTH WEST"],
"Volume (in Mn )": ["210.40", "150.10", "260.75", "90.30", "120.00", "130.60"],
"Volume Contribution (%)": ["0.86%", "0.61%", "1.06%", "0.37%", "0.49%", "0.53%"],
"Value (in Cr.)": ["24,100.50", "15,300.25", "33,900.00", "9,700.80", "13,200.00", "12,800.40"],
})
def num(s):
return pd.to_numeric(s.str.replace(",", "", regex=False).str.rstrip("%"))
df = pd.DataFrame({
"state": raw["State / Union Territory"].str.title(),
"district": raw["District"].str.title(),
"volume_mn": num(raw["Volume (in Mn )"]),
"vol_share": num(raw["Volume Contribution (%)"]) / 100,
"value_cr": num(raw["Value (in Cr.)"]),
})
df["avg_ticket_rs"] = (10 * df["value_cr"] / df["volume_mn"]).round(0)
# Hypothetical population denominators (lakh), clearly labelled as assumptions
assumed_pop_lakh = {"Gautam Buddha Nagar": 20, "Ghaziabad": 45, "Gurugram": 15,
"Faridabad": 18, "South": 27, "North West": 36}
df["assumed_pop_lakh"] = df["district"].map(assumed_pop_lakh)
df["txns_per_person"] = (df["volume_mn"] * 1e6 / (df["assumed_pop_lakh"] * 1e5)).round(1)
df["rank_volume"] = df["volume_mn"].rank(ascending=False).astype(int)
df["rank_per_person"] = df["txns_per_person"].rank(ascending=False).astype(int)
print(df[["district", "volume_mn", "avg_ticket_rs", "txns_per_person", "rank_volume", "rank_per_person"]])The populations in assumed_pop_lakh are placeholders, not Census figures. In your real project, replace them with a sourced number. The point of the code is the last two columns: watch how ranks move when the denominator changes, and report both.
Choosing a denominator, honestly
The Census 2011 Primary Census Abstract is available from the Census of India tables page. It gives district populations as of 2011. For fast-growing districts such as Gautam Buddha Nagar and Gurugram, that is badly out of date.
You have three options:
- 1Use 2011 counts and label every per-person figure "per 2011 resident".
- 2Use an official projection if you can find one at district level, and cite it.
- 3Skip per-person figures and compare shares and ticket sizes only.
Option 3 is fully defensible. Commuting also breaks the per-person idea: many people who live in Ghaziabad pay for things in Noida or Delhi.
Plan
- 1Download twelve consecutive months.
- 2Build a district-month panel for the NCR districts.
- 3Rank by volume, value and average ticket, and track rank changes over the year.
- 4Compare each NCR district's share of national volume with its share of value. A district whose value share exceeds its volume share has larger average payments.
- 5Add per-person figures only under a chosen, labelled denominator.
Deliverable
- A slope chart of NCR districts' volume share across the first and last month of the year.
- A scatter of average ticket against volume, one point per district, with the NCR districts labelled.
- A table of the NCR districts with volume, value, average ticket and rank for each month.
- A README with the source, tab name, download dates, attribution caveat, denominator decision and limits.
Interview questions this invites
- What does "district" mean in NPCI's table, and what do you not know about it?
- Why might Gurugram's average ticket differ from Ghaziabad's?
- Your per-person figure uses 2011 population. How wrong could it be, and in which direction?
- How would a merchant-acquiring team use this analysis, and what extra data would they want?
The same NPCI page supports a merchant category analysis if you want a second, complementary project. District-level comparison and denominator reasoning are practised in our Data Analyst programme. Learners near Noida can also join the optional in-person labs at our centre.
Frequently asked questions
Does NPCI publish UPI data by district?
Yes. The UPI Statewise Statistics tab on NPCI's UPI Ecosystem Statistics page lists rows by state or union territory and district, with volume in millions, value in crore and each row's percentage contribution, for a selected month.
Can I compute UPI transactions per person for Noida?
Only with a stated population denominator, and the options are imperfect. Census 2011 district counts are old. The district in NPCI's table may also not match where people actually live and work, so present any per-person figure as an estimate with its caveats.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI