How we built the dataset, how AI exposure scores are calculated, and what the numbers mean for Canada's 20 million workers.
All underlying data is open-access, published by the Government of Canada under the Open Government Licence.
| Source | Publisher | What we use |
|---|---|---|
| COPS 2024–2033 Summary CSV | ESDC | Employment 2023, projected job openings 2024–2033, labour market outlook per occupation |
| 3-Year Employment Outlooks 2025–2027 | ESDC / Job Bank | Regional outlook ratings (Shortage / Balance / Surplus) per occupation × province |
| Job Bank wage reports | ESDC / Statistics Canada | Median hourly wage by NOC 2021 unit group, LFS reference period 2023–2024 (454/516 occupations); converted to annual at 2,080 hrs |
| Table 98-10-0586-01 (2021 Census) | Statistics Canada | Median annual employment income by NOC 2021 unit group, 2020 reference year — fallback for occupations not covered by Job Bank wage reports |
| NOC 2021 | Statistics Canada | Occupation titles, 5-digit NOC codes, TEER levels, category structure |
| Job Bank | ESDC | Occupation profile URLs and canonical titles (via internal concordance ID lookup) |
The 516 occupations come from the COPS 2024–2033 summary CSV, which lists every NOC 2021 unit group with labour market projections. We exclude the "All Occupations" aggregate and all TEER / major-group subtotals, keeping only individual 5-digit unit groups.
485 of 516 occupations have employment figures. The remaining 31 are suppressed by Statistics Canada due to small sample sizes. Those 485 represent 20.1 million jobs — the full Canadian employed labour force.
| Category | Occupations | Jobs (2023) | Avg AI Exposure |
|---|---|---|---|
| Sales and service | 61 | 4.95M | 2.9 |
| Trades, transport and equipment operators | 94 | 3.37M | 2.2 |
| Business, finance and administration | 51 | 3.26M | 5.5 |
| Education, law and social services | 52 | 2.48M | 3.8 |
| Natural and applied sciences | 66 | 1.93M | 6.0 |
| Health occupations | 43 | 1.62M | 3.2 |
| Manufacturing and utilities | 68 | 956K | 2.5 |
| Art, culture, recreation and sport | 37 | 647K | 4.1 |
| Management occupations | 15 | 428K | 5.4 |
| Natural resources and agriculture | 24 | 425K | 2.0 |
| Other occupations | 5 | 71K | 1.4 |
Pay figures come primarily from Job Bank wage reports, which publish median hourly wages derived from the Labour Force Survey (LFS), reference period 2023–2024, updated November 2025. These are actual paid wages reported by workers — not advertised or offered rates. Hourly medians are converted to an annual equivalent using 2,080 hours (52 weeks × 40 hours), the standard Canadian full-time year.
For NOC 2021 codes starting with 6–9, the TEER level is the second digit of the code. For codes 0–5, the TEER is the first digit. This corrects a common misreading of the code structure.
The 3-Year Employment Outlooks 2025–2027 XLSX contains ~44,000 rows — one per occupation × province/territory. There is no pre-computed national row. We derive a national outlook by taking the modal (most common) rating across all 13 regions for each occupation.
Outlook ratings are converted to a numeric proxy for the scatter view axis:
| Rating | Numeric proxy | Occupations |
|---|---|---|
| Strong risk of Shortage | +12 | 38 |
| Moderate risk of Shortage | +6 | 65 |
| Balance | +2 | 365 |
| Moderate risk of Surplus | −4 | 11 |
| Strong risk of Surplus | −8 | 6 |
| Undetermined | — | 31 |
Each occupation receives a score from 0 to 10 measuring how much cognitive AI is expected to reshape that occupation — both through direct automation (AI doing the knowledge work) and through productivity amplification (fewer workers needed per unit of output).
Scores are generated by GPT-4o (OpenAI) reading a structured
Markdown description of the occupation, including: NOC code, TEER level, major category,
employment 2023, projected job openings 2024–2033, and labour market conditions.
The model is instructed to respond with a single JSON object: {"exposure": N, "rationale": "..."}.
Temperature is set to 0.2 for consistency.
| Score | Tier | Canadian examples |
|---|---|---|
| 0–1 | Minimal | Underground miners, roofers, landscapers, oil field workers, commercial divers |
| 2–3 | Low | Electricians, plumbers, firefighters, welders, dental hygienists, heavy equipment operators |
| 4–5 | Moderate | Registered nurses, police officers, veterinarians, social workers, construction managers |
| 6–7 | High | Accountants, engineers, teachers, HR managers, journalists, financial advisors |
| 8–9 | Very high | Software developers, graphic designers, translators, paralegals, data analysts, web designers |
| 10 | Maximum | Data entry clerks — routine digital processing with no physical component |
Percentages are job-weighted (by 2023 employment). The distribution is concentrated at scores 2–4 because Canada's largest employment sectors — trades, transport, sales and service — are physical-work dominated with low cognitive AI exposure. The job-weighted average across all 20.1M jobs is 4.6 / 10.
Highest-exposure sectors are knowledge-work-heavy; lowest are physical/trades. Note that low AI exposure does not mean low automation risk overall — see Robotics section below.
Higher education generally correlates with higher AI exposure, with some nuance at the college/apprenticeship level:
Occupations scoring 6 or higher represent 7,840,500 jobs (38.9% of the labour force) and a combined annual payroll of $590 billion CAD (based on 2023–2024 LFS median wages).
| Occupation | Score | Jobs (2023) | Median Pay |
|---|---|---|---|
| Data entry clerks | 10/10 | 36,000 | $49K |
| Software developers and programmers | 8/10 | 155,700 | $100K |
| Software engineers and designers | 8/10 | 113,100 | $117K |
| Computer systems developers and programmers | 8/10 | 45,700 | $90K |
| Data scientists | 8/10 | 36,600 | $96K |
| Web developers and programmers | 8/10 | 28,700 | $80K |
| Financial auditors and accountants | 6/10 | 247,300 | $84K |
| Administrative officers | 6/10 | 238,500 | $60K |
| Administrative assistants | 6/10 | 233,800 | $55K |
| Information systems specialists | 6/10 | 229,400 | $96K |
These occupations score 1/10 on cognitive AI exposure — but several (miners, oil field workers) face separate high physical automation risk. See Robotics section below.
| Occupation | Score | Jobs (2023) | Robotics risk |
|---|---|---|---|
| Underground production and development miners | 1/10 | 29,400 | High |
| Dancers | 1/10 | 13,600 | Low |
| Fishermen/women | 1/10 | 10,600 | Low |
| Oil and gas drilling, servicing and related labourers | 1/10 | 5,100 | High |
| Underground mine service and support workers | 1/10 | 3,100 | High |
| Mine labourers | 1/10 | 3,100 | High |
| Athletes | 1/10 | 2,700 | Low |
Physical automation — industrial robots, autonomous vehicles, precision agriculture equipment, and mining systems — displaces workers in sectors that score low on the AI Exposure axis. These two waves of automation attack different parts of the occupational distribution.
| Study | Key finding |
|---|---|
| Brookfield Institute (2016) — The Talented Mr. Robot | 42% of Canadian jobs at high risk of automation (probability >70%) |
| OECD (2016) — The Risk of Automation for Jobs | 9% of Canadian jobs at high automation risk (task-level); 30% face significant change |
| Bank of Canada (Georgieva et al., 2018) | ~2M Canadian jobs (~10% of workforce) face high automation risk |
| Statistics Canada (Lu, 2019) | Manufacturing and transportation most exposed; auto sector employment fell 30% 2000–2018 partly due to automation |
| Acemoglu & Restrepo (2020) — Robots and Jobs | Each robot per 1,000 workers reduces employment-to-population ratio 0.18–0.34% and wages ~0.4% |
| OECD (2023) — Employment Outlook | ~27% of Canadian jobs face high automation risk under updated task-based measures |
| WEF (2023) — Future of Jobs Report | 83M jobs globally displaced vs. 69M created by 2027; net −14M across automation + AI |
| NOC Sector | Robotics risk | Key drivers |
|---|---|---|
| Manufacturing and utilities | Very High | Auto assembly robots (ON), food processing lines, packaging automation |
| Trades, transport and equipment operators | High | Autonomous trucks (AV platforms), automated equipment, delivery drones |
| Natural resources and agriculture | High | Autonomous mining haul trucks, robotic harvesters, precision ag (John Deere 8R) |
| Sales and service | Moderate | Self-checkout (40%+ in major grocers), robotic food prep, automated retail |
| All other sectors | Low | Physical automation has minimal direct impact on core job tasks |
These occupations face displacement from both cognitive AI and physical automation simultaneously:
| Occupation | AI Exposure | Robotics risk | Mechanism |
|---|---|---|---|
| Transport truck drivers | 3/10 | High | AI route optimization + autonomous vehicle platforms |
| Cashiers | 6/10 | High | AI customer service + self-checkout / scan-and-go |
| Agricultural workers | 2/10 | High | AI crop monitoring + robotic harvesting and planting |
| Postal workers and couriers | 3/10 | High | AI route optimization + automated sorting + delivery drones |
| Food processing labourers | 2/10 | Very High | Computer vision quality inspection + robotic processing lines |
| Bank tellers | 6/10 | Moderate | AI banking apps + ATM / kiosk expansion |
Seven scripts, run in order, build everything from raw government files to the website:
| Script | Output | Description |
|---|---|---|
build_occupations.py | occupations.json | Reads COPS CSV, extracts 516 NOC unit groups, assigns categories and Job Bank search URLs |
build_jobbank_urls.py | Updates occupations.json | Queries Job Bank Solr API to look up concordance IDs for direct profile URLs (462/516) |
scrape_jobbank.py | Updates occupations.json | Scrapes Job Bank summary and requirements pages to add canonical titles and employment requirement bullets (~3 min, resumable) |
scrape_jobbank_wages.py | data/jobbank_wages.json | Scrapes Job Bank wage reports for median hourly wages (2023–2024 LFS) for 454 occupations; resumable |
generate_pages.py | pages/*.md | Generates one Markdown file per occupation (used as LLM input) |
make_csv_ca.py | occupations.csv | Compiles wages (Job Bank 2023–2024 primary, Census 2020 fallback), employment, education, and outlook into a flat CSV |
score.py | scores.json | Calls GPT-4o via OpenAI API to score each occupation 0–10 |
build_site_data_ca.py | site/data.json | Merges CSV + scores + scraped Job Bank data into the single JSON the frontend loads |
Provincial pages are generated by a ninth script, generate_province_pages.py,
which builds one standalone HTML page per province from the same data. The script
adds an interactive squarify treemap (identical to the national page), all
occupation tables re-weighted to provincial employment, and sector exposure bars.
| Script | Output | Description |
|---|---|---|
generate_province_pages.py | site/province/*.html | Generates 10 province pages (ON, QC, BC, AB, MB, SK, NS, NB, NL, PE) with provincial employment estimates, interactive treemap, and sector breakdowns |
For the 462 occupations with a direct Job Bank profile, scrape_jobbank.py collects:
The COPS 2024–2033 dataset provides employment at the national level only. Provincial employment per occupation is not published. To generate province-level estimates we use the 3-Year Employment Outlooks 2025–2027 XLSX, which contains sector-level (major occupational category) employment for each province and territory.
For each occupation and each province, estimated provincial employment is:
national_jobs — COPS 2023 employment for this occupation (national)prov_cat_emp — provincial employment in this occupation's major category (from 3-year outlook XLSX)national_cat_emp — sum of all COPS national employment figures within the same major category
This is a proportional scaling approach: if Saskatchewan accounts for 19% of national "Trades, transport and equipment operators" employment, then each trades occupation in SK is assigned 19% of its national job count. It is not a survey — it is an estimate — but it grounds provincial numbers in actual sector-level data rather than a simple population share.
Each province's average AI exposure score is computed as a job-weighted mean across all occupations, using the estimated provincial job counts:
Provinces with a larger share of employment in high-exposure sectors (Business & Finance, Natural & Applied Sciences) score higher; provinces with heavier Trades, Transport, or Natural Resources employment score lower.
| Province | Avg AI Exposure | Est. Employment | Highest-exposure sector |
|---|---|---|---|
| Ontario (ON) | 4.66 | 8,227,017 | Business & Finance (7.67 avg) |
| British Columbia (BC) | 4.58 | 2,769,384 | Business & Finance (7.67 avg) |
| Quebec (QC) | 4.58 | 4,610,643 | Business & Finance (7.67 avg) |
| New Brunswick (NB) | 4.46 | 419,742 | Business & Finance (7.67 avg) |
| Nova Scotia (NS) | 4.46 | 536,697 | Business & Finance (7.67 avg) |
| Alberta (AB) | 4.45 | 2,438,058 | Business & Finance (7.67 avg) |
| Manitoba (MB) | 4.39 | 700,986 | Business & Finance (7.67 avg) |
| Newfoundland & Labrador (NL) | 4.38 | 254,916 | Business & Finance (7.67 avg) |
| Prince Edward Island (PE) | 4.35 | 88,893 | Business & Finance (7.67 avg) |
| Saskatchewan (SK) | 4.29 | 617,463 | Business & Finance (7.67 avg) |
The spread across provinces is relatively narrow (4.29–4.66) because occupation mix at the sector level is similar nationally. The main differentiator is the share of workers in Business & Finance vs Trades & Transport — provinces like Ontario and BC have a larger white-collar knowledge workforce while Saskatchewan and Alberta carry a larger trades and natural resources base.
Each province page embeds a self-contained JavaScript squarify treemap that:
../data.json (national occupation data) and ../province_data.json (provincial sector breakdowns) via fetch()natCatEmp on the client (sum of national jobs per category)scaled_jobs = national_jobs × provCatEmp[category] / natCatEmp[category]<canvas> element with hover tooltips showing provincial job countsThis means the province pages share no pre-computed occupation-level provincial data — all estimation happens live in the browser using the same formula as the Python generator.