Данные блуждания

«Где сегодня?» - Планирую поездку в Сингапур с кластерами

Составление планов поездок с помощью R, k-medoids и Google Maps

Планирование - непростая задача. Особенно, когда речь идет о путешествиях и неизвестных местах. Через пару дней я буду иметь удовольствие посетить Сингапур. Чтобы подготовиться к поездке в этот многонациональный, современный и дорогой (ой!) Город, я прочитал о нем книгу, поискал лучшие места для фотографий в Instagram и, в конце концов, создал специальную карту на Google Maps с некоторыми местами, которые я ' хочу посетить. Это выглядит так.

Посмотрев на карту и поняв, что я проведу в этом загруженном городе-государстве всего четыре дня, я спросил себя: «с чего мне начать?» и «как мне приспособиться?» моя повестка дня, чтобы я мог вместить все эти места за такой короткий промежуток времени? » Затем у меня возникла мысль.

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

«Хорошо, Хуан, это важно?» Наверное, нет. В конце концов, одна из самых крутых вещей в поездке в новый город - это заблудиться и исследовать его. Но послушайте, это похоже на забавный эксперимент и отличный способ совместить данные и путешествия.

Алгоритм: k-medoids

Когда я думал об алгоритме, который я должен использовать для кластеризации моих данных, я должен был иметь в виду фундаментальный факт: Земля не плоская. Таким образом, мне пришлось прибегнуть к алгоритму, который позволяет мне использовать специальную меру подобия, учитывающую кривизну Земли. Это алгоритм k-medoids. В отличие от своего знаменитого аналога, k-средних, k-medoids - это алгоритм кластеризации на основе расстояния, который можно использовать с произвольной мерой расстояния, в то время как модель k-средних основана на минимизации дисперсии, которая в данном случае представляет собой сумму квадратов ошибки.

Формула подобия, которую я использовал вместе с k-medoids, известна как Haversine, метрика, которая определяет расстояние между двумя точками на сфере с учетом их долготы и широты (Https://en.wikipedia.org/wiki/Haversine_formula); для этого эксперимента единицей измерения расстояния являются километры.

Разобравшись с этой предысторией, давайте соберем данные.

Сбор данных

Замечательной особенностью Моих карт Google является то, что он позволяет легко экспортировать карты и закрепленные местоположения во внешний файл. Для этого щелкните слой карты, отметьте параметр экспортировать как KML и загрузите его. Результатом является KML-файл, представляющий собой XML-файл, соответствующий стандартному формату. Когда у вас есть данные, следующим шагом будет преобразование их в красивую и аккуратную таблицу, и есть два способа сделать это.

Первый - вручную. Если ваша карта состоит из нескольких точек, вы можете просто найти <coordinates> узлы в файле .kml и вставить их вместе с названием местоположения (если вам интересно) в другой файл (возможно, CSV).

Неручный способ включает в себя синтаксический анализ файла для извлечения информации из узлов. Простой способ сделать это в R - использовать пакет map tools и функцию getKMLcoordinates, которая принимает в качестве параметра путь к файлу и автоматически создает матрицу, состоящую из координат (для точное как увидеть сценарий на моем GitHub; ссылка в конце).

Теперь, когда у нас есть аккуратный и чистый набор данных, пора его сгруппировать.

Кластеризация

Для кластеризации данных я использовал реализацию k-medoids R из пакета cluster. Чтобы применить ее, нужно вызвать функцию pam, используя в качестве параметра набор данных и количество желаемых кластеров. Нравится:

pam(df, k = 4)

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

pam(distances, k = 4, diss = TRUE)

Затем мы наконец можем объединиться. Что касается параметра 'k', я выбрал 4, так как планирую провести в городе четыре или пять дней. Кластеры выглядят так.

Круто, правда? Однако, поскольку эта статья посвящена Сингапуру и местам, которые мне интересно посетить, нам нужна карта, чтобы лучше понять смысл кластеризации, и, конечно же, для этого есть пакет R (больше похожий на несколько).

Выбранный мной пакет называется ggmap, библиотека, которая предоставляет оболочку для Google Maps API, позволяющую загружать карты непосредственно в R. Еще лучше то, что этот пакет полностью совместим с ggplot2, упрощая наложение дополнительных слоев графика поверх диаграммы. С помощью этой функции я нарисовал кластеры на карте Сингапура. Вот как это выглядит.

Здесь мы можем увидеть четыре кластера и области, которые они граничат, каждая из которых обозначает места, которые я должен посетить за эти четыре дня. Северный кластер (пурпурный) находится на вершине региона заповедника Букит Тимах, намекая на то, что мне нужно потратить один день только на то, чтобы посетить этот район и места, отмеченные на нем (что я действительно мог бы сделать). Прямо под ним находится синий кластер, который указывает на оживленный центр города. Затем, на красном, у нас есть кластер района Сентоза, и, наконец, справа, район аэропорта, который я обязательно посещу, потому что там есть центр покемонов и торговый центр, который выглядит прямо из научно-фантастического фильма. Чтобы получить более подробное представление о местах, я покажу увеличенные версии четырех различных кластеров.

Это природный заповедник.

Затем, на следующем изображении, у нас есть остров Сентоза. Видите точку слева? В этом баре подают местное пиво. Но более того, этот момент представляет собой главную ловушку, которую я обнаружил в своей методике, а именно неправильный расчет фактического расстояния, которое мне нужно пройти. Расстояние Хаверсина просто говорит нам о расстоянии от одной координаты до другой, учитывая только кривизну Земли. Однако, к сожалению, у меня нет крыльев или частной лодки, чтобы доставить меня прямо с Сентозы до бара. Подразумевая, что расстояние, которое мне нужно пройти, будет выше, чем рассчитанное по формуле - и это без учета подъемов и спусков, которые также добавляют пару метров к общему пройденному расстоянию, но Сингапур довольно плоский, так что это неважно. Тем не менее, я решил проигнорировать эту деталь, и, честно говоря, я действительно мог попасть в бар, проведя день на солнечном острове.

Центр города.

И, наконец, аэропорт.

Это самый маленький кластер, состоящий всего из двух точек. Означает ли это, что я посвящу один день именно этому? Хотя я мог бы провести разумное количество времени в Центре покемонов, нет, я не буду проводить здесь целый день. Честно говоря, в этот день я посетлю некоторые достопримечательности центра города.

Что касается того факта, что в этом кластере всего две точки, это можно решить, выбрав другой алгоритм кластеризации, например, основанный на плотности, такой как DBSCAN. Этот вид алгоритма требует в качестве гиперпараметра эпсилон-значения, которое определяет минимальное количество точек, которое должен иметь кластер.

Кластерный анализ

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

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

В первом столбце указан размер кластеров. Как мы видели ранее, самое маленькое состоит из двух наблюдений, а самое большое (район Даунтаун) имеет 22 места. Затем во втором столбце указывается максимальное несходство (max_diss), то есть расстояние между медоидом кластера и его самой дальней точкой. Например, max_diss кластера 2 составляет 7,41 (километров, помните), что означает, что мне нужно пройти (теоретически) 7,41 км. чтобы добраться до его центра, если я начну с парка Восточного побережья. Подобно max_diss, у нас есть av_diss, среднее несходство (от центра центроида). Четвертый столбец содержит диаметр, который представляет собой максимальное различие между двумя точками одного и того же кластера, за которым следует оценка разделения, минимальное различие между точками данных одной группы. и точка данных из другого.

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

y = -251.4 + 1470.4 * X

Где X - расстояние (в км). Итак, если я хочу знать приблизительное количество шагов, необходимых для выполнения каких-либо действий, обсуждаемых ранее, мне просто нужно заменить X на значение. Например, прогулка от Центра покемонов до парка Восточного побережья (расстояние 10,780345 км.) Займет у меня 15600,02 шага. Разве это не круто?

Вывод

В этой статье я описал, как я определил план своего предстоящего визита в Сингапур. Имея немного данных, карты Google и k-medoids, я обнаружил места, которые мог бы посещать каждый день. Согласно кластеризации, я должен провести один день в природном заповеднике, один день в центре города, еще один на острове Сентоза и один в аэропорту. Буду ли я следовать этому плану? Некоторые части, да. Думаю, мне придется подождать, пока я приду, чтобы увидеть, насколько это практично.

Код, используемый для этого проекта, включая наборы данных, доступен на моем Github: https://github.com/juandes/wanderdata-scripts/tree/master/unsupervised-city-planning/singapore

Надеюсь, вам понравилось это и вы узнали что-то новое. Если у вас есть какие-либо вопросы, пояснения или какие-либо несоответствия здесь, оставьте комментарий.

Эта статья является частью моей серии Wander Data, в которой я рассказываю и переживаю свои истории о путешествиях с данными. Чтобы увидеть больше о проекте, посетите wanderdata.com.

Спасибо за чтение :)