Sources. DPWH spend: PhilGEPS awards data 2013 to 2025, filtered to contracts where the implementing agency name contains "PUBLIC WORKS AND HIGHWAYS". Mirrored at csiiiv/philgeps-awards-dashboard (MIT license). Poverty: PSA OpenStat 1E/FY Table 1a (Annual Per Capita Poverty Threshold and Poverty Incidence Among Families with Measures of Precision); anchors at 2018, 2021, 2023. Per capita GDP: PSA OpenStat 2A/PPA/2025 Table 9 at constant 2018 prices, 2022 to 2024. Consumer Price Index: PSA OpenStat 2M/PI/CPI/2018NEW, all items, PHILIPPINES annual average; used to deflate DPWH spend to PHP 2018-real. Population: PSA 2020 Census of Population and Housing, with Highly Urbanized Cities summed back into their parent provinces so per-capita ratios reflect the whole geographic province.
Awards, not disbursement. Every spend figure here is PhilGEPS contract awards (the peso value of contracts awarded), not disbursement (cash actually paid out). The two are not the same: a contract can be awarded and then run for years, get re-scoped, or go partly unspent. Government reports its money in three stages, appropriation (budgeted), obligation (committed), then disbursement (paid), and disbursement routinely lags obligation by a wide margin within a year. Actual disbursement by province of delivery is not published anywhere machine-readable for 2014 to 2024: COA's annual reports (coa.gov.ph) are PDF-only and tag the disbursing agency office, not where the project was built; DPWH's project portal carries awards, not cash. So awards are the closest public proxy. The "five trillion in roads" headline is the total contract value attributed to provinces, money committed, not money proven spent.
Scale and trend. Province-attributed DPWH contract awards total across 2014 to 2024. The yearly figure rose from about a year in 2014 to 2016 to a peak of in ; the 2022 to 2024 average ran about the 2014 to 2016 average. As with every figure here, these are awards (money committed), not verified disbursement; the figures are computed live from the same per-province data the chart plots.
Compute. For each province and year, DPWH per capita is the sum of DPWH-tagged contract award values divided by 2020 Census population. Poverty for non-anchor years is linearly interpolated between the nearest PSA anchors; years before 2018 and after 2023 are held constant at the nearest anchor (rendered with a colored border so the held-constant treatment is visible). DPWH PHP 2018-real values are nominal divided by (annual CPI / 100). The per-story "What the data shows" line is a Spearman rank correlation computed across all provinces at the story's reference year; it describes association only, never causation.
Cumulative spend preset. The "Spend vs poverty change" preset sums each province's nominal DPWH awards per capita over 2014 to 2023 and plots the total against the change in poverty incidence from 2018 to 2023. The sum stays nominal: the CPI series is 2018-based, so deflating 2014 to 2017 would mean backcasting the index, and the chart never fabricates values it cannot compute. The window ends at 2023 to match the last PSA poverty anchor, so the spend total covers the decade leading into the measured poverty change. On the Y axis, negative means poverty fell; a downward-sloping cloud would mean provinces with more cumulative spend saw larger poverty drops. As everywhere else here, spend is contract awards, not disbursement, and the correlation is association, not causation.
Regional inflation story. The "Inflation vs poverty" preset runs at a coarser grain than the rest of the site: PSA publishes the Consumer Price Index by region, not by province, so that story uses the 18 official regions instead of the 82 provincial units. Inflation per region is the year-on-year change in the all-items annual-average CPI (2018=100) from PSA OpenStat 2M/PI/CPI/2018NEW; the series starts in 2019 because the 2018-based index needs a year prior, and the in-progress calendar year is excluded because its running average is not a full-year print. Poverty is PSA's own regional estimate read directly off the regional rows of Table 1a, with its published 95% CI and CV, never an average of the provincial rows (PSA's regional estimate uses the full survey design). The chart shows the two PSA survey years that have an inflation print, 2021 and 2023. Regions carry no population bubble size (the regional census total is not pulled), so every bubble draws at the same size, and the map view is off at this grain.
Significance.
Every preset's finding line carries a permutation p-value: the observed
Spearman rho is compared against 10,000 random shuffles of the Y values
(seeded, computed at build time in etl/build.py), and p is the
share of shuffles whose |rho| is at least as large as the observed one. Pick
a custom indicator pair and the page computes the same thing live with 1,000
shuffles at the displayed year. Read p as the probability of seeing a rank
correlation this strong if the two indicators were unrelated; it says nothing
about causation or the size of any effect. Because Spearman works on ranks,
it is unchanged by the log-axis toggle: log is monotone and preserves ranks.
Uncertainty. Poverty and subsistence incidence are survey estimates, not censuses, so PSA publishes a 95% confidence interval and a coefficient of variation (CV) for each province-year. The chart carries those: hover any poverty or subsistence bubble to see its CI, select a province to draw its CI as a whisker, and provinces whose CV exceeds 30% (PSA's threshold for an imprecise estimate, typically the low-poverty provinces where a small sample yields a wide margin) are drawn dimmed with a dashed amber ring. Only the survey years (2018, 2021, 2023) carry a CI; interpolated and held-constant years are model estimates and deliberately show none.
COVID years. PSA's poverty anchors are 2018, 2021, and 2023, so the 2019 and 2020 values are linear interpolations across a period that was anything but linear. The pandemic's poverty spike and recovery are invisible to a straight line drawn between 2018 and 2021, and the tooltips for those two years say so.
Honesty notes. About 20 percent of DPWH award value cannot be attributed to a single province (null area_of_delivery, multi-province contracts, "Independent City" bucket) and is excluded. Seven province-years with per-capita under PHP 100 are dropped as likely coverage gaps. Maguindanao is shown as the pre-2022-split unit because PSA's poverty table still reports the rolled-up Maguindanao; Maguindanao del Norte / del Sur 2023 rows are intentionally not used. NCR is the regional aggregate (16 cities) treated as a single bubble.
Attribution coverage.
The build records each province's share of the attributed DPWH total in
manifest.json (derived.dpwh_attribution_share_by_psgc).
The roughly 20 percent of award value that cannot be attributed is not spread
evenly: BARMM provinces sit near zero on that table because their
area_of_delivery strings rarely resolve to a single PSGC code. Per-province
spend figures there are a conservative lower bound, so cross-province spend
comparisons understate BARMM.
Input provenance.
manifest.json carries an inputs block recording what
each build consumed: a sha256 for each of the 15 PhilGEPS parquet chunks (the
mirror's raw URLs are mutable, so the local hash is the pin), the sha256 of
the cached PSGC reference, and, for the live PSA OpenStat API where pinning
is impossible, the fetch date and per-table row counts. A rebuild against a
silently changed upstream shows up as a hash or row-count diff.
Fixed denominator. Every per-capita figure across 2014 to 2024 divides by the same 2020 Census population, because that is the only complete province-level census in the window. Provinces grew over the decade, so early-year per-capita spend is modestly overstated and late-year modestly understated relative to a true same-year population. The effect is small next to the year-to-year swings in contract awards, but it is real and worth knowing.
Single-snapshot indicators. Population is the 2020 Census, and "poverty change 2018 to 2023" is one number per province. Both are repeated across the panel only so they can pair with year-varying indicators in the picker; they do not actually vary by year, so the animation holds them still and the chart labels them "does not vary by year." Hitting play never implies motion these series do not have.
Limits. Poverty rates are PSA's "province-without-HUC" measure published in Table 1a. Per-capita DPWH spend uses whole-province population including HUCs. Per capita GDP uses PSA's "province-only" measure (HUCs are published separately and are NOT rolled in here), and PSA publishes provincial GDP only from 2022, so that panel is three years. Bubble size is the 2020 Census and does not animate. Every province carries all three published PSA anchors (2018, 2021, 2023); for example Sulu fell from 75.3% in 2018 to 41.5% in 2021 to 13.0% in 2023. Years before 2018 and after 2023 are held constant at the nearest anchor and drawn with a colored border so the held-constant treatment is visible.