share of population under 18 years old with foreign background or non-Belgian citizenship in the Brussels-Capital Region
Brussels-Capital Region (BE10) — young population by citizenship / origin
Using Eurostat's 2021 Census tables for the Brussels-Capital Region (NUTS‑2 = BE10)12, complemented by the single‑year age totals3:
Total population 2021: 1,226,329, of which 277,043 are under 18.
| Age group | Total | Non-Belgian citizenship | Foreign-born (proxy for foreign background) |
|---|---|---|---|
| 0–4 | 80,361 | 23.1% | 6.4% |
| 5–9 | 79,938 | 29.7% | 15.3% |
| 10–14 | 75,739 | 26.5% | 21.4% |
| Under 15 | 236,038 | 26.4% | 14.2% |
| 15–19 | 68,256 | 26.9% | 27.6% |
| All ages | 1,226,329 | 35.0% | 46.4% |
Answer:
- Non-Belgian citizenship: about 26–27% of the under‑18 population. The census publishes the exact band only down to under 15 (26.4% ≈ 62,300 children) and the 15–19 band (26.9%); combining these with the single‑year age totals gives an estimated under‑18 figure of ≈26.5% (≈73,400 of 277,000)4.
- Foreign background: this is a Belgian‑specific concept (based on nationality at birth / parents' origin) that is not produced in the Eurostat/OECD datasets. The closest available measure — foreign‑born (born outside Belgium) — is 14.2% of under‑15s and ≈16% of under‑18s4. This is only a partial proxy and clearly understates "foreign background", because many children of foreign parents are themselves born in Belgium (note how the foreign‑born share rises sharply with age, from 6% at 0–4 to 28% at 15–19).
A comparison chart was produced in 4 (brussels_young_origin.svg).
Caveats: The regional census tables do not publish an exact "under‑18" breakdown by citizenship/origin, so the under‑18 citizenship figure is an estimate (the two adjacent published bands, under‑15 and 15–19, both sit near 26.5%, so the estimate is robust). The OECD's "Population by citizenship – Cities and FUAs" dataset would contain an exact under‑18 citizenship/origin breakdown for Brussels, but its dataflow was unavailable (persistent server‑side error), so it could not be used.
- Eurostat dataset: Population by groups of country of citizenship, age groups, groups of current activity status and NUTS 2 region
- Eurostat dataset: Population by groups of country of birth, age groups, groups of current activity status and NUTS 2 region
- Eurostat dataset: Population by age and NUTS 2 region
- Code Run 1
Images
brussels_young_origin.svgDataset filters for
cens_21ctza_r2Filter Value(s) geo BE10 sex T wstatus TOTAL Dataset filters for
cens_21coba_r2Filter Value(s) geo BE10 sex T wstatus TOTAL Dataset filters for
cens_21agr2Filter Value(s) geo BE10 sex T Program output
Under-15 total: 236038 Age 15,16,17: 13969 13728 13308 Under-18 total: 277043 Total pop: 1226329 Age group Total pop Non-Belgian citizenship % Foreign-born % 0-4 80361 23.1 6.4 5-9 79938 29.7 15.3 10-14 75739 26.5 21.4 <15 236038 26.4 14.2 15-19 68256 26.9 27.6 All ages 1226329 35.0 46.4 Estimated under-18 non-Belgian citizenship: 26.5% (73363 / 277043) Estimated under-18 foreign-born: 16.2% (44932 / 277043) saved chartCode
import pandas as pd, numpy as np import matplotlib; matplotlib.use('Agg') import matplotlib.pyplot as plt cit = pd.read_csv(DATASET_FILES[0], low_memory=False) # citizenship (18) cob = pd.read_csv(DATASET_FILES[1], low_memory=False) # country of birth (8) pop = pd.read_csv(DATASET_FILES[2], low_memory=False) # single-year age (60) # --- under-18 total from single-year ages --- s = pop.set_index('age')['value'] lt15 = s['Y_LT15'] y15,y16,y17 = s['Y15'], s['Y16'], s['Y17'] u18 = lt15 + y15 + y16 + y17 print("Under-15 total:", lt15) print("Age 15,16,17:", y15, y16, y17) print("Under-18 total:", u18) print("Total pop:", s['TOTAL']) # --- citizenship shares --- cp = cit.pivot_table(index='age', columns='citizen', values='value', aggfunc='sum') bp = cob.pivot_table(index='age', columns='c_birth', values='value', aggfunc='sum') def sh(p, col, age): return p.loc[age, col]/p.loc[age,'TOTAL']*100 rows = [] for age,lab in [('Y_LT5','0-4'),('Y5-9','5-9'),('Y10-14','10-14'),('Y_LT15','<15'),('Y15-19','15-19'),('TOTAL','All ages')]: rows.append([lab, cp.loc[age,'TOTAL'], sh(cp,'FOR',age), sh(bp,'FOR',age)]) tab = pd.DataFrame(rows, columns=['Age group','Total pop','Non-Belgian citizenship %','Foreign-born %']) print("\n", tab.round(1).to_string(index=False)) # --- estimated under-18 (assume 15-17 behave like 15-19) --- rate_cit_15_19 = sh(cp,'FOR','Y15-19')/100 rate_fb_15_19 = sh(bp,'FOR','Y15-19')/100 est_cit = cp.loc['Y_LT15','FOR'] + rate_cit_15_19*(y15+y16+y17) est_fb = bp.loc['Y_LT15','FOR'] + rate_fb_15_19*(y15+y16+y17) print("\nEstimated under-18 non-Belgian citizenship: %.1f%% (%d / %d)" % (est_cit/u18*100, est_cit, u18)) print("Estimated under-18 foreign-born: %.1f%% (%d / %d)" % (est_fb/u18*100, est_fb, u18)) # --- chart --- ages=['Y_LT5','Y5-9','Y10-14','Y15-19']; labels=['0-4','5-9','10-14','15-19'] x=np.arange(len(ages)); w=0.38 fig,ax=plt.subplots(figsize=(9,5)) ax.bar(x-w/2,[sh(cp,'FOR',a) for a in ages],w,label='Non-Belgian citizenship',color='#c0392b') ax.bar(x+w/2,[sh(bp,'FOR',a) for a in ages],w,label='Foreign-born (partial proxy for foreign background)',color='#2980b9') ax.set_xticks(x); ax.set_xticklabels(labels); ax.set_ylim(0,35) ax.set_xlabel('Age group'); ax.set_ylabel('% of age group') ax.set_title('Brussels-Capital Region (BE10), Census 2021\nYoung population with non-Belgian citizenship vs. foreign-born') ax.legend(); ax.grid(axis='y',alpha=.3) for i,a in enumerate(ages): ax.text(i-w/2, sh(cp,'FOR',a)+0.5, f"{sh(cp,'FOR',a):.1f}", ha='center', fontsize=8) ax.text(i+w/2, sh(bp,'FOR',a)+0.5, f"{sh(bp,'FOR',a):.1f}", ha='center', fontsize=8) plt.tight_layout(); plt.savefig('brussels_young_origin.svg'); print("\nsaved chart")