Skip to content

Research · open data

Financial inclusion and regional growth in Colombia

An open warehouse of public sources, an index by dimension, two annual panels, an atlas of all 1,123 municipalities and an econometric battery that answers the question with its N, its clusters and its tests.

M.Sc. in Economics thesis · Pontificia Universidad Javeriana

Warehouse, index, atlas and estimates published · the temporal-disaggregation annex and the manuscript follow

Abstract

Does financial inclusion predict the economic growth of Colombia's departments once you take out the national trends that move all of them at once? To answer it, the project downloads nineteen public sources with a verifiable manifest, resolves every series to the municipal code, models them as a star schema with vintages on dbt and DuckDB, and builds a financial-inclusion index by dimension with frozen, published weights. On top go two annual panels, department and municipality, an interactive atlas, and an econometric battery of two-way fixed effects, cross-sectional and spatial dependence diagnostics, four designs that do not rely on the index being exogenous, and inference built for 33 clusters. The answer is published with its specification, its N and its tests, whatever the sign.

Atlas

The index on the map, by department and by municipality

Three views of the same data. Flat, with the metrics around it; raised, to lift one department out and look at it; and municipalities, to go down to all 1,123 units. Pinning a department lets you descend to its municipalities from the map itself, and choosing a region closes the frame in on that selection while the neighbours bleed off the edge.

View

Loading the map and its series…

  • A territory without colour is not a zero: it is a territory no supervised institution reported that year.
  • Block height is constant and encodes nothing. A height that depended on the value would let the units in front hide the ones behind, and a unit's reading must not depend on where it falls on the map.
  • The San Andrés archipelago is a chip drawn off scale: it lies 700 km offshore and covers 26 km², so inside the frame it shrank the map by a fifth to paint a dot.
  • Two of the panel's 1,123 municipalities have no polygon in the 2024 national map: they appear in the ranking and the figures, but not on the map.

Data

Nineteen public sources, each download fingerprinted

Acquisition with a manifest

A purpose-built downloader pages the open-data APIs, verifies the row count against the source, types every column from the portal's metadata and writes Parquet partitioned by year. Each pull records the source date, rows, bytes and sha256 in a versioned manifest.

Geographic keys resolved

The financial supervisor's tables never declare the municipal code, yet they carry it implicitly in the row column. Resolving it gives 100% coverage across the 34 quarterly cuts and avoids name matching, which breaks on accents and aliases.

Dimensional warehouse with dbt

A star schema with vintage-aware facts on DuckDB: department, municipality and period dimensions, plus the supervisor's 98 variables each with its annualisation rule; inclusion in long form by product block.

The schema splice, measured

The current table replaces the previous one in 2021Q1, and that quarter exists in both: a natural test of the splice. The median difference per department is 0.02% and the worst case reaches 1.8%; a dbt test fails if those thresholds break.

Annual frequency, two panels

Subnational GDP is annual, so no annual value is ever repeated across four quarters. The department panel covers 2018 to 2025 with 231 growth observations and none repeated; the municipal one covers 2018 to 2024 on the statistics office's municipal value added.

A zero is not a reading

Zeros from the supervisor and the education ministry are absences, not values: outside each row's product block they disappear by construction. On the map, a territory without colour is one nobody reported, and that is not the same as zero.

The index

The assumption gets measured before the method is chosen

Eight variables, three dimensions

Access, use and depth, each with its variables normalised per adult or per product and standardised over the calibration window. Eighteen candidates were left out, each with its reason written down.

PCA was ruled out by measuring it

Sampling adequacy comes to 0.314 for access and 0.404 for use, below the 0.5 a factor model needs. Forcing it produces negative implicit weights on microcredit — an index that says more credit is less inclusion.

Equal weights, frozen and published

Within each dimension the weights are equal, fixed over the 2018–2019 window and never touched again. Implicit weights per variable are always published, and none may be negative.

Sensitivity in plain sight

PCA and Sarma's distance index are computed the same way and published as alternatives, with the rank correlation between the three versions. None is hidden.

Zero is an average, not an absence

The index is standardised against the average department over the calibration window. A value of 2 is two standard deviations above that average, not "twice the inclusion".

Results

With entity and time effects, the coefficient is zero

Financial inclusion does not predict departmental growth once the national trend is taken out.

β = +0.0007 · p = 0.90

Thirty-three departments, 2019 to 2025, 228 observations. With entity and time fixed effects the composite index does not move real GDP per capita growth: the wild cluster bootstrap gives p = 0.89 and the permutation placebo p = 0.68. Without time effects the same coefficient is +0.024 with p < 0.001. That distance is exactly what the national trend was worth: the index rises in every department at once, and anything else that rises with the years looks like it.

SpecificationβSEpN
Entity and time effects (baseline)+0.00070.00600.90228
Baseline with Driscoll-Kraay errors+0.00070.00370.84228
Entity effects only+0.02420.0050< 0.001228
In changes of the index−0.00710.00510.16226
CCE, heterogeneous loadings by department+0.00140.00860.87228
SLX, spatial lag of the index+0.00460.00660.49221
Shift-share, 2018 exposure × national adoption+0.01820.00670.007223
0.89
wild cluster bootstrap p

999 Rademacher draws with the null imposed over 33 departments

0.68
permutation placebo p

499 shuffles of the index within each year; the real coefficient sits in the middle of the cloud

2.46
Pesaran CD on the residuals

weak but present cross-sectional dependence (p = 0.014); hence Driscoll-Kraay alongside the cluster

  • 1The three dimensions on their own, the specification in changes, CCE, SLX and the two alternative indices all give the same thing: zero.
  • 2The only design with a signal is the shift-share. It survives initial income as a placebo, but initial urbanisation produces an equally significant slope (+0.051, p = 0.013): it captures that the more urban departments, which are also the more included ones, grew faster over the period. It is a differential slope, not an effect of the index, and it is published as such.
  • 3The event study around 2020 cannot test pre-trends — the dependent variable starts in 2019 and the shock is 2020 — and it is published with that limitation written down.

Decisions

Every decision of substance is written before the code

The decisions that change a result — frequency, data model, index method, econometric design — go into a decision record with their alternatives, their cost and how to reverse them. Constants live in one place and no published figure exists without the test that holds it up.

Annual frequency, two panels

Subnational output is annual and no annual value is spread across four quarters. Temporal disaggregation stays an annex, with its caveats.

Star schema with vintages

Natural keys, one fact per download, and a schema splice measured in the quarter that exists in both sources.

Index by dimension with its assumption measured

Sampling adequacy before factoring; equal weights, frozen and published; alternatives in plain sight.

Econometric design

Two-way fixed effects, diagnostics measured rather than assumed, four designs against endogeneity, and a wild bootstrap because 33 clusters are not enough for the asymptotics.

Derived data under the source's licence

What comes out of the supervisor, the ICT ministry and the education ministry is published CC BY-SA 4.0, with attribution.

Reproduce

One command brings the whole project up

  1. uv sync

    Exact dependencies from the lock file. Nothing is installed outside it.

  2. uv run iif acquire all

    Downloads the nineteen sources, verifies the count against each API and writes the manifest with sha256.

  3. make check

    Ruff, 91 Python tests, 250 dbt models and tests on DuckDB, and the site render. It exits zero or there is no commit.

  4. uv run iif econ

    Runs the full econometric battery in under half a minute and writes the file every figure on this page comes from.

  5. uv run iif atlas

    Generates the geometry and series this map consumes, inside the 3 MB budget the contract sets.

The local and CI engine is DuckDB. BigQuery is kept as an alternative target with a per-query cost cap, and Snowflake as a later demonstration; nothing in the project depends on either staying alive.

What is there and what is coming

The project ships in phases

  1. 1Published: the nineteen sources with a manifest, the full dbt warehouse, the index by dimension with its weights, the two annual panels, the atlas and the econometric battery with its results.
  2. 2Next: the temporal-disaggregation annex (Chow-Lin, Denton and Fernández on the statistics office's quarterly indicator) and the manuscript.
  3. 3All the code, the derived data and the decisions are in the repository, versioned.