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

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

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



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

Но такой подход трудоемкий, неточный и не учтет все многообразие различий между квартирами.

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

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

созданный с использованием Р.



Сбор данных

Постановка задачи понятна, возникает вопрос, откуда брать данные, в РФ существует несколько основных сайтов по поиску недвижимости, и есть база данных WinNER, содержащая максимальное количество объявлений в довольно удобный интерфейс и позволяет загружать файлы в формате csv. Но если раньше эта база данных допускала доступ по времени (минуты, часы, дни), то сейчас минимум составляет всего 3 месяца доступа, что несколько избыточно для рядового покупателя или продавца (хотя если серьезно подойти, можно понести эти затраты).

С этим вариантом это было бы совсем просто, поэтому пойдем другим путем, возьмем данные с какого-нибудь сайта недвижимости.

Из нескольких вариантов я выбрал самый удобный известный cian.ru .

На тот момент данные отображались в простой табличной форме, но когда я попытался разобрать все данные в R, у меня ничего не вышло.

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

Эта альтернатива оказалась замечательным сервисом.

импорт.io , который позволяет извлекать информацию со страниц (или сайтов), имеет собственный REST API и возвращает результат в формате JSON. А R может сделать запрос к API и проанализировать JSON. Быстро ознакомившись с этим сервисом, я создал на нем экстрактор, извлекающий всю необходимую информацию (все параметры каждой квартиры) с одной страницы.

А R уже перебирает все страницы, вызывая для каждой этот API и объединяя полученные данные JSON в одну таблицу.

Хотя импорт.io позволяет создать полностью автономный API, который будет проходить через все страницы, я подумал, что логично, что то, что я не могу сделать (парсинг одной страницы), нужно корректно назначить стороннему API, а все остальное продолжать делать на R Итак, источник данных выбран, Теперь об ограничениях будущей модели:

  1. Г.

    Москва

  2. Один тип квартиры на модель (то есть однокомнатные, двухкомнатные или трехкомнатные)
  3. В пределах одной станции метро (т.к.

    используется геокодирование и расстояние до ближайшего метро)

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


Обзор данных

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

Поэтому изначально необходимо привести все данные к «аккуратному» виду.



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

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



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

По сути, есть два варианта: исключить такие наблюдения или заменить недостающие значения.

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

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

такие наблюдения.



Тест на выбросы
Выбросы встречаются еще реже и могут быть только количественными, а именно по цене и метражу.

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

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



Основные положения теоремы Гаусса-Маркова
подробнее Итак, мы исключили неверные наблюдения; затем, прежде чем проводить анализ, оценим их по основным положениям теоремы Гаусса-Маркова.

Забегая вперед, скажу, что мы не хотим от модели интерпретации коэффициентов или правильной оценки их доверительных интервалов; нам это нужно для прогнозирования «теоретической» цены, поэтому некоторые предпосылки для нас не критичны.

  1. Модель данных указана правильно.

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

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

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

  2. Все регрессоры детерминированы и неравны.

    Да, это тоже правда.

  3. Ошибки не систематические.

    Верно, поскольку в OLS используется фиктивный термин, уравнивающий ошибки.

  4. Дисперсия ошибок такая же (гомоскедастичность).

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

  5. Ошибки некоррелированы (эндогенность).

    Не здесь, эндогенность скорее всего есть (например, квартиры - "соседи" с одного и того же участка или подъезда), есть какой-то внешний неучтенный фактор, но опять же для прогнозирования запись с эндогенностью не важна, тем более мы не знаю, что это неучтенный фактор.

Данные в целом соответствуют предположениям, поэтому можно строить модели.



Набор регрессоров

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

Для определения расстояния используется API сервиса геокодирования Google (я выбрал его как наиболее точный, гибкий к ограничениям, есть готовая функция в R), сначала геокодируются адреса квартир и станций метро с помощью функция геокодировать из упаковки ggmap .

А расстояние определяется по формуле гаверсинуса, готовой функции distHaversine из упаковки геосфера .

Общее количество регрессоров составило 14:

  1. Расстояние до метро
  2. Общая площадь
  3. Жизненное пространство
  4. Кухонная зона
  5. Тип дома
  6. Наличие и типы лифтов
  7. Наличие и типы балконов
  8. Количество и типы ванных комнат
  9. Куда выходят окна?
  10. Наличие телефона
  11. Тип продажи
  12. Второй этаж
  13. Верхний этаж
  14. Пятиэтажное здание


Протестированные модели прогнозного анализа

подробнее Помимо практической личной ценности, было также интересно протестировать разные модели, поэтому я решил выбрать лучшую модель, протестировать разные выборки для всех известных мне простых моделей регрессии, а именно были протестированы следующие модели: 1. МНК для всех регрессоров 2. МНК с логарифмом (различные варианты: логарифм цены и/или площади и/или расстояния до метро) 3. МНК с включением и исключением регрессоров.

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

?.

, Шитиков В.

К.

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

Критерии эффективности модели

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

Поэтому мы сосредоточимся на оценке качества моделей на основе средней разницы между эмпирическими и прогнозируемыми значениями.

А чтобы было интереснее, и для определения выгоды (экономической эффективности) среднеквадратическая ошибка не всегда будет показательной (поскольку некоторые наблюдения могут ее исказить), я использовал для оценки критериев не только обычное RMSE - среднее среднее значение квадратичная ошибка, но также MAE – средняя абсолютная ошибка и MPE – средняя процентная ошибка.



Результаты тестирования модели

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

Это позволяет единообразно оценивать все модели, прогнозировать новые цены и выявлять ошибки.

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

И практически абсолютным победителем (92%) по всем трем критериям стал алгоритм случайного леса.

Также на разных выборках по некоторым критериям хорошие результаты показали медианная регрессия, МНК с логарифмом цены, полное МНК и иногда Ридж с Лассо.

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

Таким образом, простая модель (МНК) может быть лучшей альтернативой, чем более сложные.

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

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

Для тестового моделирования мы использовали функцию случайный лес (из одноименного пакета) со значениями по умолчанию, пытаюсь изменить основные параметры сложности дерева размер узла , Максноды , nПермь определили, что несколько лучшая минимизация ошибок прогноза для разных выборок достигается за счет изменения параметра размер узла (минимальное количество узлов) до 1. Итак, модель выбрана.



Показать на карте

Победитель определяется (случайный лес), данная модель предсказывает «теоретические» цены для всех наблюдений с минимальными ошибками.

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

И для этого есть пакет в R ГуглВис предназначен для интеграции с картографической системой Google (однако существует пакет для Leaflet).

Я также продолжал пользоваться Google, так как полученные от их геокодирования координаты запрещено отображать на других картах.

Отображение на карте осуществляется одной функцией gvisMap из упаковки ГуглВис .

код отображения карты вывод $просмотр < — renderGvis({ #view — htmlOutput output element если ((err()!=" ")) return(NULL) форма3<-formap() formap3$деска<-paste0(row.names(formap3), ".

№", форма3$номер, " ", адрес формы3$, "недооценён" формат(-formap3$abs.discount, big.mark=" "), «рублей» («, as.integer(formap3$otn.discount), "%)") gvisMap(formap3, "coord", "desc", options=list( MapType = 'нормальный', EnableScrollWheel = ИСТИНА, showTip=TRUE)) })

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

Передавать все необходимые параметры через консоль — медленно и неудобно, поэтому хотелось сделать все автоматически.

И традиционно для этого снова можно использовать R с фреймворками.

блестящий , И блестящая приборная панель , которые имеют достаточные элементы управления вводом/выводом.

полный код клиентской части интерфейса страница панели мониторинга( DashboardHeader(title = "Горная недвижимость v0.9" ), панель мониторингаБоковая панель( боковая панельМеню( menuItem("Исходные данные", tabName = "Источник"), MenuItem("Сводка", tabName="Сводка" ), MenuItem("Необработанные данные", tabName="Необработанные" ), MenuItem("Точные данные", tabName="Tidy" ), MenuItem("Прогнозировать данные", tabName="Predict" ), MenuItem("Графики", tabName="Графики" ), MenuItem("Карта результатов", tabName="Карта") ) ), приборная панельBody( tags$head(tags$style(HTML('.

box{overflow: auto;}'))), tabItems( tabItem("Источник", коробка(ширина=12, жидкостьРоу( столбец (ширина = 4, selectInput("Метро", "Метро", "", width='60%'), # бр(), час(), #checkboxInput("Kind.home0", "all", TRUE), checkboxGroupInput("Вид.дом", "Тип дома",c( «панель» = 1, «Сталинист» = 7, «щит» = 8, «кирпич» = 2, «монолитный» = 3, «кирпичный-монолитный» = 4, «блок» = 5, "дерево"=6), выбрано=c(1,2,3,4,5,6,7,8)), час(), слайдерInput("Etag", "Эtag", min=0, max=100, value=c(0, 100),step=1), checkboxInput("EtagP", "не последний"), слайдерInput("Этагн", "В доме этажей", min=0, max=100, value=c(0, 100),step=1) , submitButton("Анализ", icon("обновить")) ), столбец (ширина = 4, selectInput("Комнаты", "Комнаты", c ("", "1"="&комната1=1", "2"="&комната2=1", "3"="&room3=1"),width='45%'), # бр(), час(), # бр(), selectInput("Балкон", "Балкон", c("можно без балкона" = "0", «только с балконом»="&minbalkon=1", «только без балкона»="&minbalkon=-1"), ширина = '45%'), бр(), час(), бр(), #бр(), слайдерInput("КухняM", "Кухонная зона", min=0, max=25, value=c(0, 25),step=1), слайдерInput("GilM", "Жилая площадь", min=0, max=100, value=c(0, 100),step=1), слайдерInput("TotalM", "Общая площадь", min=0, max=150, value=c(0, 150),step=1) ), столбец (ширина = 4, слайдерInput("Цена", "Цена", min=0, max=50000000, value=c(0, 50000000),step=100000, sep=" "), # час(), selectInput("Сделка", "Тип сделки", с("любой"="0", "бесплатно.

"="&sost_type=1", "альтернативный"="&sost_type=2"), ширина = '45%'), бр(), час(), #бр(), # бр(), # бр(), radioButtons("туалет", "Ванная", c("не важно" = "", "отдельный" = "&minsu_r=1", "комбинированный" = "&minsu_s=1")), час(), selectInput("Лифт", "Лифт (минимум)", с("0"=0, "1"="&минлифт=1", "2"="&минлифт=2", "3"="&минлифт=3", "4"="&минлифт=4" ), ширина = '45%'), час(), selectInput("obs", "Отображать квартиры на карте:",c(1:10),selected=5, width=250), textOutput("плоский") ) ), LiquidRow(htmlOutput("hyperf1")), LiquidRow( textOutput("testOutput")) ) ), tabItem("Raw", box(dataTableOutput("Raw"),width=12,height=600)), tabItem("Сводка", box(verbatimTextOutput("Сводка"), ширина = 12, высота = 600)), tabItem("Tidy", box(dataTableOutput("Tidy"), ширина=12, высота=600)), tabItem("Predict", box(dataTableOutput("Predict"),width=12, height=600)), tabItem("Графики", box(width=12,plotOutput("RFplot", height=275),plotOutput("r2", height=275))), tabItem("Карта", box(width=12,htmlOutput("view"), DT::dataTableOutput("formap2"), height=600)) ) ) ) Результатом всего этого является удобное приложение с графическим интерфейсом, фактически с двумя (оставшимися пунктами для управления) пунктами главного бокового меню – первым и последним.

Во-первых ( Источник данных ) в боковом меню (рис.

1) задаются все необходимые параметры (аналогично циану) для поиска и оценки квартир.



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

Рис.

1 Выбранное окно меню Источник данных Остальные пункты бокового меню отображают:

  • сводный отчет ( Краткое содержание ) регрессорами
  • таблицы данных (необработанные ( Необработанные данные ) — оригинал после разбора, аккуратный ( Аккуратные данные ) — после приведения параметров в аккуратный вид и корректировки параметров и добавления геолокации, и финальный ( Прогнозировать данные ) таблица с прогнозируемыми значениями цен)
  • три диаграммы ( Участки ) (рис.

    2) – точность модели и важность регрессоров в алгоритме случайного леса (почти всегда все регрессоры важны) и диаграмма рассеяния исходной и прогнозируемой цен.



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

Рис.

2 Выбранное окно меню Участки Ну и последний пункт( Карта результатов ) (рис.

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



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

Рис.

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

Эту интеграцию (включение JS-элементов в таблицу) можно выполнить в пакете.

Д.

Т.

.



Заключение

Подводя итог вышесказанному, как все это работает:
  1. На первой странице с помощью элементов управления задается первоначальный запрос
  2. На основе выбора этих входных элементов генерируется строка запроса (она также указывается в виде гиперссылки для проверки)
  3. Эта строка, указывающая, что страница передается в API. импорт.io (в процессе создания всего этого циан начал менять интерфейс вывода, благодаря импорт.io Переобучил экстрактор буквально за 5 минут)
  4. Полученный JSON от API обрабатывается
  5. Все страницы пронумерованы (во время работы отображается строка состояния по процессам)
  6. Таблицы объединяются, проверяются (исключаются неправильные значения, заменяются недостающие значения) и приводятся к единому виду, удобному для анализа.

  7. Осуществляется геокодирование адресов и определение расстояния.

  8. Модель построена с использованием алгоритма случайного леса.

  9. Определяются прогнозные цены, абсолютные и относительные отклонения.

  10. Лучшие результаты отображаются на карте и в таблице под ней (количество отображаемых квартир указано на первой странице)
Вся работа приложения (от начала запроса до отображения на карте) выполняется менее чем за минуту (большая часть времени уходит на геолокацию — ограничение Google для домашнего использования).

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

  • ползать
  • анализ
  • интеграция со сторонним API
  • обработка JSON
  • геокодирование
  • работа с различными регрессионными моделями
  • оценить их эффективность разными способами
  • геолокация
  • показать на карте
Кроме того, все это реализовано в удобном графическом приложении, которое может быть как локальным, так и размещенным в сети, и все это делается в одном R (не считая импорт.io ), с минимумом строк кода и простым и элегантным синтаксисом.

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

Теги: #r #Интеллектуальный анализ данных #блестящие #блестящие панели #Случайный лес #линейная регрессия #недвижимость #предиктивная аналитика #программирование #Интеллектуальный анализ данных #r #Машинное обучение

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.