Вартість житла як функція координат


Ціни на житло формуються з численних факторів, основні з яких — це близькість до центру міста і наявність поруч різної інфраструктури. Але реальні ціни тільки у паперових газетах і ріелторських сайтах. Ми будемо будувати свою карту з цінами на нерухомість в Москві за допомогою python, яндекс API і matplotlib, спеціальний репортаж з місця подій під катом.

Гіпотеза
Як людина, що проживає в москві, характер цін в москві оцінюю наступним чином:
  • дуже дорого — в межах садового кільця.
  • дорого — від садового кільця до ТТК
  • не дуже дорого — між ТТК і МКАД, а ціна лінійно убуває в бік МКАДа
  • дешево — за МКАДом
На карті будуть присутні локальні максимуми і мінімуми в зв'язку з близькістю важливих об'єктів або промислових зон. А також буде розрив у цінах до МКАДа і після, т. к. це кільце в основному збігається з адміністративним кордоном міста.

Сотні рядків чудового і не дуже python-коду будуть доступні в кінці статті за посиланням.

Для досліджень я взяв два сайту про нерухомості з даними за літо цього року. Всього у вибірці брали участь 24,000 записів про новобудовах та на вторинному житло, причому різні оголошення з одним адресою усереднюють за ціною.

Оголошення парсились скриптом і зберігалися в sqlite бази даних у форматі:

широта, довгота, ціна за кв. м.


веб павуківТак, через нестачу знань, ніяких сторонніх бібліотек не було використано і це спричинило за собою створення двох окремих скриптів по одному на кожен сайт, дергающих адреси, метраж і вартість квартир. Адреси чарівним чином перетворювалися в координати допомогою Google Geocoder API. Але з-за досить низької планки квоти на використання був змушений запускати скрипт кожен день протягом тижня. Геокодер яндекса в 10 разів безкоштовніші .


Будуємо функцію
Для узагальнення функції на всю площину її необхідно проинтерполировать за наявними точкам. Для цього підійде функція
LinearNDInterpolator
з модуля scipy. Для цього лише необхідно встановити python наобором наукових бібліотек, відомий як scipy. У випадку, коли дані дуже різнорідні, практично неможливо підібрати правдоподібну функцію на площині. Метод
LinearNDInterpolator
використовує тріангуляцію Делоне, розбиваючи всю площину на безліч трикутників.

Важливий фактор, який потрібно враховувати при побудові функцій — розкид значень функції. Серед оголошень трапляються справжні монстри з ціною за квадратний метр більше 10 млн. рублів всередині кремля, вони зіпсують графік і ви побачите лише однорідне поле з яскравою крапкою. Для того, щоб на графіку можна було розрізнити практично всі дані, такі значення потрібно фільтрувати кордоном, підбирається емпіричним шляхом. Для статистичної моделі ці значення не несуть корисної інформації.

А тим часом, результат інтерполяції виглядає як градієнтний пекло (кликабельно):



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



Про дискретизації на картізалежно від того, хочемо ми бачити загальну картину цін або флуктуації поблизу середнього значення, необхідно застосувати компадирование даних, тобто розподіл даних рівномірніше на шкалу значень, зменшуючи більше значення і збільшуючи маленькі. У коді це виглядає так:
zz = np.array(map(lambda x: map(lambda y: int(2*(0.956657*math.log(y) - 10.6288)) , x), zz)) #HARD 
zz = np.array(map(lambda x: map(lambda y: int(2*(0.708516*math.log(y) - 7.12526)) , x), zz)) #MEDIUM 
zz = np.array(map(lambda x: map(lambda y: int(2*(0.568065*math.log(y) - 5.10212)) , x), zz)) #LOW 

Функції підбиралися емпіричним шляхом за допомогою апроксимації по 3м-4м точкам на wolframalpha.


Варто помітити, що метод лінійної інтерполяції не може робити розрахунок значень за межами граничних точок. Тим самим на графіку з достатньому великим масштабом ми побачимо оченьмногоугольник. Масштаб необхідно вибрати таким чином, щоб графік був повністю вписана в отриману фігуру.

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



Розрахунки схожі на розрахунок гравітаційного поля в точці. Для оптимізації будемо брати в розрахунок тільки ті точки, які дійсно роблять внесок у кінцеве значення поля. Після розрахунків, результат нагадує бризки (кликабельно).



Яке ще перетворення?При строгому побудові графіка поля, на ньому видно безліч точок, що відповідають локальним домінуванням «дорогого» поля над «недорогим» і навпаки. Ці точки схожі на шум і псують графік. Усунути їх можна, наприклад, медіанним фільтром над зображенням з достатньому великим значенням. Для цього я використовував командний інтерфейс програми IrfanView.


Візуалізація
Поєднай отримані зображення з схемної картою Москви. Яндекс API дозволяє взяти карту з координатами і вказати для неї кутові розміри по довготі і широті, а так само бажаний розмір зображення.

Приклад запиту:

http://static-maps.yandex.ru/1.x/?ll=37.5946002,55.7622764&spn=0.25,0.25&size=400,400&l=map


Проблема полягає тільки в тому, що зазначені кутові розміри визначають не межі видимої області, а її гарантований розмір. Це означає, що ми отримаємо картинку з кутовими розмірами >= 0.25. Способи впоратися з межами видимих координат виявлено не було, і вони вишукувалися вручну.

Про подгонианеВирівняти карти один щодо одного можна за допомогою яндекс міток, малюючи точки на карті з заданими координатами і отримуючи карту з позначками.

За пару дзвінків з бібліотеки PIL зображення поєднуються з комфортними для спостереження рівнями прозорості.

map_img = Image.open(map_img_name, 'r').convert('RGBA')
price_img = Image.open(prices_img_name, 'r').convert('RGBA')
if price_img.size == map_img.size:
result_img = Image.blend(map_img, price_img, 0.5)


Результати
Три зображення з різними рівнями компандирования і анімація варіанту з полем.



Трохи аналітики:
В цілому, як і пророкувала гіпотеза, всередині садового кільця та кільця ТТК ціни на житло максимальні і убувають у міру видалення від центру. Проте в межах МКАД, середня ціна зберігається в західній і південно-західній частинах. За межами МКАД, а так само в східній частині за ТТК ціна нижче середньої.

У деталях все набагато цікавіше, відзначимо основні області:
  • В лужниках і воробйових горах жити досить дорого житлової нерухомості воробйових гір немає, швидше за все область була побудована за граничним значенням зверху і знизу
  • Житлові масиви поблизу фундаментальної бібліотеки МГУ, будуються і побудовані висотки у мосфильмовского ставка коштують дорожче ймовірно із-за активної будівництва і великих лісопаркових ділянок. Висока ціна на території від меморіальної синагоги та сквером ім. Ганни Герман так само обумовлена оточуючими цінами і своїм місцем розташування серед парків і заказника.
  • В районі між станцією метро «Крилатське» та проспектом Маршала Жукова житло так само вважається дорогим
  • Незважаючи на положення за МКАДом і близькістю до кладовища, будинки вздовж вулиці Генерала Бєлобородова відрізняються високою ціною.
Як видно на картах, теорія цілком підтверджується практикою і вдале поєднання інфраструктури, відстані до центру і близькості до відомим московським споруд буде виявлено функцією лінійної інтерполяції над координатами.

На жаль, виконана робота багато в чому не автоматизується, але якщо стаття буде цікавою хабровчанам, я побудую подібні карти інших великих міст нашої країни.

Код веб павуків, самої програми, а так само використані бази даних доступні через GitHub.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.