Программирование Викиданных/Населённые пункты
В главе исследуется объект Викиданных населённый пункт(Q486972) и его свойства. В каждом из разделов представлены задачи, решённые с помощью SPARQL-запросов.
Был получен список населённых пунктов, построены пузырьковые диаграммы с количеством населения в <<населённых пунктах>> по странам. Построена диаграмма, показывающая долю населения, проживающего в населённых пунктах относительно всего населения страны. Диаграмма показала, что высокий процент населения, проживающего в населённых пунктах, приходится на сельскохозяйственные страны, в то время как в более индустриальных странах меньшая доля населения проживает в населённых пунктах.
На 2017 год Википедия описывала примерно половину населённых пунктов (75 тыс.), Викиданные содержали менее 3% таких поселений (4 тыс.) относительно данных переписи за 2010 год (155,5 тыс.). На 2021 год Викиданные содержат менее 12% таких поселений (17 тыс.) относительно данных той же переписи за 2010 год.
Для сравнения сельских и городских поселений построены диаграммы количества учёных, сгруппированных по родам деятельности и разделённых по месту рождения: сельское или городское.
Для поиска более полных ответов на поставленные выше задачи были найдены более общие классы для объекта населённый пункт с помощью свойства частный случай понятия(P31). Трудность исследования вызвана отсутствием чёткой типологии населённых пунктов (например, от численности населения) в законодательстве России и в Викиданных.
Список <<Населённых пунктов>>
правитьПостроим список всех населённых пунктов с помощью SPARQL-запроса.
# List of all human settlements
SELECT ?hum ?humLabel WHERE{
?hum wdt:P31 wd:Q486972. # instance of human settlement
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
SPARQL-запрос, 411393 записи на 2017 год.
В 2021 году оказалось невозможным получить список населённых пунктов из-за большого числа объектов и поэтому слишком долгой работы SPARQL-запроса.
Для подсчёта числа всех населённых пунктов обратимся к функции COUNT() в SPARQL-запросе.
# Number of human settlements
SELECT (COUNT(?hum) AS ?count) WHERE {
?hum wdt:P31 wd:Q486972. # instance of human settlement
}
SPARQL-запрос, 563126 населённых пунктов в 2021 году.
Среди отечественных населённых пунктов на Викиданных, которым соответствуют статьи Русской Википедии, почти пустыми являются, например, бывшая деревня Борисово (3 свойства) и Бригадирское лесничество (4 свойства).
По данным сервиса ProWD среди отечественных населённых пунктов больше всего свойств (36) у Ялты. Лидером по всему миру является Токио (73 свойства).
Список стран по суммарному количеству населения
правитьС помощью запроса SPARQL-запрос построим упорядоченный список стран по суммарному количеству населения, проживающего в <<населённых пунктах>>.
# List of countries by population in settlements
SELECT ?country ?countryLabel (SUM(?population) as ?sumPopulation)
WHERE {
?hum wdt:P31 wd:Q486972; # instance of human settlement
wdt:P17 ?country; # in the ?country
wdt:P1082 ?population. # has ?population
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?country ?countryLabel
ORDER BY DESC (?sumPopulation)
SPARQL-запрос, Получена 161 страна в 2017 году и 213 стран в 2021 году.
Для подсчёта количества населения по странам используем команду SUM() во второй строке SPARQL-запроса. Для группировки населённых пунктов по странам используем команду GROUP BY на девятой строке того же запроса.
В 2017 году больше всего населения проживало в <<населённых пунктах>> Бразилии (12 млн), Пакистана (10 млн), Мексики (8 млн), Йемена (8 млн), Индии (7 млн) и Бангладеша (7 млн).
На рисунке справа можно увидеть список стран на 2021 год: Индия (30 млн), Китай (28 млн), Мексика (17 млн), Индонезия (13 млн), Канада (9 млн) и Саудовская Аравия (9 млн).
Итак, результаты SPARQL-запрос в 2017 и 2021 существенно разнятся. По этим результатам получается, что за четыре года в населённых пунктах Индии стало больше на 23 млн человек.
Проверка правильности выполнения скрипта
правитьПроверим правильность подсчётов вышеописанного запроса, который строит список стран по суммарному числу населения. Для этого напишем скрипт - SPARQL-запрос, где для самой малолюдной страны будет построен список поселений с количеством их жителей. В 2017 году запрос показал, что такой страной является Черногория. В 2021 году такой страной является Сент-Люсия. Немного изменим тот же скрипт и выведем число жителей населённых пунктов Сент-Люсия.
# Population in settlements in the Saint Lucia
SELECT (sum(?population) as ?total)
WHERE {
?hum wdt:P31 wd:Q486972. # instance of human settlement
?hum wdt:P17 wd:Q760. # settlement in the Saint Lucia
?hum wdt:P1082 ?population. # settlement has ?population
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,[AUTO_LANGUAGE]"}
}
SPARQL-запрос, 160 человек (2021).
Проверка прошла успешно, так как данный скрипт подтвердил результат численности населения, проживающего в «населённых пунктах» Сент-Люсия.
Полнота Викиданных
правитьНаселённый пункт — это общее название мест с постоянными жителями[1]. По версии редакторов Викиданных в понятие насёленный пункт входят города, сёла, деревни и другие. Полный список можно увидеть в разделе этой статьи «Cписок объектов, сопутствующих "human_settlement" в "instance of"». Точной информации о количестве населённых пунктов в мире не было найдено. Поэтому проверим полноту населённых пунктов, которые есть в Викиданных и которые использовались для решения задачи. Была поставлена задача: построить упорядоченный список стран по суммарному количеству населения, проживающего в "human_settlement". Для этого напишем SPARQL-запрос, который выведет населённые пункты с незаполненным свойством 'population'. В 2017 году этот запрос выдал 372997 таких населённых пунктов. Произведя расчеты получаем, что только у 9,3% населенных пунктов мира указано количество населения (свойство 'population'). Проводя ту же проверку в 2021 году, запрос выдал 507078 таких населённых пунктов. Получаем 11.2% населенных пунктов мира имеют свойство 'population'. А теперь посмотрим населённые пункты, у которых не указана принадлежность к какой-либо стране - SPARQL-запрос. В 2017 году таких нашлось 8427 объектов. В 2021 году таких объектов уже существенно больше - 27824. Поэтому в результате решения данной задачи получились неполная картина о суммарном количестве населения в населённых пунктах по странам.
Рассмотрим населённые пункты России. По данным проекта "Населённые пункты России/Статистика" Русская Википедия содержит приблизительно 75000 статей о населённых пунктах России. По переписи 2010 года в России 155 510 населённых пунктов. Проверим, сколько объектов содержится в Викиданных о населённых пунктах России с помощью следующего SPARQL-запроса. В 2017 году было получено 4113 объектов, что составляет 2,6% от общего числа населённых пунктов по переписи за 2010 год. В 2021 году запрос выдал 17425 объектов, что составляет 11,2% от общего числа населённых пунктов. Таким образом, в Викиданных содержится слишком мало информации о населённых пунктах России.
Итак, степень заполненности Викиданных по населённым пунктам низкая. А именно, у некоторых городов, поселков, деревень и других населённых пунктов на Викиданны отсутствует свойство "экземпляр" (instance of), значением которого может быть "населённый пункт" (human settlement). Кроме того, есть почти пустые и плохо проработанные объекты. Для решения этих проблем необходимо заполнять эти свойства и связывать между собой объекты Викиданных.
Заполнение Викиданных
правитьВ ходе заполнения объектов Викиданных было решено заполнять свойство "экземпляр" (instance of).
Были внесены данные о 100 объектах России, которые не имели значения "населённый пункт" (human settlement) в свойстве "экземпляр" (instance of).
На 25.10.2017, после заполнения данными, Викиданные содержали 4207 объектов о населённых пунктах России, что составляло 2,6% от общего числа населённых пунктов по переписи за 2010 год и 5,6% от данных Русской Википедии. Это можно увидеть с помощью следующего SPARQL-запроса.
Доля населения страны, проживающего в "human_settlement"
правитьПостроим упорядоченный список стран доли населения (в процентах), проживающего в "населённых пунктах", к числу всех жителей страны.
#defaultView:BarChart
# An ordered list of the ratio of the number of people living in "settlement" to the number of inhabitants in the country.
SELECT ?country ?proportionPopulation ?countryLabel WHERE {
SELECT ?country ?countryLabel (SUM(?population / ?pop) as ?proportionPopulation) WHERE {
?hum wdt:P31 wd:Q486972; # instances of human settlement
wdt:P17 ?country; # has ?country
wdt:P1082 ?population. # has ?population
?country wdt:P1082 ?pop. # population in the country
FILTER (?pop > 5000000). # only country > 5 million population
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?country ?countryLabel
HAVING (?proportionPopulation > 0.1 && ?proportionPopulation < 1)
}
ORDER BY ?proportionPopulation
SPARQL-запрос, 158 записей (2017), 208 записей (2021).
Столбчатая диаграмма на рисунке позволяет увидеть для каждой отдельной страны отношение количества людей, проживающих в "населённых пунктах" к числу жителей в стране. Из графика видно, что наиболее высокий процент в 2017 году приходился на следующие страны: Кирибати (78%), Ниуэ (70%), Греция (53%), Тувалу (48%), Коморы (43%), Маврикий (42%). В 2021 году ситуация полностью поменялась: Ниуэ (72%), Папуа — Новая Гвинея (71%), Словения (61%), Фарерские острова (54%), Греция (53%), Маршалловы Острова (51%). Интересно заметить, что в основном это маленькие островные государства. Вероятно, большая часть жителей этих стран сконцентрирована в населённых пунктах.
На 2017 год рассматривая отдельно страны большой восьмёрки, доля жителей в населённых пунктах составила: Россия (2.98%), США (1.76%), Япония (0.80%), Канада (0.26%), Франция (0.20%), Германия (0.24%), Великобритания (0.18%), Италия (0.07%). В 2011 году значения значительно снизились: Россия (0.045%), США (0.014%), Япония (0.008%), Канада (0.23%), Франция (0.005%), Германия (0.005%), Великобритания (0.014%), Италия (0.0005%) Отметим, что это страны промышленно развитые.
Построенная диаграмма подтверждает следующую гипотезу: высокий процент населения страны, проживающего в "населённых пунктах", указывает на более аграрную страну. В действительности имеется возможность развития сельского хозяйства в этих странах. Исходя из диаграммы и запроса видно, что наиболее высокий процент населения страны, проживающего в "населённых пунктах", приходится на островные, южные, жаркие страны, в которых, по-видимому, менее развита промышленность (маленькая территория, небольшое количество населения, удаленность от материков). А индустриальные страны (большой восьмёрки) имеют очень низкий процент населения страны, проживающего в "населённых пунктах".
Cписок классов, сопутствующих <<населённому пункту>> в свойстве <<экземпляр>>
правитьДалее классом будем называть каждый элемент в исследуемом объекте на Викиданных, связанный через свойство экземпляра. Главная цель этого раздела, получить классы в свойстве <<экземпляр>>, используемые совместно с классом населённый пункт. Такие классы будем считать сопутствующими. Для этого попробуем получить список объектов, имеющих свойство <<населённый пункт>> SPARQL-запрос.
# List of objects accompanying "human_settlement" in the property "instance of"
SELECT ?inst ?instLabel (COUNT(?hum) as ?sumHum)
WHERE{
?hum wdt:P31 wd:Q486972; # instance of human settlement
wdt:P31 ?inst. # other objects in instance
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,[AUTO_LANGUAGE]"}
}
GROUP BY ?inst ?instLabel
SPARQL-запрос, так как данный запрос слишком долго выполняется и выводится сообщение об ошибке: "Query timeout limit reached", сделаем его более лёгким. Для этого уменьшим число перебираемых объектов.
# List of classes accompanying the human_settlement in the
# property 'instance of'
SELECT ?inst (COUNT(?hum) as ?sumHum)
WHERE{
?hum wdt:P31 wd:Q486972; # instance of human settlement
wdt:P31 ?inst. # other objects in instance
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?inst
SPARQL-запрос, Получено 610 результатов в 2017 году и 1245 результатов в 2021 году.
Для ускорения выполнения SPARQL-запроса выполним следующие два шага.
Во-первых, выключим из рассмотрения такие поселения, которые имеют в списке экземпляров только населённый пункт. Результат не ухудшится, так как в него не будут включены экземпляры только класса <<населённый пункт>>. С этой целью внесём в наш скрипт строку 9 и получим фильтр для отбора нужных поселений.
Во-вторых, в строке 8 уберем такие объекты переменной ?inst, которые имеют свойство государство. Это позволит отсечь сотни типов населённых пунктов специфичных для отдельных стран, например, административно-территориальная единица России.
Эти преобразования позволили выполнить запрос по всем странам мира за приемлемое время (13 мс).
# List of objects with the class of human settlement, without
# country and single human settlement
SELECT ?inst (COUNT(?hum) as ?sumHum)
WHERE{
?hum wdt:P31 wd:Q486972; # instance of human settlement
wdt:P31 ?inst. # other objects in instance
MINUS {?inst wdt:P17 []}. # without country
FILTER(?inst != wd:Q486972 ). # without human settlement
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?inst
ORDER BY DESC (?sumHum)
SPARQL-запрос, Получено 355 записей в 2017 году и 707 записей в 2021 году.
В таблице ниже представлены сравнительные результаты между 2017 и 2021 годами, количества классов, сопутствующих <<населённому пункту>> в свойстве <<экземпляр>>.
номер | название класса | количество на 2017 | количество на 2021 | разница |
---|---|---|---|---|
1 | Cёло | 2844 | 4853 | +2009 |
2 | Муниципалитеты | 1181 | 3376 | +2195 |
3 | Деревни | 662 | 1761 | +1099 |
4 | Археологические памятники | 425 | 887 | +462 |
5 | Местные поселения | 425 | 158 | -257 |
6 | Разрушенные города | 423 | 388 | -40 |
7 | Города | 322 | 545 | +223 |
8 | Малые города | 277 | 446 | +2009 |
9 | Заброшенные деревни | 254 | 474 | +220 |
10 | Внутренние районы | 207 | 503 | +296 |
В 2021 году была предложена ещё одна модернизация SPARQL-запроса. А именно: отсечь доисторические поселения таких типов, как поселения латенского периода, бронзового века и доисторического времени, где есть письменность, без явного указания этих трёх объектов.
Что есть общего у этих трех объектов на Викиданных? Они являются подклассами объектов, которые, в свою очередь, являются экземпляром объектов археологической культуры, исторического периода, археологического века, всемирной истории и геологического периода. Применяя фильтр с описанным выше подклассам получаем такой результат SPARQL-запрос.
# List of classes accompanying the human_settlement in the property
# 'instance of' without historical objects
SELECT ?inst ?instLabel (COUNT(?hum) as ?sumHum) WHERE{
?hum wdt:P31 wd:Q486972; # instance of human settlement
wdt:P31 ?inst. # other objects in instance of human settlement
?inst wdt:P31 ?test. # instance of ?inst
?test wdt:P31 ?typ. # instance of ?test
MINUS {?inst wdt:P17 []}. # without country
# without human settlement and prehistoric settlements
FILTER(?inst != wd:Q486972 && ?typ != wd:Q465299
&& ?typ != wd:Q11514315 && ?typ != wd:Q15401699
&& ?typ != wd:Q200325 && ?typ != wd:Q392928 ).
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?inst ?instLabel
ORDER BY DESC (?sumHum)
SPARQL-запрос, Получено 89 результатов.
В итоге, вместо 707 классов из SPARQL-запроса, мы получили 89 различных классов, сопутствующих <<населённому пункту>> в свойстве <<экземпляр>> .
Отечественные учёные на селе и в городе
правитьПопробуем подсчитать число отечественных учёных, родившихся в сельских и городских типах населённых пунктов. И сравнить эти числа. Решим эту задачу за пять шагов:
- Выявим список сельских и список городских типов поселений именно в России.
- Определим основные научные направления, представленные в Викиданных.
- Выявим способ определения отечественных ученых.
- Сделаем такую диаграмму, на которой разным цветом будут указаны разные научные направления (математики, физики, химики и так далее) для учёных родившихся в сельских поселениях.
- Сделаем вторую диаграмму — по городским поселениям и сравнить результаты.
Список сельских и список городских типов поселений именно в России
правитьВыведем список классов поселений и их количество для объектов имеющих свойство численность населения и принадлежащие государству России.
# List of settlement classes and their number for objects with
# the property "population" in Russia
SELECT ?class ?classLabel (COUNT(?class) AS ?count) WHERE {
{
SELECT ?class ?classLabel ?humLabel WHERE {
?hum wdt:P17 wd:Q159; # settlement in the Russia
wdt:P1082 ?population; # has ?population
wdt:P31 ?class. # has ?class
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
}
}
GROUP BY ?class ?classLabel
ORDER BY DESC (?count)
SPARQL-запрос, Получили 216 разных классов поселений.
Основные классы из SPARQL-запроса представлены в таблице ниже.
номер | название класса | количество упоминаний | население |
---|---|---|---|
1 | сельское поселение в России | 18104 | 34043885 |
2 | деревня | 14795 | 1727221 |
3 | село | 9875 | 10584016 |
4 | посёлок | 4418 | 3326567 |
5 | хутор | 1733 | 509825 |
6 | город | 1171 | 104453583 |
7 | населённый пункт | 1168 | 6643211 |
8 | посёлок городского типа России | 665 | 3745723 |
9 | город с населением более 100 000 человек | 108 | 58159327 |
10 | город-миллионер | 14 | 32136227 |
Из исследований проведенных выше мы знаем, что класс <<населённый пункт>> используется совместно с разными классами поселений. Поэтому его не будем добавлять ни к сельским, ни к городским поселениям.
Далее классы из таблицы выше под номерами (1, 2, 3, 4 и 7) будут упоминаться, как сельские поселения. Произведём подсчёт количества населения таких поселений в России. Получили 50 млн человек. Ссылка на SPARQL-запрос: SPARQL-запрос.
А классы из таблицы выше под номерами (9, 11, 21 и 54) будут упоминаться, как городские поселения. Произведём подсчёт количества населения таких поселений в России. Получили 198 млн человек. Ссылка на SPARQL-запрос: SPARQL-запрос.
Основные научные направления, представленные в Викиданных
правитьВыведем список профессий и их количество для людей со свойством гражданство России.
# List of occupation or job citizens of Russia
SELECT DISTINCT ?job ?jobLabel (COUNT(?hum) AS ?count) WHERE {
?hum wdt:P27 wd:Q159; # citizen of Russia
wdt:P106 ?job. # has occupation or job
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
GROUP BY ?job ?jobLabel
ORDER BY ?count
SPARQL-запрос, Получили 89 результатов.
Ниже приведена таблица с выбранными научными направления из SPARQL-запроса.
номер | название класса | количество упоминаний |
---|---|---|
1 | физик | 991 |
2 | историк | 913 |
3 | экономист | 880 |
4 | математик | 857 |
5 | инженер | 558 |
6 | исследователь | 502 |
7 | химик | 439 |
8 | врач | 342 |
9 | юрист | 330 |
10 | биолог | 222 |
Выявить способ определения отечественных ученых
правитьЕсть два способа получения списка ученых.
Первый по наличию свойства научная степень. Выведем количество людей имеющих такое свойство.
# Count of peoples in Russian with academic degree
SELECT (COUNT(DISTINCT ?hum) AS ?human_count) WHERE {
# Russian Empire, Soviet Union and Russia
VALUES ?ruCountries {wd:Q34266 wd:Q15180 wd:Q159}
?hum wdt:P512 ?academic_degree; # has academic degree
wdt:P27 ?ruCountries. # lives (lived) in Russian countries
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
SPARQL-запрос, Получили 24297 человек.
Второй по наличию свойства участник организации одной из нескольких академий: academy of sciences, learned society, scientific society, academy, research institute, educational institution. Выведем количество людей имеющих такое свойство.
# Count of peoples in Russian in academy
SELECT (COUNT(DISTINCT ?hum) AS ?human_count) WHERE {
VALUES ?ruCountries {wd:Q34266 wd:Q15180 wd:Q159}
VALUES ?class_academy {wd:Q414147 wd:Q955824 wd:Q74801 wd:Q162633
wd:Q31855 wd:Q2385804 wd:Q83172}
?hum wdt:P463 ?academy; # has academic degree
wdt:P27 ?ruCountries. # lives (lived) in countries
# academy is an element of the class academy
?academy wdt:P31 ?class_academy.
SERVICE wikibase:label{bd:serviceParam wikibase:language "ru,en"}
}
SPARQL-запрос, Получили 4170 человек.
Первый способ дает больше людей, что позволить увидеть более подробную картину на диаграммах ниже. Будем его использовать для построения диаграмм ниже.
Построение диаграммы на которой разным цветом будут указаны разные научные направления для учёных родившихся в сельских поселениях
правитьИспользуя вышеописанные шаги, получаем запрос...
Построение диаграммы для учёных родившихся в городских поселениях и сравнение диаграмм
правитьИспользуя вышеописанные шаги, получаем такой запрос SPARQL-запрос...
Сравнив диаграммы, видно...
Построение диаграмм
правитьSPARQL-запрос, Получили ru town. SPARQL-запрос, Получили ru rural. SPARQL-запрос, Получили en rural. SPARQL-запрос, Получили en town.
Будущая работа
править- Подсчитать и вывести по странам список известных личностей, родившихся в населённых пунктах.
- Подсчитать и построить график отношения суммарной площади населённых пунктов к площади страны.
- Найти населённые пункты, основанные в XXI веке.
- Рассмотреть только те населённые пункты, которые уже не существуют. Построить список таких пунктов, упорядоченный по длительности существования населённого пункта.
Упражнения
править
SPARQL-запросы с ответами:
См. также
правитьПримечания
правитьЛитература
править- Ожегов С. И. Толковый словарь русского языка. — Москва, 2003.
Ссылки
править- Andrew Krizhanovsky, Anna Eparskaya Сравнительный анализ населённых пунктов по числу жителей в разных странах.
- Maksimenko L. Human Settlements in Russia (англ.). ProWD (2021). Проверено 24 сентября 2021.