Airbnb собирает огромное количество данных о своих предложениях и делает их доступными для всех, кто заинтересован в их анализе. В контексте программы Наностепень Udacity Data Scientist я решил написать о своих выводах после применения CRISP-DM (межотраслевой процесс интеллектуального анализа данных) к Airbnb. данные по 3 городам Франции: Бордо, Лион и Париж.

Что такое CRISP-DM?

Межотраслевой процесс интеллектуального анализа данных состоит из 6 этапов, взаимодействие которых можно проиллюстрировать на схеме ниже (источник: Википедия); в контексте проекта Airbnb/Udacity эти этапы можно описать следующим образом:

  • Бизнес-понимание: Airbnb – это веб-платформа, предназначенная, в частности, для связи между владельцами жилья и людьми, которые хотели бы арендовать это жилье на ограниченный срок (например, , дело, удовольствие).
  • Понимание данных: предоставленные данные состоят из трех файлов, содержащих сами объявления (например,, описание, цена, местоположение, информация о хозяине, удобства), календарь (например,, дата, доступность, цена) и отзывы. Поскольку я не хочу иметь дело с дополнительной сложностью НЛП (обработка естественного языка) в контексте этого проекта, я буду использовать только данные списков и календаря. .
  • Подготовка данных. Данные очень редко бывают «чистыми» и готовыми к обработке. Вместо этого достаточное количество времени должно быть посвящено выяснению того, как поступать с проблемными данными, такими как отсутствующие значения/бесполезная информация/выбросы, как обрабатывать даты, числовые значения, строковые значения и т. д. Этот этап обычно занимает больше всего времени. полный.
  • Моделирование. Обычно это этап, которого с нетерпением ждут большинство энтузиастов машинного обучения, таких как я. Цель состоит в том, чтобы применить методы машинного обучения, например, для прогнозирования значений некоторых функций или для кластеризации данных. В контексте этого проекта я попытаюсь предсказать цены на основе некоторых других функций.
  • Оценка. Эффективность описанного выше этапа моделирования оценивается с использованием различных показателей. Это может привести к созданию модели, готовой к развертыванию в рабочей среде (см. этап развертывания ниже) и/или к ответам на вопросы, что я и сделаю в этом проекте.
  • Развертывание: модель, которая считается достаточно хорошей для того, чтобы делать реальные прогнозы, может быть развернута для использования в производственной среде. Этот этап здесь обсуждаться не будет.

Ниже приводится краткое описание процесса CRISM-DM, который я применил для анализа данных Airbnb. Технические детали можно найти в одном Jupyter Notebook, хранящемся в моем репозитории Github. Время от времени случается, что Github не отображает блокноты Jupyter, поэтому доступен альтернативный рендеринг HTML.

1 — Бизнес-понимание

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

Airbnb предлагает предложения по всему миру.

2 — Понимание данных

После загрузки данных в Jupyter Notebook очевидным первым шагом является измерение количества данных, с которыми мы будем иметь дело, и визуализация их подмножества (обычно первые 5 или 10 строк). На этом этапе я хранил данные по Бордо, Лиону и Парижу отдельно (для тех, кому может быть интересно, почему я перечисляю 3 города именно в таком порядке, если Париж — столица Франции: в алфавитном порядке…).

В таблице ниже показано количество данных, которые будут получены на следующих этапах CRISP-DM. Обратите внимание, что я не пытался измерить Отзывы для Лиона и Парижа, так как я заметил это, просматривая этот файл для Бордо, что данные интересны только при применении НЛП, что могло бы стать предметом отдельной статьи.

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

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

Вопросы

Можно искать Данные, чтобы ответить на существующие Вопросы, или получить Вопросы, просматривая существующие Данные. Последнее верно здесь, так как я решил загрузить данные Airbnb, как было предложено в контексте проекта Udacity в партнерстве с Airbnb. Просто взглянув на информацию, представленную в 2 файлах, которые я выбрал для анализа, на ум пришли следующие 3 вопроса:

  1. Распределение цен: насколько по-разному распределяются цены в трех разных городах? Другими словами, если предположить, что у нас есть некоторое гауссово распределение количества предложений (ось Y) в определенных ценовых категориях (ось X), которое у нас действительно есть , мы увидим, что ниже — это кривые, похожие по форме и по расположению относительно диапазона цен. ?
  2. Сезонные колебания цен: здесь мы сравним распределение цен (ось Y) примерно за один год (ось X).
  3. Функции для объяснения цен. Здесь будет использоваться машинное обучение — в частности, модель случайного леса, — чтобы определить, какие типы функций имеют наибольшее влияние на цену листинга.

3 — Подготовка данных

Как и в случае с подавляющим большинством наборов данных, 6, которые мы будем использовать — по 2 для всех 3 городов — нужно немного «подчистить». Это делается в два этапа, соответствующих вопросам 1 и 2, которые касаются набора данных календаря, а затем вопросу 3, который посвящен набору данных списков.

Очистка набора данных календаря

  • Удалите все точки данных с отсутствующей ценой, поскольку меня изначально интересуют распределение цен и сезонные колебания цен.
  • Замените цены в строковом формате (например,, "$1500") эквивалентными им числовыми значениями (например,, " 150 долларов» становится 150).

Вопрос 1. Имеют ли Бордо, Лион и Париж разные распределения цен?

Визуализируйте распределение цен

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

Хотя цены в Париже, как правило, достигают более высоких верхних пределов, чем в Бордо и Лионе, все 3 кривые выравниваются в диапазоне 400–800 долларов; Я решил построить распределение цен ниже и выше 500 долларов (разные масштабы), чтобы лучше рассмотреть потенциальные различия между тремя городами.

Вопрос 1 — Заключение

Три графика слева показывают, что Бордо, Лион и Париж имеют очень сходное распределение цен в большей части ценового диапазона, ниже 500 долларов США. Три графика справа показывают, что Париж предлагает большее предложение выше 500 долларов США. Хотя Бордо и Лион — красивые города, Париж привлекает больше иностранных туристов, что может объяснить разницу в верхнем ценовом диапазоне.

Вопрос 2. Имеют ли Бордо, Лион и Париж одинаковые сезонные колебания цен?

Визуализируйте сезонные колебания цен

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

Вопрос 2 — Заключение

График выше дает 2 основных наблюдения:

  • Ценыв течение года в Париже намного выше, чем в Лионе и Бордо, что опять-таки можно объяснить тем, что Париж находится в топ-3 самых посещаемых городов мира; это также экономическая столица Франции и выше (население 2,2 млн человек). Лион (население 500 тыс.) больше, чем Бордо (население 250 тыс.), что может объяснить, почему цены в первом немного выше; Кроме того, Бордо находится недалеко от Атлантического океана и многочисленных пляжных курортов, которые привлекают множество туристов за пределы города.
  • Цены достигают пика во всех трех городах в период праздников в конце года, но Париж привлекает людей в течение всего года с дополнительным пиком в период осени. >когда многие туристы — часто без детей, вернувшиеся в школу — приезжают в столицу после того, как летняя жара и толпа отступили.

Слияние и очистка набора данных списков

В рамках подготовки к этапу Моделирование (4-й в CRISP-DM) я объединим 3 набора данных списков для Бордо, Лион и Париж и очистите получившийся. Поскольку я больше не буду сравнивать 3 города, слияние создаст набор данных с большим количеством точек данных, что должно привести к более точным прогнозам. Но чтобы не потерять информацию о городе, я добавляю три функции «Бордо», «Лион» и «Париж», где точка данных будет иметь 1 в столбце, соответствующем городу, к которому она принадлежит, и 0 в другом столбце. 2.

Как видно из таблицы выше, набор данных списков имеет гораздо больше возможностей, чем календарь; это возможность выполнить более глубокую очистку:

Удалите некоторые функции:

  • свободный текст, поскольку в контексте этого проекта не будет выполняться НЛП, а также URL-адреса и идентификаторы;
  • лишниефункции (например,, местоположение: просто сохранено ‘neighbourhood_cleansed’);
  • % отсутствующих значений: функции со слишком большим количеством отсутствующих значений склонны к искажению результатов; в этом случае я удаляю все функции с более чем 50% отсутствующих значений;
  • низкая изменчивость: признаки, значения которых идентичны для подавляющего большинства точек данных, представляют слишком мало интереса для прогнозирования;
  • применяя «здравый смысл бизнеса», чтобы решить, какие функции кажутся наименее важными для нашего анализа.

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

One-Hot кодирует категориальные данные: например, если категориальный — в отличие от числового — признак может принимать значения ['X', 'Y', 'Z'], он будет заменен на 3 объекта, где «X» = 1, если исходный объект точки данных равен «X», и 0 в противном случае. Этот трюк улучшает производительность многих алгоритмов прогнозирования.

Нормализуйте числовые данные: в этом конкретном случае я делаю все числовые значения признака лежащими между 0 и 1; это гарантирует, что функции с большим значением не будут считаться более важными, чем функции с низким значением (например,, площадь в квадратных футах по сравнению с количеством спален).

Упростить, например:

  • функция «calendar_updated» принимает такие значения, как «2 дня назад», «неделю назад», «23 месяца назад»; горячее кодирование генерирует слишком много новых функций, поэтому я заменяю их все только тремя функциями: «calendar_updated_up_to_1_year», «calendar_updated_over_1_year» и существующий «calendar_updated_never».
  • функция «удобства» — это список, содержащий такие элементы, как «ТВ», «Интернет», «Кондиционер» и т. д. Вместо горячего кодирования каждого возможного значения как уникальной функции, я просто заменил эту функцию на «количество_удобств»: количество удобств для каждого списка.
  • Функции даты «first_review» и «last_review» были заменены количеством дней между ними, точно так же, как функция даты «host_since» была заменена продолжительностью в днях.

4 — Моделирование

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

Я попробовал две модели регрессии; они используются для прогнозирования непрерывных значений, таких как цены в данной конкретной ситуации. Не вдаваясь в технические детали (см.. Github Repository), модель линейной регрессии с этим набором данных показала себя ужасно; к счастью, модель Регрессия случайного леса показала себя намного лучше и позволила мне отсортировать все функции, оставшиеся в наборе данных, по степени их влияния на цену каждого листинга.

5 — Оценка

Вопрос 3 — Какие функции больше всего влияют на цены?

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

Вопрос 3 — Заключение

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

  • Окрестности: после очистки данных, кроме города, "neighbourhood_cleansed" – это единственная функция, связанная с местоположением. Это вполне логично, потому что люди будут платить больше, чтобы жить в хорошем районе, где, скорее всего, есть жилье более высокого класса. Данные смогли подтвердить эту интуицию.
  • Тип ресурса: это связано с пунктом выше. Интересно отметить, что более дешевое жилье (например, кемпер/дом на колесах, шале, пещера, кемпинг, хижина, земляной дом, купольный дом) так же вероятно влияет на цены, как и более дорогое жилье ( например, курорт, поезд, казино, остров), но, конечно, не в том же направлении...

Вывод

С «показателем R2» 90 % для обучающих данных и только 43 % для тестовых данных я мог бы намного лучше выполнить предварительную обработку данных, например, анализируя комментарии и обзоры с помощью обработки естественного языка ( NLP станет предметом другого проекта Udacity Data Scientist Nano Degree) и с помощью анализа основных компонентов (PCA создает «гибридные» функции, но скрывает исходные функции, не позволяя мне ответить на мой третий вопрос). Кроме того, я мог бы потратить больше времени на точную настройку моей модели, которую я едва выполнил с помощью перекрестной проверки.

Завершение этого проекта заняло у меня гораздо больше времени, чем я ожидал. Это научило меня многому о CRISP-DM и подтвердило то, что все в индустрии науки о данных кричат ​​миру: не менее 80 % времени, отведенного на проект по науке о данных/машинному обучению, тратится на очистку данных (т.е. /em>, этап 3 — Подготовка данных процесса).