Статья является кратким обзором о сертификации по программе IBM Data Science Professional Certificate.


Будучи новичком в Python, мне пришлось столкнуться с реализацией задач:


  • Загрузка и парсинг HTML таблиц
  • Очистка загруженных данных
  • Поиск географических координат по адресу объекта
  • Загрузка и обработка GEOJSON
  • Построение интерактивных тепловых карт (heat map)
  • Построение интерактивных фоновых картограмм (choropleth map)
  • Преобразование географических координат между сферической WGS84 и картезианский системой координат UTM
  • Представление пространственных географических объектов в виде гексагональная сетки окружностей
  • Поиск географических объектов, расположенных на определенном расстоянии от точки
  • Привязка географических объектов к полигонам сложной формы на поверхности
  • Описательные статистический анализ
  • Анализ категорийных переменных и визуализация результатов
  • Корреляционный анализ и визуализация результатов
  • Сегментация с использованием k-Mean кластеризации и elbow метода
  • Анализ и визуализация кластеров

В ходе сертификации необходимо было пройти 9 курсов:



Первые 3 курса носили повествовательный характер.
Курсы «Python for Data Science and AI» и «Databases and SQL for Data Science» ориентированы на новичков в программировании, и не требуют существенных начальных знаний.


Курсы «Data Analysis with Python», «Data Visualization with Python», «Machine Learning with Python» были значительно интереснее. Они отлично подготовлены и содержат большое количество лабораторных работ на Python.


А вот курс Applied Data Science Capstone заставил реально напрячься – нужно было придумать реальную задачу, связанную с анализом пространственных данных на Python, реализовать и грамотно оформить отчет.


Дальнейшая часть статьи оформлена в виде отчета о выполненном исследовании в ходе курса Applied Data Science Capstone.


Для читателей кому интересен программный код — ссылка на Github.
Общий объем кода исследования сравнительно невелик — около 700 строк.


Вопрос реальной практической ценности результатов исследования оставляю открытым.


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


Содержание



1. Introduction


1.1 Background


Москва — одна из крупнейших столиц мира с население более 12 миллионов человек. Площадь Москвы более 2561.5 км?, средняя плотность населения 4924.96 человек/км? 1.


Москва разделена на 12 административных округов (125 районов, 2 городских округа, 19 поселений) и имеет очень неоднородное население от 30429 человек/км? для района "Зябликово", до 560 человек/км? для района "Молжаниновский" 2.


Средняя стоимость жилой недвижимости колеблется от 68,768 рублей/м? для района "Кленовское" до 438,568 рублей/м? для района "Арбат" 3.


1.2 Business Problem


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


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


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


Ключевыми критериями моего исследования будут:


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

2. Data acquisition and cleaning


2.2. Data requirements


Основываясь на формулировке проблемы и установленных критерия исследования, мне необходимо было собрать следующую информацию:


  1. основной набор данных со списком районов Москвы, содержащий:


    • наименование и тип каждого района и административного округа, в который он входит
    • площадь в км?, население и стоимость недвижимости в каждом районе

  2. географические координаты центра каждого района


  3. географические границы районов в формате GEOJSON


  4. список объектов (фитнес центров, кафе, ...), размещенных в каждом районе с указанием их географических координат и классификационных категорий



2.3. Describe data sources


Данные со списком районов Москвы были загружены с нескольких HTML страниц и объединены в общий набор данных.


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

Географические координаты центра района запрашивались через службу Nominatim. Которая, к сожалению, отличается некоторой нестабильностью, что потребовало делать большое количество итераций.


Географические границы районов в формате GEOJSON были загружены со страницы


Для поиска объектов на карте (фитнес центров, кафе и т.п.) был использован сервис Foursquare API. Весьма удачный сервис, который имеет одно существенное ограничение. В одном запросе можно получить не более 100 объектов в радиусе 1000 м. Для получения списка всех объектов в Москве был использован следующий подход:


  • Москва была разбита на сетку окружностей малого диаметра, чтобы не превысить ограничение в 100 объектов.
  • для каждой окружности из полученной сетки, через сервис Foursquare API запрашивался список объектов.
  • чтобы исключить потерю объектов, радиус окружности для запроса Foursquare API был больше радиуса сетки (с перекрытием)
  • результирующий список объектов был очищен от дубликатов.

2.4. Describe data cleansing


Поскольку список районов Москвы был загружен с нескольких HTML страниц, то необходимо было выполнить существенный объем очистки данных. В частности:


  • удаление неиспользуемых столбцов
  • очистка текстовых полей от лишних символов таких как ' \n\t', ' ', ''
  • корректировка символов "е" и "ё" для ключевых полей
  • очистка числовых полей от лишних символов
  • конвертация строковых полей в float и int

Результирующий очищенный набор данных содержит следующую информацию о 146 районах Москвы:


  • Borough_Name — наименование района — использовался как уникальный ключ в наборе данных
  • District_Name — наименование Административного округа, в состав которого входит район
  • Borough_Type — тип района
  • OKATO_Borough_Code — числовой код OKATO района
  • OKTMO_District_Code — числовой код OKTMO Административного округа
  • Borough_Area — площадь района в квадратных километрах
  • Borough_Population — население района
  • Borough_Population_Density — плотность населения района
  • Borough_Housing_Area — площадь жилой застройки района в тыс. квадратных метров
  • Borough_Housing_Area_Per_Person — жилая площадь на одного человека в районе
  • Borough_Housing_Price — средняя стоимость жилой недвижимости в районе в рублях

Подготовленный и очищенный набор данных со списком районов Москвы доступен по ссылке
Таблица ниже демонстрирует выборку из этого набора.


Moscow Boroughs dataset


Сервис Nominatim, использованный для определения географических координат Москвы отличается нестабильностью при работе с русской буквой ё, поэтому для части районов (около 10 штук) координаты были собраны вручную.


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


Boroughs Population in Moscow City


Как мы видим, использование географических координат районов для поиска объектов (фитнес центров, кафе, ...), совершенно бесполезно, так как каждый район имеет очень сложную форму. Поэтому была подготовлена сетка окружностей небольшого радиуса в пределах 28 000 метров от центра Москвы.


Рисунок ниже демонстрирует пример такой сетки. Координаты центра каждой окружности из сетки использовалась для запроса к сервису Foursquare API.


Example of the hexagonal grid of area candidates


Используя Forsquare API, было было получено 34460 объектов (фитнес центров, кафе, ...) в 7899 ячейках сетки.


Поскольку для поиска объектов использовался радиус (350 метров) больше, чем радиус ячейки сетки (300 метров), возникла необходимость в удалении дубликатов.


После удаления дубликатов осталось 27622 уникальных объекта в радиусе 28 000 метров вокруг Москвы.


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


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


В результате был подготовлен набор данных для анализа из 20864 объектов (фитнес центров, кафе, ...), расположенных в 120 районах с их географическими координатами и категориями. Набор доступен по ссылке.
Таблица ниже демонстрирует выборку из этого набора.


Moscow venues dataset


Рисунок ниже демонстрирует пример расположения объектов в районах "Чертаново Южное" и "Южное Бутово".


Example of the some Moscow Boroughs and theis venues


3. Methodology


В соответствии с ключевыми критериями исследования необходимо:


  • определить районы с самым высоким населением и наименьшей ценой недвижимости
  • предоставить инструмент / методологию для определения близости конкурирующих фитнес объектов

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


  • описательный анализ, включая статистический анализ, анализ категориальных переменных и корреляционный анализ
  • сегментация с использованием K-Mean кластеризации

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


3.1. Exploratory Data Analysis


Набор данных со списком районов Москвы включает следующие ключевые переменные:


  • District_Name — наименование административного округа, в состав которого входит район
  • Borough_Area — площадь района в квадратных километрах
  • Borough_Population — население района
  • Borough_Population_Density — плотность населения района
  • Borough_Housing_Area — площадь жилой застройки района в тыс. квадратных метров
  • Borough_Housing_Price — средняя стоимость жилой недвижимости в районе в рублях

Таблица ниже показывает ключевую описательную статистику по укажанным переменным.


Descriptive statistical analysis


Как мы можем видеть, районы Москвы имеют очень неоднородную плотность населения от 12 194 до 253 943 человек.
Средняя стоимость недвижимости колеблется от 109 421 рублей/м? до 438 568 рублей/м?.


На рисунке ниже показана взаимосвязь между категориальной переменной District_Name и Borough_Population. Распределение населения между районами в разных округах существенно перекрываются, что не позволяет использовать переменную District_Name для классификации, но мы можем оценить, что наиболее густонаселенные районы расположены в районах «ЮЗАО», «ЮАО», «СЗАО» и «ЗАО».


'District' and 'Population'


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


'District' and 'Housing Price'


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


На рисунке ниже показана корреляционная зависимость между ключевыми переменными. Для настоящего исследования были приняты следующие типовые показатели статистической значимости корреляции (p-value):


  • p-value < 0.001: убедительные доказательства того, что корреляция значительна
  • p-value is < 0.05: есть умеренные доказательства того, что корреляция значительна
  • p-value is < 0.1: есть слабые доказательства того, что корреляция значительна
  • p-value is > 0.1: нет никаких доказательств того, что корреляция является значительной

Correlation matrix


Correlation matrix values


  • корреляция между Borough_Area, Borough_Population_Density и Borough_Population является статистически значимой, хотя линейная зависимость не очень сильная
  • корреляция между Borough_Housing_Area и Borough_Population является статистически значимой, и линейная зависимость чрезвычайно сильна
  • корреляция между Borough_Area, Borough_Population_Density, Borough_Housing_Area и Borough_Housing_Price не являются статистически значимыми, и линейная связь не является сильной
  • корреляция между Borough_Area и Borough_Population_Density является статистически значимой, а линейная связь чрезвычайно сильна

3.2. Clustering


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


Для этих целей, в исследовании была использована K-Means кластеризация с применением Elbow метода, который позволяет определить оптимальное количество кластеров, на которые будет выполнена сегментация.


Для применения Elbow метода, была выполнена пробная кластеризация с различным количеством центроидов (от 1 до 10). Для каждого варианта были посчитаны искажение (distortion) и инертность (inertia).


Ниже приведены графики зависимости Distortion и Inertia от количества центроидов.
На графиках отчетливо заметны переломы (elbows) на 3 и 5 центроидах.


В своем исследовании я решил остановиться только на одном варианте кластеризации с 3-мя центроидами.


'Elbow_Method_Distortion'


'Elbow_Method_Inertia'


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


  • количество районов в каждом кластере
  • суммарная популяция каждого кластера
  • суммарная площадь каждого кластера
  • средняя популяция по районам в каждом кластере
  • средняя стоимость недвижимости по районам в каждом кластере
  • % популяции кластера к общей популяции Москвы (в объеме исследования)
  • % площади кластера к общей площади Москвы (в объеме исследования)
  • плотность населения в каждом кластере

В следующей таблице показана собранная статистика
'Moscow_Clustering'


Сформированные кластеры имеют следующие отличительные особенности:


  • "0" кластер — характеризуется низкой средней популяцией (78538 человек на район), относительно высокой средней стоимостью недвижимости (173695 рублей/м?) и низкой плотностью населения (10328 человек/км?)
  • "1" кластер — характеризуется наибольшей средней популяцией (153187 человек на район), самой низкой средней стоимостью недвижимости (160741 рублей/м?) и наибольшей плотностью населения (13312 человек/км?)
  • "2" кластер — характеризуется низкой средней популяцией (79805 человек на район), наибольшей средней стоимостью недвижимости (333794 рублей/м?) и низкой плотностью населения (10533 человек/км?)

"1" кластер отлично соответствует критериям моего исследования:


  • районы из этого кластера имеют наибольшую среднюю популяцию населения и самую низкую средней стоимостью недвижимости
  • в 34 районах проживает 43% всего населения Москвы, при этом занимаемая ими площадь составляет 37% от всей площади Москвы, что означает максимальную плотность населения

Следующие схемы наглядно показывают сформированные кластеры в виде boxplot диаграмм.


'Cluster_Borough_Population_boxplot'


'Cluster_Borough_Housing_Price_boxplot'


На следующем рисунке показана фоновая картограмма (choropleth map) построенных кластеров
Как можно видеть, районы в целевом "1" кластере в основном расположены на периферии города Москвы.
Но не все районы периферии хорошо населены, поэтому не соответствуют нашим критериям.


'Moscow_Clustering_map'


4. Result


Результат моего исследования представлен в виде:


  • Списка оптимальных районов для расположения фитнес центров в соответствии с установленными критериями:
    • высокая плотность (количество) населения
    • низкая стоимость жилой недвижимости
  • Списка всех конкурирующих фитнес объектов, распределенных по категориям и районам из оптимального списка
  • Интерактивной тепловой карты (heat map) и фоновой картограммы (choropleth map) расположения конкурирующих фитнес объектов

Набор данных со списком оптимальных районов доступен по ссылке.
Таблица ниже демонстрирует выборку из этого набора.


Moscow_Recomended_Borough_df


Из 20864 найденных объектов (фитнес центров, кафе, ...), 928 соответствуют категории "Gym / Fitness Center", из которых 259 расположены в районах из оптимального списка.
Набор данных со списком конкурирующих фитнес объектов доступен по ссылке
Таблица ниже демонстрирует выборку из этого набора.


Moscow_gym_venues_df


Интерактивная тепловая карта (heat map) и фоновая картограмма (choropleth map) доступна по ссылке (HTML в zip архиве) Interactive map
На рисунках ниже показаны фрагменты карты.


gym_heatmap_big


gym_heatmap_smal


gym_250


5. Discussion


В ходе исследования мной была собрана следующая информация:


  1. список районов Москвы, содержащий:


    • наименование и тип каждого района и административного округа, в который он входит
    • площадь в км?, население и стоимость недвижимости в каждом районе

  2. географические координаты центра каждого района Москвы
  3. географические границы каждого района Москвы в формате GEOJSON
  4. список объектов (фитнес центров, кафе, ...), размещенных в каждом районе Москвы с указанием их географических координат и классификационных категорий

Собранная информация была выверена, очищена и опубликована на GitHub в виде набора .csv файлов.


Для сегментации районов по плотности населения и цене на недвижимость был использована K-Means кластеризация с применением Elbow метода. При исследовании графиков зависимости Distortion и Inertia от количества центроидов, я принял решение остановиться на одном варианте кластеризации с 3-мя центроидами. При необходимости может быть проведена альтернативная сегментация с 5 кластерами, которая может сформировать несколько отличный набор оптимальных районов для расположения фитнес центров.
Поэтому рекомендованный список районов следует рассматривать как отправную точку для более детального анализа.


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


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