Покупка оптимальной квартиры с R
Многие люди сталкиваются с вопросом покупки или продажи недвижимости, и важный критерий здесь, как бы не купить дороже или не продать дешевле относительно других, сопоставимых вариантов. Простейший способ — сравнительный, ориентироваться на среднюю цену метра в конкретном месте и экспертно добавляя или снижая проценты от стоимости за достоинства и недостатки конкретной квартиры. Но данный подход трудоемок, неточен и не позволит учесть все многообразие отличий квартир друг от друга. Поэтому я решил автоматизировать процесс выбора недвижимости, используя анализ данных путем предсказания «справедливой» цены. В данной публикации описаны основные этапы такого анализа, выбрана лучшая предиктивная модель из восемнадцати протестированных моделей на основании трех критериев качества, в итоге лучшие (недооцененные) квартиры сразу помечаются на карте, и все это используя одно web-приложение, созданное с помощью R.
Сбор данных- Город Москва
- Один тип квартир в модель (то есть однушки или двушки или трешки)
- В пределах одной станции метро (так как используется геокодирование, и расстояние до ближайшего метро)
- Вторичка (так как новостройки все принципиально разные, и качественно друг от друга отличаются, а в объявлениях это либо не сказано, или написано что-то в комментариях, но ни то, ни другое, не позволяет создать адекватную модель)
Как это часто бывает, в данных могут оказаться и выбросы, и пропуски, и просто обман, когда новостройки выдают за вторичку, или вообще продают землю. Поэтому первоначально надо привести все данные к «опрятному» виду.
Проверка на обманЗдесь основной упор на описание объявления, если встречаются слова явно не относящиеся к требуемой мне выборке, эти наблюдения исключаются, это проверяется функцией R grep. А так как в R вычисления векторные, данная функция сразу возвращает вектор значений верных наблюдений, применив его, отфильтруем выборку.
Проверка на пропущенные значенияПропущенные значения встречаются достаточно редко (и в основном именно в «левых» объявлениях, с новостройками и землей, которые к этому моменту уже исключены), но с теми, что остаются надо что-то делать. Вариантов, в общем-то, два, исключать такие наблюдения или заменять эти пропущенные значения. Так как жертвовать наблюдениями не хотелось, а исходя из предположения, что данные не заполнены исходя из принципа «что его заполнять, и так понятно, что это как все окружающее», решил заменять качественные переменные на моду их значений, а количественные (метраж) на медианные значения. Конечно, это не совсем корректно, и совсем правильно было бы проводить корреляционное отношение между наблюдениями, и заполнять пропуски согласно полученным результатам, но для данной задачи посчитал это избыточным, притом таких наблюдений достаточно мало.
Проверка на выбросыВыбросы встречаются еще реже, и могут быть только количественными, а именно по цене и по метражам. Здесь исходил из предположения, что покупатель (я) конкретно знает по какой цене и примерно какого метража должна быть его квартира, поэтому задавая начальные значения верхней и нижней цены, ограничивая метраж, мы автоматически избавляемся от выбросов. Но даже если это не так (не делать ограничения), то при получении результата или взглянув на диаграмму рассеяния и увидев, что есть выброс, можно осуществить запрос с уточненными данными, тем самым убрав эти наблюдения, что улучшит модель.
Основные предпосылки теоремы Гаусса-Маркова- Модель данных правильно специфицирована. В общем да, путем исключения выбросов, некорректных объявлений, замены пропущенных значений, модель вполне адекватна. Какая-то нестрогая мультиколлинеарность может присутствовать (например пятиэтажка и нет лифта или площади – общая/жилая), но как писал выше, для прогнозирования это не критично, более того она не нарушает и основные предпосылки. Для целей построения тестовых моделей, все значений переводились в дамми-переменные корректно, строгая мультиколлинеарность исключена.
- Все регрессоры детерминированы и не равны. Да, тоже верно.
- Ошибки не носят систематического характера. Верно, так как в МНК используется свободный член, которые уравнивает ошибки.
- Дисперсия ошибок одинакова (гомоскедастичность). Так как используется ограничения по размеру регрессоров и зависимой переменной (масштаб сопоставимый), то гетероскедастичность минимальна, да и для прогнозирования она снова не критична (стандартные ошибки несостоятельны, а они нам не интересны)
- Ошибки некоррелированы (эндогенность). Вот тут нет, эндогенность, скорее всего, есть (например, квартиры -«соседи» с одной площадки или подъезда), есть какой-то внешний неучтенный фактор, но снова для прогнозирования, запись с эндогенностью не принципиальна, более того, мы не знаем этот неучтенный фактор.
- Расстояние до метро
- Общая площадь
- Жилая площадь
- Площадь кухни
- Тип дома
- Наличие и типы лифтов
- Наличие и типы балконов
- Кол-во и типы санузлов
- Куда выходят окна
- Наличие телефона
- Тип продажи
- Первый этаж
- Последний этаж
- Пятиэтажка
Помимо практической личной ценности, интересно было еще и протестировать разные модели, то решил для выбора лучшей модели, проверить различные выборки на все простые модели регрессий которые знаю, а именно, были протестированы следующие модели:
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.