Этот проект родился после беседы с друзьями об инвестициях в недвижимость. Обсуждали, как выгодно купить квартиру, паркинг или келлер под сдачу и выгодно ли вообще.
Я решил проанализировать рынок продажи и аренды гаражей и парковочных мест своего города. Квартиры – слишком дорогие объекты для инвестиций, а что касается гаражей и паркингов – тут «вход» гораздо меньше, и на аренду вроде бы всегда есть спрос.
![](https://habrastorage.org/getpro/habr/upload_files/5f6/787/310/5f67873101ce3709260a62e17296f2f8.jpg)
При оценке инвестиций на первом план всегда выходят два параметра: объем вложений (стоимость объекта) и рентная плата. Зная эти параметры, можно рассчитать срок возврата инвестиций. Безусловно, есть и другие параметры, как то, качество объекта, уровень спроса на аренду, динамика стоимости объекта во времени и т.д. но именно цена покупки и арендный доход определяют стоит ли вообще рассматривать такой объект.
Я решил найти среди объявлений на продажу с одной стороны такие объекты, для которых цена по каким-либо причинам несколько занижена. Например, собственник при выставлении объекта не оценил соседних предложений, или ему нужно продать объект срочно. С другой стороны, меня интересовали те объекты, которые расположены географически в зонах повышенного арендного спроса, где арендные ставки высокие.
Для решения данной задачи я скачал спарсенные с нескольких популярных сайтов недвижимости объявления о продаже и аренде гаражей и паркингов Екатеринбурга за последний месяц. Получил, соответственно, два датафрейма – объекты, выставленные на продажу и объекты, сдающиеся в аренду. Среди прочих данных в датасетах была представлена следующая информация:
Название - название, присваиваемое площадкой объявлений автоматически при публикации объявления
Цена - цена, определенная собственником при подаче объявления
Дата - дата подачи объявления
Описание - характеристика объекта от продавца в произвольной форме
lat - географическая широта точки расположения объекта в градусах
lng - географическая долгота точки расположения объекта в градусах
Доп.параметры - характеристика объекта, составленная площадкой объявлений автоматически по данным, которые продавец вводит при подаче объявления
С какими проблемами я столкнулся в ходе обработки данных?
1. В датасетах было много дублей, которые получались, например, по тому, что собственники гаражей выкладывали объявления сразу на несколько сайтов. При этом они используют одинаковое описание и выставляют одинаковую цену. Поэтому, такие объявления можно распознать по одновременному совпадению этих двух параметров. Дубликаты удаляются из датасета.
df_sel = df_sel.drop_duplicates(subset=['Описание', 'Цена'])
2. Часть объектов является двойными, или даже тройными местами. То есть, такими, где могут разместится два автомобиля, и которые, соответственно, можно сдать двум арендаторам. Проблема заключалась в том, что среди параметров объектов не было признака, указывающего на то, одноместный объект, или двойной. В доп.параметрах была указана площадь. Поэтому пришлось вытащить ее оттуда и записать в дополнительный столбец.
df_sel['Доп.параметры'] = df_sel['Доп.параметры'].where(df_sel['Доп.параметры'].str.contains('Площадь'), other=np.nan)
Однако, у части объявлений информация о площади отсутствовала.
![](https://habrastorage.org/getpro/habr/upload_files/14c/4fe/81f/14c4fe81f25eefbae01275c3beda09a2.png)
Несмотря на то, что объектов с неопределенной площадью достаточно мало, около 5%, мы не можем просто отбросить их. Дело в том, что наличие или отсутствие этих объектов мало значимо для всего рынка, но локально в своих микрорайонах учет или не учет этих объектов может дать неправильные ценовые сигналы. Поэтому задача определения, к какому типу относятся эти объекты (одноместным или двухместным) сохраняется.
Я принял допущение о том, что место считается двойным, если его площадь больше или равна 30 м2. И, если площадь меньше 30 м2, то считаем это одинарным местом. Посмотрим, как распределены по ценам одноместные паркинги, двухместные паркинги и паркинги с неопределенной площадью.
![](https://habrastorage.org/getpro/habr/upload_files/ac4/925/6d0/ac49256d0a99874e80f9384a240a4c0f.png)
Как видно из графика, кривая распределения двухместных паркингов смещена вправо, что достаточно очевидно, т.к. чаще всего они дороже одноместных. Кривая распределения объектов, по которым площадь не определена больше походит на кривую распределения одноместных. Однако, из этого нельзя сделать вывод о том, что все объекты с неопределенной площадью являются одноместными паркингами, так как по кривой распределения видно, что среди них есть очень дорогие объекты.
Поэтому выделять из объектов с неопределенной площадью двухместные места нужно другим способом. Попробуем из описания, которые дают собственники выделить слова, которые характерны для одноместных и двухместных объектов. Для этого используем класс counter модуля collections. Выведем ТОП-30 слов, которые используются собственниками при описании своих объектов. Слова отсортированы по убыванию частоты использования.
![](https://habrastorage.org/getpro/habr/upload_files/a31/c5f/90d/a31c5f90dcad654d5ee9659d8468c11c.png)
Нельзя сказать, что данный метод позволил однозначно дифференцировать объекты по количеству мест, но результаты вполне ожидаемые. Например, то, что на первом и втором месте по наиболее часто встречающимся словам среди двухместных объектов именно слова "2" и "два". Так же, интересно то, что на третьем месте слово "смотровая". Действительно, смотровые ямы чаще свойственны большим гаражам. (Для одноместных объектов "смотровая" только на 27-м месте).
Теперь составим список слов, которые с наибольшей вероятностью встречаются в описании двухместных паркингов. Я взял следующие слова и словосочетания:
'2 машиноместа', '2 паркинга', '2 гаража', 'двойное', 'семейное', 'семейный', 'два', 'две', 'Два', 'места'
Объявления с неопределенной площадью разделим на одноместные и двухместные по такому признаку: если в их описании встречаются слова из списка, приведенного выше, то этот объект является двухместным, иначе – одноместным. Затем посмотрим, соответствует ли распределение объявлений с вновь определенным типом распределению объектов с заранее известной площадью.
![](https://habrastorage.org/getpro/habr/upload_files/54c/72a/929/54c72a929e1e594fb625915f490c3a8b.png)
![](https://habrastorage.org/getpro/habr/upload_files/a42/de3/8a2/a42de38a25f59dcf79467381e8f578b6.png)
На графиках видно, что кривые распределения объявлений с вновь определенными признаками и объявлений, по которым признак был заранее известен, похожи друг на друга.
На основании признака одноместный/двухместный разделяем все объявления о продаже на два датафрейма – одноместные и двухместные паркинги.
Таким образом, по результатам обработки данных, получили следующую статистику по объектам, выставленным на продажу:
![](https://habrastorage.org/getpro/habr/upload_files/b3d/fe9/0d3/b3dfe90d3e2b3e24efceadb310f761ac.png)
![](https://habrastorage.org/getpro/habr/upload_files/bf7/024/104/bf70241042afeb70dc86fcfa4df328f4.png)
![](https://habrastorage.org/getpro/habr/upload_files/bd5/771/d39/bd5771d3997b5215ee74344a6a5d18d6.png)
Теперь все те же действия проделываем с объектами, сдающимися в аренду и получаем по ним следующую статистику.
![](https://habrastorage.org/getpro/habr/upload_files/ec5/be9/9be/ec5be99bebff260786f0c4f998f451db.png)
![](https://habrastorage.org/getpro/habr/upload_files/bd6/687/aa2/bd6687aa21d720ccad34f6afba3cfabf.png)
![](https://habrastorage.org/getpro/habr/upload_files/69e/9d9/b1f/69e9d9b1fc1d39371b7adbff9d8a68b8.png)
Поиск инвестиционных объектов
Задача определения объектов, наиболее интересных для инвестирования заключается в следующем. Среди всех выставленных на продажу объектов нужно найти такие, которые расположены в зонах повышенного арендного спроса. Т.е. там, где сформированы наибольшие арендные ставки. И если соотношение цены продающегося объекта и средней (или медианной) цены на аренду в этой зоне находится на определенном уровне, обеспечивающим возврат инвестиций в заданные сроки, то такой объект является перспективным с точки зрения инвестирования для сдачи его в аренду.
Для решения этой задачи необходимо сформировать арендные зоны (кластеры) по территориальному признаку. Для формирования кластеров используем датафрейм одноместных объектов, сдающихся в аренду. Для этого используем широту и долготу расположения объектов. Разбиение на кластеры осуществляем алгоритмом KMeans.
Подбираем число кластеров, которое обеспечит наиболее эффективное разбиение. Эффективность определяем по метрике silhouette_score. Рассматриваем разбиение на 50, 100, 150, 200, 250, 300, 350, 400, 450 и 500 кластеров (естественно, в цикле). Для каждого разбиения вычисляем silhouette_score и ошибку перекрестного контроля best_cv_err. Поиск наилучшего значения можно осуществить с помощью класса GridSearchCV – поиск наилучшего набора параметров, обеспечивающих минимум ошибки перекрестного контроля.
После каждого разбиения проводим проверку на валидационной выборке. В качестве обучающей модели используем метод К ближайших соседий KNeighborsClassifier. И для начала, подбираем наилучший параметр n_neighbors - то самое число соседий, по которому модель определяет, к какому кластеру должен относиться объект. По результатам проверки на валидационной выборке рассчитываем параметр R2 и точность.
Результаты сводим в таблицу и отображаем на графике.
![](https://habrastorage.org/getpro/habr/upload_files/25b/ab7/380/25bab7380439c2c5fafad1e00c1071df.png)
![](https://habrastorage.org/getpro/habr/upload_files/3ad/e26/437/3ade26437b79dd5e8e2cff8f0974e50b.png)
Наиболее эффективное разбиение на кластеры достигается при количестве кластеров равном 150. Точность и значение silhouette_score при этом значении практически максимальные. Разбиваем одноместные объекты, сдающиеся в аренду на 150 кластеров.
km = KMeans(n_clusters=150, random_state=0) # задаём число кластеров, равное 150,
# и фиксируем значение random_state для воспроизводимости результата
labels = km.fit_predict(X_sc) # применяем алгоритм к данным и формируем вектор кластеров
# сохраняем метки кластера в поле нашего датасета
df_rent_single_slot['rent_cluster'] = labels
На карту наносим кластеры с градацией цвета в зависимости от средней стоимости аренды внутри кластера. Для графического отображения используем карту Екатеринбурга в shape формате и применяем методы библиотеки GeoPandas. Географическими центрами кластеров являются средние значения широт и долгот объектов, относящихся к данному кластеру. Красными точками нанесены сами объекты – паркинги, сдающиеся в аренду.
![](https://habrastorage.org/getpro/habr/upload_files/02e/2ae/ded/02e2aeded0679967831998a9c3320661.png)
Теперь, когда у нас определены кластеры, создадим модель, которая по координатам объекта сможет определить, к какому кластеру относится этот объект.
В качестве обучающей модели используем метод К ближайших соседий KNeighborsClassifier. Параметр n_neighbors принимаем равным 1 - именно это значение обеспечивает наименьшую ошибку перекрестного контроля. Проверим, чему равна ошибка на тестовой выборке при этом значении параметра
# создаем обучающую и валидационную выборки
Xtrain, Xtest, ytrain, ytest = train_test_split(df_rent_single_slot[['lat','lng']],
df_rent_single_slot['rent_cluster'],
test_size=0.2)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
validates = knn.predict(X_test)
print('R2: {:.2f}'.format(r2_score(y_test, validates)))
print('Точность: {:.2f}'.format(accuracy_score(y_test, validates)))
R2: 0.9
Точность: 0.96
Наша модель по координатам объекта определяет, к какому кластеру относится объект, с точностью 96%.
Для каждого объекта из датасета df_sel_single_slot (продажа одноместных паркингов) определяем, к какому из кластеров этот объект относится. И то же самое для двухместных паркингов. Определяем для каждого объекта, выставленного на продажу срок окупаемости payback в месяцах. Срок окупаемости находится делением стоимости объекта на среднюю арендную ставку кластера (для вычисления срока окупаемости двухместных паркингов их стоимость делится на двойную ставку средней аренды в кластере). Распределение объектов по сроку окупаемости выглядит следующим образом.
![](https://habrastorage.org/getpro/habr/upload_files/0f5/ab0/be3/0f5ab0be341dba4dd1dfcab3cc74d819.png)
Теперь, когда мы знаем распределение объектов на аренду по кластерам, составляем таблицу с характеристикой кластеров. Нас интересует инвестиционная привлекательность кластера. Примем, что кластер тем привлекательнее, чем выше в нем стоимость аренды и чем меньше в нем срок арендной экспозиции. Это следует из предположения о том, что если в определенном кластере сложилась высокая цена аренды, а объекты сдаются быстро, то в этом кластере есть повышенный спрос на аренду паркингов.
Каждому кластеру присваиваем рейтинг. Для вычисления рейтинга средние стоимости аренды в кластерах ранжируются от 0 до 1, где 0 – наименьшая стоимость аренды, 1- наибольшая. Аналогично ранжируются медианные сроки экспозиции объявлений, 0 – наибольший срок экспозиции, 1 – наименьший. Затем эти показатели суммируются и образуют рейтинг. Исходя из того, что рейтинг кластера лежит в диапазоне от 0 до 2, к «лучшим» кластерам относим те, чей рейтинг выше 1.
Отбросим из потенциальных объектов для инвестирования объекты типа "овощехранилище", металлические гаражи и т.п., так как сдать их в аренду проблематично. Выберем объекты, срок окупаемости которых не превышает 60 месяцев и отсортируем по убыванию рейтинга кластера.
В результате получили наиболее перспективные с точки зрения инвестирования объекты – 44 одноместных объявлений и 9 двухместных. Отобразим эти объекты на карте, заодно обозначив лучшие кластеры.
![](https://habrastorage.org/getpro/habr/upload_files/53a/528/ad7/53a528ad7beb1eb541418e45bbd5d2c1.png)
Выборочный анализ результатов
Теперь мы можем рассмотреть любой из выбранных объектов и проанализировать его в отдельности. Например, рассмотрим объект под номером 42. В кластере, где находится этот объект также продаются еще 5 объектов, и сдаются в аренду 3 объекта – потенциальных конкурента.
Рассмотрим эти объекты на фрагменте карты.
![](https://habrastorage.org/getpro/habr/upload_files/2e9/26a/916/2e926a91636597b736a6bc0a615b47af.png)
Кроме того, посмотрим, как соотносится интересующий нас объект с соседними по сроку окупаемости и площади.
![](https://habrastorage.org/getpro/habr/upload_files/bc0/ab6/16a/bc0ab616a7e755f1a63adeb0a21bc803.png)
В случае принятия решения об инвестировании в данный объект считаем, что сдавать его в аренду будем по средней цене в кластере (пунктирная линия на графике). Посмотрим, как он будет соотносится с конкурентами по цене и площади.
![](https://habrastorage.org/getpro/habr/upload_files/518/63d/8f6/51863d8f6943b9175716467194bfeeb3.png)
Выводы
В результате проделанной работы из 2200 объявлений о продаже гаражей и паркингов выбрали 53 интересных для инвестирования объекта. Это кардинальным образом облегчает подбор объекта для инвестиций, принимая во внимание, что селекция основана на том, чтобы вложения инвесторов окупались максимально быстро, а приобретаемые объекты были востребованы на арендном рынке.
Помимо решенной главной задачи, у нас получилось выделить такие области на карте города, где складывается дефицит предложения по аренде паркингов и формируются высокие цены. Эта информация могла бы быть полезной для лиц, занимающихся строительством при определении цены продажи своих объектов.
Кроме того, получили инструмент для краткого наглядного анализа конкретного объекта.