// The columns the table shows, in order: a base indicator and, where it is// computed by sex, its f and m columns beside it.columnSpec = [ ["lf","both"], ["lf","f"], ["lf","m"], ["lfpr","both"], ["lfpr","f"], ["lfpr","m"], ["pop_wa","both"], ["inactive","both"], ["lf_dependency","both"], ["pop","both"], ["tdr","both"], ["odr","both"], ["prop_65p","both"], ["median_age","both"]].map(([k, s]) => ({key: s ==="both"? k : k +"_"+ s,ind: k,sex: s,label: (indMeta.get(k)?.label?? k) + (s ==="both"?"": s ==="f"?", women":", men"),short:shortLabel(k) + (s ==="both"?"": s ==="f"?" (F)":" (M)"),decimals: indMeta.get(k)?.decimals??0, unit: indMeta.get(k)?.unit??""}))
shortLabel = k => ({lf:"Labour force",lfpr:"Participation %",pop_wa:"Aged 15+",inactive:"Outside LF",lf_dependency:"Econ. dependency",pop:"Population",tdr:"Age dependency",odr:"Old-age dependency",prop_65p:"Share 65+ %",median_age:"Median age"})[k] ?? k
. Participation rates by age and sex from the /18 Labour Force Survey, held constant, so every change over time is a change in age structure.
fmt = (v, d) => v ==null?"": d3.format(",."+ d +"f")(v)
headline = {const y0 = national[0], y1 = national[national.length-1];const tiles = [ ["Labour force "+ y0.year,fmt(y0.lf,0),"persons; women "+fmt(y0.lf_f,0) +", men "+fmt(y0.lf_m,0)], ["Labour force "+ y1.year,fmt(y1.lf,0), (y1.lf>= y0.lf?"+":"") +fmt(y1.lf- y0.lf,0) +" over "+ (y1.year- y0.year) +" years, from age structure alone"], ["Participation "+ y0.year,fmt(y0.lfpr,1) +"%","women "+fmt(y0.lfpr_f,1) +"%, men "+fmt(y0.lfpr_m,1) +"%"], ["Participation "+ y1.year,fmt(y1.lfpr,1) +"%","women "+fmt(y1.lfpr_f,1) +"%, men "+fmt(y1.lfpr_m,1) +"%"], ["Economic dependency "+ y0.year,fmt(y0.lf_dependency,0),"persons not in the labour force per 100 in it"], ["Economic dependency "+ y1.year,fmt(y1.lf_dependency,0),"per 100 in the labour force"] ];returnhtml`<div class="tiles">${tiles.map(t =>html`<div class="tile"><div class="tile-k">${t[0]}</div><div class="tile-v">${t[1]}</div><div class="tile-n">${t[2]}</div></div>`)}</div>`;}
nationalChart = Plot.plot({width:Math.min(document.body.clientWidth-48,960),height:300,marginLeft:70,x: {label:"Year",tickFormat: d =>String(d)},y: {label:"Labour force (persons)",grid:true,tickFormat: v => d3.format("~s")(v),domain: [0, d3.max(national, d => d.lf) *1.05]},color: {legend:true,domain: ["Women","Men"],range: ["#D55E00","#0072B2"]},marks: [ Plot.areaY(national.flatMap(d => [{year: d.year,sex:"Men",v: d.lf_m}, {year: d.year,sex:"Women",v: d.lf_f}]), {x:"year",y:"v",fill:"sex",order: ["Men","Women"],opacity:0.85}), Plot.lineY(national, {x:"year",y:"lf",stroke:"#1a1a1a",strokeWidth:1.5}), Plot.tip(national, Plot.pointerX({x:"year",y:"lf",title: d => d.year+"\nlabour force "+fmt(d.lf,0) +"\nwomen "+fmt(d.lf_f,0) +" men "+fmt(d.lf_m,0) +"\nparticipation "+fmt(d.lfpr,1) +"%"})) ]})
Nepal’s labour force by sex, to , women stacked on men. Resident population, so the men working abroad are not in it.
viewof year = Inputs.select(meta.years, {label:"Year",value: (newDate()).getFullYear(),format: y =>String(y)})
viewof tier = Inputs.select(meta.levels.map(d => d.key), {label:"Tier",value:"district",format: k => levelLabel.get(k)})
viewof within = Inputs.select(withinOptions, {label:"Within",value:"all",format: c => c ==="all"?"All": (regionByCode.get(c)?.name?? c),disabled: withinOptions.length<=1})
viewof search = Inputs.search(tierRows, {placeholder:"Find an area",label:"Search"})
rawRows = d3.csv("data/yr/"+ year +"_"+ tier +".csv", d => {const o = {code:String(d.code)};for (const k ofObject.keys(d)) if (k !=="code") o[k] = d[k] ===""?null:+d[k];return o;})
tierRows = rawRows.map(d => { const r = regionByCode.get(d.code);returnObject.assign({name: r?.name?? d.code, parent: r?.parent??""}, d); }).filter(d => within ==="all"|| d.parent=== within)
bandOrder = [...newSet(bandRows.map(d => d.band))].sort((a, b) =>parseInt(a) -parseInt(b))
pyramid = bandRows.length? Plot.plot({width:Math.min(document.body.clientWidth-48,760),height:380,marginLeft:50,marginRight:20,x: {label:"Persons (women left, men right)",tickFormat: v => d3.format("~s")(Math.abs(v)),grid:true,domain: [-d3.max(bandRows, d => d.pop) *1.18, d3.max(bandRows, d => d.pop) *1.18]},y: {domain: bandOrder,label:"Age"},color: {legend:true,domain: ["In the labour force","Outside the labour force"],range: ["#0072B2","#cfd8df"]},marks: [ Plot.barX(bandRows.flatMap(d => [ {band: d.band,sex: d.sex,part:"In the labour force",v: (d.sex==="f"?-1:1) * d.lf}, {band: d.band,sex: d.sex,part:"Outside the labour force",v: (d.sex==="f"?-1:1) * d.out} ]), {x:"v",y:"band",fill:"part",order: ["In the labour force","Outside the labour force"],title: d => d.band+", "+ (d.sex==="f"?"women":"men") +" | "+ d.part+": "+fmt(Math.abs(d.v),0)}), Plot.ruleX([0]), Plot.text(bandRows.filter(d => d.sex==="f"), {x: d =>-d.pop,y:"band",text: d =>fmt(d.rate,0) +"%",textAnchor:"end",dx:-4,fill:"#5b6165",fontSize:10}), Plot.text(bandRows.filter(d => d.sex==="m"), {x: d => d.pop,y:"band",text: d =>fmt(d.rate,0) +"%",textAnchor:"start",dx:4,fill:"#5b6165",fontSize:10}) ]}) :html`<p class="muted">Loading the age profile.</p>`
Population aged 15 and over by five-year band and sex, with the labour force filled and those outside it in grey. The percentage beside each bar is that band’s participation rate, which is the survey’s and is the same in every area; what differs between areas and years is the size of the bands. Pick a district or province in the table above to see its profile.
How the numbers are made
Labour force is the resident population aged 15 and over times the participation rate of its age band and sex, summed. The rates are those of the 2017/18 Nepal Labour Force Survey (11 age bands per sex, listed below), and they are held constant to 2051. So the labour force changes only because the number of people in each age band changes: a growing labour force here means more people of working age, not more of them working. That is the demographic-only reference against which any policy or behavioural scenario is compared.
Participation rate is labour force over population aged 15 and over, per 100. For both sexes it is a ratio of the two sums, not the average of the women’s and men’s rates. In it reads percent against the survey’s own 39.9, because the 2021 resident age structure is not the 2017 one and because the rates are applied to the census-based projection rather than to the survey’s own population.
Economic dependency ratio is everyone not in the labour force, of any age, per 100 in it. It rises faster than the age dependency ratio because it also counts working-age people outside the labour force.
Resident population. The projection counts people present in Nepal. The roughly 2.2 million absentees counted abroad by the 2021 census, most of them working-age men, are not in these figures. Their return, or further departures, is the largest single uncertainty in any labour force projection for Nepal and is not modelled here.
The rates are one file.data/participation.csv is the whole surface. When the fourth Labour Force Survey (fieldwork 2025, fifteen domains) is published, replacing that file, with province-specific rates if the survey supports them, rebuilds every number on this page.