Анализ данных на уровне муниципалитетов осложняется преобразованиями структуры территориальных единиц: меняются не только границы, но и типы муниципалитетов, названия, код ОКТМО. Это нужно учитывать в ходе исследований и при использовании информации, например, при работе с Базой данных показателей муниципальных образований Росстата. Открытых машиночитаемых данных о таких преобразованиях нет.

Меня зовут Артём Кушлевич, я геоаналитик из команды СберИндекса. В этой статье расскажу, о каких нюансах муниципальных данных нужно знать аналитикам, как мы сделали пространственный слой муниципалитетов с историей версий и разработали справочник преобразований, который можно использовать для построения непрерывных временных рядов. Эта информация может помочь:

  • геоаналитикам, заинтересованным в данных о границах муниципальных образований;

  • исследователям, которые работают с муниципальными данными (в первую очередь с Базой данных показателей муниципальных образований Росстата - БДПМО);

  • при проектировании БДПМО 2.0.

Сбериндекс занимается разработкой экспериментальной методологии для показателей, рассчитываемых на муниципальном уровне с помощью анализа больших данных.

С одной стороны, нам нужно прогнозировать домашнюю и рабочую локации клиента (например, «домашний муниципалитет»), используя цифровые следы — транзакционные паттерны и данные геолокации. С другой стороны, нужно иметь возможность сопоставлять наши результаты с информацией из других источников, например, с муниципальными данными Росстата или Федеральной налоговой службы.

Для первой задачи нам были нужны точные границы муниципальных образований с 2018 года. Для второй — «прослеживаемость» муниципальных образований во времени с учётом их преобразований, чтобы можно было собрать максимально длинные, полные и непротиворечивые временные ряды показателей в БДПМО, или воспользоваться другими источниками муниципальных данных.

Простого способа решить эти две задачи нет, так как таких официальных данных нет в открытом доступе. Поэтому мы собрали базу с изменениями в структуре муниципального устройства регионов России. Для этого проанализировали все возможные проблемы и особенности, собрали и объединили данные из трёх различных источников и обработали границы полигонов муниципалитетов. О подробностях можно прочитать здесь, а сам версионный справочник муниципальных образований с пространственным слоем можно скачать с сайта СберИндекса.

Немного о терминах

Разберёмся со структурой муниципального устройства. Определения муниципалитетов даются в Федеральном законе от 06.10.2003 N 131-ФЗ «Об общих принципах организации местного самоуправления в Российской Федерации». Территориальная организация местного самоуправления имеет двухуровневую структуру. В нашем справочнике учтены только муниципалитеты первого уровня, а уровень поселений не рассматривали.

Типология муниципалитетов первого уровня:
  • муниципальный район — несколько поселений и межселенных территорий, объединённых общей территорией;

  • муниципальный округ — несколько объединенных общей территорией населённых пунктов, не являющихся муниципальными образованиями;

  • городской округ — несколько объединённых общей территорией населённых пунктов, не являющихся муниципальными образованиями, при этом не менее двух третей населения проживает в городских населённых пунктах;

  • городской округ с внутригородским делением — городской округ, в котором образованы внутригородские районы (внутригородские муниципальные образования);

  • внутригородская территория (внутригородское муниципальное образование) города федерального значения часть территории города федерального значения, в границах которой действует местное самоуправление.

Все эти муниципальные образования имеют равный статус друг перед другом, и мы можем сравнивать их между собой.

Границы муниципалитетов меняются, а отслеживать это крайне трудоемко

С 2018 по 2024 гг. около 3% муниципалитетов России изменили свои границы. Преобразования затронули 17 регионов, в основном Московскую область, Чеченскую Республику и Пермский край. Число не кажется существенным, но даже такой масштаб изменений сильно осложняет сбор панельных данных: нужно учесть каждое изменение границы при формировании набора данных, состоящих из показателей за несколько периодов времени для одних и тех же единиц наблюдения (муниципалитетов). Интересно, что есть страны, где структура на внутрирегиональном уровне практически не меняется десятилетиями. Например, на европейской территории Франции со второй половины XX века был реформирован только один департамент (из Urban Community of Lyon в Metropolis of Lyon).

Логика укрупнения муниципалитетов заключается в снижении издержек на содержание администраций местного самоуправления, в повышении эффективности управления и экономии на масштабе. Обратная сторона укрупнения — населению сложнее отстаивать свои локальные интересы и получать социальные услуги из‑за оптимизации систем.

Проблему отлично иллюстрируют изменения городского округа Серпухов:

Сначала к городскому округу Серпухов присоединили Серпуховский муниципальный район (вместе с его упразднением), спустя несколько лет присоединили два прилегающих городских округа: Протвино и Пущино. При этом, что важно, уникальный идентификатор муниципалитета (код ОКТМО) на протяжении всего периода существования городского округа Серпухова не изменился.

Такие трансформации требуют аккуратного формирования статистических рядов, в том числе проверки показателей на аддитивность в случае составления одного временного ряда на основе показателей различных периодов существования границ муниципалитета.

Чтобы собрать базу данных изменений границ, мы изучили несколько источников данных:

  • В государственных базах есть только актуальные границы муниципалитетов, к таким источникам относятся:

  • В международных базах открытых данных есть информация о структуре муниципалитетов РФ, но нет версионности. Данные существенно хуже по качеству: границы сильно упрощены, а само муниципальное устройство неактуально (GADM — Глобальная база данных границ административных областей).

  • Nextgis позволяет выгружать актуальные и исторические версии полигонов муниципалитетов из OpenStreetMap, но доступ к нему платный.

Поэтому мы остановились на OpenStreetMap (OSM) — открытой геоинформационной базе данных с документированным API. Особенность OSM в том, что границы вносятся участниками‑волонтёрами часто с задержкой и упрощённо, в нескольких регионах нарушена логическая структура идентификаторов иерархии муниципалитетов (osm_id — сквозной идентификатор уникальных объектов в базе OpenStreetMap). При этом доступны версии полигонов за прошлые периоды.

Ниже расскажем, как с помощью OSM мы формировали пространственный слой муниципалитетов, но сначала ещё об одной проблеме — изменениям подвержены не только границы.

Меняются не только границы, но и названия и типы муниципалитетов

Помимо изменений границ муниципалитетов происходят более сложные преобразования: объединение, присоединение (вместе с упразднением одного или нескольких образований), выделение и разделение образований. Также меняются их названия и типы (например, муниципальный район реформируется в муниципальный округ).

Суммарно с 2018 по 2023 год изменилась муниципальная структура 42 регионов, то есть изменения произошли почти в половине субъектов — как в Европейской части, так и в Сибири, и на Дальнем Востоке. Есть регионы, где все муниципалитеты меняли свои типы (Магаданская и Курганская области, Ставропольский край, ЯНАО, Удмуртия и др.). Есть регионы, где было большое количество объединений (Московская область, Пермский край и др.). И на этом процесс трансформации муниципальной структуры не прекращается.

В течение последнего десятилетия наблюдается тенденция к укрупнению муниципальных образований. Есть только один обратный пример: выделение городского округа Сириус из городского округа Сочи. Чаще всего менялись типы муниципального образования:

  • примерно с 2014 года муниципальные районы чаще переводили в городские округа. По такому примеру преобразовались Московская область, Нижегородская, Магаданская, Свердловская, Томская области, Пермский край и др.

  • c 2019 года муниципальные районы активно меняли тип на муниципальные округа. Этот процесс продолжается и сейчас.

Согласно Федеральному закону «Об общих принципах организации местного самоуправления в Российской Федерации» от 01.05.2019 N 87-ФЗ, до 01.01.2025 часть городских округов, созданных без учёта требований по количеству и плотности городского населения, будут обязаны преобразовать в муниципальные (например, в Магаданской области).

Все эти изменения нужно учитывать, чтобы корректно пользоваться статистической информацией по муниципалитетам.

Изменения муниципалитетов приводят к разрывам статистических рядов

Официальная статистика по муниципальным образованиям публикуется в БДПМО. Работу с ней осложняет отсутствие программного интерфейса (API) и сложная иерархическая архитектура данных с различиями по регионам. В итоге нужно много предварительной ручной обработки.

Ниже показан пример выгрузки из БДПМО по городскому округу Серпухову и по Серпуховскому муниципальному району.

Можно заметить разрывы временных рядов и нарушенную структуру идентификаторов. В идеале должно быть так:

В этом варианте базы данных:

  • все ряды непрерывны в пределах одного территориального образования с неизменными границами;

  • ряд по Серпуховскому муниципальному району заканчивается в 2019 году в связи с его присоединением к городскому округу; соответственно, ряд по городскому округу также прерывается. При этом закон об объединении вступил в силу с 30.12.2018, но из‑за особенностей сбора изменений Росстандартом и Росстатом ряд прервался только в 2020 году.

  • ряды по Протвино и Пущино (после присоединения к городскому округу Серпухов в 2023 году) заканчиваются в 2024 году.

  • по объединенному городскому округу ряд будет формироваться с 2025 года, как указано в законе об объединении.

Пример с Серпуховом не уникален. Множество муниципалитетов имеет разрозненные статистические ряды в силу произошедших с ними изменений. Невозможно связывать разрозненные значения в единые непрерывные ряды без справочника муниципальных образований с указанием идентификатора неизменной территории и периода существования муниципалитета.

Как мы формировали адаптированный версионный справочник муниципальных образований

Есть несколько разработок, посвящённых работе с муниципальными данными, но по различным причинам мы не смогли их использовать:

  • справочник муниципалитетов ИНИД содержит даты начала и окончания действия муниципалитета и идентификатор территории (характеризует неизменный набор населенных пунктов, код и название муниципалитета), но не актуализируется с 2021 года и учитывает дату преобразования по появлению новой версии в исходных таблицах справочнике ОКТМО.

  • машиночитаемая сборка БДПМО платформы «Если быть точным» — решена проблема непрерывности рядов, но присутствует задержка публикации.

Для наших целей было необходимо создать справочник муниципалитетов, содержащий:

  • идентификатор неизменных границ (territory_id), который зависит от изменений формы муниципалитетов (не зависящий от внутримуниципальных трансформаций);

  • период действия версии атрибутов муниципалитета, с учётом задержки из‑за Росстандарта;

  • дополнительные атрибуты — центр муниципалитета и его координаты, статус (Закрытое административное территориальное образование), тип формы (shape — о нём далее).

Логично было бы начать с информации, которая содержится в Общероссийском классификаторе территорий муниципальных образований Российской Федерации.

Новая версия муниципального образования может возникнуть не только при изменении кода ОКТМО, но и при изменении названия, типа муниципалитета или границ при неизменности других атрибутов (ОКТМО, названия). К тому же для работы с данными важно отслеживать начало и окончание действия каждой версии муниципалитета.

Рассмотрим изменения на примере трёх образований Пермского края: Кудымкарского городского округа, муниципального района и муниципального округа. В таблице ниже можно отследить все изменения этих муниципалитетов (ОКТМО, тип, наименование и границы).

C:\Users\22401913\Downloads\image.png

Изначально Кудымкарский городской округ и муниципальный район имели код ОКТМО, начинающийся с восьмёрки, это артефакт их вхождения в упразднённый Коми‑Пермяцкий автономный округ. За три года произошли следующие изменения:

  • Смена типа муниципального образования с изменением ОКТМО в 2019 году. Муниципальный район стал муниципальным округом, в коде ОКТМО заменили 8 на 5 согласно новой тенденции изменения типов в стране. Границы остались неизменными (territory_id = 1).

  • Изменение ОКТМО при сохранении типа в 2019 году. Городской округ сменил начало кода с 8 на 7 (общераспространённую кодировку типа). Границы остались неизменными (territory_id = 2);

  • Объединение городского округа с муниципальным округом в формате присоединения в 2022 году. Атрибуты муниципального округа не изменились, но изменились границы (territory_id 23). Городской округ перестал существовать.

При наполнении справочника мы выяснили, что единого источника с необходимой информацией нет. Дальше мы расскажем, как объединяли данные из трёх доступных источников (двух баз Росстата и OpenStreetMap).

Первый источник — справочник ОКТМО Росстата

Росстат ежемесячно публикует справочник ОКТМО по итогам обновлений от Росстандарта, учитывающих изменения регионального законодательств в части муниципального устройства. Этот справочник, помимо кода ОКТМО, названия и типа муниципалитета, содержит данные о названии центра муниципалитета.

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

Например, Углегорский муниципальный район Сахалинской области перестал существовать с января 2017 года, потому что его тип сменился на городской округ, что отражено в Законе Сахалинской области от 26.12.2016 № 120-ЗО. При этом в 2018 году Углегорский муниципальный район всё ещё был включён в справочник ОКТМО, а в БДПМО некоторые показатели публиковались уже по городскому округу.

Для начала мы собрали все возможные версии атрибутов муниципалитетов из справочника ОКТМО Росстата:

  1. предварительно обработали все опубликованные таблицы, очистив их от агрегированных строк и лишних столбцов;

  2. соединили все таблицы в одну и удалили дубликаты по всем атрибутам.

В итоге получилась таблица со всеми уникальными версиями муниципалитетов по следующим атрибутам: наименование, тип, регион, административный центр, статус ЗАТО, код ОКТМО, неизменные границы. Даты, когда муниципалитет переставал или начинал появляться в таблицах, мы не учитывали из‑за проблемы с актуальностью, о которой писали раньше.

Из‑за большого количества изменений атрибутов нам необходим был дополнительный источник, который смог бы дать актуальную информацию об изменениях муниципалитетов и позволил бы «связать» различные версии из первого источника в случае сохранения границ (присвоить им одинаковый territory_id).

Второй источник — ежегодный сборник Росстата о численности населения

Чтобы выявить актуальные даты изменений каждого муниципального образования, мы использовали ежегодный сборник Росстата «Численность населения по муниципальным образованиям РФ». В нём ежегодно в июле публикуются все изменения в структуре муниципалитетов по регионам России за год, предшествующий году публикации, и актуальный список названий муниципалитетов на начало года. При этом код ОКТМО не публиковался в сборниках до 2024 года.

Чтобы получить необходимую базу данных, мы:

  • Превратили текстовые записки об изменениях муниципалитетов (агрегируемых из территориальных филиалов Росстата) в машиночитаемую информацию об изменениях (название до, название после, регион и год изменения).

  • Составили базовую таблицу за 2018 год (нас интересовали данные с 2018 года — это потенциальная глубина временных рядов СберИндекса). Для этого использовали таблицу на 01.01.2018 и обогатили её дополнительными атрибутами (первый источник).

  • Учитывая информацию о преобразованиях муниципалитетов в 2018 году (из второго источника на 01.01.2019), мы добавили дату окончания действия тем версиям муниципалитетов, которые менялись, и добавили в таблицу новые версии из первого источника.

  • Повторили те же действия для последующих годов: используя получившийся список, итеративно за каждый год добирали новые версии атрибутов муниципального образования из первого источника, получив периоды действия каждой версии муниципалитета (year_from и year_to) из второго источника.

Учли и изменения границ, в данном случае атрибуты не менялись. Добавили атрибут territory_id, дублирующийся у версий муниципалитетов, характеризующих одну территорию с неизменными границами.

Пространственная часть справочника: векторный слой с границами муниципальных образований

Используя получившийся список муниципалитетов, мы выгрузили из третьего источника (OSM) границы всех существующих муниципалитетов. Каждый из них имеет уникальный osm_id, при этом API позволяет выгрузить ранние версии одного osm_id на любую дату. Это было удобно для тех муниципалитетов, которые меняли границы.

Важно было учесть, что границы в OSM постепенно уточняются. Это не позволяет сопоставлять версии границ различных периодов в одном слое: образуются наложения и не покрываемые участки (пример — муниципалитеты Дагестана выгрузки 2018 и 2024 годах). При этом у некоторых объектов границы не соответствуют реальности либо нарушена иерархия, поэтому мы доработали часть муниципалитетов непосредственно в OSM (в частности, Котласский муниципальный округ).

Получив XML‑документ с тегами и координатами всех версий муниципалитетов (наследование osm_id при трансформациях происходило достаточно хаотично), мы обратились к Wikidata и получили полигоны с кодами ОКТМО.

Выгрузку данных из OSM мы разбили на два этапа. Сначала последовательными запросами (от уровня РФ к федеральным округам и после — к регионам) выгрузили внутрирегиональные структуры территорий, состоящие из набора subarea (субрегиональных единиц). Для регионов это муниципальные образования. Учитывались все версии структур, то есть также osm_id упразднённых муниципалитетов. После сведения всех osm_id муниципалитетов в единую таблицу, выгрузили для них геометрии версии на последнюю возможную дату.

Сбор всех osm_id муниципалитетов, которые существовали в роли subarea в регионе в системе OSM:

import re, numpy as np, pandas as pd, geopandas as gpd, requests, json
from shapely.geometry import shape, MultiPolygon
from shapely.ops import polygonize
from shapely.validation import explain_validity, make_valid
from lxml import etree, html
from itertools import compress

reg_n = 140337 #osm_id Архангельской области
res = requests.get(f'https://api.openstreetmap.org/api/0.6/relation/{reg_n}/history')
root = html.fromstring(res.content)

# Все версии состава муниципалитетов регионов России по версии OSM (начиная с последней версии до 01.01.2018 г.)
vers = list(compress(root.findall("./relation"),
[int(re.search('^\d{4}', x.attrib['timestamp']).group(0)) >= 2018 for x in root.findall("./relation")][1:] + [True]))

# По каждой версии состава региона скачиваются списки муниципалитетов
mo_v = []
for child in vers:
    mo_g_v = [grand.attrib.values() for grand in child.findall("./member[@role='subarea']")]
    mo_g_v = pd.DataFrame(mo_g_v, columns=['type','ref','role'])
    mo_g_v['vers'] = child.attrib['timestamp']
    mo_v.append(mo_g_v)
mo_v = pd.concat(mo_v, ignore_index = True)

# Список всех муниципалитетов (актуальная версия + последняя до удаления)
mo_v_l = mo_v[~mo_v.duplicated(subset=['ref'], keep='last')].reset_index(drop=True).copy()
mo_v_l['reg_id'] = reg_n
mo_v_l['reg_name'] = root.findall("./relation/tag[@k='name']")[0].attrib['v']

Выгрузка геометрий полигонов из OSM:

date = '2018-01-01T01:00:00Z'
ref = 1151629 #Котласский муниципальный район (округ)

# Запрос для актуальных версий, где vision = 'True'
overpass_url = "http://overpass-api.de/api/interpreter"
overpass_query = f"""[out:json][date:"{date}"];(relation({ref}););convert item ::=::,::geom=geom(),_osm_type=type();out geom;"""
response = requests.get(overpass_url,
                        params={'data': overpass_query})
response.raise_for_status()
data = response.json()

results_dict = [{
    'name': element['tags']['name'],
    'vers': date,
    'geometry': MultiPolygon(polygonize(shape(element['geometry']))),
    'ref': ref
} for element in data['elements']]

gdf = gpd.GeoDataFrame(results_dict).set_crs('epsg:4326')
gdf.geometry = gdf.geometry.apply(make_valid)

Далее каждому полигону присвоили внешний идентификатор границ (territory_id) из первой атрибутивной части справочника, а также год начала и окончания действия каждого territory_id.

На последнем этапе мы вручную доработали границы прошлых версий муниципалитетов для полной сопоставимости и исключения наложения соседних муниципалитетов. Покрытие территории РФ за каждый год должно быть ровно 100%.

Мы получили справочник муниципальных образований, который:

  • Состоит из двух частей: атрибутивной (версионные характеристики муниципалитетов) и пространственной (версионные границы муниципалитетов);

  • Содержит информацию с 2018 года о муниципальных образованиях 1 уровня. Муниципальные образования 2 уровня не учитывались (это городские и сельские поселения, межселенные территории, внутригородские районы городских округов, но не городов федерального значения), так как официальной статистики по поселениям практически нет;

  • Учитывает муниципалитеты 85 субъектов РФ; новые регионы в справочник не включены;

  • даты (год) изменений учтены согласно второму источнику Росстата и могут несколько разниться с датами начала/окончания рядов в БДПМО;

  • Содержит геометрии полигонов из OpenStreetMap с корректировкой границ. Территория РФ полностью покрыта слоем с муниципалитетами, нет наложений границ смежных образований;

  • Учитывает тип муниципалитетов, форму, административный центр и его координаты.

В справочнике доступны следующие атрибуты муниципалитетов:

  • territory_id — код территории (муниципального образования в постоянных границах);

  • region_code — код региона (субъекта федерации);

  • oktmo — код муниципального образования;

  • municipal_district_name — наименование муниципального образования;

  • municipal_district_name_short — краткое наименование муниципального образования;

  • municipal_district_type — тип муниципального образования;

  • municipal_district_status — статус муниципального образования (ЗАТО, федеральная территория);

  • municipal_district_center — название центра муниципалитета;

  • municipal_district_center_lat, municipal_district_center_lon — географические координаты центра в проекции epsg:4326 (геокодированные через Nominatim);

  • shape форма территории муниципального образования (1 — муниципалитет, у которого административный центр находится внутри; 2 — муниципалитет с административным центром в соседнем муниципалитете, 3 — муниципалитет, центр которого является одновременно административным центром для соседнего);

  • shape_linked_oktmo код связанного муниципального образования (если shape {2, 3});

  • source_rosstat — источник (название файла версии ОКТМО на сайте Росстата);

  • year_from — год начала актуальности записи (включая этот год);

  • year_to — год окончания актуальности записи (не включая этот год).

Как пользоваться?

Для того, чтобы получить информацию на конкретный год, можно использовать лёгкий фильтр для первой части справочника: df[(df.year_from <= 2022) & (df.year_to > 2022)].

Потом через функцию inner_join можно присоединить вторую, пространственную часть по полю territory_id. Также группируя таблицу по различным атрибутам — territory_id, ОКТМО и названию — можно выявить все преобразования муниципалитета и сопоставить прерывающиеся ряды.

Многие исследователи вынуждены тратить время на поиск границ муниципалитетов или предобработку муниципальных данных из БДПМО. Поэтому мы надеемся, что справочник, доступный на сайте СберИндекса, поможет делать больше интересных исследований на уровне муниципалитетов в России.

Источники инфографики: Росстат, законы Московской области от 14.12.2018 № 220/2018-ОЗ и от 30.01.2023 № 1/2023-ОЗ, OpenStreetMap.

Комментарии (2)


  1. pfg21
    11.10.2024 12:08

    как обычно не указаны условия пользования собранными данными, ни в статье, ни на страничке исследования....
    мелочь, а юрики уже начинают докапываться до "бесхозных" данных.


    1. a_kushlev Автор
      11.10.2024 12:08

      спасибо за комментарий, мы прорабатываем этот вопрос