Method
Every number on Atlas Kedah has a source and a year. Every modelled number is labelled ‘Estimate’ and explained here. If we can't back a claim with data, we don't make it.
Three kinds of number
- Official Published directly by DOSM or a government agency. We only round.
- Derived — simple arithmetic on official numbers (shares, GDP per person, rankings).
- Estimate Our model. Always labelled, with a range where possible.
Jobs Mirror: estimated jobs by sector
DOSM publishes the number of employed residents in each district, and employment by industry for Kedah as a whole — but not employment by industry for each district. We estimate that missing table:
- Starting point: each district's GDP structure (average of 2019–2020) across the five sectors.
- Iterative proportional fitting (IPF / RAS) rescales the table until (a) each row equals that district's employed residents in 2024, and (b) each column equals Kedah's workers in that sector in 2024.
- Range: we repeat this 2,000 times, letting output per worker differ between districts (log-normal, 25% spread) and district employment totals vary ±5% (sampling error). The range shown is the 10th to 90th percentile.
Known limits
- The model assumes workers in the same sector produce similar output in every district. Where farming is low-value (e.g. smallholder rubber) farm jobs are probably underestimated; where factories are high-tech, manufacturing jobs may be overestimated.
- GDP is measured where output is produced; jobs are measured where people live. Commuters (e.g. to Kulim or Penang) are counted in their home district.
- These estimates will be replaced by Census 2020 tables once obtained from DOSM.
Specialisation (location quotient)
LQ = the sector's share of district GDP ÷ its share of Kedah's GDP. An LQ of 2.0 means the sector matters twice as much here as in Kedah on average. We also compute LQ against Malaysia (all 160 districts) in the data files.
Why districts grew (shift-share)
Each district's GDP growth 2015–2019 is split into three parts: (1) Kedah-wide growth — what it would have grown at Kedah's rate; (2) industry mix — the effect of holding sectors that grew faster or slower across Kedah; (3) local performance — the remainder: whether the district's sectors beat the same sectors statewide. We stop at 2019 because 2020 was distorted by COVID-19.
Recent GDP estimates
The latest published district GDP is for 2020. For 2025, we assume each district keeps its share of each Kedah sector while each sector grows as published for Kedah. The districts sum to Kedah's published GDP. This cannot capture local changes after 2020 (e.g. new factories).
Net migration
Implied net migration = population change 2020–2024 − (births − deaths in 2020–2023). DOSM's population estimates embed their own migration assumptions, so treat this as a rough signal, not a count.
District GDP nowcasts and projections
DOSM publishes district GDP to 2020, but state GDP by sector every year. For 2021–2025, each district's sectors move with the same sector at state level, and district totals are matched to the official state figures. After 2025, each state sector is assumed to grow at its 2015–2025 average rate.
This model was chosen after testing on 161 districts across Malaysia: each model forecast one state without seeing that state's data (leave-one-state-out). A machine-learning model (gradient-boosted trees, with features such as momentum, sector mix, population density and night lights) was tested too. The P10–P90 range comes from the model's actual errors in this test; beyond three years it widens with the square root of the number of years, and state projections add uncertainty drawn from actual annual growth in 2016–2025 (Monte Carlo simulation).
The scenario simulator changes state sector growth rates; each district keeps its sector shares. Major projects add manufacturing output in their district, above trend, at Kedah's average output per factory worker. Scenario ranges reuse the baseline model's range widths.
AI district briefs
The brief on each district page is drafted by the Claude language model (Anthropic) from a fact sheet for that district, generated from this atlas's data. A brief may only state numbers that appear in its fact sheet. An automatic checker rejects any number that doesn't match the data, and the Malay text is checked against our style guide. Each brief is labelled an AI draft until a person has reviewed it.
District types
Each district gets one type from its GDP mix (2020, constant 2015 prices). The rules are applied in the order below; a district takes the first type it meets. Kedah's average GDP per person is RM21,600. Only four types are used because five category colours can't be told apart reliably when any two districts may touch.
- Industrial hub: Manufacturing makes up at least 30% of district GDP.
- Farming heartland: Agriculture makes up at least 35% of district GDP.
- Services centre: Services are over 70% of GDP, and GDP per person is above the Kedah average.
- Rural mixed economy: All other districts: local services and farming, with GDP per person below the Kedah average.
Night lights
Night-time light intensity from satellite imagery, as published on DOSM's Kawasanku dashboard (2024). The Kedah and Penang figures are district averages weighted by area. Night lights are a rough signal of urban density and economic activity, not a measure of GDP.
The catch-up calculator
GDP per person = state real GDP (constant 2015 prices) ÷ mid-year population estimate. Malaysia's GDP is the sum of all states including Supra. In the Shenzhen story's calculator, Kedah's GDP grows at the chosen rate, Kedah's population grows at its average rate over the past decade, and Malaysia's GDP per person grows at its own past-decade average. The catch-up year is the first year Kedah's GDP per person passes Malaysia's. This is a scenario, not a forecast: growth rates rarely hold for decades, and Shenzhen's and Bac Ninh's rates were reached from far lower starting points.
Cells DOSM suppresses
DOSM withholds some small sector values for confidentiality. We fill them as a residual: district GDP total, minus an estimate of import duties, minus the known sectors. Filled values:
| District | Year | Sector | RM m |
|---|---|---|---|
| Bandar Baharu | 2018 | Construction | 4.7 |
| Bandar Baharu | 2019 | Construction | 3.3 |
| Bandar Baharu | 2020 | Construction | 3.6 |
| Kota Setar | 2015 | Mining & quarrying | 29.1 |
| Kota Setar | 2016 | Mining & quarrying | 35.2 |
| Kota Setar | 2017 | Mining & quarrying | 32.7 |
| Kota Setar | 2018 | Mining & quarrying | 28.5 |
| Kota Setar | 2019 | Mining & quarrying | 15.2 |
| Kota Setar | 2020 | Mining & quarrying | 19.4 |
| Kulim | 2015 | Mining & quarrying | 92.8 |
| Kulim | 2016 | Mining & quarrying | 105.7 |
| Kulim | 2017 | Mining & quarrying | 95.9 |
| Kulim | 2018 | Mining & quarrying | 82.3 |
| Kulim | 2019 | Mining & quarrying | 61.8 |
| Kulim | 2020 | Mining & quarrying | 76.0 |
| Padang Terap | 2015 | Mining & quarrying | 4.9 |
| Padang Terap | 2016 | Construction | 4.7 |
| Padang Terap | 2018 | Construction | 4.2 |
| Padang Terap | 2019 | Construction | 2.5 |
| Padang Terap | 2020 | Construction | 3.1 |
| Pendang | 2016 | Construction | 2.6 |
| Pendang | 2017 | Construction | 3.1 |
| Pendang | 2018 | Construction | 3.6 |
| Pendang | 2019 | Construction | 3.0 |
| Pendang | 2020 | Construction | 3.1 |
| Sik | 2015 | Construction | 3.7 |
| Sik | 2016 | Construction | 2.0 |
| Sik | 2017 | Construction | 1.9 |
| Sik | 2018 | Construction | 1.3 |
| Sik | 2019 | Construction | 1.2 |
| Sik | 2020 | Construction | 1.6 |
Automatic highlights
The ‘Strength’ and ‘Challenge’ points on each profile come from fixed rules (e.g. poverty ≥ 1.3× the Kedah average; LQ ≥ 1.2 with a share ≥ 8%), not AI. The same rules apply to every district.
Corrections
Found a mistake? Tell us and we'll fix it and log it here. The code and data are open. Download the data