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
| File | Grain | Rows | Size | Keys | Plan |
|---|---|---|---|---|---|
| gap_adm0_latest.parquet | adm0 (latest full quarter) | 210 | 21 KB | area_id | Any plan |
| gap_adm2_latest.parquet | adm2 (latest full quarter per country) | 19,128 | 3.0 MB | area_id | Any plan |
| gap_adm2_quarterly.parquet | adm2 × quarter | 476,543 | 53.0 MB | area_id, quarter | Pro |
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.
- gap_adm0_latest.parquet · 21 KBSign in to download
- gap_adm2_latest.parquet · 3.0 MBSign in to download
- gap_adm2_quarterly.parquet · 53.0 MBSign in to download
- Data dictionary (CSV)Sign in to download
Schema
gap_adm2_quarterly.parquet · 41 columns
| Column | Type | Unit | Description |
|---|---|---|---|
| area_id | character | KASPR district id (adm2) or ISO3 (adm0) | |
| level | character | ||
| iso | character | ||
| adm1 | character | ||
| name_1 | character | ||
| name_2 | character | ||
| quarter | character | calendar quarter, local time | |
| ym | integer | first month of the quarter, yyyymm | |
| period | Date | first day of the quarter (DATE) | |
| n_months | integer | ||
| obs_hours | numeric | hours | |
| n_endpoints | numeric | mean responding IP addresses per hour (support) | |
| lat_med_all_ms | numeric | ms | |
| lat_p90_all_ms | numeric | ms | |
| lat_med_working_ms | numeric | ms | observation-weighted median latency, Mon–Fri 09–17 local |
| lat_p90_working_ms | numeric | ms | 90th percentile, working hours |
| jitter_ms | numeric | ms | |
| jitter_evening_ms | numeric | ms | |
| intraday_spread_ms | numeric | ms | evening-peak median minus night-trough median (congestion) |
| anomaly_share | numeric | share (0-1) | share of scored hours flagged anomalous (METHODS.md section 5) |
| events | integer | runs of >= 2 anomalous hours | |
| mttr_hours | numeric | hours | mean event length |
| frontier_working_ms | numeric | ms | lowest working-hours median in the country (confidence ok) |
| national_median_working_ms | numeric | ms | |
| gap_frontier_ms | numeric | ms | district minus frontier (ms); NULL when coverage_confidence = low |
| gap_national_ms | numeric | ms | district minus national median |
| gap_frontier_all_ms | numeric | ms | |
| gap_rank_country | integer | 1 = best in country | |
| gap_rank_adm1 | integer | 1 = best in its ADM1 | |
| n_districts_country | integer | ||
| gap_trend_4q_ms_per_year | numeric | ms | |
| gap_trend_8q_ms_per_year | numeric | ms | |
| gap_trend_12q_ms_per_year | numeric | ms | |
| gap_trend_8q_t | numeric | ||
| convergence_class | character | 8-quarter Newey–West trend of the gap: converging / diverging / stagnant / insufficient | |
| convergence_class_12q | character | ||
| coverage_confidence | character | ok: >= half the quarter's hours observed and mean endpoints >= 100; else low | |
| pop_2020 | numeric | GHS population 2020 (Space2Stats hexes) | |
| degurba_class | character | city / town_suburb / rural (GHS-SMOD shares) | |
| ntl_sum_2024 | numeric | annual VIIRS radiance sum 2024 | |
| data_vintage | character | KASPR panel vintage |
gap_adm2_latest.parquet · 41 columns
| Column | Type | Unit | Description |
|---|---|---|---|
| iso | character | ||
| area_id | character | KASPR district id (adm2) or ISO3 (adm0) | |
| level | character | ||
| adm1 | character | ||
| name_1 | character | ||
| name_2 | character | ||
| quarter | character | calendar quarter, local time | |
| ym | integer | first month of the quarter, yyyymm | |
| period | Date | first day of the quarter (DATE) | |
| n_months | integer | ||
| obs_hours | numeric | hours | |
| n_endpoints | numeric | mean responding IP addresses per hour (support) | |
| lat_med_all_ms | numeric | ms | |
| lat_p90_all_ms | numeric | ms | |
| lat_med_working_ms | numeric | ms | observation-weighted median latency, Mon–Fri 09–17 local |
| lat_p90_working_ms | numeric | ms | 90th percentile, working hours |
| jitter_ms | numeric | ms | |
| jitter_evening_ms | numeric | ms | |
| intraday_spread_ms | numeric | ms | evening-peak median minus night-trough median (congestion) |
| anomaly_share | numeric | share (0-1) | share of scored hours flagged anomalous (METHODS.md section 5) |
| events | integer | runs of >= 2 anomalous hours | |
| mttr_hours | numeric | hours | mean event length |
| frontier_working_ms | numeric | ms | lowest working-hours median in the country (confidence ok) |
| national_median_working_ms | numeric | ms | |
| gap_frontier_ms | numeric | ms | district minus frontier (ms); NULL when coverage_confidence = low |
| gap_national_ms | numeric | ms | district minus national median |
| gap_frontier_all_ms | numeric | ms | |
| gap_rank_country | integer | 1 = best in country | |
| gap_rank_adm1 | integer | 1 = best in its ADM1 | |
| n_districts_country | integer | ||
| gap_trend_4q_ms_per_year | numeric | ms | |
| gap_trend_8q_ms_per_year | numeric | ms | |
| gap_trend_12q_ms_per_year | numeric | ms | |
| gap_trend_8q_t | numeric | ||
| convergence_class | character | 8-quarter Newey–West trend of the gap: converging / diverging / stagnant / insufficient | |
| convergence_class_12q | character | ||
| coverage_confidence | character | ok: >= half the quarter's hours observed and mean endpoints >= 100; else low | |
| pop_2020 | numeric | GHS population 2020 (Space2Stats hexes) | |
| degurba_class | character | city / town_suburb / rural (GHS-SMOD shares) | |
| ntl_sum_2024 | numeric | annual VIIRS radiance sum 2024 | |
| data_vintage | character | KASPR panel vintage |
gap_adm0_latest.parquet · 17 columns
| Column | Type | Unit | Description |
|---|---|---|---|
| iso | character | ||
| area_id | character | KASPR district id (adm2) or ISO3 (adm0) | |
| level | character | ||
| quarter | character | calendar quarter, local time | |
| n_districts | integer | ||
| n_districts_total | integer | ||
| frontier_working_ms | numeric | ms | lowest working-hours median in the country (confidence ok) |
| frontier_name | character | ||
| median_gap_ms | numeric | ms | |
| p90_gap_ms | numeric | ms | |
| worst_name | character | ||
| worst_gap_ms | numeric | ms | |
| n_converging | integer | ||
| n_diverging | integer | ||
| n_stagnant | integer | ||
| median_spread_ms | numeric | ms | |
| data_vintage | character | KASPR 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.
