The question
“Germany is losing competitiveness” sounds decisive. Analytically, it is incomplete. It does not identify an outcome, an economic unit, a comparison group, a period, or the quantity we want to estimate.
For this lesson, the broad claim becomes a bounded historical question:
From 2000–2019, did Germany’s manufacturing real value added per hour grow more slowly than the median of Austria, Czechia, France, Italy, the Netherlands, and Sweden; was its rebased unit-labour-cost movement less favourable from 2020 to 2021; and what additional evidence would be needed to explain the productivity gap?
This formulation is deliberately narrower than the headline. It does not establish Germany’s current 2022–2026 position. It turns an argument into a measurement plan that another analyst can inspect, reject, or reproduce.
The evidence
The evidence package separates four source roles instead of blending unlike statistics into one score.
- World Development Indicators (DS001) provides whole-economy productivity, manufacturing growth, and export-intensity context.
- OECD Data Explorer (DS003) provides internationally comparable GDP-per-hour, manufacturing productivity growth, and manufacturing unit-labour-cost series.
- Eurostat (DS004) provides a second, European national-accounts view of manufacturing real value added, value added per hour, and nominal unit labour costs.
- EU KLEMS & INTANProd (DS011) defines the growth-accounting extension for TFP and intangible-capital contributions. Its public download and citation are verified, but numeric redistribution permission and the advertised release vintage are not. No EU KLEMS values are republished here pending written permission.
The common comparison window is 2000–2021. The structural reading ends in 2019; 2020–2021 is shown as a pandemic sensitivity rather than treated as an ordinary endpoint.
The worked solution uses OECD manufacturing real-GVA-per-hour growth as the primary outcome, repeats the same calculation with Eurostat, and keeps the two providers separate. WDI remains context. EU KLEMS remains a named but blocked mechanism branch.
The visual argument
The metric tree keeps four branches separate before any calculation begins:
- Outcome: manufacturing real value added per hour.
- Cost position: manufacturing unit labour cost, indexed to 2020.
- External exposure: exports as a share of GDP and manufacturing real growth.
- Mechanism: TFP and intangible-capital contributions, retrieval-only until EU KLEMS reuse rights are resolved.
The tree defines the analysis. Every leaf names its provider, unit, denominator, period, and limitation. No leaf is averaged into a synthetic “competitiveness score.” The annual chart below the method then shows what happens when one branch is actually calculated.
Competitiveness is a metric tree, not a score
Germany · 2000-2021The reviewed evidence separates productivity, cost position, external context, and a blocked mechanism branch. It can frame a historical diagnosis; it does not establish current competitiveness.
GDP per person employed
DS001Manufacturing GVA per hour growth
DS003Manufacturing nominal unit labour cost
DS004| Dataset | Series | Year | Value | Unit / denominator |
|---|---|---|---|---|
| DS001 | GDP per person employed | 2000 | 110,916 | constant 2021 PPP international dollars / total employment |
| DS001 | GDP per person employed | 2021 | 124,873 | constant 2021 PPP international dollars / total employment |
| DS003 | Manufacturing GVA per hour growth | 2000 | 7.39 | percent per year / manufacturing hours worked |
| DS003 | Manufacturing GVA per hour growth | 2021 | 7.35 | percent per year / manufacturing hours worked |
| DS004 | Manufacturing nominal unit labour cost | 2000 | 87.98 | index 2020=100 / real GVA per hour in compensation-per-hour ratio |
| DS004 | Manufacturing nominal unit labour cost | 2021 | 93.44 | index 2020=100 / real GVA per hour in compensation-per-hour ratio |
The method
Begin with the decision, not the dataset. Then make every design choice executable.
- State who could act differently after seeing the result.
- Select one primary outcome and distinguish contextual indicators from mechanisms.
- Fix the unit of observation: country-year for whole-economy context or country-industry-year for manufacturing evidence.
- Choose benchmarks before examining the ranking.
- Define the estimand. Here it is the mean of 20 annual gaps: Germany’s manufacturing productivity growth minus the median growth of the six declared peers in each year from 2000 through 2019.
- Record units and denominators. GDP per worker, GDP per hour, a growth rate, an index, and an export share are not interchangeable.
- Preserve provider vintages and flags. Similar-looking OECD and Eurostat series remain separate observations.
- Compound Germany’s annual rates and the annual peer-median path separately. Do not compound an average rate or treat the constructed peer path as one country.
- Report 2020–2021 as sensitivity, repeat the calculation with Eurostat, and state what the result does not establish.
For year t, the calculation is gap_t = Germany_growth_t - median(peer_growth_t). The structural estimand is the arithmetic mean of gap_t for 2000–2019. The worked solution below executes this exact sequence on the published panel and exposes every annual input.
The primary OECD result is 2.35% per year for Germany versus 2.65% for the annual peer-median path, an average gap of −0.29 percentage points per year. A separate Eurostat provider cross-check gives 2.35%, 2.64%, and the same rounded −0.29-point gap. Compounding the annual OECD rates gives 54.6% for Germany and 66.8% for the constructed peer-median path.
Worked solution / 1,386 rows to one bounded answer
Solve the claim with the data
The metric tree chooses the estimand. This calculation now executes it without mixing providers, hiding the comparison group, or treating pandemic years as ordinary data.
- 01
Choose one outcome series
Use OECD manufacturing real GVA per hour growth (DS003) as the primary outcome. Keep Eurostat for a separate robustness check.
- 02
Freeze the comparison
Keep Germany as the focus and AT, CZ, FR, IT, NL, and SE as the six peers declared before inspecting results.
- 03
Build one peer median per year
For each year, take the median of the six peer growth rates. Do not pool all country-years or average provider series.
- 04
Calculate the annual gap
Subtract the peer median from Germany. Average those 20 annual gaps over 2000–2019 and compound each annual path separately.
- 05
Stress-test the answer
Report 2020–2021 outside the structural estimate, repeat the method with Eurostat, and inspect ULC movement without claiming absolute cost levels.
annual_gapt = Germany_growtht − median(peer_growtht)Structural estimand = mean of annual gaps for 2000–2019
Germany versus the declared peer median
OECD manufacturing real GVA per hour growth, percent per year
Germany trails the peer median on average before 2020, falls further behind in 2020, and rebounds more strongly in 2021. Pandemic disruption motivated the pre-declared sensitivity window; the opposing signs show why pooling those years would distort the structural reading.
Robustness check
A provider cross-check reaches the same rounded answer
The same estimand is calculated separately from each provider. The values are never averaged into a synthetic score.
| Provider | Germany mean | Peer mean | Annual gap | Compounded paths |
|---|---|---|---|---|
| OECD Productivity database | 2.35% | 2.65% | −0.29 pp | 54.6% vs 66.8% |
| Eurostat labour productivity | 2.35% | 2.64% | −0.29 pp | 54.4% vs 66.7% |
Run the same calculation in DuckDB
Place the permitted CSV beside this query and run the statement unchanged. The expected row is 2.35, 2.65, -0.29, 54.6, 66.8 after rounding.
WITH selected AS (
SELECT year, geo, value
FROM read_csv_auto('competitiveness-panel.csv')
WHERE datasetId = 'DS003'
AND seriesKey = 'GVAHRS.C.XDC_H.LR.GY._Z._Z'
AND year BETWEEN 2000 AND 2019
),
annual_comparison AS (
SELECT
year,
max(value) FILTER (WHERE geo = 'DE') AS germany_growth,
median(value) FILTER (
WHERE geo IN ('AT', 'CZ', 'FR', 'IT', 'NL', 'SE')
) AS peer_median_growth
FROM selected
GROUP BY year
)
SELECT
round(avg(germany_growth), 2) AS germany_average,
round(avg(peer_median_growth), 2) AS peer_median_average,
round(avg(germany_growth - peer_median_growth), 2) AS annual_gap_pp,
round(
(exp(sum(ln(1 + germany_growth / 100))) - 1) * 100,
1
) AS germany_compounded_growth,
round(
(exp(sum(ln(1 + peer_median_growth / 100))) - 1) * 100,
1
) AS peer_path_compounded_growth
FROM annual_comparison;Sensitivity
Keep 2020–2021 visible, but separate
| Provider | Year | Germany | Peer median | Gap |
|---|---|---|---|---|
| OECD | 2020 | -2.01% | -0.52% | −1.49 pp |
| OECD | 2021 | 7.35% | 4.65% | +2.70 pp |
| EUROSTAT | 2020 | -2.00% | -0.55% | −1.45 pp |
| EUROSTAT | 2021 | 7.30% | 4.65% | +2.65 pp |
Movement check
The 2020–2021 ULC movement does not confirm the claim
| Provider | Germany 2021 | Peer median | Gap |
|---|---|---|---|
| OECD | 95.31 | 96.49 | −1.17 index points |
| EUROSTAT | 93.44 | 97.07 | −3.63 index points |
Both gaps are negative. That is not a less-favourable 2021 movement. Because every country is rebased to its own 2020 value, these indexes do not compare absolute labour cost levels across countries.
Inspect the 22 annual OECD comparisons used above
| Year | Window | Germany | Peer median | Gap |
|---|---|---|---|---|
| 2000 | Structural | 7.39% | 6.64% | +0.75 pp |
| 2001 | Structural | 2.01% | 2.69% | −0.68 pp |
| 2002 | Structural | -0.53% | 2.79% | −3.32 pp |
| 2003 | Structural | 3.62% | 3.23% | +0.39 pp |
| 2004 | Structural | 4.22% | 5.39% | −1.17 pp |
| 2005 | Structural | 4.37% | 5.00% | −0.63 pp |
| 2006 | Structural | 8.79% | 6.64% | +2.15 pp |
| 2007 | Structural | 2.89% | 3.90% | −1.02 pp |
| 2008 | Structural | -4.09% | -1.11% | −2.98 pp |
| 2009 | Structural | -12.35% | -6.55% | −5.81 pp |
| 2010 | Structural | 17.35% | 9.61% | +7.73 pp |
| 2011 | Structural | 5.34% | 4.55% | +0.79 pp |
| 2012 | Structural | -1.55% | 0.36% | −1.92 pp |
| 2013 | Structural | -0.54% | 0.30% | −0.84 pp |
| 2014 | Structural | 3.87% | 1.86% | +2.01 pp |
| 2015 | Structural | 0.06% | 2.09% | −2.03 pp |
| 2016 | Structural | 4.05% | 1.38% | +2.67 pp |
| 2017 | Structural | 3.15% | 3.10% | +0.05 pp |
| 2018 | Structural | 0.10% | 1.39% | −1.29 pp |
| 2019 | Structural | -1.03% | -0.33% | −0.69 pp |
| 2020 | Sensitivity | -2.01% | -0.52% | −1.49 pp |
| 2021 | Sensitivity | 7.35% | 4.65% | +2.70 pp |
The notebook
First reproduce the worked result; then use the workbench to change the design.
- Download the permitted M01 CSV.
- Run the DuckDB query shown in the worked solution without changing it.
- Confirm the rounded output
2.35, 2.65, -0.29, 54.6, 66.8and inspect all 22 annual comparisons. - Check that Eurostat independently produces the same rounded annual gap.
- Only then change one choice in the workbench: the outcome, benchmark, estimand, metric, or caveat.
- Explain why your changed result answers a different question.
The workbench validates structure, not ideology. It does not replace the calculation above. Multiple trees can pass when their choices are explicit and coherent, but each one must eventually be executed against data. A printable blank tree, full worked solution, annual table, and expected output remain available when scripts or local storage are unavailable.
Metric-tree workbench
Answers stay in memory · checkpoints stay on deviceThe worked solution used one defensible design. Change at least one analytical choice, then explain why your tree answers a different question. The check validates explicit structure, not one approved interpretation.
Optional PWT denominator and convergence extension
The existing Data Lab can test a separate PWT-based per-worker or per-hour convergence question. It does not reproduce M01’s World Bank, OECD, Eurostat, or EU KLEMS evidence and must not be used as its receipt.
Open the PWT Data Lab extensionPrintable metric-tree fallback
Works without scriptingComplete the same analytical decisions on paper. The worked result is one valid tree, not the only valid answer.
Printable blank metric tree
Worked Germany example
- Decision
- Whether a historical manufacturing productivity gap warrants deeper diagnosis.
- Outcome
- Manufacturing real GVA per hour growth.
- Unit
- Country-industry-year.
- Comparison
- Germany against the declared six-country peer median.
- Estimand
- Germany minus peer-median average annual growth over 2000-2019.
Expected structural checks
- The claim names a decision, outcome, economic unit, comparison, and period.
- Every metric retains its dataset, unit, denominator, and vintage.
- Context indicators and mechanism evidence are not averaged into one score.
- The implication states what to investigate or decide without claiming causality.
| ID | Provider | Role | Rights state |
|---|---|---|---|
| DS001 | World Bank | GDP per person employed; Manufacturing value added growth; Exports of goods and services | redistribution permitted with attribution |
| DS003 | OECD | GDP per hour; Manufacturing GVA per hour growth; Manufacturing unit labour cost | redistribution permitted with attribution |
| DS004 | Eurostat | Manufacturing real GVA growth; Manufacturing real GVA per hour growth; Manufacturing nominal unit labour cost | redistribution permitted with attribution |
| DS011 | LUISS / EU KLEMS consortium | Manufacturing value added per hour growth; TFP contribution; Non-NA intangible capital contribution | blocked pending written permission |
Limitations
- EU KLEMS numeric redistribution permission is not verifiable from published provider terms.
- EU KLEMS portal and linked workbook disagree on 2025 versus 2024 release vintage.
- The common four-source panel ends in 2021 and cannot establish present-tense 2022–2026 competitiveness.
The executive interpretation
A leader should not ask for “the competitiveness number.” They should ask which outcome is deteriorating, relative to whom, over what period, and through which mechanism.
The worked evidence supports a modest historical manufacturing-productivity gap: about 0.29 percentage points per year against the declared peer median in 2000–2019. It does not support the narrower claim that Germany’s 2020–2021 unit-labour-cost movement was less favourable; both rebased provider indexes sit below the peer median in 2021. It also does not establish the mechanism or Germany’s current 2022–2026 position.
What should an executive do differently after seeing this? Treat the historical productivity gap as a reason to commission a current, mechanism-level diagnosis—not as permission to assert that present competitiveness or labour-cost pressure has already been proved.
How this can mislead
- The complete four-source window ends in 2021 and cannot establish the present-tense 2022–2026 claim.
- World Bank productivity is whole-economy evidence, while OECD, Eurostat, and EU KLEMS manufacturing measures use different classifications and construction methods.
- GDP per worker, GDP per hour, growth rates, and 2020-based indices answer different questions.
- The peer benchmark is a new median in each year. Its compounded path is a transparent constructed benchmark, not the experience of one country.
- Higher unit labour costs may reflect wage convergence, labour hoarding, shorter hours, quality upgrading, or temporary utilisation rather than structural decline.
- A 2020=100 ULC index compares movement from each country’s own base. It does not compare absolute labour-cost levels across countries.
- Exports as a share of GDP measure openness and domestic-demand composition, not export market share or domestic value added in exports.
- TFP is a residual that also absorbs utilisation, reallocation, assumptions, and measurement error.
- Pandemic disruption, the post-2021 energy shock, automotive transition, China exposure, demographics, exchange rates, offshoring, and sectoral reallocation remain rival explanations.
Evidence receipt
m01-competitiveness-v2Source and vintage
- DS001: World Bank · WDI API source 2, last updated 2026-07-13 · redistribution-permitted-with-attribution Canonical source
- DS003: OECD · Dataflow validFrom 2026-06-23T15:35:46.08Z; registry flags retained · redistribution-permitted-with-attribution Canonical source
- DS004: Eurostat · nama_10_a64 updated 2026-07-08; nama_10_lp_a21 updated 2026-07-30 · redistribution-permitted-with-attribution Canonical source
- DS011: LUISS / EU KLEMS consortium · Blocked: portal says Release 2025 while linked workbook identifies 2024 release / Eurostat extraction 2024-04-08 · blocked-pending-written-permission Canonical source
Query or filter
DS001 https://api.worldbank.org/v2/country/DEU;AUT;CZE;FRA;ITA;NLD;SWE/indicator/SL.GDP.PCAP.EM.KD;NV.IND.MANF.KD.ZG;NE.EXP.GNFS.ZS?source=2&date=2000:2021&format=json&per_page=20000&footnote=y
DS003 https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_PDB@DF_PDB/DEU+AUT+CZE+FRA+ITA+NLD+SWE.A.GDPHRS._T.USD_PPP_H.LR.N._Z.PPP?startPeriod=2000&endPeriod=2021&dimensionAtObservation=AllDimensions&format=csvfilewithlabels | https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_PDB@DF_PDB/DEU+AUT+CZE+FRA+ITA+NLD+SWE.A.GVAHRS.C.XDC_H.LR.GY._Z._Z?startPeriod=2000&endPeriod=2021&dimensionAtObservation=AllDimensions&format=csvfilewithlabels | https://sdmx.oecd.org/public/rest/data/OECD.SDD.TPS,DSD_PDB@DF_PDB/DEU+AUT+CZE+FRA+ITA+NLD+SWE.A.ULCH.C.IX.V.N._Z._Z?startPeriod=2000&endPeriod=2021&dimensionAtObservation=AllDimensions&format=csvfilewithlabels
DS004 https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nama_10_a64?lang=en&freq=A&unit=CLV_PCH_PRE&nace_r2=C&na_item=B1G&geo=DE&geo=AT&geo=CZ&geo=FR&geo=IT&geo=NL&geo=SE&sinceTimePeriod=2000&untilTimePeriod=2021 | https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nama_10_lp_a21?lang=en&freq=A&unit=PCH_PRE&nace_r2=C&na_item=RLPR_HW&geo=DE&geo=AT&geo=CZ&geo=FR&geo=IT&geo=NL&geo=SE&sinceTimePeriod=2000&untilTimePeriod=2021 | https://ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/nama_10_lp_a21?lang=en&freq=A&unit=I20&nace_r2=C&na_item=NULC_HW&geo=DE&geo=AT&geo=CZ&geo=FR&geo=IT&geo=NL&geo=SE&sinceTimePeriod=2000&untilTimePeriod=2021
DS011 {"geo_code":["DE","AT","CZ","FR","IT","NL","SE"],"nace_r2_code":"C","year":[2000,2021],"var":["LP1_G","LP1ConTFP","LP1ConIntangnonNA"]}
Rights boundary
- DS001: redistribution-permitted-with-attribution · CC BY 4.0
- DS003: redistribution-permitted-with-attribution · OECD Terms and Conditions
- DS004: redistribution-permitted-with-attribution · European Commission reuse policy / CC BY 4.0 default
- DS011: blocked-pending-written-permission
Transformations
- Keep each provider series separate; do not average into a composite score.
- Filter to DE, AT, CZ, FR, IT, NL and SE for 2000–2021.
- Map provider geography codes to ISO-2 display codes while retaining dataset and series keys.
- Preserve source-specific units, denominators, vintages and observation flags.
- Sort rows deterministically by datasetId, seriesKey, geography and year.
- For each OECD and Eurostat manufacturing-productivity series, calculate Germany minus the median of AT, CZ, FR, IT, NL and SE by year; average the 2000–2019 annual gaps and compound the two annual paths separately.
- Keep 2020–2021 outside the structural estimate and report both years as pandemic sensitivity.
- Use 2020=100 unit-labour-cost indexes only to compare provider-specific movement; do not interpret them as cross-country absolute cost levels.
- Exclude all EU KLEMS numeric values until written redistribution permission and vintage conflict are resolved.
Expected output
Worked structural result
- DS003: Germany 2.35%, peer median 2.65%, annual gap -0.29 percentage points.
- DS004: Germany 2.35%, peer median 2.64%, annual gap -0.29 percentage points.
Limitations
- The complete four-source design ends in 2021 and cannot establish current 2022–2026 competitiveness.
- WDI whole-economy indicators and OECD/Eurostat manufacturing indicators use different economic scopes.
- GDP per worker, GDP per hour, growth rates, indices and export shares are not interchangeable.
- Unit labour cost movements can reflect wages, hours, quality, labour hoarding or utilisation.
- EU KLEMS mechanism values are omitted pending permission and vintage resolution.
Extension challenge
Change exactly one design choice and explain how the interpretation changes.
- Replace the peer median with an employment-weighted manufacturing benchmark.
- End the structural window in 2018 instead of 2019.
- Replace value added per hour with value added per worker and defend the denominator.
- Replace the annual peer median with the median of country-specific 2000–2019 average growth rates and explain why the estimand changes.
- Add Poland to the first three sources while documenting why it cannot enter the selected EU KLEMS extension.
- Design a separately sourced 2022–2026 extension without splicing it into the historical series.
Your extension is complete when the revised metric tree still names its decision, outcome, unit, comparison, estimand, sources, denominators, caveat, and executive implication.