Regional · Internet gap

District internet gap and convergence

Quarterly from 2019 Q1, measurement to 16 July 2026 · Vintage 2026-07-16

For 19,128 districts in 210 countries, and every quarter since 2019 (476,543 district-quarters): working-hours and all-hours latency, jitter, the evening congestion spread, anomaly share and events; the gap to the best-served district and to the national median; ranks; and an eight-quarter convergence class.

What’s in it

FileGrainRowsSizeKeysPlan
gap_adm0_latest.parquetadm0 (latest full quarter)21021 KBarea_idAny plan
gap_adm2_latest.parquetadm2 (latest full quarter per country)19,1283.0 MBarea_idAny plan
gap_adm2_quarterly.parquetadm2 × quarter476,54353.0 MBarea_id, quarterPro

Definitions

The gap is the difference, in working-hours median latency, between a district and the best-served district in its country with sufficient measurement — the frontier, recomputed every quarter. Ranks run within country and within each region; a district is ranked only when at least half of the quarter’s hours were observed and the mean number of responding addresses clears the reliability gate.

Each district’s gap over the last eight quarters is fitted with a trend whose standard error allows for serial correlation. A falling gap with a clear slope is converging; a rising one is diverging; the rest are stagnant. A frontier that improves faster than the typical district shows up as widespread divergence even while every district improves.

Two covariates separate a reach gap from a congestion gap: the settlement class of the district (city, town, rural, from GHS population grids) and the evening spread, the evening-peak median minus the night-trough median.

Caveats

226,493 of the 476,543 district-quarters, and 8,367 of the 19,128 districts in the latest layer, are low-confidence: their gaps and ranks are NULL while their levels stand.

The frontier can change district between quarters, so a country can read as diverging while its own latency fell; the convergence class is about the gap, not the level.

This is not a last-mile speed ranking (the benchmark story explains why speed tests and this measurement rank districts differently), the package ships identifiers and attributes but no geometry, and the covariate columns are NULL where a district’s hexes could not be assigned.

Downloads

Downloads need an account. Sign in, or continue with Google for a Free account on the spot; the two large files need Pro.

Schema

gap_adm2_quarterly.parquet · 41 columns
ColumnTypeUnitDescription
area_idcharacterKASPR district id (adm2) or ISO3 (adm0)
levelcharacter
isocharacter
adm1character
name_1character
name_2character
quartercharactercalendar quarter, local time
ymintegerfirst month of the quarter, yyyymm
periodDatefirst day of the quarter (DATE)
n_monthsinteger
obs_hoursnumerichours
n_endpointsnumericmean responding IP addresses per hour (support)
lat_med_all_msnumericms
lat_p90_all_msnumericms
lat_med_working_msnumericmsobservation-weighted median latency, Mon–Fri 09–17 local
lat_p90_working_msnumericms90th percentile, working hours
jitter_msnumericms
jitter_evening_msnumericms
intraday_spread_msnumericmsevening-peak median minus night-trough median (congestion)
anomaly_sharenumericshare (0-1)share of scored hours flagged anomalous (METHODS.md section 5)
eventsintegerruns of >= 2 anomalous hours
mttr_hoursnumerichoursmean event length
frontier_working_msnumericmslowest working-hours median in the country (confidence ok)
national_median_working_msnumericms
gap_frontier_msnumericmsdistrict minus frontier (ms); NULL when coverage_confidence = low
gap_national_msnumericmsdistrict minus national median
gap_frontier_all_msnumericms
gap_rank_countryinteger1 = best in country
gap_rank_adm1integer1 = best in its ADM1
n_districts_countryinteger
gap_trend_4q_ms_per_yearnumericms
gap_trend_8q_ms_per_yearnumericms
gap_trend_12q_ms_per_yearnumericms
gap_trend_8q_tnumeric
convergence_classcharacter8-quarter Newey–West trend of the gap: converging / diverging / stagnant / insufficient
convergence_class_12qcharacter
coverage_confidencecharacterok: >= half the quarter's hours observed and mean endpoints >= 100; else low
pop_2020numericGHS population 2020 (Space2Stats hexes)
degurba_classcharactercity / town_suburb / rural (GHS-SMOD shares)
ntl_sum_2024numericannual VIIRS radiance sum 2024
data_vintagecharacterKASPR panel vintage
gap_adm2_latest.parquet · 41 columns
ColumnTypeUnitDescription
isocharacter
area_idcharacterKASPR district id (adm2) or ISO3 (adm0)
levelcharacter
adm1character
name_1character
name_2character
quartercharactercalendar quarter, local time
ymintegerfirst month of the quarter, yyyymm
periodDatefirst day of the quarter (DATE)
n_monthsinteger
obs_hoursnumerichours
n_endpointsnumericmean responding IP addresses per hour (support)
lat_med_all_msnumericms
lat_p90_all_msnumericms
lat_med_working_msnumericmsobservation-weighted median latency, Mon–Fri 09–17 local
lat_p90_working_msnumericms90th percentile, working hours
jitter_msnumericms
jitter_evening_msnumericms
intraday_spread_msnumericmsevening-peak median minus night-trough median (congestion)
anomaly_sharenumericshare (0-1)share of scored hours flagged anomalous (METHODS.md section 5)
eventsintegerruns of >= 2 anomalous hours
mttr_hoursnumerichoursmean event length
frontier_working_msnumericmslowest working-hours median in the country (confidence ok)
national_median_working_msnumericms
gap_frontier_msnumericmsdistrict minus frontier (ms); NULL when coverage_confidence = low
gap_national_msnumericmsdistrict minus national median
gap_frontier_all_msnumericms
gap_rank_countryinteger1 = best in country
gap_rank_adm1integer1 = best in its ADM1
n_districts_countryinteger
gap_trend_4q_ms_per_yearnumericms
gap_trend_8q_ms_per_yearnumericms
gap_trend_12q_ms_per_yearnumericms
gap_trend_8q_tnumeric
convergence_classcharacter8-quarter Newey–West trend of the gap: converging / diverging / stagnant / insufficient
convergence_class_12qcharacter
coverage_confidencecharacterok: >= half the quarter's hours observed and mean endpoints >= 100; else low
pop_2020numericGHS population 2020 (Space2Stats hexes)
degurba_classcharactercity / town_suburb / rural (GHS-SMOD shares)
ntl_sum_2024numericannual VIIRS radiance sum 2024
data_vintagecharacterKASPR panel vintage
gap_adm0_latest.parquet · 17 columns
ColumnTypeUnitDescription
isocharacter
area_idcharacterKASPR district id (adm2) or ISO3 (adm0)
levelcharacter
quartercharactercalendar quarter, local time
n_districtsinteger
n_districts_totalinteger
frontier_working_msnumericmslowest working-hours median in the country (confidence ok)
frontier_namecharacter
median_gap_msnumericms
p90_gap_msnumericms
worst_namecharacter
worst_gap_msnumericms
n_converginginteger
n_diverginginteger
n_stagnantinteger
median_spread_msnumericms
data_vintagecharacterKASPR panel vintage

Source and licence

KASPR measurement, vintage 2026-07-16; covariates from World Bank Space2Stats (GHS-POP, GHS-SMOD, VIIRS), CC BY 4.0.

Open Growth