HS Code–EXIOBASE Concordance and Clean-Technology Use Shares

Methodology, Coverage, and Results — v2 (revised May 2026)

Author

Oriol Vallès Codina — Net Zero Industrial Policy Lab (NZIPL), Johns Hopkins SAIS

Published

May 15, 2026

Show code
library(dplyr); library(readr); library(arrow); library(ggplot2)
library(knitr); library(kableExtra); library(tidyr); library(stringr); library(scales)

ROOT <- here::here()
gd   <- read_csv(file.path(ROOT,"data","green_dict","green_dictionary.csv"),
                 show_col_types=FALSE) |>
         mutate(code = formatC(as.integer(code), width=6, flag="0"))
shares  <- read_parquet(file.path(ROOT,"data","exiobase","io_use_shares.parquet"))
concord <- read_csv(file.path(ROOT,"data","exiobase","hs_exiobase_concordance.csv"),
                    show_col_types=FALSE)

# Consistent universe for all results: raw/processed materials with EXIOBASE mapping
RAW_PROC <- c("Raw Material","Processed Material")
gd_rp <- gd |>
  filter(role %in% RAW_PROC, !is.na(exiobase_product))

TECH_COLORS <- c(Solar="#eab308", Nuclear="#0ea5e9", Batteries="#f59e0b",
                 Transmission="#06b6d4", Wind="#3b82f6", Biofuel="#84cc16",
                 Electrolyzers="#a855f7", Geothermal="#ef4444",
                 `Heat Pumps`="#f97316", Magnets="#ec4899")
Note

Version 2 — May 2026. This version corrects two methodological issues identified in peer review (see §4), adds a second share metric (direct_use_share), and applies a consistent filter across all results tables and plots.

1 Background: The Multi-Use Problem

The NZIPL Clean Value Chain Explorer (CVCE) maps global trade in clean technology inputs using BACI bilateral trade data harmonised against a curated Green Dictionary of 605 HS-6 product codes across 10 technologies. Many of these products — copper ore, alumina, rare-earth oxides, silicon metal — are multi-use commodities: they flow into clean technology manufacturing but also into construction, electronics, automotive, and general industry.

Without correction, treating 100% of bilateral copper ore trade as “clean tech” inflates the apparent size of the clean industrial base. The IO use-share pipeline addresses this by asking:

What fraction of sector \(j\)’s actual output is induced by clean technology production?

We answer this with two complementary metrics derived from EXIOBASE, detailed below.

2 Data Sources

2.1 EXIOBASE 3.9.6 pxp (2019)

EXIOBASE 3 [@stadler2018] is a multi-regional supply-and-use table produced by the EXIOBASE consortium. We use the product-by-product (pxp) symmetric input-output table for the year 2019:

Attribute Value
Countries 44 + 5 rest-of-world regions (49 total)
Products 200 industry/product categories
Matrix dimensions 9,800 × 9,800 (49 × 200)
Unit Millions of euros (basic prices, 2019)
Files used A.txt (technical coefficients, 545 MB), x.txt (gross output, 1 MB)

The A matrix and gross output vector are extracted from the EXIOBASE zip archive using pymrio (scripts/build_data/10a_parse_exiobase.py).

2.2 NZIPL Green Dictionary

The Green Dictionary contains 605 HS-6 product codes curated by the NZIPL team, organised by technology, value-chain stage, and product role:

Show code
gd |>
  count(tech, stage, role) |>
  pivot_wider(names_from=stage, values_from=n, values_fill=0) |>
  arrange(tech) |>
  kbl(caption="Green Dictionary: codes by technology, stage, and role") |>
  kable_styling(bootstrap_options=c("striped","condensed"), font_size=12)
Green Dictionary: codes by technology, stage, and role
tech role Downstream Final Product Midstream Upstream
Batteries Process Equipment 32 0 6 0
Batteries Product Component 1 0 7 0
Batteries Final Product 0 3 0 0
Batteries Processed Material 0 0 27 0
Batteries Raw Material 0 0 0 13
Biofuel Process Equipment 10 0 5 0
Biofuel Final Product 0 4 0 0
Biofuel Processed Material 0 0 27 0
Biofuel Raw Material 0 0 0 23
Electrolyzers Process Equipment 16 0 1 0
Electrolyzers Product Component 10 0 2 0
Electrolyzers Final Product 0 1 0 0
Electrolyzers Processed Material 0 0 18 0
Electrolyzers Raw Material 0 0 0 6
Geothermal Process Equipment 18 0 9 0
Geothermal Product Component 10 0 12 0
Geothermal Final Product 0 9 0 0
Geothermal Processed Material 0 0 14 0
Geothermal Raw Material 0 0 0 14
Heat Pumps Process Equipment 5 0 3 0
Heat Pumps Product Component 7 0 5 0
Heat Pumps Final Product 0 4 0 0
Heat Pumps Processed Material 0 0 4 0
Heat Pumps Raw Material 0 0 0 5
Magnets Process Equipment 9 0 0 0
Magnets Product Component 1 0 0 0
Magnets Final Product 0 2 0 0
Magnets Processed Material 0 0 5 0
Magnets Raw Material 0 0 0 5
Nuclear Process Equipment 2 0 3 0
Nuclear Product Component 11 0 0 0
Nuclear Final Product 0 2 0 0
Nuclear Processed Material 0 0 11 1
Nuclear Raw Material 0 0 0 13
Solar Process Equipment 24 0 11 0
Solar Product Component 11 0 2 0
Solar Final Product 0 3 0 0
Solar Processed Material 0 0 18 0
Solar Raw Material 0 0 0 11
Transmission Process Equipment 9 0 6 0
Transmission Product Component 2 0 0 0
Transmission Final Product 0 8 0 0
Transmission Processed Material 0 0 6 0
Transmission Raw Material 0 0 0 5
Wind Process Equipment 8 0 7 0
Wind Product Component 13 0 32 0
Wind Final Product 0 1 0 0
Wind Processed Material 0 0 23 0
Wind Raw Material 0 0 0 9

3 Step 1: HS Code → EXIOBASE Product Concordance

BACI uses HS-6 product codes; EXIOBASE uses named product categories (e.g. “Copper ores and concentrates”, “Electrical machinery and apparatus n.e.c. (31)”). Bridging these requires a two-step concordance. Note that EXIOBASE categories are products (200 product-by-product flows), not ISIC/NACE sectors.

3.1 Priority 1: Direct HS6 Prefix Mapping

For ores and key processed materials — products with a clear, unique EXIOBASE counterpart — we constructed a direct lookup table of 40 HS6-prefix → EXIOBASE-product mappings covering:

  • Chapter 26 metal ores (iron, copper, nickel, aluminium/bauxite, cobalt, REE, uranium, precious metals)
  • Chapter 28 inorganic chemicals (alumina/Al₂O₃, lithium compounds, cobalt oxides, REE chlorides)
  • Processed metals (copper wire/products, aluminium products, indium, bismuth, cadmium)
  • Specialty materials (biofuel feedstocks, wood biomass, nuclear-specific compounds)
Show code
tibble::tribble(
  ~HS6, ~Name, ~EXIOBASE_product,
  "260111/260112", "Iron ore", "Iron ores",
  "260300", "Copper ore", "Copper ores and concentrates",
  "260400", "Nickel ore", "Nickel ores and concentrates",
  "260600", "Bauxite (aluminium ore)", "Aluminium ores and concentrates",
  "260500/261000/261300", "Cobalt, chromium, molybdenum ores", "Other non-ferrous metal ores",
  "261610/261690", "Precious metal ores (Ag, Au, Pt)", "Precious metal ores and concentrates",
  "261210/261220", "Uranium ore", "Uranium and thorium ores (12)",
  "262000", "Rare earth ores", "Other non-ferrous metal ores",
  "280530", "REE metals (Sc, Y, La, Ce, Nd...)", "Precious metals",
  "281820", "Alumina (Al₂O₃)", "Aluminium and aluminium products",
  "283691", "Lithium carbonate/compounds", "Other non-ferrous metal products",
  "740811/740819", "Copper wire", "Copper products",
  "760120", "Unwrought aluminium", "Aluminium and aluminium products",
  "811292", "Indium (solar thin-film)", "Other non-ferrous metal products",
  "284610/284690", "REE chlorides", "Precious metals",
  "440110/440130", "Wood pellets/chips (biofuel)", "Wood products",
  "282611", "Lithium fluoride (nuclear moderator)", "Nuclear fuel"
) |>
  kbl(caption="Selected direct HS6 → EXIOBASE product mappings (illustrative subset)",
      col.names=c("HS6 Code(s)","Product Name","EXIOBASE Product")) |>
  kable_styling(bootstrap_options=c("striped","condensed"), font_size=12)
Selected direct HS6 → EXIOBASE product mappings (illustrative subset)
HS6 Code(s) Product Name EXIOBASE Product
260111/260112 Iron ore Iron ores
260300 Copper ore Copper ores and concentrates
260400 Nickel ore Nickel ores and concentrates
260600 Bauxite (aluminium ore) Aluminium ores and concentrates
260500/261000/261300 Cobalt, chromium, molybdenum ores Other non-ferrous metal ores
261610/261690 Precious metal ores (Ag, Au, Pt) Precious metal ores and concentrates
261210/261220 Uranium ore Uranium and thorium ores (12)
262000 Rare earth ores Other non-ferrous metal ores
280530 REE metals (Sc, Y, La, Ce, Nd...) Precious metals
281820 Alumina (Al₂O₃) Aluminium and aluminium products
283691 Lithium carbonate/compounds Other non-ferrous metal products
740811/740819 Copper wire Copper products
760120 Unwrought aluminium Aluminium and aluminium products
811292 Indium (solar thin-film) Other non-ferrous metal products
284610/284690 REE chlorides Precious metals
440110/440130 Wood pellets/chips (biofuel) Wood products
282611 Lithium fluoride (nuclear moderator) Nuclear fuel

3.2 Priority 2: NACE4 Fallback

For HS codes not in the direct table, we fall back to the NACE Rev. 2 4-digit code assigned in the Green Dictionary (from the NAICS crosswalk pipeline). A lookup table maps 33 NACE4 codes to EXIOBASE product categories.

Show code
tibble::tribble(
  ~NACE4, ~Description, ~EXIOBASE_product,
  "0710", "Iron ore mining", "Iron ores",
  "2442", "Aluminium production", "Aluminium and aluminium products",
  "2444", "Copper production", "Copper products",
  "2445", "Other non-ferrous metals", "Other non-ferrous metal products",
  "2011", "Basic chemicals", "Chemicals nec",
  "2311/2312", "Flat/hollow glass", "Glass and glass products",
  "2410", "Basic iron & steel", "Basic iron and steel",
  "2446", "Nuclear fuel processing", "Nuclear fuel",
  "2732", "Wiring/electrical apparatus", "Electrical machinery (31)"
) |>
  kbl(caption="Selected NACE4 → EXIOBASE product fallback mappings",
      col.names=c("NACE4","Description","EXIOBASE Product")) |>
  kable_styling(bootstrap_options=c("striped","condensed"), font_size=12)
Selected NACE4 → EXIOBASE product fallback mappings
NACE4 Description EXIOBASE Product
0710 Iron ore mining Iron ores
2442 Aluminium production Aluminium and aluminium products
2444 Copper production Copper products
2445 Other non-ferrous metals Other non-ferrous metal products
2011 Basic chemicals Chemicals nec
2311/2312 Flat/hollow glass Glass and glass products
2410 Basic iron & steel Basic iron and steel
2446 Nuclear fuel processing Nuclear fuel
2732 Wiring/electrical apparatus Electrical machinery (31)

3.3 Coverage

Show code
cov_tbl <- gd |>
  group_by(tech) |>
  summarise(
    total     = n(),
    raw_proc  = sum(role %in% RAW_PROC),
    mapped    = sum(!is.na(exiobase_product) & role %in% RAW_PROC),
    pct       = round(mapped / pmax(raw_proc,1) * 100),
    .groups   = "drop"
  )

cov_tbl |>
  kbl(caption="EXIOBASE concordance coverage by technology (raw/processed materials only)",
      col.names=c("Technology","Total HS6","Raw/Processed","Mapped","Coverage %")) |>
  kable_styling(bootstrap_options=c("striped","condensed")) |>
  column_spec(5, bold=TRUE)
EXIOBASE concordance coverage by technology (raw/processed materials only)
Technology Total HS6 Raw/Processed Mapped Coverage %
Batteries 89 40 40 100
Biofuel 69 50 50 100
Electrolyzers 54 24 24 100
Geothermal 86 28 28 100
Heat Pumps 33 9 9 100
Magnets 22 10 10 100
Nuclear 43 25 25 100
Solar 80 29 29 100
Transmission 36 11 11 100
Wind 93 32 32 100

100% of raw and processed material codes are mapped to an EXIOBASE product. Components, process equipment, and final products are not mapped — they receive leontief_use_share = direct_use_share = 1.0 by assumption (§4.4).

4 Step 2: Clean-Technology Product Definitions

For each of the 10 technologies, we define a set of EXIOBASE product categories representing its final-stage manufacturing output. These identify which columns of the Leontief inverse (or transaction matrix) correspond to clean-tech demand.

Show code
tech_sectors <- list(
  Solar        = c("Electricity by solar photovoltaic", "Electricity by solar thermal",
                   "Glass and glass products", "Electrical machinery (31)"),
  Wind         = c("Electricity by wind", "Machinery and equipment (29)",
                   "Basic iron and steel", "Fabricated metal products (28)"),
  Batteries    = c("Electrical machinery (31)", "Other non-ferrous metal products",
                   "Copper products", "Aluminium products", "Chemicals nec"),
  Electrolyzers= c("Machinery (29)", "Electrical machinery (31)", "Fabricated metals (28)"),
  Transmission = c("Transmission services of electricity", "Electrical machinery (31)",
                   "Copper products", "Aluminium products"),
  Nuclear      = c("Nuclear fuel", "Electricity by nuclear", "Machinery (29)"),
  `Heat Pumps` = c("Machinery (29)", "Electrical machinery (31)", "Rubber and plastics"),
  Geothermal   = c("Electricity by Geothermal", "Machinery (29)"),
  Magnets      = c("Precious metals", "Precious metal ores", "Other non-ferrous metals",
                   "Electrical machinery (31)"),
  Biofuel      = c("Biogasoline", "Biodiesels", "Other Liquid Biofuels",
                   "Oil seeds", "Sugar cane, sugar beet")
)

do.call(rbind, lapply(names(tech_sectors), function(t)
  data.frame(Technology=t,
             `EXIOBASE clean-tech products`=paste(tech_sectors[[t]], collapse=" · "),
             check.names=FALSE))) |>
  kbl(caption="Clean-technology EXIOBASE product definitions") |>
  kable_styling(bootstrap_options=c("striped","condensed"), font_size=11) |>
  column_spec(2, width="60%")
Clean-technology EXIOBASE product definitions
Technology EXIOBASE clean-tech products
Solar Electricity by solar photovoltaic · Electricity by solar thermal · Glass and glass products · Electrical machinery (31)
Wind Electricity by wind · Machinery and equipment (29) · Basic iron and steel · Fabricated metal products (28)
Batteries Electrical machinery (31) · Other non-ferrous metal products · Copper products · Aluminium products · Chemicals nec
Electrolyzers Machinery (29) · Electrical machinery (31) · Fabricated metals (28)
Transmission Transmission services of electricity · Electrical machinery (31) · Copper products · Aluminium products
Nuclear Nuclear fuel · Electricity by nuclear · Machinery (29)
Heat Pumps Machinery (29) · Electrical machinery (31) · Rubber and plastics
Geothermal Electricity by Geothermal · Machinery (29)
Magnets Precious metals · Precious metal ores · Other non-ferrous metals · Electrical machinery (31)
Biofuel Biogasoline · Biodiesels · Other Liquid Biofuels · Oil seeds · Sugar cane, sugar beet
Warning

Sector granularity limitation. EXIOBASE aggregates all machinery manufacturing into one category (“Machinery and equipment n.e.c. (29)”). Heat-pump or wind-turbine manufacturing is a small slice of global machinery output. Using this broad sector as a clean-tech proxy therefore understates the true share — the denominator (total machinery output) is large relative to the clean-tech-specific portion. This is a known limitation of 200-product IO tables and affects all technologies relying on machinery categories.

5 Step 3: Correct IO Aggregation

Before computing use shares, the 9,800-sector A matrix must be aggregated to 200 product categories. A previous version of this pipeline summed A coefficients directly, which is mathematically incorrect: since \(A_{ij} = Z_{ij}/x_j\) (transactions divided by output), adding coefficients from sectors of different sizes conflates the denominators.

Correct approach (v2):

\[ Z^{\text{prod}}_{ij} = \sum_{c}\sum_{c'} Z_{(c,i)(c',j)}, \quad x^{\text{prod}}_{j} = \sum_{c} x_{(c,j)}, \quad A^{\text{prod}}_{ij} = \frac{Z^{\text{prod}}_{ij}}{x^{\text{prod}}_{j}} \]

Since \(Z = A \cdot \text{diag}(\mathbf{x})\), we reconstruct transactions from A.txt and x.txt without needing to read Z.txt (682 MB) separately:

Z_raw  <- sweep(A_raw, 2, x_raw, `*`)              # Z[i,j] = A[i,j] * x[j]
Z_prod <- t(rowsum(t(rowsum(Z_raw, prod_names)),    # sum over countries
                   prod_names))
x_prod <- rowsum(matrix(x_raw, ncol=1), prod_names) # sum output
A_prod <- sweep(Z_prod, 2, pmax(x_prod, 1e-12), `/`)# recompute A

6 Step 4: Use Share Computation

We compute two complementary metrics for each HS-6 raw/processed material code.

6.1 Metric 1: Leontief Upstream Use Share

The Leontief inverse \(\mathbf{L} = (\mathbf{I} - \mathbf{A})^{-1}\) captures total (direct + indirect) upstream requirements. Element \(L_{jk}\) is the total output of sector \(j\) required per unit of final demand for sector \(k\).

Corrected formula (v2): For raw material sector \(j\) and clean-tech column set \(\mathcal{C}_t\):

\[\text{leontief\_use\_share}_{j,t} = \frac{\displaystyle\sum_{k \in \mathcal{C}_t} L_{jk}}{x_j}\]

The denominator is sector \(j\)’s actual gross output \(x_j\) (millions EUR, from x.txt). A previous version divided by \(\sum_k L_{jk}\) (the total Leontief row sum), which is a per-unit-demand concept rather than an output-weighted share — this has been corrected.

compute_sector_shares <- function(clean_sector_codes) {
  clean_cols    <- which(grepl(clean_sector_codes, colnames(A_raw), fixed=TRUE))
  row_to_clean  <- rowSums(L[, clean_cols, drop=FALSE])
  # Denominator: actual gross output x_j (not Leontief row sum)
  ifelse(x_raw > 0, row_to_clean / x_raw, 0)
}

Interpretation: Total upstream Leontief requirements from sector \(j\) directed to clean tech, expressed as a fraction of \(j\)’s actual output. Values are small for bulk commodities (iron ore: ~0.004%) because their global output is vast relative to clean-tech demand; larger for specialised intermediates (REE compounds: ~0.5–2%).

6.2 Metric 2: Direct Use Share

The direct use share measures only first-order supply chain links — no indirect chains:

\[\text{direct\_use\_share}_{j,t} = \frac{\displaystyle\sum_{k \in \mathcal{C}_t} Z^{\text{prod}}_{jk}}{x^{\text{prod}}_j}\]

computed at the aggregated 200-product level. This is more intuitive as a direct fraction of output but understates total clean-tech dependence for materials deep in the supply chain.

compute_direct_shares <- function(clean_sector_codes) {
  clean_cols <- which(grepl(clean_sector_codes, colnames(Z_prod), fixed=TRUE))
  dir_use    <- rowSums(Z_prod[, clean_cols, drop=FALSE])
  ifelse(x_prod_vec > 0, dir_use / x_prod_vec, 0)
}

6.3 Mapping to HS6 Codes

Each HS6 code is matched to its EXIOBASE product (§3). Both share metrics are averaged over all 49 country-instances of that product:

\[\hat{s}_{\text{HS6}} = \frac{1}{|\{c\}|}\sum_{c:\,\text{product}(c) = \text{EXIO(HS6)}} s_{c,t}\]

6.4 Assignment Rules

Condition leontief_use_share direct_use_share
Raw/Processed Material, EXIOBASE mapped \(\hat{s}^L_{j,t}\) (Leontief) \(\hat{s}^D_{j,t}\) (direct)
Raw/Processed Material, unmapped tech-mean fallback \(\bar{s}^L_t\) tech-mean fallback \(\bar{s}^D_t\)
Product Component / Process Equipment / Final Product \(1.0\) \(1.0\)

The 1.0 assumption for downstream products: battery separators, solar module frames, wind turbine blades, and electrolyzer stacks are clean-technology-specific by curation. The 1.0 is an upper bound; in practice some process equipment HS codes may be multi-use.

7 Results

All plots and tables below use the same consistent universe: raw and processed materials with an EXIOBASE product mapping (role %in% c("Raw Material","Processed Material") & !is.na(exiobase_product)). The 1.0-assigned downstream products are excluded from distribution analysis.

7.1 Leontief Use Share Distribution

Show code
gd_rp |>
  filter(leontief_use_share < 1) |>
  mutate(tech = factor(tech, levels=names(TECH_COLORS))) |>
  ggplot(aes(x=leontief_use_share, fill=tech)) +
  geom_histogram(bins=30, colour="white", linewidth=0.2, alpha=0.9) +
  scale_fill_manual(values=TECH_COLORS) +
  scale_x_continuous(labels=percent_format(accuracy=0.01)) +
  facet_wrap(~tech, ncol=5, scales="free_y") +
  labs(title="Leontief upstream use share — raw/processed materials",
       subtitle="Σ L[j, k∈C] / x_j  ·  mapped codes only  ·  excludes 1.0 downstream assignments",
       x="Leontief use share", y="HS-6 codes") +
  theme_dark() +
  theme(legend.position="none", strip.text=element_text(size=8),
        plot.background=element_rect(fill="#1a2030"),
        panel.background=element_rect(fill="#0d1520"),
        text=element_text(colour="#e2e8f0"),
        axis.text=element_text(colour="#94a3b8"),
        strip.background=element_rect(fill="#0f2518"))

7.2 Direct Use Share Distribution

Show code
gd_rp |>
  filter(direct_use_share < 1) |>
  mutate(tech = factor(tech, levels=names(TECH_COLORS))) |>
  ggplot(aes(x=direct_use_share, fill=tech)) +
  geom_histogram(bins=30, colour="white", linewidth=0.2, alpha=0.9) +
  scale_fill_manual(values=TECH_COLORS) +
  scale_x_continuous(labels=percent_format(accuracy=1)) +
  facet_wrap(~tech, ncol=5, scales="free_y") +
  labs(title="Direct use share — raw/processed materials",
       subtitle="Σ Z_prod[j, k∈C] / x_prod[j]  ·  first-order transactions only  ·  mapped codes only",
       x="Direct use share", y="HS-6 codes") +
  theme_dark() +
  theme(legend.position="none", strip.text=element_text(size=8),
        plot.background=element_rect(fill="#1a2030"),
        panel.background=element_rect(fill="#0d1520"),
        text=element_text(colour="#e2e8f0"),
        axis.text=element_text(colour="#94a3b8"),
        strip.background=element_rect(fill="#0f2518"))

7.3 Top and Bottom Examples by Technology

Show code
base <- gd_rp |> filter(leontief_use_share < 1)

examples <- bind_rows(
  base |> group_by(tech) |> slice_max(leontief_use_share, n=3, with_ties=FALSE),
  base |> group_by(tech) |> slice_min(leontief_use_share, n=2, with_ties=FALSE)
) |>
  ungroup() |>
  distinct(tech, code, .keep_all=TRUE) |>
  arrange(tech, desc(leontief_use_share)) |>
  select(tech, code, name, exiobase_product, leontief_use_share, direct_use_share) |>
  mutate(leontief_use_share = percent(leontief_use_share, accuracy=0.001),
         direct_use_share   = percent(direct_use_share,   accuracy=0.1))

examples |>
  kbl(caption="Top-3 and bottom-2 Leontief use shares by technology (raw/processed, mapped only)",
      col.names=c("Tech","HS6","Product","EXIOBASE Product","Leontief share","Direct share")) |>
  kable_styling(bootstrap_options=c("striped","condensed"), font_size=11) |>
  column_spec(5:6, bold=TRUE)
Top-3 and bottom-2 Leontief use shares by technology (raw/processed, mapped only)
Tech HS6 Product EXIOBASE Product Leontief share Direct share
Batteries 282010 CAM; Manganese Dioxide Other non-ferrous metal products 17.014% 43.7%
Batteries 282090 CAM; Manganese Oxides Other non-ferrous metal products 17.014% 43.7%
Batteries 282200 CAM; Electrolytic Cobalt, LCO (Lithium Cobalt Oxide) Other non-ferrous metal products 17.014% 43.7%
Batteries 392010 Separator; Polymers of Ethylene, Non-Cellular Rubber and plastic products (25) 0.002% 4.7%
Batteries 392020 Separator; Polymers of Propylene, Non-Cellular Rubber and plastic products (25) 0.002% 4.7%
Biofuel 260500 Cobalt Ore Other non-ferrous metal ores and concentrates 0.007% 1.2%
Biofuel 261100 Tungsten Ore Other non-ferrous metal ores and concentrates 0.007% 1.2%
Biofuel 261310 Molybdenum Ore Other non-ferrous metal ores and concentrates 0.007% 1.2%
Biofuel 121292 Feedstock Input; Sugar Cane Crops nec 0.001% 0.1%
Biofuel 121300 Feedstock Input; Ag-Waste Crops nec 0.001% 0.1%
Electrolyzers 711011 Catalyst; Platinum Precious metals 0.004% 17.3%
Electrolyzers 711021 Catalyst; Palladium Precious metals 0.004% 17.3%
Electrolyzers 711041 Catalyst; Iridium Precious metals 0.004% 17.3%
Electrolyzers 283324 Catalyst; Nickel Sulfate Chemicals nec 0.001% 4.1%
Electrolyzers 283329 Cobalt Sulfate Chemicals nec 0.001% 4.1%
Geothermal 710229 Industrial Diamonds Precious metals 0.002% 2.7%
Geothermal 710510 Diamond Powder Precious metals 0.002% 2.7%
Geothermal 720230 Casing; Ferro-manganese Basic iron and steel and of ferro-alloys and first products thereof 0.002% 10.7%
Geothermal 252330 Geothermal Wells; Cement Cement, lime and plaster 0.000% 0.2%
Geothermal 252100 Limestone Stone 0.000% 0.3%
Heat Pumps 260600 Bauxite Ore Aluminium ores and concentrates 0.003% 2.9%
Heat Pumps 281820 Alumina Aluminium and aluminium products 0.003% 21.6%
Heat Pumps 740110 Copper Mattes Copper products 0.003% 17.0%
Heat Pumps 261390 Molybdenum Ore Other non-ferrous metal ores and concentrates 0.001% 2.5%
Heat Pumps 251910 Magnesium Ore Chemical and fertilizer minerals, salt and other mining and quarrying products n.e.c. 0.001% 1.4%
Magnets 280530 Rare-earth Metals, Scandium and Yttrium Precious metals 8.033% 44.4%
Magnets 284690 Compounds, Mixes of Rare-earths, Yttrium, Scandium Precious metals 8.033% 44.4%
Magnets 261590 Niobium, Tantalum and Vanadium Ores and Concentrates Other non-ferrous metal ores and concentrates 0.028% 17.4%
Magnets 260120 Roasted Iron Pyrite Chemicals nec 0.001% 1.0%
Magnets 283324 Nickel Sulfates Chemicals nec 0.001% 1.0%
Nuclear 260111 Iron Ore (Non- Agglomerated) Iron ores 0.836% 0.8%
Nuclear 260112 Iron Ore (Agglomerated) Iron ores 0.836% 0.8%
Nuclear 260300 Copper Ore Copper ores and concentrates 0.067% 0.7%
Nuclear 380110 Neutron Moderator; Artificial Graphite Other non-metallic mineral products 0.001% 1.3%
Nuclear 681099 Hafnium; Control Rods Other non-metallic mineral products 0.001% 1.3%
Solar 700529 Solar Glass; Glass Sheet Casing (Float) Glass and glass products 8.385% 24.6%
Solar 260600 Solar Miscellaneous; Materials for Aluminum Coating Aluminium ores and concentrates 0.013% 2.6%
Solar 392010 Solar Glass; Polymers of Ethylene for EVA Sheets Rubber and plastic products (25) 0.001% 2.7%
Solar 392030 Solar Glass; Polymers of Styrene for EVA Sheets Rubber and plastic products (25) 0.001% 2.7%
Transmission 281820 Alumina Aluminium and aluminium products 2.727% 28.3%
Transmission 760521 Aluminum wire Aluminium and aluminium products 2.727% 28.3%
Transmission 740110 Copper Mattes Copper products 2.606% 49.5%
Transmission 260120 Iron (Roasted Iron Pyrites) Chemicals nec 0.001% 4.0%
Transmission 281290 Sulfur Hexafluoride Chemicals nec 0.001% 4.0%
Wind 730110 Tower; Sheets Iron & Steel Basic iron and steel and of ferro-alloys and first products thereof 0.661% 49.8%
Wind 820900 Rotor; Materials for Use in Rotor (Sintered Metal) Fabricated metal products, except machinery and equipment (28) 0.035% 21.9%
Wind 281820 Alumina Aluminium and aluminium products 0.007% 31.7%
Wind 290949 Tower; Industrial Alcohols for Use in Tower Chemicals nec 0.001% 4.4%
Wind 350691 Rotor; Adhesive for Use in Rotor Chemicals nec 0.001% 4.4%

7.4 Summary Statistics

Show code
gd_rp |>
  filter(leontief_use_share < 1) |>
  group_by(tech) |>
  summarise(
    n_mapped       = n(),
    mean_leontief  = percent(mean(leontief_use_share, na.rm=TRUE), accuracy=0.001),
    max_leontief   = percent(max(leontief_use_share,  na.rm=TRUE), accuracy=0.001),
    mean_direct    = percent(mean(direct_use_share,   na.rm=TRUE), accuracy=0.1),
    max_direct     = percent(max(direct_use_share,    na.rm=TRUE), accuracy=0.1),
    .groups="drop"
  ) |>
  kbl(caption="Use-share summary by technology (raw/processed materials, mapped, excludes 1.0)",
      col.names=c("Technology","N mapped","Mean Leontief","Max Leontief",
                  "Mean Direct","Max Direct")) |>
  kable_styling(bootstrap_options=c("striped","condensed")) |>
  column_spec(3:4, color="#60a5fa") |>
  column_spec(5:6, color="#fb923c")
Use-share summary by technology (raw/processed materials, mapped, excludes 1.0)
Technology N mapped Mean Leontief Max Leontief Mean Direct Max Direct
Batteries 40 5.255% 17.014% 23.2% 52.9%
Biofuel 48 0.003% 0.007% 0.7% 1.8%
Electrolyzers 24 0.002% 0.004% 7.4% 17.3%
Geothermal 27 0.001% 0.002% 4.3% 10.7%
Heat Pumps 9 0.002% 0.003% 9.6% 21.6%
Magnets 10 1.615% 8.033% 15.4% 44.4%
Nuclear 23 0.084% 0.836% 2.8% 10.7%
Solar 27 0.315% 8.385% 3.7% 24.6%
Transmission 11 0.973% 2.727% 24.5% 50.9%
Wind 31 0.025% 0.661% 10.1% 49.8%

7.5 Comparing the Two Metrics

Show code
gd_rp |>
  filter(leontief_use_share < 1, direct_use_share < 1) |>
  ggplot(aes(x=direct_use_share, y=leontief_use_share, colour=tech)) +
  geom_point(alpha=0.6, size=1.8) +
  scale_colour_manual(values=TECH_COLORS) +
  scale_x_continuous(labels=percent_format(accuracy=1)) +
  scale_y_continuous(labels=percent_format(accuracy=0.01)) +
  facet_wrap(~tech, ncol=5, scales="free") +
  labs(title="Direct vs Leontief use share per HS-6 code",
       subtitle="Each point is one raw/processed material code  ·  Leontief captures indirect chains",
       x="Direct use share (Z/x)", y="Leontief use share (ΣL/x)") +
  theme_dark() +
  theme(legend.position="none", strip.text=element_text(size=8),
        plot.background=element_rect(fill="#1a2030"),
        panel.background=element_rect(fill="#0d1520"),
        text=element_text(colour="#e2e8f0"),
        axis.text=element_text(colour="#94a3b8"),
        strip.background=element_rect(fill="#0f2518"))

7.6 Economic Interpretation

Direct use share (orange in summary table) measures what fraction of a material’s global output flows directly into clean technology manufacturing. It ranges from near-zero for bulk commodities (iron ore goes mainly to steel for construction) to 30–50% for specialised intermediates (lithium battery compounds, REE processing).

Leontief use share (blue) captures the full upstream chain — all indirect requirements induced by one unit of clean-tech final demand. It is smaller in magnitude than the direct share for most materials because the denominator (\(x_j\)) counts all global output of sector \(j\), while clean-tech final demand per unit is modest relative to total global demand. This metric is more appropriate for materials several steps upstream of clean tech (e.g. iron ore → steel → turbine blade → wind electricity).

The direct share is generally larger because it captures concentrated, bilateral supply transactions. The Leontief share is more conservative and reflects the full economic footprint.

8 Limitations and Open Questions

  1. Monetary, not physical IO. EXIOBASE records flows in millions of euros. Relative prices distort the share of rare materials (REEs, cobalt) whose value density is much higher than bulk commodities. Physical MRIO tables (EXIOBASE MR-PSUT) would be preferable but are harder to work with.

  2. Single reference year (2019). Use shares reflect the structure of industrial demand before the post-IRA/CBAM clean energy investment wave. Battery and solar shares are likely understated for 2022–2024.

  3. 49-country coverage. ~140 remaining countries are pooled into 5 rest-of-world regions, diluting use shares for materials produced mainly in DRC (cobalt), Bolivia (lithium), Indonesia (nickel).

  4. Broad sector aggregation. EXIOBASE’s 200 product categories group diverse subsectors. “Machinery and equipment (29)” covers heat pumps, industrial turbines, and general machinery. The Leontief share for heat-pump materials is understated because the denominator includes all non-clean machinery output. This is a structural limitation of 200-product tables.

  5. Clean-tech column definition. We treat all output of the defined EXIOBASE products (e.g. all “Electrical machinery (31)”) as clean tech. This overstates the clean-tech share if the sector produces both clean and non-clean goods (see §2 callout).

  6. 1.0 assumption for downstream products. Some process equipment HS codes are multi-use. The 1.0 assignment is an upper bound.

  7. Tech-mean fallback for unmapped materials. The ~50% of raw/processed materials without a direct EXIOBASE mapping receive the technology average. This introduces measurement error for highly specific materials.

9 Files and Reproducibility

File Description
scripts/build_data/10a_parse_exiobase.py Extract A.txt + x.txt from EXIOBASE zip
scripts/build_data/10_build_io_use_shares.R Z-based aggregation, Leontief + direct share computation
data/exiobase/hs_exiobase_concordance.csv Per-HS6 concordance with both share metrics
data/exiobase/io_use_shares.parquet Machine-readable shares (product_code, tech, leontief_use_share, direct_use_share)
data/green_dict/green_dictionary.csv Green Dictionary + exiobase_product + leontief_use_share + direct_use_share

To reproduce:

# Step 1: extract A.txt + x.txt from EXIOBASE zip (requires IOT_2019_pxp.zip)
python3 scripts/build_data/10a_parse_exiobase.py 2019

# Step 2: compute use shares
IO_MODE=real IO_YEAR=2019 Rscript scripts/build_data/10_build_io_use_shares.R

# Step 3: render this report
quarto render qmd/report/hs_exiobase_use_shares_methodology.qmd

EXIOBASE data is available at exiobase.eu (registration required). The IOT_2019_pxp.zip (~500 MB) goes in data/exiobase/.

10 References