Every assumption, numbered
Each entry states the assumption, why it was made, what it would change if wrong, and whether it has been tested. Nothing in this analysis rests on an assumption that is not on this list.
Companion documents: QUERIES.md is the exact SQL behind every number;
FINDINGS.md is what survived review and at what confidence.
A. Population and scope
Section titled “A. Population and scope”A1. One survey release, not pooled
Section titled “A1. One survey release, not pooled”release_id = 'calendar_2025'.
Why. Pooling calendar_2022–25 would roughly double thin cells, but wages are nominal and would need a deflator; the companion analysis shows the obvious internal deflator (median wage of all salaried workers) is unusable because it reads exactly ₹15,000 in three consecutive years — round- number heaping, not stable pay.
If wrong. Cells stay thinner than they need to be, so several rung comparisons remain statistically tied that pooling might separate.
Tested? Partly. The companion pooled four years for engineering only (../plfs/entry/POOLED.md) and found the single-year estimates confirmed, with a 26% tighter interval. Not tested for the other ten rungs.
A2. First visit only
Section titled “A2. First visit only”visit = 'V1'.
Why. pas, usual principal activity, is collected only at the first visit — 100% populated at
V1 and 0% at every revisit. Including revisits would both lose the activity variable and count
households up to four times.
If wrong. Not an assumption so much as a requirement; ignoring it produces garbage.
Tested? Yes — documented in the table’s own schema, and the calendar_* releases are V1-only.
A3. Ages 21–34
Section titled “A3. Ages 21–34”Why. The lower bound is the earliest age at which a three-year degree holder can plausibly have finished. The upper bound keeps the window inside “early career” for every rung.
If wrong. A wider band would mix career stages; a narrower one would empty the wage cells.
Tested? No. The lifecycle extract separately reaches ages 17–42 for the three life stages.
A4. Population figures are a lower bound
Section titled “A4. Population figures are a lower bound”PLFS weight_annual sums to the survey’s own Census-2011-anchored projection — 1,193m nationally
at CY2025 V1, against India’s actual ~1,450m. Every population count in this analysis, and every
“People” column in every rung note, is therefore understated.
Why no adjustment is applied. Every rate here is a share, and shares are unaffected — numerator and denominator carry the same deflation. Applying a correction would require an official population projection we do not hold as a documented table, and hard-coding one into a script is exactly the drift this corpus tries to avoid.
Tested — three independent anchors, which broadly agree. This was checked rather than taken on faith, because the schema’s own “15–20%” is itself an estimate:
| Anchor | Observed | Expected | Implied correction |
|---|---|---|---|
| Total weighted population | 1,193m | ~1,450m | 1.22× |
| ~2.5 crore per single-year cohort, ages 21–34 | 265.2m | ~350m | 1.32× |
| AISHE UG graduate flow vs PLFS degree stock 21–34 | 71.6m | ~84m | 1.17× |
The AISHE anchor is the weakest of the three — its graduate counts are ‘actual response’, so they themselves undercount, which pushes the true correction above 1.17×.
The correction is NOT uniform by age, so a single global scalar would be wrong: the shortfall is larger for the 30–34 band than for 20–24. Anyone converting a share here into a headcount should quote the 1.17×–1.32× range, not a point estimate.
What would fix it properly. Loading MoSPI’s Population Projections for India and States 2011–2036 (single-year age × sex × year) as a documented external table. Calibration then becomes a join with a schema behind it rather than a magic number. Raised with the data team; until then, counts stand as lower bounds.
If wrong. Every absolute population figure (265.2m for ages 21–34, 49.26m general degree, 53.97m below middle school) is understated by roughly a fifth to a third. No ratio, rate, share or comparison anywhere in this analysis is affected.
B. How the rungs are defined
Section titled “B. How the rungs are defined”B1. gedu_lvl places a person on the ladder; tedu_lvl only splits within a level
Section titled “B1. gedu_lvl places a person on the ladder; tedu_lvl only splits within a level”Why. General education is the ordinal ladder; technical qualification is a within-level distinction, used only where it separates people who are otherwise identical.
Consequence, and it is asymmetric. At gedu_lvl='11' the technical field decides the rung
(technical vs non-technical diploma). At gedu_lvl='12' it decides the rung for technical
degrees (engineering, medical, other technical) but is ignored for diplomas — a graduate
holding only a diploma sits in the general-degree rung, not a diploma rung.
If wrong. 4,496 people (7.8% of the general-degree rung) would move to a diploma rung. That would raise the diploma rungs’ numbers and lower the general degree’s, so the current placement is the conservative choice for this analysis’s main finding.
Tested? Yes — 2,272 of those 4,496 hold an engineering or medical diploma; moving them would strengthen rather than weaken the diploma-beats-degree result.
B2. “Technical” means a technical field, not merely “some technical code”
Section titled “B2. “Technical” means a technical field, not merely “some technical code””Technical diplomas are tedu_lvl IN ('07','08','09','10') — agriculture, engineering, medicine,
crafts. Code 11, “diploma in other subjects”, is not technical.
Why. An earlier version used tedu_lvl != '01', which swept in code 11 — 1,890 people at
25.4% formal employment — and diluted the technical rung from 33.4% to 29.1%.
If wrong. The 05/06 split moves by roughly 5 percentage points in both directions.
Tested? Yes, and it failed once. Fixed. But see rungs/06:
the non-technical rung’s top two occupations are electrical installers and machinery mechanics,
so the boundary is softer than the codes suggest. Unresolved.
B3. Below-middle-school sub-levels are merged
Section titled “B3. Below-middle-school sub-levels are merged”Codes 01–06: not literate, no formal schooling, below primary, primary.
Why. Their labour-market outcomes are indistinguishable at the resolution a 609-person formal-work cell can support.
If wrong. A real gradient inside the bottom 54 million is being hidden.
Tested? No.
C. What counts as work
Section titled “C. What counts as work”C1. Formal work requires a contract or social security
Section titled “C1. Formal work requires a contract or social security”pas='31' AND ern_reg > 0 AND (job_pas IN ('2','3','4') OR ssec_pas NOT IN ('8','9')).
Why. It matches how PLFS-based formality is conventionally measured.
If wrong — and it partly is. The OR admits people with a written contract but no benefits. At
the bottom rung they are 23.9% of the formal count and earn a ₹10,000 median, below the ₹11,000 of
those classed informal — an inversion. At engineering they are 2.7% at ₹21,000, above the informal
₹16,000. The rule behaves differently at the two ends of the ladder.
Tested? Yes. Requiring social security takes rung 01 from 1.66% to 1.26% and engineering from 52.58% to 51.20%, widening the top-to-bottom ratio from 31.7× to 40.6×. Every ordering is unchanged, and the looser rule is the conservative choice for the claims made here.
C2. ssec_pas = '9', “not known”, counts as not formal
Section titled “C2. ssec_pas = '9', “not known”, counts as not formal”Why. An unknown is treated as a failure rather than a pass.
If wrong. Formal rates rise slightly at every rung. ssec_pas='9' is 3.1% of salaried workers
(weighted); the subset that would actually change classification — no contract and unknown benefits —
is 2.5%.
Tested? No.
C3. Casual wage labour is inside “informal wage work”, with no earnings test
Section titled “C3. Casual wage labour is inside “informal wage work”, with no earnings test”pas IN ('41','42','51').
Why. ern_reg and ern_self cover only regular and self-employed work — of 1,286 casual
labourers in the graduate base, 12 carry an earnings value. Requiring one would drop them for a
reason about the survey’s field coverage, not their work.
Consequence. At rung 01, casual labour is 24.2 of the informal column’s 31.3 points, so “informal wage work” there means daily-wage labour, not informal salaried employment. At engineering it is a seventh of a much smaller column. The column does not mean the same thing at both ends of the ladder.
Tested? Yes, by decomposition.
C4. Unpaid family workers are not working for money
Section titled “C4. Unpaid family workers are not working for money”pas='21' is excluded from every employment column.
Why. PLFS records them as employed; they earn nothing.
If wrong. They are 9.6% of rung 01. Counting them would roughly halve that rung’s apparent non-employment.
Tested? No, but the direction is not in doubt.
D. Wages and growth
Section titled “D. Wages and growth”D1. Wage growth is measured on tenure, not age
Section titled “D1. Wage growth is measured on tenure, not age”dur_pas, collapsed to three steps: under 1 year, 1–3 years, over 3 years.
Why. Tenure measures time in work directly. It assumes nothing about when anyone finished studying, and it separates a fresh entrant aged 30 from a thirty-year-old with eight years behind them.
If wrong. Every growth multiple is wrong.
Tested? For graduates, yes — see D2. For the school rungs, no, and there is a known failure: at rung 01 the three tenure cells have mean ages 27.4 / 27.1 / 29.6, so they are not entrants versus veterans at all. That rung’s growth claim now rests on the lifecycle lens instead.
D2. The dur_pas code boundaries are inferred, not documented
Section titled “D2. The dur_pas code boundaries are inferred, not documented”Taken to be: under 6 months, 6–12 months, 1–2 years, 2–3 years, 3+ years.
Why. No codebook exists in our schema and there is no dur_pas_label column. The ladder was
validated against people who cannot have long tenure: among graduates in salaried work, code 3 peaks
at age 22–23, code 4 at 25, code 5 from 27.
If wrong. The three-step collapse is robust to a 1↔2 swap, but the position of code 3’s lower boundary — exactly the boundary the “entry wage” column depends on — is not independently established.
Tested? For graduates only. The validation has no force for the school rungs: at rung 01, mean age by code runs 27.9 / 26.8 / 26.8 / 26.7 / 28.9 — flat, so no age evidence exists there.
D3. Wage figures describe only those in formal work
Section titled “D3. Wage figures describe only those in formal work”Why. ern_reg exists only for regular salaried work.
Consequence. The wage tables cover 1.66% of the bottom rung and 52.58% of engineering. They say what a formal job pays, not what the population earns.
Tested? N/A — a limit of the data.
D4. Medians are unweighted; rates are weighted
Section titled “D4. Medians are unweighted; rates are weighted”APPROX_QUANTILES in BigQuery is unweighted. All shares and rates use weight_annual.
If wrong. Medians would shift by up to a few percent. The companion’s pooled analysis computed a weight-replicated median for engineering and got ₹45,000 against the unweighted ₹42,000 — a 7% gap.
Tested? Only for engineering. Not resolved: the two figures coexist in the corpus and neither document previously said which was which.
E. The lifecycle table
Section titled “E. The lifecycle table”E1. It is a synthetic cohort, not a projection
Section titled “E1. It is a synthetic cohort, not a projection”The age-40 column describes people who are 40 today and finished their education around 2008.
If read as a forecast. It is optimistic on two counts: far fewer people held a degree in 2008, so today’s 40-year-old graduates are a more selected group; and nominal wage growth across the columns mixes career progression with twenty years of inflation, which this data cannot separate.
Tested? No.
E2. The “Wage ×” column is not comparable across rungs
Section titled “E2. The “Wage ×” column is not comparable across rungs”Each rung’s entry window sits at its own completion age — 20–22 for diplomas, 21–23 for school rungs and general degrees, 22–24 for engineering, 23–25 for postgraduates, 24–26 for medicine.
If treated as comparable. Re-basing medicine to a common 21–23 entry moves its multiple from 1.71× to 2.83×, taking it from near the bottom of the ladder to the top. Any cross-rung ranking of that column is an artefact of the differing windows.
Tested? Yes — that is where the 2.83× comes from. Both diploma notes previously claimed “steepest on the ladder” and both have been qualified.
E3. “At entry” for school rungs is ages 21–23, not their leaving age
Section titled “E3. “At entry” for school rungs is ages 21–23, not their leaving age”Why. There is no graduation-to-work moment for someone who left school at 13, and PLFS at 13–15 is child-labour territory. 21–23 is the earliest age at which outcomes read as adult labour-market outcomes.
Known failure. For higher secondary this does not fully work: 39% of that rung is still studying at 21–23, so its 3.48% entry employment rate is below the secondary rung’s 5.33%. The artefact is reduced, not removed.
Tested? Yes, and the residual problem is documented in
rungs/04.
F. Statistical treatment
Section titled “F. Statistical treatment”F1. Uncertainty is reported only where a claim depends on it
Section titled “F1. Uncertainty is reported only where a claim depends on it”Cluster-robust standard errors, clustering on first-stage unit
(CONCAT(st, dc, strm, sstrm, IFNULL(ss,''), mfsu)).
Why cluster. PLFS is stratified multi-stage; treating people as independent understates the standard error by 3.5–4.7× on population-wide estimates.
Caveat found in review. For thin subgroups the design effect is much smaller — engineering graduates aged 22–24 are 1.14 people per unit, giving a measured design effect of 1.14×, not 3.5×. For those cells the width comes from the raw count and from weight variation, not from clustering.
Tested? Yes, and it corrected an earlier overstatement.
F2. Rungs whose intervals overlap are reported as tied, not ranked
Section titled “F2. Rungs whose intervals overlap are reported as tied, not ranked”Technical diploma (30.77% ± 1.21), medicine (32.41% ± 2.55) and postgraduate (29.11% ± 0.71) are mutually indistinguishable. Two claims were retracted on this basis.
Tested? Yes — that is what produced the retraction.
G. Known-unresolved
Section titled “G. Known-unresolved”These are open, not settled, and are flagged wherever they bear on a number.
- The 05/06 diploma boundary — technical trades dominate formal work on the non-technical
rung. Either
tedu_lvlmis-codes people who trained on the job, or a general diploma is a common route into a trade. (B2) - Whether technical diplomas follow class 10 or class 12. The README frames the diploma as a
step “on top of” higher secondary, but most Indian polytechnic diplomas follow class 10, and
no_of_years_in_formal_educationis 100% NULL in this release, so it cannot be tested. The direction is favourable — the true comparison for many would be rung 03’s 5.95%, making the step larger — but the ordinality claim is not supported. - The postgraduate rung contains the degree rungs’ own graduates. 709 engineering and 195 medical degree holders sit in rung 11, so rung 07 is really “engineering graduates who did not do a master’s”. Any ladder-position claim about rung 11 is a comparison between a field-mixed pool and a field-pure one.
- Weighted versus unweighted medians (D4) — unresolved across the corpus.
- The n≥50 lens rule is applied mechanically in the companion analysis but not in this one; every ladder rung uses tenure regardless, including medicine at n=43.