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

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

С какими почтовыми индексами в округе Лос-Анджелес больше всего магазинов Starbucks на душу населения?

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

Определите конечную цель

Наша конечная цель - создать картографическую карту округа Лос-Анджелес. Наша хороплетная карта - это, по сути, карта, которая будет отвечать следующим требованиям:

- Все границы почтового индекса должны быть нарисованы

- Каждый почтовый индекс должен быть окрашен с различной интенсивностью в зависимости от количества магазинов Starbucks на душу населения

Какие типы данных нам нужны?

Итак, нам определенно нужны какие-то географические данные, чтобы нарисовать почтовые индексы. Нам также нужна информация о местонахождении каждой кофейни Starbucks в округе Лос-Анджелес. И, конечно же, нам нужна информация о населении округа Лос-Анджелес по почтовому индексу. Подводя итог, нам понадобится:

1. Географические данные границ почтового индекса в округе Лос-Анджелес (предпочтительно файл GeoJSON, который представляет собой JSON, описывающий сложные формы)

2. Местоположение каждого магазина Starbucks в округе Лос-Анджелес (желательно электронная таблица с почтовым индексом каждого магазина)

3. Население округа Лос-Анджелес по почтовому индексу (предпочтительно в виде таблицы)

Где мы можем найти данные?

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

Географические данные кажутся достаточно простыми, и некоторые поисковые запросы в Google по запросу la county zipcode geojson в конечном итоге привели к тому, что я нашел соответствующий GeoJSON, хранящийся на моем GitHub здесь.

Данные о местонахождении магазина Starbucks оказались сложнее. Либо наборы данных, которые я обнаружил, были устаревшими, либо относились к штату, а не округу. Чтобы получить эти данные, мне пришлось провести очень осторожный запрос API к официальному Локатору магазинов Starbucks. На самом деле, этот процесс был достаточно интересным, чтобы я написал об этом отдельный пост на Medium:



Что касается набора данных о населении, я нашел в Интернете несколько готовых электронных таблиц для того, что я хотел, но я, честно говоря, не был уверен в их достоверности. Я подумал, что гораздо безопаснее получать данные о населении прямо из Бюро переписи населения США. Для получения этих данных потребовался очень конкретный вызов API Бюро переписи, и у меня есть целая статья, посвященная этому процессу:



Вы можете найти все три результирующих набора данных на моем GitHub:

  • округ Лос-Анджелес GeoJSON здесь
  • набор данных о местоположениях Starbucks округа Лос-Анджелес находится здесь
  • Население округа Лос-Анджелес по набору данных по почтовому индексу находится здесь

Как мы будем объединять наборы данных?

Итак, у нас есть нужные данные. Теперь давайте придумаем стратегию того, как объединить все это вместе, чтобы сделать карту, которую мы хотим. Чтобы составить карту, нам нужно количество магазинов Starbucks на душу населения для каждого почтового индекса в округе Лос-Анджелес. В настоящее время у нас есть две части, необходимые для создания этой метрики, данные о населении и данные для хранения, но их нужно объединить.

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

Что-то вроде этого:

Этап 1. Объединение данных о населении и местонахождении магазина

Давайте посмотрим на снимки двух таблиц, чтобы определить, как мы можем объединить их.

Данные о населении

Данные о местонахождении магазина

Кажется, мы сможем объединить два набора данных в их столбцах с почтовыми индексами, но есть одна проблема. Данные о местонахождении магазина содержат по одной строке для каждого магазина Starbucks в округе Лос-Анджелес, но мы действительно хотели бы иметь одну строку для каждого почтового индекса с общим количеством магазинов в качестве другого столбца. Давайте воспользуемся python, чтобы выполнить несколько быстрых и грязных преобразований данных!

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

Теперь давайте объединим два набора данных:

Впоследствии connectedDf выглядит так:

Почему некоторые записи являются NaN? Что ж, если определенный почтовый индекс существует в наборе данных о населении, но не в наборе данных о магазинах, его значение numStores будет отсутствовать, и наоборот. Мы решим эту проблему за секунду.

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

Полученный в результате connectedDf выглядит так:

Отлично! Этап 1 завершен; у нас есть фрейм данных с магазинами на душу населения для каждого почтового индекса.

Этап 2. Составление карты магазинов на душу населения с использованием географических данных

Теперь, когда у нас есть набор данных, содержащий магазины на душу населения, мы можем нанести эти значения на карту округа Лос-Анджелес, детали формы которого хранятся в наших географических данных. Давайте создадим нашу картограмму!

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

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

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

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

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