Skip to content

Method

Everything settled, why, and what is still open. This analysis reads NAAC and nothing else.

No NIRF, no AISHE, no AICTE, no PLFS. Two comparisons are obvious and both are deliberately absent: how much of India’s college sector NAAC covers (needs AISHE), and whether a NAAC grade agrees with a NIRF rank (needs NIRF). Mixing either in would mean a reader could not tell which claims stand on NAAC alone and which depend on reconciling registers with different populations and purposes.

Every number here is a NAAC field, and every rate is one NAAC number over another.

naac_dim_colleges (7,566) and naac_dim_universities (497), both scraped from naac.gov.in on 2025-08-14. Clean on arrival: aishe_id unique and non-null in both, no null CGPA, grade, cycle or declaration date.

naac_dim_transition_autonomous_colleges (290) is not read. Those colleges hold extended validity during a move to autonomous status and carry no CGPA or grade at all — they are neither graded successes nor ungraded failures, so including them would corrupt any denominator.

1. Grade is a deterministic function of CGPA

Section titled “1. Grade is a deterministic function of CGPA”

A++ ≥ 3.51, A+ ≥ 3.26, A ≥ 3.01, B++ ≥ 2.76, B+ ≥ 2.51, B ≥ 2.01, C ≥ 1.51.

Verified, not assumed: zero of 7,566 colleges carry a grade outside the band its CGPA falls in. check_notes.py re-runs that test against the raw table on every run, rather than trusting the summary it just built.

The consequence is easy to get wrong: grade and CGPA are not two pieces of evidence. Grouping by one is grouping by the other, and a college cannot have “a good grade despite a low CGPA”.

2. A file of “valid accreditation” contains expired accreditations

Section titled “2. A file of “valid accreditation” contains expired accreditations”

NAAC accreditation runs five years from date_of_declaration. Against the 2025-08-14 snapshot, 406 colleges (5.4%) and 16 universities (3.2%) are already past five years, on a file published as institutions holding valid accreditation.

They are flagged, not dropped. Silently removing 5.4% of the register would be the larger distortion, and anyone counting “accredited colleges in India” should choose that boundary explicitly rather than inherit it. is_expired and a four-way validity band are both in the output.

3. It is a snapshot, and every field is prefixed current_ for a reason

Section titled “3. It is a snapshot, and every field is prefixed current_ for a reason”

One scrape, one date, no history. current_cycle_number says how many rounds an institution has completed, not what it scored in the earlier ones. No trend is computable and none is attempted.

This bites hardest on the cycle finding: CGPA rises from 2.53 at cycle 1 to 3.03 at cycle 4+, and that is consistent with institutions improving and with weak ones not returning. A snapshot cannot separate the two, and the README says so rather than picking the flattering reading.

Colleges and universities are reported side by side, never summed. A university awards degrees, a college is affiliated to one; no institution appears in both registers. The gap between them is large — mean CGPA 3.05 against 2.67 — so which register a grade came from matters.

Cycles above 4 are pooled into “4+”. 24 colleges sit at cycle 5 and none at 6. The band is named 4+ rather than 4 so the pooling is visible in the output itself.

Shares are computed within kind, so college percentages sum to 100 across colleges and university percentages across universities. There is no combined denominator anywhere.

The checker verifies claims, not just cells

Section titled “The checker verifies claims, not just cells”

check_notes.py re-derives all 56 published figures, and separately asserts the four findings, because each is a statement about a relationship rather than a cell:

  • B is the modal college grade
  • universities out-score colleges on both mean CGPA and A-or-better share
  • expiry rises monotonically as grade falls — the headline, and the one most likely to break on a re-scrape
  • a C college is at least 8× as likely to be expired as an A++ one

A finding that cannot be written as an assertion does not go in the README.

  • Coverage is unmeasured. 7,566 accredited colleges out of how many? That needs AISHE and is a separate piece by design.
  • No state or district breakdown. naac_dim_colleges carries address as a single blob — locality, city, district, state, pincode in one string with no delimiter guarantee. Parsing it would be guesswork; the transition-autonomous table has a real state column but no grades, so it cannot stand in. A geography cut needs the address parsed upstream or a join on aishe_id.
  • Affiliating university is captured but unused. 447 distinct universities across the college register, 9 colleges with none recorded. Whether grades cluster by affiliating university is a real question and not answered here.
  • The expiry gradient has an untested alternative explanation. Low-graded colleges may be slower to re-accredit, or NAAC may process them more slowly, or they may be closing. A snapshot cannot distinguish these, and the README claims only the pattern, not the mechanism.