# INF-15 «Полотно»: методология простыми словами

Пакет `grid` v1.0.0 (2026-07-26). Этот документ объясняет метод для
читателя без технической подготовки — так, как того требует раздел 9 ТЗ
(«методический блок... на двух языках»). Пререгистрация (заморожена
2026-07-26, две датированные поправки): `PREREGISTRATION.md`. Все
допущения с параметрами — `params/assumptions.yaml`. Живая версия:
<https://by-population-maps.vercel.app/research/grid>.

---

## 1. Что такое сетка 1 км и откуда берутся клетки

Все прошлые карты проекта делили Беларусь на 118 районов — каждый закрашен
одним цветом. Внутри одного района может быть живой райцентр и полтора
десятка почти вымерших деревень, а на карте это один усреднённый оттенок.

Эта карта устроена иначе: страна разбита на квадраты со стороной ровно
**1 километр** — их **857 по ширине и 514 по высоте** (немногим более
440 тысяч квадратов вместе с теми, что попадают на соседние страны в
рамке-обрезке и зануляются). В каждом квадрате хранится число жителей.
Никаких административных границ внутри карты нет — они есть только как
необязательный тумблер поверх неё.

Источник клеток — открытый набор данных Европейской комиссии **GHS-POP
R2023A** («население мира по клеткам»): 4 глобальных тайла на каждую из
10 «эпох» (1975, 1980, …, 2020, шаг 5 лет) обрезаются по границе Беларуси
в равноплощадной проекции Молльвейде (см. раздел 2 — почему именно эта
проекция) и собираются в единую сетку, одинаковую для всех 10 лет — это
важно, иначе клетки разных лет были бы не сопоставимы.

## 2. Почему именно эта проекция карты

Пример технического задания предлагал считать в проекции Web Mercator
(EPSG:3857) — она используется в большинстве веб-карт, но **не сохраняет
реальную площадь**: масштаб растёт от экватора к полюсам. На широте
Беларуси (51–56° с.ш.) клетка «1000×1000 м» в координатах Web Mercator
покрыла бы на местности РЕАЛЬНУЮ площадь примерно в 2,5–3,2 раза меньше
одного квадратного километра — причём юг и север страны получили бы
РАЗНУЮ фактическую площадь клетки. Это нарушило бы прямое обещание раздела
1 ТЗ («страна, разбитая на квадратные клетки по одному километру»).
Поэтому все расчёты сделаны в равноплощадной проекции Молльвейде
(**ESRI:54009**) — той же, в которой изначально поставляется GHS-POP: клетка
действительно равна 1 км² на местности, без искажения по широте и без
лишнего шага пересчёта. Решение и его обоснование зафиксированы в
`docs/decisions/INF-15.md`, запись **D-001**. Для отображения на
веб-карте клетки экспортируются как картинки с координатами четырёх углов
в привычных градусах (EPSG:4326) — библиотека карты сама «натягивает» их
на карту, повторного пересчёта на сервере не требуется.

## 3. Почему и как применена calibровка клеток к официальной статистике

**Простыми словами.** GHS-POP показывает ФОРМУ распределения населения —
где внутри района люди расположены гуще, а где реже — на основе снимков
застройки. Официальная статистика Белстата даёт ИТОГОВОЕ число жителей
района. Мы **совместили оба**: взяли форму из GHS-POP, а итог — из
официальной статистики.

**Почему пришлось так сделать.** При первой проверке (сверка суммы клеток
района с официальным числом, порог ±3 %) выяснилось, что сырой продукт
расходится с официальными данными почти для всех районов: **119 из 119**
территорий (118 районов + Минск) хотя бы раз за 10 лет вышли за допуск; по
отдельным годам — от 40 до 111 районов из 118–119. Национальная сумма тоже
была вне допуска ±1 % на каждом из 10 лет (реально +1,7 %…+3,4 %). Это не
ошибка нашего расчёта — площадь маски страны и правильность обрезки
проверены отдельно и совпадают с официальной площадью (~207 600 км²) с
точностью до 1 %. Причина — в самом продукте: города областного подчинения
(Брест, Витебск, Могилёв, Гродно, Гомель и другие) в нём систематически
переоценены (на 12–46 %), а пригороды Минской агломерации — недооценены
(на 12–29 %); один из вероятных источников этого — сама референсная
численность переписи 2009 года, использованная разработчиком продукта
(JRC) для калибровки: **10 018 692** человек против настоящих
**9 503 807** (расхождение +5,4 %) — это задокументировано в файле
метаданных, который поставляется вместе с самим продуктом.

**Что мы сделали.** Клетки каждого района домножаются на коэффициент
`официальное_число_района(год) / сумма_клеток_района(год)` — так, чтобы
после этого сумма клеток района ТОЧНО совпадала с официальной цифрой.
GHS-POP при этом остаётся источником только внутрирайонного «узора»
расселения, а не источником итогового числа. Полное расследование, все
проверенные и отклонённые альтернативные объяснения и голосование трёх
независимых ролей (одобрено 3:0 с условиями) — `docs/decisions/INF-15.md`
D-005 и `docs/notes/grid_validation.md`.

**Честная оговорка.** Калибровка чинит только СУММУ по району. То, где
именно внутри района сконцентрирован прирост (например, городское ядро
против сельской периферии одного и того же района), по-прежнему
определяется исключительно рисунком GHS-POP и калибровкой не проверяется —
это ограничение остаётся и раскрыто в `LIMITATIONS.md`.

## 4. Формулы главных показателей

Обозначения: `d` — порог депопуляции (чел/км²); `Pᵢ` — население клетки
`i`; `n` — число клеток страны (1 клетка = 1 км²).

- **Доля опустевшей территории**, `area_share_below(d)` — какая доля
  площади страны имеет плотность ниже порога `d`:
  `area_share_below(d) = (число клеток с плотностью < d) / (всего клеток страны)`.
  Считается для трёх порогов: основной **5** чел/км², вспомогательный
  строгий **1** чел/км², вспомогательный мягкий **25** чел/км².
- **Обычная (арифметическая) плотность страны**: `сумма Pᵢ / n`. Обманчивое
  число — делит всех людей на всю площадь, включая леса и болота.
- **Плотность «глазами среднего жителя»** (population-weighted density):
  `Σ Pᵢ² / Σ Pᵢ` — не среднее по клеткам, а среднее, взвешенное самим
  населением: житель густонаселённой клетки «весит» в этом среднем больше.
  Смысл: обычная плотность может падать, а эта — расти, если люди
  собираются вместе быстрее, чем в среднем пустеет территория. Разделить
  эти два процесса — главная идея исследования.
- **Острова расселения** (settlement components) — клетки с плотностью
  ≥ 1 чел/км² объединяются в связные «острова» (по 8 соседям, включая
  диагональных — типично для сельской застройки на грубой решётке 1 км).
  Считается их число и доля населения в самом крупном острове.
- **Центр масс населения** (centroid track) — точка, в которой находился бы
  «центр тяжести» страны, если бы всех жителей положить на карту и найти
  точку равновесия (взвешенное по населению среднее координат всех
  заселённых клеток). Для лет до 1975 года (когда клеточной сетки ещё нет)
  точка считается по официальной численности района, приложенной к
  географическому центроиду района — не к его столице, а к центру самой
  территории.
- **Метры сети на жителя** (network_per_capita) — длина дорожной сети
  района (сумма по классам OSM) делённая на его текущее население:
  `road_km_total / (население / 1000)` — километров на 1000 жителей;
  отдельно — на квадратный километр площади района.

## 5. Два варианта прогноза, 2026–2050

Прогноз численности РАЙОНОВ у проекта уже есть (`forecast.json`, версия
v2026.4, три сценария base/optimistic/negative). Задача этого шага —
«разложить» эту будущую численность внутри каждого района по клеткам.
Делаем это в двух явно разных вариантах — не потому, что не знаем, какой
правильный, а потому, что оба они — предположения, и лучше показать оба,
чем выдать одно за факт:

- **Вариант A («инерция»).** Для каждой клетки считается, как менялась её
  доля в населении района за все 10 наблюдаемых лет (1975–2020), и этот
  тренд продолжается без изменений до прогнозного года.
- **Вариант Б («пригороды/периферия»).** Тот же тренд, но дополнительно
  скорректирован явным допущением: пригороды 7 крупнейших городских ядер
  страны (плотность ≥1500 чел/км² в 2020 году, найдены автоматически, не по
  списку названий) растут быстрее (буст доли клетки до **+35 %** к 2050
  году на расстоянии 8–20 км от ядра), а территории дальше 60 км от
  ближайшего ядра пустеют быстрее (штраф до **−25 %**). Коэффициенты
  0,35/0,25 и километры — явное модельное допущение, а не измеренная
  величина (`docs/decisions/INF-15.md` D-006).

После применения любого варианта клетки района масштабируются так, чтобы их
сумма ТОЧНО (до 0,1 %) совпадала с уже опубликованным прогнозом района —
иначе мы бы незаметно подменили прогноз проекта новым (это и есть проверка
G-2 ниже). Год 2050 не является «родным» узлом прогноза (шаг 5 лет от 2026
не попадает точно в 2050) — он получен линейной интерполяцией между узлами
2046 и 2051 и помечен как интерполяция, не как прогнозная точка «как есть».

**Наблюдение при проверке.** На национальном уровне варианты A и Б почти не
различаются (`area_share_below(5)` на 2050 год в базовом сценарии:
A = 0,8492, Б = 0,8478 — разница <0,15 п.п.), потому что итог по КАЖДОМУ
району одинаков для обоих вариантов по построению — различие целиком
внутри района. На карте это означает, что разница между A и Б будет
заметнее при клике по конкретной клетке или малому региону, чем в
общестрановой панели показателей.

## 6. Восемь проверок (G-1…G-8) с результатами

Все числа ниже воспроизводимы из вендоренных агрегатов пакета —
`sources/raw/metrics_observed.json`, `metrics_forecast.json`,
`g3_nightlights_crosscheck.json`, `network_metrics.json`. Полный протокол
с командами для самостоятельной проверки — `VALIDATION.md`.

**G-1. Сходится ли карта клеток с официальными числами.**
Требование: расхождение ≤3 % по району на каждую эпоху, ≤1 % по стране.
Сырой продукт эту проверку **не проходит** (раздел 3 выше) — после
применения calibровки (раздел 3) сумма клеток района/страны становится
**тождественно** равна официальному ряду, то есть проверка выполняется
«по построению», а не как независимый эмпирический тест. Список районов,
не прошедших сырую сверку, публикуется целиком — `sources/raw/
reconciliation.csv` (1190 строк = 119 территорий × 10 эпох), не растворён в
средней цифре.

**G-2. Сходится ли прогноз по клеткам с прогнозом по районам.**
Требование: сумма клеток района = прогноз района, ±0,1 %. Результат:
максимальное отклонение по факту — **0,0 %** на **4284** проверках
(район × год × сценарий × вариант). **Пройдена.**

**G-3. Согласны ли с независимым сенсором (ночная светимость).**
Требование: направление изменения (население вверх/вниз) совпадает со
знаком изменения светимости минимум для 70 % районов (2012→2020).
Результат: **32,8 %** согласия (39 из 119 районов) — **НЕ пройдена**.
Доминирующий паттерн — «население по официальным данным упало, а
светимость выросла» у **63,9 %** районов (76 из 119). Согласно
предписанному разделом 7 ТЗ фallback'у: расхождение двух сенсоров стало
отдельным, видным сюжетом исследования, а утверждения C-1 и C-2 подаются
как **открытый вопрос**, не как подтверждение (`docs/decisions/INF-15.md`
D-007).

**G-4. Не объясняется ли всё Полесьем и Чернобылем.**
Требование: рост доли опустевшей территории (порог 5 чел/км²) сохраняется
после исключения полесских (27) и чернобыльских (12) районов (36 районов
после объединения списков — 3 района входят в оба). Результат: рост
сохраняется — с **0,6828** (1975) до **0,7120** (2020), **+0,0292**,
монотонно на всех промежуточных точках. **Пройдена.**

**G-5. Устойчив ли центр масс населения.**
Требование: трек точки сдвигается не более чем на 15 км при других
разумных допущениях (иное возмущение веса района для дореволюционных лет;
другой порог «заселённости» при взвешивании для лет с сеткой). Результат:
максимальный сдвиг — **2,03 км** (год 1970) при допуске 15 км.
**Пройдена.**

**G-6. Полна ли карта дорог.**
Требование: сумма длины сети OSM (снимок для INF-04) против официальной
статистики протяжённости дорог — расхождение ≤15 %. Результат: OSM-сумма
**76 958,8 км** против официальных **86 446,0 км** (РУП «Белдорцентр»,
01.01.2026) — отклонение **−10,97 %**. **Пройдена** — `network_per_capita`
публикуется с абсолютными километрами (не только относительным индексом).

**G-7. Ни одного числа без подтверждения.**
Требование: каждое число со страницы присутствует в контрольном списке
внутри архива. Результат: **20** контрольных метрик в
`checks/expected_results.json`, покрывают все восемь проверок и оба
утверждения-заявления (C-1/C-2/C-3). **Пройдена.**

**G-8. Скорость и вес.**
Требование: все кадры карты вместе ≤12 МБ, первая загрузка страницы
≤3,5 МБ, один кадр ≤220 КБ. Результат (`params/assumptions.yaml →
budgets`): фактический суммарный вес кадров — **2,82 МБ** (бюджет 12 МБ),
максимальный размер одного кадра — **220 КБ** (ровно на границе бюджета);
сам `grid.json` — около **202 КБ** (бюджет 1536 КБ). **В пределах бюджета**,
но по размеру кадра — впритык, без запаса.

## 7. Что из этого следует для C-1/C-2/C-3

Итог трёх утверждений пререгистрации, сведённый воедино:

| Утверждение | Что видно в данных | Независимая проверка | Статус в `claims.yaml` |
|---|---|---|---|
| C-1 (концентрация растёт быстрее, чем пустеет территория) | pw_density 3105,6 → 5657,3 чел/км² (1975→2020), при падении arithmetic_density 48,9 → 44,9 (1990→2020) | G-3 не пройдена (32,8 % < 70 %) | **open_question** |
| C-2 (доля опустевшей территории растёт монотонно, не только из-за Полесья/Чернобыля) | area_share_below(5): 0,7155 → 0,7422 (1975→2020), рост продолжается до 0,843–0,859 к 2050 во всех сценариях/вариантах; G-4 пройдена | G-3 не пройдена | **open_question** |
| C-3 (сети на жителя больше там, где депопуляция сильнее) | Spearman ρ = −0,7508 (p ≈ 1,25×10⁻²², 118 районов) | G-6 пройдена (Δ = −10,97 %, допуск ±15 %) | **verified** |

## 8. Блок метода (восемь обязательных полей)

1. **Исследовательский вопрос.** Как устроено расселение Беларуси без
   административных границ (сетка 1 км) и как рисунок менялся 1975→2020 и
   куда идёт до 2050 года?
2. **Единица анализа.** Клетка 1 км² (857×514 сетки, ESRI:54009) — базовая
   пространственная единица; территория (118 районов + Минск, 119 единиц) —
   единица агрегации и калибровки; эпоха (10 наблюдаемых 1975–2020, 6
   прогнозных 2026–2050) — единица времени.
3. **Источники.** GHS-POP R2023A (1 км, Молльвейде, CC BY 4.0, JRC);
   официальные ряды и прогноз населения районов (BY Maps, использование с
   указанием источника); снимок OpenStreetMap 2026 года (ODbL); вырезки
   ночной светимости INF-08 v2 (только для проверки G-3); чернобыльские
   зоны INF-07 (только для проверки G-4).
4. **Преобразования.** Мозаика и клип тайлов GHS-POP по единой сетке;
   constrained dasymetric калибровка (клетки района приведены к
   официальному ряду); лог-линейная экстраполяция доли клетки в населении
   района для прогноза (варианты A/Б); нормировка прогноза к району (G-2);
   point-in-polygon привязка рёбер дорожной сети к району.
5. **Показатели.** `area_share_below(d)` для d=5/1/25; `arithmetic_density`
   и `population_weighted_density`; `settlement_components`;
   `centroid_track`; `network_per_capita` (км/1000 жителей, км/км²).
6. **Допущения.** Калибровка сумм по району [ФАКТ, не допущение — сырой
   продукт не проходит G-1]; внутрирайонный рисунок = допущение GHS-POP
   [MODEL]; прогноз — два явно разных стилизованных варианта, не диапазон
   точности [MODEL]; дорожная сеть — снимок 2026 года, не история.
7. **Проверки.** Восемь проверок G-1…G-8 (раздел 6 выше); шесть из восьми
   пройдены (G-1 — «по построению» после калибровки, G-2, G-4, G-5, G-6,
   G-7, G-8), одна не пройдена (G-3, с предписанным честным fallback'ом).
8. **Ограничения.** Полный разбор — `LIMITATIONS.md`: карта не является
   независимым источником численности населения; малозаселённые/
   эвакуированные зоны искажены дазиметрией сильнее прочих; прогноз
   опирается на сильное допущение продолжения внутреннего рисунка района;
   по дорогам — снимок, не история; между пятилетними точками —
   интерполяция.
