Перейти к содержанию

Программирование Викиданных/Населённые пункты

Материал из Викиверситета

В главе исследуется объект Викиданных населённый пункт(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 год. Размер пузырька соответствует количеству населения, проживающего в <<населённых пунктах>> одной страны.
Пузырьковая диаграмма по суммарному количеству населения, проживающего в <<населённых пунктах>> на 2021 год. Размер пузырька соответствует количеству населения, проживающего в <<населённых пунктах>> одной страны.

В 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)
Диаграмма доли населения страны, проживающего в "населённых пунктах" (2022)

Столбчатая диаграмма на рисунке позволяет увидеть для каждой отдельной страны отношение количества людей, проживающих в "населённых пунктах" к числу жителей в стране. Из графика видно, что наиболее высокий процент в 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 годами, количества классов, сопутствующих <<населённому пункту>> в свойстве <<экземпляр>>
номер название класса количество на 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 человек.

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

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

[править]

Используя вышеописанные шаги, получаем запрос...

Диаграмма количества учёных, родившихся в сельских поселениях, с указанием дат рождения (десятилетия). Фильтрация по нескольким профессиям (научным направлениям). Диаграмма построена в 2022 году по SPARQL-запросу.
Диаграмма количества российских и советских учёных всех направлений, родившихся в сельских поселениях в 1850-1980 годы. Максимальное число учёных (685 человек) родилось в 1930-е годы. Диаграмма построена по SPARQL-запросу https://w.wiki/55WY в 2022 году.

Построение диаграммы для учёных родившихся в городских поселениях и сравнение диаграмм

[править]

Используя вышеописанные шаги, получаем такой запрос SPARQL-запрос...

Диаграмма количества российских и советских учёных, родившихся в городских поселениях в 1850-1990 годы. Диаграмма построена в 2022 году по SPARQL-запросу https://w.wiki/58tL.

Сравнив диаграммы, видно...

Построение диаграмм

[править]

SPARQL-запрос, Получили ru town. SPARQL-запрос, Получили ru rural. SPARQL-запрос, Получили en rural. SPARQL-запрос, Получили en town.

Будущая работа

[править]
  • Подсчитать и вывести по странам список известных личностей, родившихся в населённых пунктах.
  • Подсчитать и построить график отношения суммарной площади населённых пунктов к площади страны.
  • Найти населённые пункты, основанные в XXI веке.
  • Рассмотреть только те населённые пункты, которые уже не существуют. Построить список таких пунктов, упорядоченный по длительности существования населённого пункта.

Упражнения

[править]

2 Выберите, какие из представленных гербов относятся к населённым пунктам Российской Федерации, а какие — нет.

Относится,Не относится

3 К какой стране относится панорама этого населенного пункта?



SPARQL-запросы с ответами:

См. также

[править]

Примечания

[править]

Литература

[править]
  • Ожегов С. И. Толковый словарь русского языка. — Москва, 2003.

Ссылки

[править]