Methodology & Statistics

How we built the dataset, how AI exposure scores are calculated, and what the numbers mean for Canada's 20 million workers.

Key numbers

516
NOC 2021 unit-group occupations covered
20.1M
Canadian jobs represented (2023 data)
4.6
Job-weighted average AI exposure (0–10)
37.6%
Jobs in Low AI-exposure occupations (score 1–3)
38.9%
Jobs in High AI-exposure occupations (score 6+)
$590B
Annual payroll in high AI-exposure occupations (6+)

Data sources

All underlying data is open-access, published by the Government of Canada under the Open Government Licence.

SourcePublisherWhat 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)

Occupations

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.

By major occupational category

CategoryOccupationsJobs (2023)Avg AI Exposure
Sales and service614.95M2.9
Trades, transport and equipment operators943.37M2.2
Business, finance and administration513.26M5.5
Education, law and social services522.48M3.8
Natural and applied sciences661.93M6.0
Health occupations431.62M3.2
Manufacturing and utilities68956K2.5
Art, culture, recreation and sport37647K4.1
Management occupations15428K5.4
Natural resources and agriculture24425K2.0
Other occupations571K1.4

Wage data

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.

Coverage: Job Bank wage data is available for 454 of 516 occupations (those with a direct Job Bank profile). The remaining 62 fall back to Statistics Canada Table 98-10-0586-01 (2021 Census, 2020 income reference year) or, where neither source is available, a TEER-level estimate.

Annual conversion note: Multiplying a median hourly wage by 2,080 hours gives a full-time-equivalent annual figure. Workers in high part-time occupations (retail, recreation, food service) may earn less annually than this implies — the hourly median itself is still accurate, but actual annual take-home depends on hours worked.

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.

Labour market outlook

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:

RatingNumeric proxyOccupations
Strong risk of Shortage+1238
Moderate risk of Shortage+665
Balance+2365
Moderate risk of Surplus−411
Strong risk of Surplus−86
Undetermined31

AI exposure scoring

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).

Scope: The AI Exposure score measures cognitive/digital automation only — the impact of language models, AI agents, and digital automation on the information-processing parts of a job. It does not measure industrial robots, autonomous vehicles, or physical automation machinery. Those are captured separately in the Robotics section below. A welder scores low on AI Exposure even though welding robots exist; a truck driver scores low even though autonomous vehicles are coming.

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 anchors

ScoreTierCanadian examples
0–1MinimalUnderground miners, roofers, landscapers, oil field workers, commercial divers
2–3LowElectricians, plumbers, firefighters, welders, dental hygienists, heavy equipment operators
4–5ModerateRegistered nurses, police officers, veterinarians, social workers, construction managers
6–7HighAccountants, engineers, teachers, HR managers, journalists, financial advisors
8–9Very highSoftware developers, graphic designers, translators, paralegals, data analysts, web designers
10MaximumData entry clerks — routine digital processing with no physical component

Score distribution

Score 1
11.3%
Score 2
14.4%
Score 3
11.9%
Score 4
15.3%
Score 5
8.2%
Score 6
11.5%
Score 7
11.2%
Score 8
15.1%
Score 9
1.0%
Score 10
0.2%

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.

AI exposure by sector

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.

Natural & applied sci.
6.0
Business & finance
5.7
Management
5.5
Art & culture
4.1
Education & law
3.9
Health
3.5
Sales & service
2.9
Manufacturing
2.4
Natural resources
2.3
Trades & transport
2.3

AI exposure by education level

Higher education generally correlates with higher AI exposure, with some nuance at the college/apprenticeship level:

University+
5.7
College / 2yr
4.1
High school
3.4
Vocational
3.0
No degree req.
2.4
Note on TEER 4–5 (no degree / vocational): Workers in these groups score low on cognitive AI exposure — but many face significant physical automation risk from robotics in manufacturing, agriculture, and logistics. Low AI score ≠ safe from automation overall.

High AI-exposure occupations

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).

OccupationScoreJobs (2023)Median Pay
Data entry clerks10/1036,000$49K
Software developers and programmers8/10155,700$100K
Software engineers and designers8/10113,100$117K
Computer systems developers and programmers8/1045,700$90K
Data scientists8/1036,600$96K
Web developers and programmers8/1028,700$80K
Financial auditors and accountants6/10247,300$84K
Administrative officers6/10238,500$60K
Administrative assistants6/10233,800$55K
Information systems specialists6/10229,400$96K

Lowest AI-exposure occupations

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.

OccupationScoreJobs (2023)Robotics risk
Underground production and development miners1/1029,400High
Dancers1/1013,600Low
Fishermen/women1/1010,600Low
Oil and gas drilling, servicing and related labourers1/105,100High
Underground mine service and support workers1/103,100High
Mine labourers1/103,100High
Athletes1/102,700Low

Robotics and physical automation

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.

The dual-threat framework: A complete picture of technological displacement requires both dimensions. Cognitive AI threatens knowledge workers (score 6–10). Physical robotics threatens manual and trade workers (score 1–3). Some occupations face both (e.g. cashiers, couriers).

Research consensus on Canadian automation risk

StudyKey finding
Brookfield Institute (2016) — The Talented Mr. Robot42% of Canadian jobs at high risk of automation (probability >70%)
OECD (2016) — The Risk of Automation for Jobs9% 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 JobsEach 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 Report83M jobs globally displaced vs. 69M created by 2027; net −14M across automation + AI

Robotics risk by NOC sector

NOC SectorRobotics riskKey drivers
Manufacturing and utilitiesVery HighAuto assembly robots (ON), food processing lines, packaging automation
Trades, transport and equipment operatorsHighAutonomous trucks (AV platforms), automated equipment, delivery drones
Natural resources and agricultureHighAutonomous mining haul trucks, robotic harvesters, precision ag (John Deere 8R)
Sales and serviceModerateSelf-checkout (40%+ in major grocers), robotic food prep, automated retail
All other sectorsLowPhysical automation has minimal direct impact on core job tasks

Dual-threat occupations

These occupations face displacement from both cognitive AI and physical automation simultaneously:

OccupationAI ExposureRobotics riskMechanism
Transport truck drivers3/10HighAI route optimization + autonomous vehicle platforms
Cashiers6/10HighAI customer service + self-checkout / scan-and-go
Agricultural workers2/10HighAI crop monitoring + robotic harvesting and planting
Postal workers and couriers3/10HighAI route optimization + automated sorting + delivery drones
Food processing labourers2/10Very HighComputer vision quality inspection + robotic processing lines
Bank tellers6/10ModerateAI banking apps + ATM / kiosk expansion

Pipeline

Seven scripts, run in order, build everything from raw government files to the website:

ScriptOutputDescription
build_occupations.pyoccupations.jsonReads COPS CSV, extracts 516 NOC unit groups, assigns categories and Job Bank search URLs
build_jobbank_urls.pyUpdates occupations.jsonQueries Job Bank Solr API to look up concordance IDs for direct profile URLs (462/516)
scrape_jobbank.pyUpdates occupations.jsonScrapes Job Bank summary and requirements pages to add canonical titles and employment requirement bullets (~3 min, resumable)
scrape_jobbank_wages.pydata/jobbank_wages.jsonScrapes Job Bank wage reports for median hourly wages (2023–2024 LFS) for 454 occupations; resumable
generate_pages.pypages/*.mdGenerates one Markdown file per occupation (used as LLM input)
make_csv_ca.pyoccupations.csvCompiles wages (Job Bank 2023–2024 primary, Census 2020 fallback), employment, education, and outlook into a flat CSV
score.pyscores.jsonCalls GPT-4o via OpenAI API to score each occupation 0–10
build_site_data_ca.pysite/data.jsonMerges CSV + scores + scraped Job Bank data into the single JSON the frontend loads

Provincial data pipeline

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.

ScriptOutputDescription
generate_province_pages.pysite/province/*.htmlGenerates 10 province pages (ON, QC, BC, AB, MB, SK, NS, NB, NL, PE) with provincial employment estimates, interactive treemap, and sector breakdowns

What gets scraped from Job Bank

For the 462 occupations with a direct Job Bank profile, scrape_jobbank.py collects:

Provincial employment estimation

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.

Estimation formula

For each occupation and each province, estimated provincial employment is:

prov_jobs = round( national_jobs × prov_cat_emp / national_cat_emp )

Where:
  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.

Provincial average exposure

Each province's average AI exposure score is computed as a job-weighted mean across all occupations, using the estimated provincial job counts:

avg_exposure = Σ( prov_jobs_i × exposure_i ) / Σ( prov_jobs_i )

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.

Provincial average exposure by province

ProvinceAvg AI ExposureEst. EmploymentHighest-exposure sector
Ontario (ON)4.668,227,017Business & Finance (7.67 avg)
British Columbia (BC)4.582,769,384Business & Finance (7.67 avg)
Quebec (QC)4.584,610,643Business & Finance (7.67 avg)
New Brunswick (NB)4.46419,742Business & Finance (7.67 avg)
Nova Scotia (NS)4.46536,697Business & Finance (7.67 avg)
Alberta (AB)4.452,438,058Business & Finance (7.67 avg)
Manitoba (MB)4.39700,986Business & Finance (7.67 avg)
Newfoundland & Labrador (NL)4.38254,916Business & Finance (7.67 avg)
Prince Edward Island (PE)4.3588,893Business & Finance (7.67 avg)
Saskatchewan (SK)4.29617,463Business & 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.

Treemap rendering on province pages

Each province page embeds a self-contained JavaScript squarify treemap that:

  1. Loads ../data.json (national occupation data) and ../province_data.json (provincial sector breakdowns) via fetch()
  2. Recomputes natCatEmp on the client (sum of national jobs per category)
  3. Scales each occupation: scaled_jobs = national_jobs × provCatEmp[category] / natCatEmp[category]
  4. Filters to occupations with at least 1 estimated provincial job
  5. Renders the squarify treemap on a <canvas> element with hover tooltips showing provincial job counts

This 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.

Known limitations

Credits