Data AnalyticsPortfolio projects with Indian public data

Mobile operator share by circle from TRAI's monthly annexures

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 27 September 2026 · 5 min read
In this article (7 sections)

Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).

The short answer

Which operator leads in each telecom circle, and does that lead survive once you count only active subscribers? TRAI's monthly press release has two annexures that answer this. Annexure-II gives each operator's wireless subscriber base by service area for the latest two months, and Annexure-III gives the share of those subscribers active on the peak day. This project turns the two tables into registered share, active-weighted share, monthly change and a concentration index for every circle, with Delhi, UP (West) and Haryana as the local focus.

Where the tables are

Download the latest release from TRAI's telecom subscriptions reports page. We worked from PR No. 116/2026, released on 28 August 2026 with data for the end of July 2026.

  • Annexure-II, "Wireless (Mobile) Subscriber Base". Rows are service areas, from Andhra Pradesh to West Bengal, plus Total, Net Addition and Rural Subscribers. Columns are Bharti Airtel, Reliance Com., Vodafone Idea, BSNL, MTNL and Reliance Jio, each with two months (Jun-26, Jul-26), then Total and Net Addition.
  • Annexure-III. The proportion of VLR subscribers against HLR on the date of peak VLR, in percent, by LSA and operator, with an overall column. Annexure-IV explains the method: HLR is the operator's registered base and VLR counts SIMs attached to the network.

The PDF has no machine-readable table. Text extraction returns the cells as one long column of numbers, and the header order comes out scrambled. Render the page, read the header from the image, and only then map positions to operators.

Some real values from PR 116/2026, useful as assertions:

Service area, July 2026AirtelVodafone IdeaMTNLJioTotal
Delhi40,228,92616,543,979122,75620,697,55777,593,221

Delhi has no BSNL entry, because MTNL serves Delhi and Mumbai, and Reliance Com. shows 3 subscribers. Delhi's overall VLR proportion is 86.79%. Vodafone Idea's Delhi figure is 235.21%, and a note under the table explains that peak VLR can exceed HLR where there are many inroamers.

Relevance to real jobs

Operator strategy teams, tower companies, handset brands and consultancies read these annexures every month. A share table is easy. The value is knowing that registered share and active share differ, that an operator's base in one circle can fall while it grows nationally, and that one table's scrambled PDF columns can silently swap two operators. Catching that is the job.

Cleaning issues

  1. 1Column mapping. Never trust the extracted header order. Confirm it against a known row: the Total row's July figures must add to the national wireless base the release states in text (1,287.92 million).
  2. 2Blanks versus zeros. A blank cell means the operator does not serve that area (BSNL in Delhi), while a zero means it serves nobody there now. Keep them distinct.
  3. 3Service areas are not states. Delhi includes wireless subscribers from the Noida, Ghaziabad, Gurgaon and Faridabad exchanges. UP is two service areas.
  4. 4Tiny legacy operators. Reliance Com. has a handful of subscribers. Keep it in totals but out of charts.
  5. 5VLR above 100%. Do not cap it silently. Report it, and explain the inroamer note.

Code: shares, change and concentration

The frame below is synthetic. Circle names and operator letters are placeholders, and every count is invented. It is not TRAI data.

python
import pandas as pd

hlr = pd.DataFrame({
    "circle":   ["Circle X"] * 4 + ["Circle Y"] * 4,
    "operator": ["Op A", "Op B", "Op C", "Op D"] * 2,
    "jun":      [25.0, 14.0, 18.0, 3.0, 30.0, 12.0, 32.0, 6.0],   # millions, synthetic
    "jul":      [25.4, 13.8, 18.3, 2.9, 30.3, 11.9, 32.4, 6.0],
    "vlr_pct":  [94.0, 120.0, 99.0, 100.0, 104.0, 85.0, 97.0, 30.0],
})

def shares(df, col):
    return 100 * df[col] / df.groupby("circle")[col].transform("sum")

hlr["share_jul"] = shares(hlr, "jul")
hlr["share_change_pp"] = hlr["share_jul"] - shares(hlr, "jun")
# Active-weighted: cap VLR at 100% for this view only, and say so in the README
hlr["active_jul"] = hlr["jul"] * hlr["vlr_pct"].clip(upper=100) / 100
hlr["active_share_jul"] = shares(hlr, "active_jul")

cols = ["circle", "operator", "share_jul", "share_change_pp", "active_share_jul"]
print(hlr[cols].round(2).to_string(index=False))

# Herfindahl-Hirschman Index on registered and active shares
hhi = hlr.groupby("circle").apply(
    lambda g: pd.Series({"hhi_registered": (g["share_jul"] ** 2).sum(),
                         "hhi_active": (g["active_share_jul"] ** 2).sum()}),
    include_groups=False).round(0)
print(hhi.to_string())

# Integrity check a real run must pass: operator rows add to the circle total
totals = {"Circle X": 60.4, "Circle Y": 80.6}
check = hlr.groupby("circle")["jul"].sum().round(2)
print((check - pd.Series(totals)).abs().lt(0.01).rename("reconciles").to_string())

The Herfindahl-Hirschman Index squares each share and adds them up, so it runs from near zero to 10,000 for a monopoly. Computing it on both bases shows whether a circle looks more concentrated once dormant SIMs are discounted. Capping VLR at 100% for the active view is a judgement call, because inroamers are not the operator's own customers. Show the uncapped version in an appendix.

Analysis plan

  • Transcribe or parse Annexure-II and Annexure-III for the latest release, and assert the Delhi row and the national total above.
  • Compute registered share, month-on-month share change and active-weighted share for every circle.
  • Compute HHI on both bases, and rank circles by concentration.
  • Collect six more releases and chart each NCR circle's operator shares over time.
  • Flag any operator whose base fell in a circle during a month when its national base rose.

Deliverables

  • Stacked bars: operator share by circle, registered and active side by side, with Delhi, UP (West), UP (East) and Haryana highlighted.
  • Share-change table: circle, operator, June share, July share, change in percentage points.
  • Concentration table: circle, HHI registered, HHI active, difference.
  • README: release numbers and dates, how the column order was confirmed, reconciliation results, the VLR cap choice, the Delhi boundary note.

Interview questions

  • How did you prove your parsed columns map to the right operators?
  • Why can registered and active market share point in different directions?
  • What does a VLR proportion above 100% tell you, and why would you not simply drop it?
  • Delhi's service area includes parts of UP and Haryana. How does that affect a "Delhi market share" headline?

The Delhi tele-density project reads the same release from the population side. Parsing awkward official PDFs is practised throughout the Data Analyst programme. Try the skill check if you are unsure where to start.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

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
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.