Тематическое исследование с использованием данных из города Эдинбург, Шотландия

Ключевые слова: Airbnb, Эдинбург, город, наука о данных, панды, геопанды, геопространственные, foursquare, карты, matplotlib, моделирование, окрестности, сети, numpy, foursquare API, планирование, питон, городское планирование, визуализация данных

В рамках Сертификата профессионала в области науки о данных IBM мы можем попробовать свои силы в нашей собственной программе Data Science Capstone, где мы узнаем, что такое решение проблем, и ответим на вопросы, как специалист по данным. Для моего задания я решила сделать еще один проект, который изучает взаимосвязь между ценами Airbnb и их определяющими факторами. Да, есть несколько очень интересных проектов, таких как проект Лауры Льюис. "здесь". Я не смог бы сделать свой, если бы не прочитал и не понял ее (и ее код), так что слава! Однако, поскольку я всецело занимаюсь исследованиями в области транспорта, я добавил немного геопространственного анализа, изучив особенности местоположения как возможные предикторы. В этом сообщении немного объясняется фон проекта, сбор данных, очистка и предварительная обработка, моделирование и быстрое завершение.

  1. Предпосылки и цель проекта
  2. "Данные"
  3. Очистка и исследование данных
  4. Особенность локации
  5. Построение моделей
  6. Улучшение моделей
  7. "Заключение и рекомендации"

Чтобы получить полную записную книжку со всем кодом, вы можете проверить репозиторий на моем Github.

Предпосылки и цель проекта

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

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

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

Еще одна проблема? Мы, вероятно, упустим конкурентные преимущества, которые имеет наш листинг по сравнению с соседними списками, например, насколько он находится рядом с продуктовым магазином, пабом и другими дополнительными услугами, или, может быть, даже то, насколько хороши мои фотографии по сравнению с моими фотографиями.

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

Данные

Airbnb не публикует никаких данных, но отдельная группа под названием Inside Airbnb собирает и собирает общедоступную информацию о многих городах, перечисленных на веб-сайте Airbnb. Для этого проекта я использовал их набор данных, собранный 21 июля 2019 года в городе Эдинбург, Шотландия. Он содержит информацию обо всех объявлениях Airbnb в Эдинбурге, которые размещались на сайте в тот день (более 14 000).

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

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

Некоторые из наиболее важных функций, которые будут рассмотрены в этом проекте, следующие:

  • accommodates: количество гостей, которое может вместить аренда
  • bedrooms: количество спален, включенных в аренду
  • bathrooms: количество ванных комнат, включенных в аренду
  • beds: количество мест, включенных в аренду
  • price: посуточная стоимость аренды
  • minimum_nights: минимальное количество ночей, которое гость может проживать при аренде
  • maximum_nights: максимальное количество ночей, которое гость может проживать при аренде
  • number_of_reviews: количество отзывов, оставленных предыдущими гостями

Чтобы смоделировать пространственную взаимосвязь между ценами на аренду Airbnb и близостью собственности к определенным местам, я использовал Foursquare API для доступа к местам города, а уличная сеть доступна через OpenStreepMap (OSM).

Очистка и исследование данных

Короче говоря, исходный набор данных содержал 14 014 объявлений Airbnb и 106 функций, но я отказался от них. Например, некоторые из них представляют собой произвольные текстовые переменные, такие как описание объекта недвижимости и все письменные отзывы. Чтобы включить эти данные, мне пришлось бы выполнить некоторую обработку естественного языка, но, к сожалению, я не смог. Так что эти функции были отброшены. Кроме того, несколько столбцов содержали только одну категорию, поэтому они тоже были удалены. Большинство списков не предлагают функции впечатлений, так что это тоже было хорошо.

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

Также есть интересный исследовательский анализ данных. Один из выводов черт возьми, Шерлок заключается в том, что существует явная сезонность, когда речь идет о листингах, выходящих на рынок.

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

В остальное время года Эдинбург занимает уникальное положение как культурная столица не только Шотландии, но и Великобритании. Существует стабильный спрос на жилье и туризм, потому что Эдинбург является деловой столицей после Лондона.

Что касается изменений цен с течением времени, средняя цена за ночь для размещения на Airbnb в Эдинбурге немного выросла за последние 10 лет. Но верхний предел цен на недвижимость сильно вырос, что привело к большему увеличению средней цены по сравнению с медианной. Средняя цена в 2010 году составляла 107,33 фунта стерлингов, а медиана - 115,0 фунта стерлингов, тогда как средняя цена в 2018 году (последний полный год данных) составляла 104,55 фунта стерлингов, а медиана - 79,0 фунта стерлингов. По сути, владельцы дорогого жилья быстро открыли для себя преимущества использования Airbnb (в основном меньше налогов и меньше ответственности, но это уже другая история).

Особенность локации

А теперь самое интересное (для меня). При поиске жилья важно быть рядом с определенными туристическими районами. Но также знание того, что у вас будет продуктовый магазин или супермаркет в пешей доступности, может быть плюсом. Многим арендаторам нравится тот факт, что вы можете готовить себе еду (и сэкономить немного фунтов стерлингов), когда получаете Airbnb по сравнению с номером в отеле.

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

Большая часть объявлений Airbnb сосредоточена в районе Старого города Эдинбурга, что соответствует огромному притоку туристов, особенно во время ежегодного фестиваля Fringe.

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

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

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

Сначала мне пришлось загрузить геоданные:

map_df - это GeoDataFrame. Чтобы получить места для каждого района, я извлек широту и долготу или x и y из точечного объекта в GeoSeries. Следующий код возвращает x и y как отдельные столбцы GeoDataFrame в исходном map_df.

Затем мы создаем URL-адрес запроса API, делаем запрос GET и извлекаем информацию для каждого места, которое находится рядом с нашими районами. Эта очень полезная функция, представленная ниже, была предоставлена ​​нам во время курса Data Science. Он просматривает все окрестности, чтобы получить нужные нам данные:

Теперь мы запускаем указанную выше функцию для каждой окрестности и создаем новый фрейм данных с именем edinburgh_venues.

Как только мы получим это, мы сможем посмотреть на различные заведения в каждом районе. Для начала насчитывалось 182 уникальных категории заведений. Хотя там было довольно грязно. Итак, я очистил полученные данные, сгруппировал строки по соседству и взял среднее значение и частоту встречаемости каждой категории.

Это помогло мне найти 5 самых популярных заведений в каждом районе:

И сохраните его в фреймворке pandas, чтобы посмотреть и решить, какие места вам интересны:

При внимательном рассмотрении данных стало ясно, что наиболее распространенными заведениями были отель, паб, продуктовый магазин / супермаркет и кафе. / Кофейня, за которой идут Бар, Автобусная остановка и Индийский ресторан. Рестораны были разделены на подкатегории. Поэтому я объединил их в одну большую категорию Ресторан. Я подумал, что маловероятно, что наличие отеля поблизости повлияет на цену, потому что объявления Airbnb должны относиться к другой категории краткосрочной аренды. Они предлагают совершенно другие преимущества по сравнению с отелями. Так что я не рассматривал эту категорию заведений.

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

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

Для простоты в этом проекте я измерил доступность, измерив доступ к местам или достопримечательностям (POI), загруженным с Foursquare. Пабы, рестораны, кафе и супермаркеты / продуктовые магазины - это наши POI (набор данных из 441 POI).

Чтобы помочь с анализом доступности, предпочтительной библиотекой Python является Pandana. Pandana - это удобная библиотека графов, которая позволяет передавать фреймы данных Pandas в сетевой граф, который сопоставляет анализ уровня графа с базовыми операциями C. Все это означает, что это намного быстрее, чем традиционные графики на основе Python.

Чтобы начать анализ, мы должны получить данные уличной сети из OSM API, используя данные о местоположении Эдинбурга (ограничивающая рамка).

Затем после запуска кода из OSM загружается сеть с 51553 узлами. Когда мы сохраняем его в HDF5, вы заметите, что некоторые узлы исключены. Это может быть полезно при уточнении сети, чтобы она включала только проверенные узлы. Я использовал метод low_connectivity_nodes(), чтобы определить те узлы, которые не могут быть подключены к более крупной сети, и исключить их.

Наконец, мы рассчитываем доступность POI:

Результирующий фрейм данных выглядит так:

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

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

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

На этот раз еще более заметно, что Старый город и центральная часть Эдинбурга имеют лучшую доступность.

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

Вот код для установки расстояния до пятого ближайшего объекта в качестве комплексной меры доступности:

Итак, вот оно. Объект местоположения был создан и затем добавлен в набор данных для моделирования.

Создание моделей

Здесь проводилась большая подготовка данных, что, конечно же, находится в репо. Я не буду вдаваться в подробности, но в целом я очистил данные, проверил их на мультиколлинеарность и рассмотрел проблемные функции, преобразовал данные в журнал, что помогло сделать price более нормально распределенные, категориальные функции с горячим кодированием и стандартизировал их с помощью StandardScaler(). Наконец, я разбил данные на поезд-тест.

Использовались две модели:

  • Пространственная гедоническая модель цен (регрессия OLS) с LinearRegression из библиотеки Scikit-Learn
  • Метод повышения градиента с XGBRegressor из библиотеки XGBoost

В качестве показателей оценки использовались среднеквадратическая ошибка (для потерь) и r-квадрат (для точности).

Я выбрал регрессию гедонической модели, потому что они обычно используются при оценке и экономике недвижимости. В идеале следует провести тесты множителя Лагранжа, чтобы проверить, есть ли пространственное отставание в зависимой переменной, и поэтому модель пространственного отставания предпочтительнее для оценки пространственного HPM (см. Этот пост для пространственной регрессии с использованием Pysal). Однако для целей этого проекта я использую только обычную модель OLS для гедонической оценки цен, которая включает пространственные и географические особенности, но не пространственное отставание, которое учитывает пространственную зависимость.

Итак, первые объясняющие переменные - это характеристики листинга (accommodates, bathrooms и т. Д.), А вторая группа объясняющих переменных, основанная на пространственных и локационных характеристиках, - это Score, что является сетевым расстоянием до 5-го ближайшего места, которое мы вычислили с помощью Pandana; и Neighbourhood принадлежность, 1, если листинг принадлежит указанному району, 0 в противном случае.

Вот мой код для пространственной гедонической модели цены:

И результаты:

Таким образом, особенности объясняют примерно 51% дисперсии целевой переменной. Интерпретация mean_squared_errorvalue несколько более интуитивно понятна, чем значение r-квадрат. Как квадратный корень из дисперсии, RMSE можно интерпретировать как стандартное отклонение необъяснимой дисперсии, и его полезное свойство состоит в том, что он находится в тех же единицах, что и переменная ответа. Однако в этом случае переменная отклика преобразуется в логарифм, поэтому интерпретация не в исходной единице, а больше похожа на процентное отклонение. Более низкие значения RMSE указывают на лучшее соответствие. RMSE - хороший показатель того, насколько точно модель предсказывает отклик. Мы можем увидеть эту взаимосвязь графически с помощью диаграммы рассеяния:

Я также пробовал использовать Ridge Regularization, чтобы уменьшить влияние менее важных функций. Регуляризация хребта - это процесс, который уменьшает коэффициенты регрессии менее важных функций. Требуется параметр альфа, который контролирует степень регуляризации.

Я экспериментировал, перебирая несколько разных значений альфа, и смотрел, как это меняет результаты.

Вот что у меня получилось:

Да… ничего особенного не произошло. Значения RMSE и r² почти идентичны по мере увеличения значения альфа, что означает, что прогноз модели существенно не улучшается с моделью регрессии гребня.

Переходим к модели деревьев решений с градиентным усилением.

XGBoost (e X treme G radient Boost ing) - это реализация деревьев решений с градиентным усилением, разработанная для обеспечения скорости и производительности. Это очень популярный алгоритм, который в последнее время доминирует в прикладном машинном обучении для структурированных данных.

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

Вот код модели XGBoost:

И результаты:

В этой модели особенности объясняют примерно 65% дисперсии целевой переменной и имеют меньшее RMSE, чем модель регрессии SHP.

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

Как видите, в этой регрессионной модели XGBoost значимость значительного числа функций равна 0.

10 самых важных функций:

  1. Если сдается вся квартира или нет room_type_Entire home/apt
  2. Сколько человек вмещает в отеле (accommodates)
  3. Тип собственности (property_type_Other)
  4. Количество санузлов (bathrooms)
  5. Сколько дней доступно для бронирования из следующих 90 (availability_90)
  6. Количество отзывов (number_of_reviews)
  7. Политика отмены умеренная (cancellation_policy_moderate).
  8. Сколько еще объявлений есть у хоста (host_listings_count)
  9. Минимальное количество ночей (minimum_nights)
  10. Максимальное количество ночей пребывания (maximum_nights)

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

Самое забавное, что особенности локации не входят в первую десятку. Принадлежность к определенному району и Score (показатель доступности) имеют относительно низкую важность по сравнению с тремя основными характеристиками. Однако Review_Scores_Location_9/10 почти добрался до первой десятки. Довольно интересно.

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

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

Улучшение моделей

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

Вот результаты:

И, как и в случае с попыткой регрессии хребта, здесь тоже ничего особенного не произошло. И Spatial Hedonic Regression, и XGBoost работают почти одинаково без дополнительных столбцов обзора.

заключение и рекомендации

Если мы выберем модель для прогнозирования цены, это будет XGBoost без столбцов обзора. Он работает лучше, чем обе модели пространственной гедонической регрессии, и так же хорош, как первая модель XGBoost, но требует меньших вычислительных затрат. Тем не менее, он предсказывает только около 66% колебаний цены. Это означает, что у нас все еще есть оставшиеся 34,44% необъяснимых.

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

Например, учитывая важность отзывов клиентов о листинге при определении цены, более глубокое понимание отзывов, скорее всего, может улучшить прогноз. Можно было использовать Анализ настроений. Оценка от -1 (очень негативное мнение) до 1 (очень позитивное мнение) может быть присвоена каждому обзору для каждого объекта размещения. Затем оценки усредняются по всем обзорам, связанным с этим списком, и окончательные оценки могут быть включены в качестве новой функции в модель (см. Пример здесь).

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

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

Вот и все. Работать над этим проектом было очень весело.

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