С момента своего основания в 2008 году Airbnb предлагает туристам уникальный способ найти краткосрочное и долгосрочное проживание в семье во время путешествий. В рамках инициативы Airbnb Inside набор данных Boston Airbnb Listing описывает деятельность по размещению объектов недвижимости в Бостоне, Массачусетс.

Здесь я проанализирую набор данных Airbnb Boston Listings "отсюда", который включает около 130 описаний удобств, местоположения и цены для каждого объявления.

Помимо списков, Airbnb Inside предлагает два других типа наборов данных:

  • Отзывы: включает подробные комментарии гостей;
  • Календарь: показывает цены и наличие для каждого свойства.

Оригинальные наборы данных Airbnb можно найти здесь.

Бизнес-вызов

Если вы собираетесь стать хозяином на Airbnb, стоит понимать, как тип недвижимости, особенности и местоположение влияют на ваш доход. Таким образом, я построил две модели, чтобы: 1. спрогнозировать цены на недвижимость Airbnb в Бостоне с использованием выбранных функций, включенных в набор данных листингов, и 2. объяснить колебания цен одновременно с близостью от центра Бостона.

Понимание данных и моделирование

Мы структурируем анализ следующим образом:

  1. Какие самые распространенные property_type и room_type в Бостоне? И как влияет номер и тип собственности на бронирование?
  2. Какие наиболее распространенные amenities доступны в объявлениях на Airbnb Boston? В зависимости от наличия жилья, как удобства привлекают клиентов?
  3. Можем ли мы построить модель машинного обучения, которая прогнозирует собственность price на основе наиболее популярных и распространенных характеристик списков?
  4. Как выглядят корреляции между price и другими features_of_interest ?
  5. Как собственность price распределяется по Бостону - равномерно или неравномерно?
  6. Может ли модель линейной регрессии объяснить, как расстояние от центра Бостона предсказывает изменения в собственности price ?

Итак, приступим!

Q1: Какие типы недвижимости и номера наиболее распространены в Бостоне?

Мы сортируем propety_type значений и подсчитываем, сколько объявлений находится под каждым типом:

Apartment          2612
House               562
Condominium         231
Townhouse            54
Bed & Breakfast      41
Loft                 39
Other                17
Boat                 12
Villa                 6
Entire Floor          4
Dorm                  2
Camper/RV             1
Guesthouse            1
Name: property_type, dtype: int64

Из общего числа 3585 объектов недвижимости большинство объектов относятся к категориям «Апартаменты», «Дома», «Кондоминиумы», «Таунхаусы» и «Кровать и завтрак».

Сортируем room_type и подсчитываем, сколько объявлений находится под каждым типом:

Entire home/apt    2127
Private room       1378
Shared room          80
Name: room_type, dtype: int64

Q1.1: Влияние свойства и типа номера на бронирование

Здесь мы хотим увидеть влияние propety_type и room_type на будущие бронирования. Мы делим availability_30 на 30 (дней) и создаем новую переменную с именем booking_percentage_30, которая показывает процент дней, забронированных из следующих 30 дней для каждого объявления. Следовательно, booking_percentage_30 как переменная популярность собственности.

df_lis['booking_percentage_30'] = 1 - (df_lis['availability_30']/30)
df_lis['booking_percentage_30'].head()
0    1.000000
1    0.133333
2    0.366667
3    0.800000
4    0.566667
Name: booking_percentage_30, dtype: float64

В выходных данных выше мы нашли процент дней, зарезервированных из следующих 30 дней для каждого объявления. Например, недвижимость 3 забронирована на 80% на следующие 30 дней.

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

Сначала посмотрим на room_type:

df_lis.groupby(['room_type'])['booking_percentage_30'].mean().sort_values(ascending=False)

А потом на propety_type:

(df_lis.groupby([‘property_type’])[‘booking_percentage_30’].mean().sort_values(ascending=False)).plot(kind=’bar’, legend=None)

Результаты. Что касается типа комнаты, то, несмотря на то, что у всего дома более высокое количество, результаты показывают, что тип отдельной комнаты предпочтительнее, чем весь дом / квартира. Кроме того, для некоторых типов недвижимости очень мало объявлений, в отличие от апартаментов, домов, кондоминиумов. Такой тип собственности, как «Вилла», имеющий только 6 объявлений, может легко иметь более высокий процент бронирования, чем «Квартира», имеющий 2612 объявлений. Таким образом, мы делаем вывод, что лодки с 12 объявлениями менее популярны, чем Villa, с только 6 объявлениями. Квартиры: 2612 объектов, почти так же популярны, как и отели типа "постель и завтрак": 41 объект.

Q2: Какие наиболее распространенные удобства доступны в наборе данных Airbnb Boston?

Помимо информации, представленной в столбцах, столбец amenities предоставляет дополнительную подробную информацию о свойствах, таких как кухня, Wi-Fi, стиральная машина / сушилка.

Мы хотели бы знать, какие amenities самые популярные среди списков, а затем выбрать некоторые из них для прогнозирования price.

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

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

Q2.1: Как удобства привлекают клиентов?

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

Результаты: мы обнаружили - помимо второй по популярности услуги, которая, кажется, является столбцом без надписи, - наличие детектора дыма в собственности увеличивает процент бронирования на следующие 30 дней почти на 15. %. Кроме того, наличие зуммера / беспроводной внутренней связи, огнетушителя, беспроводного Интернета и замка на двери спальни - хорошие идеи для увеличения популярности объявления.

Q3: Можем ли мы построить модель для прогнозирования цены листинга на основе наиболее важных характеристик набора данных?

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

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

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

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

y = df_lis_ml['price']
X = df_lis_ml.drop(columns='price')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)
lm_model = LinearRegression(normalize=True)
lm_model.fit(X_train, y_train)
y_test_preds = lm_model.predict(X_test)
test_score = r2_score(y_test, y_test_preds)
print(test_score)

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

Теперь мы хотим проверить наиболее важные коэффициенты нашей модели, предоставляя оценки коэффициентов:

def coef_weights(coefficients, X_train):
coefs_df = pd.DataFrame()
    coefs_df['est_int'] = X_train.columns
    coefs_df['coefs'] = lm_model.coef_
    coefs_df['abs_coefs'] = np.abs(lm_model.coef_)
    coefs_df = coefs_df.sort_values('abs_coefs', ascending=False)
    return coefs_df
coef_df = coef_weights(lm_model.coef_, X_train)

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

Теперь мы тестируем диапазон значений k от 10 до 74 (это количество всех функций) и находим количество функций, которые генерируют наивысшее значение R².

Результаты: наивысший балл R² достигается при использовании 30 функций, а рейтинг R² составляет 0,226.

Вопрос 4. Как выглядят корреляции между price и другими features of interest ?

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

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

Вопрос 5. Как собственность price распределяется по Бостону - равномерно или неравномерно?

Поскольку latitude и longitude являются наиболее важными коэффициентами нашей модели для прогнозирования цены на недвижимость, стоит посмотреть, как цена на недвижимость распространяется по Бостону.

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

df_lis_map_price = df_lis[df_lis['price'] < 220]

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

Результаты. Глядя на карту, мы можем сделать вывод, что самые дорогие объекты недвижимости в основном сгруппированы вокруг следующих координат: 42,36 и - 71,060. Однако есть списки с высокими ценами, которые, например, сгруппированы в районе 42,36 и -71,150.

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

Мы используем пакет folium (https://pypi.org/project/folium/) для создания карты местоположений объектов и их относительных цен, используя информацию latitude и longitude для каждого свойства.

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

Вопрос 6. Может ли модель линейной регрессии объяснить, как расстояние от центра Бостона предсказывает изменения в собственности price ?

В пятом квартале мы определили, что самый горячий кластер в Бостоне с точки зрения цены расположен вокруг следующих координат: 42,36, -71,060. Между прочим, эти координаты очень близко совпадают с координатами центра Бостона.
В нашей предыдущей модели мы использовали latitude и longitude в качестве переменных наряду с другими функциями. Здесь мы будем использовать координаты только центра Бостона, чтобы создать новую переменную для каждого объявления: distance_from_Boston_Downtown

def distance_from_Boston_Downtown(lat, lon, downtown=[42.3557, -71.0572]):
    
    R = 6373.0
    lat1 = math.radians(downtown[0])
    lon1 = math.radians(downtown[1])
    lat2 = math.radians(lat)
    lon2 = math.radians(lon)
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = math.sin(dlat / 2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon / 2)**2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    distance = R * c
    return distance
for i in range(len(df_lis_ml)):
    df_lis_ml.loc[ i , 'distance_from_Boston_Downtown'] = distance_from_Boston_Downtown(df_lis_ml.loc[ i ,'latitude'] , df_lis_ml.loc[ i ,'longitude'])

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

y = df_lis_ml['price']
X = df_lis_ml.drop(columns='price')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)
lm_model = LinearRegression(normalize=True)
lm_model.fit(X_train, y_train)
y_test_preds = lm_model.predict(X_test)
test_score = r2_score(y_test, y_test_preds)
print(test_score)

Результаты: после расчета расстояния от центра города для каждого объекта мы обучаем модель. Модель имеетзначение 0,23, что означает, что 23% колебаний цен объясняется одним расстоянием от центра Бостона.

Теперь проверим коэффициенты новой регрессионной модели.

coef_df = coef_weights(lm_model.coef_, X_train)
coef_df[coef_df['est_int'] == 'distance_from_Boston_Downtown']

Результаты. Коэффициент детерминации указывает на то, что расстояние от центра города отрицательно влияет на цену, то есть по мере увеличения расстояния цена уменьшается. В частности, за каждый километр недвижимость падает примерно на 15 долларов.

использованная литература

Анализируемый набор данных Boston Airbnb находится на Kaggle: https://www.kaggle.com/airbnb/boston

Используемые библиотеки, набор данных и подробное описание кода доступны на моем GitHub:
https://github.com/OliviaCrrbb/Boston-Airbnb-Price-Analysis-Modelling

Благодарности

Спасибо Kaggle и AirBnb за набор данных и Udacity за курс.