Покупка оптимальной квартиры с R

Покупка оптимальной квартиры с R

Многие люди сталкиваются с вопросом покупки или продажи недвижимости, и важный критерий здесь, как бы не купить дороже или не продать дешевле относительно других, сопоставимых вариантов. Простейший способ — сравнительный, ориентироваться на среднюю цену метра в конкретном месте и экспертно добавляя или снижая проценты от стоимости за достоинства и недостатки конкретной квартиры. Но данный подход трудоемок, неточен и не позволит учесть все многообразие отличий квартир друг от друга. Поэтому я решил автоматизировать процесс выбора недвижимости, используя анализ данных путем предсказания «справедливой» цены. В данной публикации описаны основные этапы такого анализа, выбрана лучшая предиктивная модель из восемнадцати протестированных моделей на основании трех критериев качества, в итоге лучшие (недооцененные) квартиры сразу помечаются на карте, и все это используя одно web-приложение, созданное с помощью R.

Сбор данных
  1. Город Москва
  2. Один тип квартир в модель (то есть однушки или двушки или трешки)
  3. В пределах одной станции метро (так как используется геокодирование, и расстояние до ближайшего метро)
  4. Вторичка (так как новостройки все принципиально разные, и качественно друг от друга отличаются, а в объявлениях это либо не сказано, или написано что-то в комментариях, но ни то, ни другое, не позволяет создать адекватную модель)
Обзор данных

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

Проверка на обман

Здесь основной упор на описание объявления, если встречаются слова явно не относящиеся к требуемой мне выборке, эти наблюдения исключаются, это проверяется функцией R grep. А так как в R вычисления векторные, данная функция сразу возвращает вектор значений верных наблюдений, применив его, отфильтруем выборку.

Проверка на пропущенные значения

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

Проверка на выбросы

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

Основные предпосылки теоремы Гаусса-Маркова
  1. Модель данных правильно специфицирована. В общем да, путем исключения выбросов, некорректных объявлений, замены пропущенных значений, модель вполне адекватна. Какая-то нестрогая мультиколлинеарность может присутствовать (например пятиэтажка и нет лифта или площади – общая/жилая), но как писал выше, для прогнозирования это не критично, более того она не нарушает и основные предпосылки. Для целей построения тестовых моделей, все значений переводились в дамми-переменные корректно, строгая мультиколлинеарность исключена.
  2. Все регрессоры детерминированы и не равны. Да, тоже верно.
  3. Ошибки не носят систематического характера. Верно, так как в МНК используется свободный член, которые уравнивает ошибки.
  4. Дисперсия ошибок одинакова (гомоскедастичность). Так как используется ограничения по размеру регрессоров и зависимой переменной (масштаб сопоставимый), то гетероскедастичность минимальна, да и для прогнозирования она снова не критична (стандартные ошибки несостоятельны, а они нам не интересны)
  5. Ошибки некоррелированы (эндогенность). Вот тут нет, эндогенность, скорее всего, есть (например, квартиры -«соседи» с одной площадки или подъезда), есть какой-то внешний неучтенный фактор, но снова для прогнозирования, запись с эндогенностью не принципиальна, более того, мы не знаем этот неучтенный фактор.
Набор регрессоров
  1. Расстояние до метро
  2. Общая площадь
  3. Жилая площадь
  4. Площадь кухни
  5. Тип дома
  6. Наличие и типы лифтов
  7. Наличие и типы балконов
  8. Кол-во и типы санузлов
  9. Куда выходят окна
  10. Наличие телефона
  11. Тип продажи
  12. Первый этаж
  13. Последний этаж
  14. Пятиэтажка
Протестированные модели предиктивного анализа

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

1. МНК на все регрессоры 2. МНК с логарифмированием (разные варианты: логарифмированием цены и/или площадей и/или расстоянием до метро) 3. МНК с включением и исключением регрессоров а) последовательным пошаговым исключениям регрессоров б) алгоритмом прямого поиска 4. Модели со штрафами (для уменьшения влияния гетероскедастичности) а) Лассо-регрессия (с 2 способами определения параметра фракционирования — минимизацией Cp-критерия Мэллоу и перекрестной проверкой) б) Ридж-регрессия (с 3 способами нахождения параметра штрафа — методом HKB, LW и перекрестной проверкой) 5. Метод главных компонент а) со всеми регрессорами б) с пошаговым исключением регрессоров 6. Квантильная (медианная) регрессия (для уменьшения влияния гетероскедастичности) 7. Алгоритм случайного леса Общее число протестированных моделей составило 18 штук.

В процессе подготовки моделей частично были использованы материалы: Мастицкий С.Э., Шитиков В.К. (2014) Статистический анализ и визуализация данных с помощью R. – Электронная книга, адрес доступа: r-analytics.blogspot.com

Критерии эффективности моделей Результаты тестирования моделей Отображение на карте

formap3<-formap() formap3$desc<-paste0(row.names(formap3), ". №", formap3$number, " ", formap3$address, " недооценена на ", format(-formap3$abs.discount, big.mark= " "), " рублей (", as.integer(formap3$otn.discount), "%)") gvisMap (formap3, «coord», «desc», options=list( mapType='normal', enableScrollWheel=TRUE, showTip=TRUE))

Графический веб-интерфейс

dashboardPage( dashboardHeader(title = «Mining Property v0.9» ),

menuItem(«Source data», tabName = «Source»), menuItem(«Summary», tabName=«Summary» ), menuItem(«Raw data», tabName=«Raw» ), menuItem(«Tidy data», tabName=«Tidy» ), menuItem(«Predict data», tabName=«Predict» ), menuItem(«Plots», tabName=«Plots» ), menuItem(«Result map», tabName=«Map») ) ), dashboardBody( tags$head(tags$style(HTML('.box'))),

fluidRow( column(width = 4,

#checkboxInput(«Kind.home0», «все», TRUE), checkboxGroupInput(«Kind.home», «Тип дома»,c( «панельный» = 1, «сталинский» = 7, «щитовой» = 8, «кирпичный» = 2, «монолитный» = 3, «кирпично-монолитный»=4, «блочный» = 5, «дерев.»=6), selected=c(1,2,3,4,5,6,7,8)), hr(), sliderInput(«Etag», «Этаж», min=0, max=100, value=c(0, 100),step=1), checkboxInput(«EtagP», «не последний»), sliderInput(«Etagn», «В доме этажей», min=0, max=100, value=c(0, 100),step=1)

column(width = 4, selectInput(«Rooms», «Комнат», c ("", «1»="&room1=1", «2»="&room2=1", «3»="&room3=1"),width='45%'), # br(), hr(), # br(), selectInput(«Balcon», «Балкон», c(«можно без балкона»=«0», «только с балконом»="&minbalkon=1", «только без балкона»="&minbalkon=-1"), width='45%'),

br(), hr(), br(), #br(), sliderInput(«KitchenM», «Площадь кухни», min=0, max=25, value=c(0, 25),step=1), sliderInput(«GilM», «Жил. площадь», min=0, max=100, value=c(0, 100),step=1), sliderInput(«TotalM», «Общ. площадь», min=0, max=150, value=c(0, 150),step=1)

sliderInput(«Price», «Цена», min=0, max=50000000, value=c(0, 50000000),step=100000, sep=" "), # hr(), selectInput(«Deal», «Тип сделки», c(«любой»=«0», «свободн.»="&sost_type=1", «альтернатива»="&sost_type=2"), width='45%'), br(), hr(), #br(), # br(), # br(), radioButtons(«wc», «Санузел», c(«не важно» = "", «раздельный» = "&minsu_r=1", «совмещенный» = "&minsu_s=1")),

), width='45%'), hr(), selectInput(«obs», «Отображать квартир на карте:»,c(1:10),selected=5, width=250), textOutput(«flat»)

), fluidRow( htmlOutput(«hyperf1»)), fluidRow( textOutput(«testOutput»)) )

), tabItem(«Raw», box(dataTableOutput(«Raw» ),width=12,height=600)), tabItem(«Summary», box(verbatimTextOutput(«Summary» ),width=12,height=600)), tabItem(«Tidy», box(dataTableOutput(«Tidy» ),width=12, height=600)), tabItem(«Predict», box(dataTableOutput(«Predict» ),width=12, height=600)), tabItem(«Plots», box(width=12, plotOutput(«RFplot», height=275),plotOutput(«r2», height=275))), tabItem(«Map», box(width=12,htmlOutput(«view»), DT::dataTableOutput(«formap2»), height=600))

Результатом всего этого становится удобное приложение с графическим интерфейсом, с фактически двумя (остальные пункты для контроля) главными пунктами бокового меню – первым и последним. В первом (Source data) пункте бокового меню (рис. 1), задаются все требуемые параметры (аналогично cian) по поиску и оценки квартир.

Рис.1 Окно выбранного меню Source data

  • сводный отчет (Summary) по регрессорам
  • таблицы данных (сырая (Raw data) – исходная после парсинга, опрятная (Tidy data) – после приведения параметров в опрятный вид и корректировки параметров и добавлением геолокации, и итоговая (Predict data) таблица с предсказанными значениями цен)
  • три диаграммы (Plots) (рис. 2)– точности модели и важности регрессоров в алгоритме случайного леса (почти всегда все регрессоры являются важными) и диаграмма рассеяния исходных и предсказанных цен.

Рис.2 Окно выбранного меню Plots

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

Рис.3 Окно выбранного меню Result map

Также в этой таблице сразу имеется ссылка (*) для перехода на данное объявление. Данную интеграцию (включение элементов JS в таблицу) позволяет сделать пакет DT.

📎📎📎📎📎📎📎📎📎📎