Участники из группы БЭК-194: Пономарев Павел-Рафаэль, Абгарян Арен, Сафронова Анна, Щетинина Екатерина, Игнатова Елизавета, Остроумов Андрей, Щеглов Всеволод

#Загружаем библиотеки:
library(readr)
library(DT) #для построения таблиц
library(dplyr)
library(stringr)
library(psych) #загрузим библиотеку psych и с ее помощью проанализируем описательные статистики (попутно добавляя те, которые не предусмотрены функцией describe и удаляя лишние)
library(knitr)
library(ggplot2)
library(lubridate)

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

Цель работы: провести анализ имеющихся данных с использованием языка R, выявить взаимосвязи и дать им объяснение.

Пункт 1

В этом задании требовалось разделить наблюдения из таблицы на две группы: номинальные данные и числовые данные.

К номинальным относятся все данные, которые не могут быть представлены в численном виде, они могут быть лишь сравнены на предмет равенства (совпадения). К таким данным мы отнесли переменные: Date_entry(даты можно сопоставить друг с другом относительно временного промежутка, но в данном случае не имеет смысла рассматривать их как числовые переменные, так как конкретная дата - понятие слишком узкое), Region(названия регионов могут быть только равны или не равны), District_ad(аналогично предыдущей переменной), Metro(аналогично предыдущей переменной), Rooms(количество комнат - своеобразная характеристика квартиры, можно сравнивать, но нельзя проводить информативный анализ этих данных с помощью математических операций, поэтому мы решили немного изменить данные, назвав квартиру с 1 комнатой “однокомнатной” и т.д.), Minimum_duration(аналогично переменной Date_entry, эти данные могут быть только либо равными друг другу, либо различными), No_agents(невозможно упорядочить, служат характеристикой основной переменной), Building(аналогично предыдущей), Lift(аналогично предыдущей), Furnished(аналогично предыдущей), Bath(аналогично предыдущей), Refurbished(аналогично предыдущей), Balcony(аналогично предыдущей).

Числовые данные могут быть сравнены, упорядочены и измерены, к ним соответственно относятся: Dist_metro_ad(можно выполнить сранвительные математические операции, упорядочить, измерить), Price(аналогично), Area_total(аналогично), Area_living(аналогично), Area_kitchen(аналогично), Floor(аналогично), Nfloor(аналогично), Latitude(аналогично), Longitude(аналогично), Year_construction(хотя дату мы отнесли к номинальным переменным, год назовём числовой, так как с ним можно провести информативный анализ).

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

Загружаем данные

data = read.csv('SPb_dwellings_for_rent_EMLS_sample_4.csv',dec=',',sep=";", fileEncoding="windows-1251")

Nominal = data.frame(Date_entry = data$Date_entry, Region = data$Region, District_ad = data$District_ad, Metro = data$Metro, Rooms = data$Rooms, Minimum_duration = data$Minimum_duration, No_agents = data$No_agents, Building = data$Building, Lift = data$Lift, Furnished = data$Furnished, Bath = data$Bath, Refurbished = data$Refurbished, Balcony = data$Balcony)

Numeric = data.frame(Dist_metro_ad = data$Dist_metro_ad, Price = data$Price, Area_total = data$Area_total, Area_living = data$Area_living, Area_kitchen = data$Area_kitchen, Floor = data$Floor, NFloor = data$NFloor, Latitude = data$Latitude, Longitude = data$Longitude, Year_construction = data$Year_construction)

Пункты 2 и 3

Для компактности представления информации мы решили выполнять пункты 2 и 3 (построение таблиц с описательнми статистиками/частотами и построение графиков) подряд по отдельности для каждой переменной.

Сначала приведем все номинальные переменные к типу “factor”

data$Region = data$Region %>% as.factor()
data$District_ad = data$District_ad %>% as.factor()
data$Metro = data$Metro %>% as.factor()
data$Minimum_duration = data$Minimum_duration %>% as.factor()
data$No_agents= data$No_agents %>% as.factor()
data$Building = data$Building %>% as.factor()
data$Lift = data$Lift %>% as.factor()
data$Furnished = data$Furnished %>% as.factor()
data$Bath = data$Bath %>% as.factor()
data$Refurbished= data$Refurbished %>% as.factor()
data$Balcony= data$Balcony %>% as.factor()

Номинальные переменные (a)

Анализ начнем с номинальных переменных.

Дата размещения объявления (Date_entry)

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

data$Date_entry = ymd(data$Date_entry)
ggplot(data) + geom_bar(aes(x = wday(Date_entry, label = T)), fill = 10,color = "black")+
  xlab("Дни недели")+
  ylab("Количеств объявлений")+
  ggtitle("Распределение объявлений по дням недели")

Отметим, что чаще всего объявления подаются во вторник, а реже всего - по выходным.

Теперь посмотрим на распределение по месяцам.

data$Date_entry = ymd(data$Date_entry)
ggplot(data) + geom_bar(aes(x = month(Date_entry, label = T)), fill = 10,color = "black")+
  xlab("Месяцы")+
  ylab("Количеств объявлений")+
  ggtitle("Распределение объявлений по месяцам")

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


Регион объявления (Region)

region = data.frame(summary(data$Region))
region_visual= datatable(region, caption="Количество предложений по сдаче квартир в Ленинграсдкой области и Санкт-Петербурге", colnames=c("Локация", "Количество наблюдений"), options = list(searching =F,ordering = F, paging = F, info = F))
region_visual

В выборке представлены квартиры, располагающиеся в двух субъектах РФ: в Санкт-Петербурге и в Ленинградской области. Квартиры, располагающиеся в Петербурге существенно преобладают в выборке. Пропущенных значений нет (видимо, регион - это обязательная графа в анкете).

Построим столбчатую диаграмму для этой переменной:

data_region = data %>%  dplyr :: select(Region)
data_region = group_by(data_region, Region)
data_region = summarise(data_region, cnt = n())

data_region$Region=str_replace_all(data_region$Region,"gorod Sankt-Peterburg", "Санкт-Петербург")
data_region$Region=str_replace_all(data_region$Region,"Leningradskaya oblast'", "Ленинградская область")

ggplot() +
  geom_bar(data = data_region, aes(y = cnt, ,x = Region), stat = "identity", position = "dodge",fill = "#4682B4", col="black")+
  ggtitle("Количество предложений по сдаче квартир\nв Ленинградской области и Санкт-Петербурге") +
  xlab("Локация") + 
  ylab("Количество предложений")+
  theme_bw()

Данная диаграмма наглядно показывает, что количество квартир под сдачу по Санкт-Петербургу в несколько раз выше количества квартир под сдачу в Ленинградской области.

Есть несколько причин такой большой разницы в данных. Во-первых, сдавать квартиру в Санкт-Петербурге более прибыльно, чем в области, так как средняя цена за аренду квартиры в крупном городе выше. Во-вторых, Санкт-Петербург - культурная столица и один из крупнейших городов России, куда приезжают люди по самым разным причинам: работа, учёба, отдых, семья и т.д. Соответственно, спрос на квартиры в городе будет выше, чем на квартиры в области, так как удобное расположение играет большую роль для многих приезжих.


Район, в котором располагается квартира (District_ad)

district = data.frame(summary(data$District_ad))
district = datatable(district, caption="Количество предложений по сдаче квартир в зависимости от района", colnames=c("Районы", "Количество наблюдений"))
district

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

datatable(data %>% filter(Region == "Leningradskaya oblast'") %>% filter( District_ad == "Выборгский")%>% select(Region, District_ad, Address),options = list(searching =F,ordering = F, paging = F, info = F)) 

Да, таких наблюдений 4. Заменим в них название района на “Выборгский ЛО”:

data$District_ad = data$District_ad %>%   as.character()
data$District_ad = ifelse(data$Region == "Leningradskaya oblast'"&data$District_ad=="Выборгский", "Выборгский ЛО", data$District_ad)
data$District_ad = data$District_ad %>% as.factor()

Теперь в выборке представлено 25 разных районов:

district = data.frame(summary(data$District_ad))
district = datatable(district, caption="Количество предложений по сдаче квартир в зависимости от района", colnames=c("Районы", "Количество наблюдений"))
district

Построим столбчатую диаграмму:

Наиболее популярные локации сдаваемых квартир - Центральный, Московский и Приморский районы. Квартиры в Центральном районе активно сдаются, так как арендодатели рассчитывают на туристов и тех, кто в командировке, ведь, в основном, все бизнес-центры и достопримечательности располагаются именно в центре города. Так же, это можно обусловить тем, что данный район - довольно живое и шумное место для постоянного проживания, что мало кому подойдет, поэтому владельцы предпочитают сдавать такие квартиры и жить дальше от центра. Приморский район знаменит своей экологической обстановкой и видами на Лахтинский разлив, он больше подходит студентам и приезжим семьям. Что касается Московского района - он также является одним из самых “зеленых” районов, занимает удобное расположение, спрос на квартиры в данном районе высокий, а следовательно - и предложение тоже.

Наименее популярные - районы Ленинградской области (Тосненский, Лужский, Гатчинский и т.д.), а так же районы пригородов Петербурга (Курортный, Петродворцовый и т.д.) Районы Ленинградской области редко пользуются спросом из-за своего дальнего относительно центра расположения и наличия квартир с современным ремонтом, за исключением густонаселённых районов с новостройками. Курортный и Петродворцовый районы - районы с наиболее дорогой землёй и недвижимостью, менее развитой инфраструктурой. Большинство приезжих - средний класс, они не могут позволить себе постоянное проживание и аренду частного дома или элитной квартиры. Значит, и предложение будет минимальным. Стоит отметить, что данные районы включают в себя по большей части именно частные постройки, очевидно, что владельцы с маленькой вероятностью будут сдавать в аренду свой дом/дачу.

Ближайшая станция метро (Metro)

metro = data.frame(summary(data$Metro))
metro = datatable(metro, caption="Ближайшая к сдаваемой квартире станция метро", colnames=c("Станция метро", "Количество наблюдений"))
metro

Заметим, что в 74 случаях не указано ближайшее к сдаваемой квартире метро. Среди станций метро также попадаются ж/д станции. Будем считать, что для пригородов ж/д станции своеобразный аналог метро - их можно не исключать из выборки.

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

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

Столбчатая диаграмма:

На графике видно, что больше всего объектов находятся в близости от м. Комендантский проспект, это объясняется развитой инфраструктурой, обилием парковых зон, детских садов, школ и ЖК комфорт-класса. Вслед за этой станцией идет Приморская. Здесь обратная ситуация: на Васильевском острове всего две станции метро и большинство жилых зданий располагаются севернее, т.е. ближе к Приморской, именно поэтому значительное количество наблюдений находятся на этой станции. 3 место разделяют Московская, где располагается район с богатой историей и архитектурой, и проспект Ветеранов, в районе которого располагаются новостройки и панельные дома со сравнительно невысокой стоимостью аренды. За ними следуют Чернышевская и площадь Восстания, которые являются центром Санкт-Петербурга. Петроградская, от которой можно быстро добраться до центра. Звездная, Проспект Просвещения, Улицы Дыбенко и Купчино, где можно найти квартиры по самой выгодной и низкой цене.

Количество комнат в квартире (Rooms)

rooms = data.frame(summary(as.factor(data$Rooms)))
rooms = datatable(rooms, caption="Количество комнат в сдаваемой квартире", colnames=c("Количество комнат", "Количество наблюдений"))
rooms

Анализируя переменную rooms, мы заметили, что в некоторых случаях одна и та же информация записана по-разному, что может затруднить анализ. Например, “1 (studiya)” и “1 (studiya)” означают одно и то же. Чтобы избежать ошибок, отформатируем данные.

data2 = data
data2$Rooms=str_replace_all(data2$Rooms,"1   \\(studiya\\)","Студия")
data2$Rooms=str_replace_all(data2$Rooms,"1 \\(studiya\\)","Студия")

Кроме того, 47 комнат в одной сдаваемой квратире - явная ошибка при сборе информации. Уберем это значение для последующего анализа.

data2 = data2 %>% filter(data2$Rooms!='47')

8 комнат в квартире на первый взгляд тоже выглядит как ошибка в данных, однако, заметим, что данная квартира сдается за 450000 рублей. Так что вполне вероятно наличие в ней восьми комнат. Итоговая таблица имеет следующий вид:

data2$Rooms = data2$Rooms %>%  as.factor()
rooms = data.frame(summary(data2$Rooms))
rooms = datatable(rooms, caption="Количество комнат в сдаваемой квартире", colnames=c("Количество комнат", "Количество наблюдений"),options = list(searching =F,ordering = F, paging = F, info = F))
rooms

Столбчатая диаграмма:

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

Minimum_duration (минимальный срок аренды)

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

data_min_dur = data %>%  filter(Minimum_duration != "")
data_min_dur$Minimum_duration = data_min_dur$Minimum_duration %>% as.factor()
summary(data_min_dur$Minimum_duration)
##          1 mes. 10 mes. 11 mes. 12 mes. 13 mes. 14 mes. 15 mes.  2 mes.  3 mes. 
##       0      80      32    1552     203       2      27       3       4      16 
## 31 mes.  4 mes.  5 mes.  6 mes.  8 mes.  9 mes. 
##      19       3       3     130       1       3

Максимальное значение - 31 месяц, минимальное - 1 месяц. При этом нетрудно заметить, что больше чем у половины наблюдений минимальный срок аренды - 11 месяцев. Все остальные “варианты” срока составляют по отдельности совсем малые части. Расположим их в порядке убывания доли в выборке:

count = data_min_dur %>% count(Minimum_duration) %>% mutate(Dolya = round(n/sum(n),4)) %>% arrange(-Dolya)
datatable(count, options = list(searching =F,ordering = F, info = F))

Отнесем все значения, доля которых в выборке меньше 3 процентов в категорию “Иное”

data_min_dur = data_min_dur %>% inner_join(count)
data_min_dur$Minimum_duration = data_min_dur$Minimum_duration %>% as.character() 

data_min_dur$Minimum_duration = ifelse(data_min_dur$Dolya<0.03, "Иное", data_min_dur$Minimum_duration)
library(stringr)
data_min_dur$Minimum_duration = data_min_dur$Minimum_duration %>% str_replace_all("mes.", "мес.")

Для наглядности посмотрим график:

ggplot(data_min_dur) + geom_bar(aes(x = Minimum_duration), fill = 3, color = 1)+
  ggtitle("Распределение наблюдений по минимальному сроку аренды")+
  xlab("Минимальный срок аренды")+
  ylab("Абсолютная частота")

У нас получилось 5 выделенных групп, попробуем разобраться, почему именно они:

1 месяц - самый логичный и подходящий выбор для арендодателей, которые хотят сдать квартиру на короткий срок.

6 месяцев = полгода - стандартный средний срок, полгода - это понятное “круглое число” по отношению ко времени.

12 месяцев - еще одно “круглое число”, ровно год.

“Иное” - варианты, не пользующиеся популярностью - они указываются реже, чем “круглые сроки”. Однако чаще, чем срок 1 месяц - это может быть связано с тем, что варианты краткосрочной аренды встречаются относительно редко. Отметим также, что варианты со сроком больше года составляют в выборке меньше 3%.

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

Участие агента (No_agents)

В изначальных данных представлено довольно путанное понятие - отсутствие агента с ответами “да” и “нет”. Чтобы избежать ошибок в анализе, изменим формулировку категории на “наличие агента”, тогда ответы “да” и “нет” исходного датасета изменим на противоположные.

data$No_agents=str_replace_all(data$No_agents,"^$","Yes")
data$No_agents=str_replace_all(data$No_agents,"Da","No")
data$No_agents= data$No_agents %>% as.factor()
agent = data.frame(summary(data$No_agents))
agent = datatable(agent, caption="Количество квартир, сдаваемых с агентом и без", colnames=c("Наличие агента", "Количество наблюдений"),options = list(searching =F,ordering = F, paging = F, info = F))
agent

Итоговая таблица не содержит ошибок. Единственное, что нам пришлось отредактировать - формулировку категории.

Построим столбчатую диаграмму для этой переменной:

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

Тип здания (Building)

build = data.frame(summary(data$Building))
build = datatable(build, caption="Материалы, из которых построены здания сдаваемых квартир", colnames=c("Тип строения", "Количество наблюдений"))
build

В 346 наблюдениях не указан тип строения, в котором находится сдаваемая квартира. Возможно, это произошло в силу незнания или нежелания уточнять.

Столбчатая диаграмма:

Диаграмма отражает основные технологии возведения сооружений. Наибольшую долю в этой категории занимает кирпичный дом, который обладает такими качествами как: долговечность, прочность и терморегуляция. Вслед за ним идет кирпично-монолитное возведение, большинство современных новостроек можно отнести к данному типу. Монолитное возведение домов используется застройщиками эконом-класса, т.к это быстро и значительно дешевле ранее упомянутых типов застройки. Далее идут панельные дома, которые активно строились в 60-х, а также служат альтернативой монолитным домам в современной постройке, т.к. тоже легко и дешево возводятся. Затем идет старый фонд, преимущественно располагающийся в центре города, цена в таких домаха выше, т.к.они зачастую представляют собой памятники архитектуры. Стоит также отметить, что дома старого фонда оснащены старой сантехникой, ремонт которой - долгий, дорогостоящий процесс, поэтому спрос на такие квартиры невелик. Столько же сдаваемых квартир располагается в блочных домах, которые являются более дешевой альтернативой панельным домам. Потом идут сталинки, которые активно строились в период с 30-х до 60-х годов. Помимо этого в городе есть монолитно-панельные дома, а также 137, 121, 504, 504D, 600.11, 606 серии панельных домов, возведенные в советское время на окраинах города, что объясняет малое количество сдаваемых в них квартир.

Наличие лифта (Lift)

data$Lift=str_replace_all(data$Lift,"Est'","Yes")
data$Lift=str_replace_all(data$Lift,"Net","No")
data$Lift=as.factor(data$Lift)
lift = data.frame(summary(data$Lift))
lift = datatable(lift, caption="Количество сдаваемых квартир в домах с лифтом и без",colnames=c("Наличие лифта", "Количество наблюдений"), options = list(searching =F,ordering = F, info = F,paging = F))
lift

Итоговая таблица - без изменений. 121 респондент не заполнил данную графу.

Столбчатая диаграмма:

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

Тип мебилировки (Furnished)

furnish = data.frame(summary(data$Furnished))
furnish = datatable(furnish, caption="Таблица типов меблировки сдаваемых квартир",colnames=c("Тип меблировки", "Количество наблюдений"))
furnish 

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

Столбчатая диаграмма:

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

Тип ванной комнаты (Bath)

bath = data.frame(summary(data$Bath))
bath = datatable(bath, caption="Таблица типов ванной комнаты в сдаваемых квартирах",colnames=c("Тип ванной", "Количество наблюдений"), options = list(searching =F,ordering = F, info = F, paging = F))
bath

В 1579 случаях не указан тип ванной комнаты. Заметим, что характеристики ванной (или ванны) указываются с разных точек зрения. Например, “Отдельная” и “Совмещеная” - это характеристика санузла (самый распространенная и показательная), а “Поперечная” и “Продольная” - это характеристика непосредственно ванны. При этом варианты, которые не относятся к определению “совмещенности санузла” составляют совсем малую долю в выборке. Чтобы внести конкретику, будем рассматривать только значения “Совмещенная/Отдельная/Душ”.

data_b = data 
data_b$Bath = data_b$Bath %>% as.character()
data_b = data_b %>% filter(Bath == "Otdel'naya"|Bath =="Dush"|Bath == "Sovmeshchennaya")
data_b$Bath = data_b$Bath %>% str_replace_all("Otdel'naya", "Отдельная")
data_b$Bath = data_b$Bath %>% str_replace_all("Sovmeshchennaya", "Совмещенная")
data_b$Bath = data_b$Bath %>% str_replace_all("Dush", "Душ")

Теперь построим диаграмму частот:

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

Тип ремонта (Refurbished)

refurbished = data.frame(summary(data$Refurbished))
refurbished = datatable(refurbished, caption="Таблица типов ремонта в сдаваемых квартирах", colnames=c("Тип ремонта", "Количество наблюдений"), options = list(searching =F,ordering = F, info = F, paging = F))
refurbished

Значения “душ”, “совмещенная”, “отдельная” в типе ремонта - явная ошибка при сборе информации. Уберем эти несоответствия.

data3 = data
data3$Refurbished=data3$Refurbished %>% as.character()
data3 = data3 %>% filter(data3$Refurbished!='Dush')
data3 = data3 %>% filter(data3$Refurbished!='Sovmeshchennaya')
data3 = data3 %>% filter(data3$Refurbished!="Otdel'naya")

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

data3$Refurbished = data3$Refurbished %>% as.factor()
refurbished = data.frame(summary(data3$Refurbished))
refurbished = datatable(refurbished, caption="Таблица типов ремонта в сдаваемых квартирах", colnames=c("Тип ремонта", "Количество наблюдений"), options = list(searching =F,ordering = F, info = F, paging = F))
refurbished

Столбчатая диаграмма:

На данной диаграмме видно превалирование трёх типов ванных комнат над всеми другими: «евростандарт», «приведён», «не требуется», причём количество квартир с мебелью категории «евростандарт» является наиболее распространённым с точки зрения предложения. Объяснением этого может послужить тот факт, что люди, желающие снять квартиру, хотят иметь более удобные в ней условия, и, разумеется, непременно предпочтут квартиру двух превалирующих категорий нежели апартаменты другого вида.


Тип балкона (Balcony)

balcony = data.frame(summary(data$Balcony))
balcony = datatable(balcony, caption="Таблица типов балконов в сдаваемых квартирах", colnames=c("Тип (наличие) балкона", "Количество наблюдений"))
balcony

Заметим, что в категории значения “net” и “Net” считаются за два разных ответа, однако по смыслу значат одно и то же. Чтобы предотвратить ошибки в работе с данными, необходимо объединить эти ответы в один.

data4 = data
data4$Balcony=str_replace_all(data4$Balcony,"Net","net")
data4$Balcony = data4$Balcony %>% as.factor()

Итоговая таблица:

balcony = data.frame(summary(data4$Balcony))
balcony = datatable(balcony, caption="Таблица типов балконов в сдаваемых квартирах", colnames=c("Тип (наличие) балкона", "Количество наблюдений"))
balcony

Столбчатая диаграмма:

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


Числовые переменные

Анализ и очистка числовых переменных. Построение таблиц, содержащих следующие описательные характеристики:

mean - среднее
median - медиана (2ой квартиль)
min/max/range - минимум, максимум, размах
assimetria - коэффициент асимметрии
kurtosis - куртозис
firstQu/thirdQu - первый/третий квартиль
sko - среднее квадратичное отклонение
moda - мода

Замечание Для нахождения моды мы использовали специально созданную функцию:

#Функция для нахождения моды:
mode <- function(x) {
d <- density(x)
d$x[which.max(d$y)]
} 

Расстояние до метро (Dist_metro_ad)

dist_ = data$Dist_metro_ad %>% na.omit() #сразу уберем все пропущенные значения
dista_= describe(dist_)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(dist_,0.25)) %>% mutate(thirdQu = quantile(dist_,0.75)) %>% mutate(sko = sd(dist_)) %>% mutate(moda = mode(dist_)) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0)))))) #задали фильтр для соблюдения эмпирического правила, описанного в файле с заданием
kable(dista_,row.names = F, caption = "Описательные характеристики расстояния до метро в выборке")
Описательные характеристики расстояния до метро в выборке
mean median min max range assimetria kurtosis firstQu thirdQu sko moda
1495 790 0 31700 31700 5.59 40.6 352 1570 2681 590

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

data_dist = data %>% select(Dist_metro_ad,Metro,Address, Region) %>% filter(Dist_metro_ad>=5000)
datatable(data_dist)

Всего лишь 135 наблюдений. Большая часть наблюдений после такого фильтра - квартиры, сдаваемые в пригородах Петербурга (и большая дистанция до метро объяснима). Есть наблюдения, где указана станция метро никак не относящаяся к адресу или станция метро, от которой ходит наземный транспорт до адреса. Более того, есть наблюдения в Лен.Области, для которых расстояние до метро вообще не имеет смысла указывать - уберем их (и заодно уберем пропущенные значения).

data_dist = data %>% select(Dist_metro_ad,Metro,Address, Region) %>% filter(Region != "Leningradskaya oblast'") %>% filter(!is.na(Dist_metro_ad))
dist_= describe(data_dist$Dist_metro_ad) %>% select(-vars, -n, -sd, -trimmed, -mad, -se) %>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_dist$Dist_metro_ad,0.25)) %>% mutate(thirdQu = quantile(data_dist$Dist_metro_ad,0.75)) %>% mutate(sko = sqrt(var(data_dist$Dist_metro_ad)))%>% mutate(moda = mode(data_dist$Dist_metro_ad)) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(dist_, row.names = F, caption = "Описательные характеристики расстояния до метро в выборке после преобразований")
Описательные характеристики расстояния до метро в выборке после преобразований
mean median min max range assimetria kurtosis firstQu thirdQu sko moda
1474 780 0 31700 31700 5.73 42.6 340 1550 2668 590

Значения почти не поменялись. Любопытно, что и значение 31700 не ушло. Посмотрим на него:

От Черной речки до Кронштадта и от Комендантского до Комарово. Анализ усложняется тем, что пригороды формально являются частью Петербурга (Курортный, Пушкинский районы, Кронштадт и т.д.), но метро пока до туда не проложено. Будем считать, что квартира находится в пешей доступности от метро, если расстояние до метро <1500м. Посмотрим, какая доля квартир находится в пешей доступности.

ggplot(data_dist %>% mutate(peshaya = Dist_metro_ad<1500) %>% mutate(Tr = T)) + geom_bar(aes(x = Tr, , fill = peshaya),position = 'fill')+
  xlab("")+
  ylab("")+
  scale_x_discrete(labels = c(""))+
  scale_fill_discrete(name = "", labels = c("Вне пешей доступности", "В пешей доступности"))+
  ggtitle("Доля квартир в пешей доступности от метро в выборке")

Почти 75%.

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

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

ggplot(data) +
  geom_boxplot(aes(y = Dist_metro_ad/1000))+
  geom_hline(yintercept = 4, color = "red", linetype = "dashed")+
  scale_x_discrete("")+
  scale_y_continuous(breaks = seq(0, 32, by = 2))+
  ggtitle("Распределение расстояния до метро в выборке (в км)")+
  ylab("")

Рассчитаем описательные статистики именно для значений меньше 4 км.

data_dist = data %>% select(Dist_metro_ad,Metro,Address, Region) %>% filter(Region != "Leningradskaya oblast'") %>% filter(!is.na(Dist_metro_ad)) %>% filter(Dist_metro_ad<4000)

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

dist_ = data_dist$Dist_metro_ad %>% na.omit() #сразу уберем все пропущенные значения
dista_= describe(dist_)  %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(dist_,0.25)) %>% mutate(thirdQu = quantile(dist_,0.75)) %>% mutate(sko = sd(dist_)) %>% mutate(moda = mode(dist_)) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(dista_, row.names = F, caption = "Описательные характеристики расстояния до метро в выборке после преобразований")
Описательные характеристики расстояния до метро в выборке после преобразований
mean median min max range assimetria kurtosis se firstQu thirdQu sko moda
965 725 0 3980 3980 1.28 1.15 17.3 300 1310 887 117

Заметно, как раньше большие значения сильно влияли на среднее. Также сильно снизилось модальное значение. Распределение стало более симметричым (коэффициент асимметрии снизился), куртозис также снизился значительно - острота пика распределения теперь не такая явная.

Коэффициент асимметрии положительный - распределение скошено вправо.

Посмотрим это на графиках:

Гистограмма

ggplot(data_dist) +geom_histogram(aes(x = Dist_metro_ad), fill = 19)+
  ylab("Абсолютная частота")+
  xlab("Расстояние до метро (в метрах)")+
  ggtitle("Гистограмма распределения расстояния до метро")

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

График плотности распределения

ggplot(data_dist)+geom_density(aes(x= Dist_metro_ad))+
  ggtitle("График эмпирической плотности распределения")+
  ylab("")+
  xlab("Расстояние до метро (в метрах)")+
  geom_vline(xintercept = mean(data_dist$Dist_metro_ad), color = 2, linetype = "dashed")+
  annotate("text", x = 990, y = 0.0002, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_dist$Dist_metro_ad), color = 3, linetype = "dashed")+
  annotate("text", x = 110, y = 0.0002, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_dist$Dist_metro_ad), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_dist$Dist_metro_ad), y = 0.0004, label = "Медиана", color = 7)


Цена аренды руб/мес (Price)

Проведем предварительный анализ с помощью summary(), гистограммы и функции плотности:

ggplot(data) +geom_histogram(aes(x = Price/1000), binwidth = 25)+
  ggtitle("Гистограмма")+
  xlab("Цена аренды в тыс. руб")+
  ylab("Абсолютная частота")

ggplot(data)+geom_density(aes(x= Price/1000))+
  ggtitle("График эмпирической плотности распределения цены")+
  ylab("")+
  xlab("Цена аренды в тыс. руб")

Сразу отметим, что квартир с ценой аренды больше 200 тыс. руб. - очень мало в выборке, а основная доля приходится на квартиры с ценой аренды меньше 100 тыс. руб.

summary(data$Price)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
     10   22000   30000   45513   50000  690000 

Отметим, что цена указана во всех объявлениях (нет пропущенных значений). Меры центральности и квартили кажутся вполне корректными, Обратим внимание на минимальное значение - 10 руб/месяц - скорее всего ошибка в данных. Посмотрим, какие квартиры сдаются меньше чем за 10000 руб/мес.

datatable(data %>% select(Address, Rooms, Price, Area_total) %>% filter(Price <10000))

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

Что касается остальных наблюдений, квартира в деревне Жабино вполне может сдаваться за 8000 рублей, а вот 3-комнатная квартира на Мойке вряд ли будет стоить 5500 руб/мес. То же самое можно сказать и об остальных подозрительно дешевых квартирах в черте города. Трудно точно утверждать, какого именно типа эти ошибка - не хватает ли нулей в цене или, возможно, в выборке оказались данные о посуточной аренде, поэтому в последующем лучше просто удалим их из выборки (оставив данные по квартирам в Жабино и Репино, которым, кажется, можно доверять).

data$Price = ifelse(data$Price<100,data$Price*1000, data$Price)
data = data %>% filter(data$Price>=8000)

Наконец, посмотрим на распределение переменной с помощью boxplot:

ggplot(data) +
  geom_boxplot(aes(y = Price/1000))+
  scale_x_discrete("")+
  ylab("Цена в тысячах рублей")+
  ggtitle("Распределение цены аренды в выборке")

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

datatable(data %>% select(Address, Rooms, Price, Area_total) %>% filter(Price >400000))

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

Выше, исходя из данных boxplot мы назвали наблюдения, у которых указана цена более 100 тыс.руб. статистически незначимыми. Их доля в выборке составляет 0.0641711

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

data_price = data %>% filter(Price<100000)
data_price$Price = data_price$Price/1000
price_stat= describe(data_price$Price)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_price$Price,0.25)) %>% mutate(thirdQu = quantile(data_price$Price,0.75)) %>% mutate(moda = mode(data_price$Price))%>% mutate(sko = sd(data_price$Price)) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(price_stat, row.names = F, caption = "Описательные статистики для цены аренды в выборке")
Описательные статистики для цены аренды в выборке
mean median min max range assimetria kurtosis firstQu thirdQu moda sko
34.9 28 8 99 91 1.24 0.805 21 45 21.5 18.5

Среднее и медианное значения теперь отличаются в меньшей степени. Распределение все еще скошено вправо, “острота пика” не так сильно выражена.

Гистограмма

ggplot(data_price) +geom_histogram(aes(x = Price), binwidth = 5, fill = 19)+
  ylab("Абсолютная частота")+
  xlab("Цена аренды (тыс. руб/мес)")+
  ggtitle("Гистограмма распределения цены аренды")

График эмпирической плотности распределения

ggplot(data_price)+geom_density(aes(x = Price))+
  ggtitle("График эмпирической плотности распределения")+
  ylab("")+
  xlab("Цена аренды (тыс. руб/мес)")+
  geom_vline(xintercept = mean(data_price$Price), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_price$Price), y = 0.02, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_price$Price), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_price$Price), y = 0.02, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_price$Price), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_price$Price), y = 0.03, label = "Медиана", color = 7)


Географическая долгота (Longitude)

Попробуем дать интерпретацию описательным характеристикам представленных в выборке географических координат. Начнем с географической долготы:

data_coord = data %>% select(Latitude, Longitude, Address) %>% filter(!is.na(Longitude)) %>% filter(!is.na(Latitude))
coord_stat_long= describe(data_coord$Longitude)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_coord$Longitude,0.25)) %>% mutate(thirdQu = quantile(data_coord$Longitude,0.75)) %>% mutate(moda = mode(data_coord$Longitude))%>% mutate(sko = sd(data_coord$Longitude))%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(coord_stat_long, row.names = F, caption = "Описательные статистики для географической долготы в выборке")
Описательные статистики для географической долготы в выборке
mean median min max range assimetria kurtosis firstQu thirdQu moda sko
30.3 30.3 28.8 30.6 1.86 -2.347 42.2 30.3 30.4 30.3 0.086
ggplot(data_coord) +geom_histogram(aes(x = Longitude), fill = 19)+
  ylab("Абсолютная частота")+
  xlab("Географическая долгота")+
  ggtitle("Гистограмма распределения географической долготы")

ggplot(data_coord)+geom_density(aes(x = Longitude))+
  ggtitle("График эмпирической плотности распределения долготы")+
  ylab("")+
  xlab("Географическая долгота")+
  geom_vline(xintercept = mean(data_coord$Longitude), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_coord$Longitude), y = 0.02, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_coord$Longitude), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_coord$Longitude), y = 2, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_coord$Longitude), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_coord$Longitude), y = 4, label = "Медиана", color = 7)

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

datatable(data_coord %>% filter(Longitude<29), options = list(searching =F,ordering = F, paging = F, info = F))

Это квартира в Выборге.

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

Посмотрим, как изменится коэффициент асимметрии, если убрать из выборки Выборг:

sk = data_coord$Longitude[data_coord$Longitude>29]
sk = skew(sk)

После преобразований коэффициент асимметрии стал равен 0.0193995. Он теперь положительный, то есть распределение немного, но все же скошено вправо:

ggplot(data_coord %>%  filter(Longitude>29))+geom_density(aes(x = Longitude))+
  ggtitle("График эмпирической плотности\nраспределения долготы после преобразований")+
  ylab("")+
  xlab("Географическая долгота")+
  geom_vline(xintercept = median(data_coord$Longitude), color = 2, linetype = "dashed")+
  annotate("text", x = median(data_coord$Longitude), y = 0.03, label = "Медиана", color = 2)

Географическая широта (Latitude)

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

coord_stat_lat= describe(data_coord$Latitude)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_coord$Latitude,0.25)) %>% mutate(thirdQu = quantile(data_coord$Latitude,0.75)) %>% mutate(moda = mode(data_coord$Latitude))%>% mutate(sko = sd(data_coord$Latitude))%>% mutate(sko = sd(data_coord$Longitude))%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(coord_stat_lat, row.names = F, caption = "Описательные статистики для географической широты в выборке")
Описательные статистики для географической широты в выборке
mean median min max range assimetria kurtosis firstQu thirdQu moda sko
59.9 59.9 59.6 60.7 1.13 0.469 5.6 59.9 60 59.9 0.086
ggplot(data_coord) +geom_histogram(aes(x = Latitude), fill = 19)+
  ylab("Абсолютная частота")+
  xlab("Географическая широта")+
  ggtitle("Гистограмма распределения географической широты")

ggplot(data_coord)+geom_density(aes(x = Latitude))+
  ggtitle("График эмпирической плотности распределения широты")+
  ylab("")+
  xlab("Географическая широта")+
  geom_vline(xintercept = mean(data_coord$Latitude), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_coord$Latitude), y = 0.02, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_coord$Latitude), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_coord$Latitude), y = 2, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_coord$Latitude), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_coord$Latitude), y = 4, label = "Медиана", color = 7)

Коэффициент асимметрии положительный - распределение скошено вправо. По минимуму и максимуму можно определить самую южную и самую северную квартиры - они же являются двумя “выбросами” в выборке

datatable(data_coord %>% filter(Latitude<59.6|Latitude>60.5), options = list(searching =F,ordering = F, paging = F, info = F))

Самое южное наблюдение в Гатчине. Самое северное - в Выборге.

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

lat = median(data_coord$Latitude)
long = median(data_coord$Longitude)

Получились координаты 59.939063северной широты и 30.324456восточой долготы.

Географический центр выборки - Шведский переулок, дом 2 - в центре Петербурга.


Общая площадь квартиры (Area_total)

data_areat=Numeric %>% select(Area_total) %>% filter(!is.na(Area_total))
artotal= describe(data_areat$Area_total) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_areat$Area_total,0.25)) %>% mutate(thirdQu = quantile(data_areat$Area_total,0.75)) %>% mutate(sko = sd(data_areat$Area_total))
mode_result_art=mode(data_areat$Area_total) 
artotal=artotal %>% mutate(mode=mode_result_art) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(artotal,row.names = F, caption = "Описательные характеристики площадей квартитр в выборке")
Описательные характеристики площадей квартитр в выборке
mean median min max range assimetria kurtosis se firstQu thirdQu sko mode
63.1 50 15 514 499 3.45 21.8 0.753 39 74 40.3 39.9

Жилое помещение площадью 514 квадратных метров - очевидно, ошибка, так как это слишком огромное пространство. Построим боксплот и посмотрим, где начинаются выбросы, чтобы подтвердить наше предположение.

ggplot(data=data_areat) + geom_boxplot(aes(x=Area_total), col = 'black', fill = 'thistle4') + theme_minimal() + xlab('Общая площадь квартиры')

Как мы видим, статистически значимые значения площади квартиры заканчиваются примерно на 250м^2. В таком случае рассмотрим скорректированную выборку.

data_areat1=data_areat %>% filter(Area_total<=250)
artotal1= describe(data_areat1$Area_total) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_areat1$Area_total,0.25)) %>% mutate(thirdQu = quantile(data_areat1$Area_total,0.75)) %>% mutate(sko = sd(data_areat1$Area_total))
mode_result_art1=mode(data_areat1$Area_total)
artotal1=artotal1 %>% mutate(mode=mode_result_art1)%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(artotal1,row.names = F, caption = "Описательные характеристики площадей квартир в выборке")
Описательные характеристики площадей квартир в выборке
mean median min max range assimetria kurtosis se firstQu thirdQu sko mode
61.6 50 15 250 235 1.93 4.65 0.642 39 73 34.3 39.6

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

ggplot(data_areat1)+geom_histogram(aes(x=Area_total),fill='pink',col='#483D8B',bins=20)+xlab('Общая площадь (кв. м)')+ylab('Количество объявлений')+ggtitle('Распределение площадей квартир')+theme_minimal()

ggplot(data_areat1)+geom_density(aes(x=Area_total),col=1)+xlab('Общая площадь (кв. м)')+ylab('Относительная частота появлений')+ggtitle('Эмпирическая плотность распределения\nплощадей квартир')+theme_minimal()+
   geom_vline(xintercept = mean(data_areat1$Area_total), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_areat1$Area_total), y = 0.01, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_areat1$Area_total), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_areat1$Area_total), y = 0.005, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_areat1$Area_total), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_areat1$Area_total), y = 0.02, label = "Медиана", color = 7)

Как мы видим, наиболее часто встречаемое значение - приблизительно 40 квадратных метров. То есть основная масса квартир ориентирована на стандартные показатели по площади и, чем больше площадь - тем меньше предоставляемых для рассмотрения квартир.


Жилая площадь (Area_living)

data_areal=Numeric %>% select(Area_living) %>% filter(!is.na(Area_living))
arliving= describe(data_areal$Area_living) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_areal$Area_living,0.25)) %>% mutate(thirdQu = quantile(data_areal$Area_living,0.75)) %>% mutate(sko = sd(data_areal$Area_living))
mode_result_arliv=mode(data_areal$Area_living)
arliving=arliving %>% mutate(mode=mode_result_arliv)%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(arliving,row.names = F, caption = "Описательные характеристики жилых площадей в выборке")
Описательные характеристики жилых площадей в выборке
mean median min max range assimetria kurtosis se firstQu thirdQu sko mode
37.7 30 10 300 290 3.1 16.4 0.503 19 46 27.3 18.5

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

data_areal1=data_areal %>% filter(Area_living<=250)
arliving1= describe(data_areal1$Area_living) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_areat1$Area_total,0.25)) %>% mutate(thirdQu = quantile(data_areal1$Area_living,0.75)) %>% mutate(sko = sd(data_areat1$Area_total))
mode_result_arl1=mode(data_areal1$Area_living)
arliving1=arliving1 %>% mutate(mode=mode_result_arl1)%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
datatable(arliving1, options = list(searching =F,ordering = F, info = F,paging = F))
ggplot(data_areal)+geom_histogram(aes(x=Area_living),fill='orange',col='black',bins=25)+xlab('Жилая площадь (кв. м)')+ylab('Количество объявлений')+ggtitle('Распределение жилых площадей квартир')+theme_minimal()

ggplot(data_areal)+geom_density(aes(x=Area_living),col=1)+xlab('Жилая площадь (кв. м)')+ylab('Относительная частота появлений')+ggtitle('Эмпирическая плотность распределения\nжилых площадей квартир')+theme_minimal()+
  geom_vline(xintercept = mean(data_areal$Area_living), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_areal$Area_living), y = 0.01, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_areal$Area_living), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_areal$Area_living), y = 0.015, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_areal$Area_living), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_areal$Area_living), y = 0.02, label = "Медиана", color = 7)

Что касается жилой площади, мода - около 10-ти квадратных метров, то есть наиболее часто встречаются однокомнатные квартиры, хотя второй по величине пик - около 30 квадратных метров. Опять же, с ростом жилой площади уменьшается кол-во предоставляемых квартир.


Площадь кухни (Area_kitchen)

data_kit=Numeric %>% select(Area_kitchen) %>% filter(!is.na(Area_kitchen))
areakit= describe(data_kit$Area_kitchen) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_kit$Area_kitchen,0.25)) %>% mutate(thirdQu = quantile(data_kit$Area_kitchen,0.75)) %>% mutate(sko = sd(data_kit$Area_kitchen))
mode_result_kit=mode(data_kit$Area_kitchen)
areakit=areakit %>% mutate(mode=mode_result_kit)%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(areakit,row.names = F, caption = "Описательные характеристики площадей кухонь в выборке")
Описательные характеристики площадей кухонь в выборке
mean median min max range assimetria kurtosis se firstQu thirdQu sko mode
13.4 10 1 165 164 4.48 33.4 0.21 8 15 10.8 9.71

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

ggplot(data=data_kit) + geom_boxplot(aes(x=Area_kitchen), col = 'black', fill = 'thistle4') + theme_minimal() + xlab('Площадь кухни сдаваемой квартиры')

data_kit1=data_kit %>% filter(Area_kitchen>1 & Area_kitchen<=60)
areakit1= describe(data_kit1$Area_kitchen) %>% select(-vars, -n, -sd, -trimmed, -mad)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_kit1$Area_kitchen,0.25)) %>% mutate(thirdQu = quantile(data_kit1$Area_kitchen,0.75)) %>% mutate(sko = sd(data_kit1$Area_kitchen))
mode_result_kit1=mode(data_kit1$Area_kitchen)
areakit1=areakit1 %>% mutate(mode=mode_result_kit1)%>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(areakit1,row.names = F, caption = "Описательные характеристики площадей кухонь в исправленной выборке")
Описательные характеристики площадей кухонь в исправленной выборке
mean median min max range assimetria kurtosis se firstQu thirdQu sko mode
13 10 3 60 57 2.51 7.73 0.157 8 15 7.9 9.78

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

ggplot(data_kit1)+geom_histogram(aes(x=Area_kitchen),fill='#20B2AA',col='black',bins=25)+xlab('Площадь кухни (кв. м)')+ylab('Количество объявлений')+ggtitle('Распределение площадей кухонь в  квартирах')+theme_minimal()

ggplot(data_kit1)+geom_density(aes(x=Area_kitchen),col=1)+xlab('Площадь кухни (кв. м)')+ylab('Относительная частота появлений')+ggtitle('Эмпирическая плотность распределения\nплощадей кухонь в  квартирах')+theme_minimal()+
  geom_vline(xintercept = mean(data_kit1$Area_kitchen), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_kit1$Area_kitchen), y = 0.01, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_kit1$Area_kitchen), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_kit1$Area_kitchen), y = 0.06, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_kit1$Area_kitchen), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_kit1$Area_kitchen), y = 0.03, label = "Медиана", color = 7)

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

Расположение квартир по их этажам (Floor)

Рассмотрим распределение квартир в зависимости от их расположения по этажам.

data_floor1=Numeric %>% select(Floor) %>% filter(!is.na(Floor))
floor_1= describe(data_floor1$Floor)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(data_floor1$Floor,0.25)) %>% mutate(thirdQu = quantile(data_floor1$Floor,0.75)) %>% mutate(sko = sd(data_floor1$Floor))
mode_floor=mode(data_floor1$Floor)
floor_1=floor_1 %>% mutate(mode=mode_floor) %>% mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0))))))
kable(floor_1,row.names = F, caption = "Описательные характеристики этажей квартир")
Описательные характеристики этажей квартир
mean median min max range assimetria kurtosis firstQu thirdQu sko mode
6.72 5 1 27 26 1.37 1.46 3 9 5.07 3.38

Полученные описательные характеристики на вид кажутся достаточно реальными. Согласно медианному и модальному значению, большая часть квартир располагаются в районе 3-5 этажей. Это может быть связано с тем, что людям удобнее, когда их квартира расположена ближе к 1 этажу, чтобы оперативнее решать бытовые задачи. Также нужно учитывать, что большинство домов имеют максимум 5,6,7 этажов, что также влияет на данное распределение.

ggplot(data_floor1)+geom_bar(aes(x=Floor %>% as.factor()),fill='brown',col='black',bins=25)+xlab('Этаж')+ylab('Количество объявлений')+ggtitle('Распределение расположения квартир по этажам')+theme_minimal()

С помощью диаграммы мы можем увидеть, что, действительно, большая часть объявлений связаны с квартирами на 3-5 этажах. Также, с увеличением этажей располагаемых квартир, предложение самих квартир уменьшается, так как: 1) не так много домов, имеющих большое количество этажей, 2) цена на квартиры в верхних этажах может быть немалой, в связи с чем спрос на них не так велик.

ggplot(data_floor1)+geom_density(aes(x=Floor),col=1)+xlab('Этаж квартиры')+ylab('Относительная частота появлений')+ggtitle('Эмпирическая плотность распределения этажей')+theme_minimal()+
  geom_vline(xintercept = mean(data_floor1$Floor), color = 2, linetype = "dashed")+
  annotate("text", x = mean(data_floor1$Floor), y = 0.01, label = " Среднее", color = 2)+
  geom_vline(xintercept = mode(data_floor1$Floor), color = 3, linetype = "dashed")+
  annotate("text", x = mode(data_floor1$Floor), y = 0.06, label = "Мода", color = 3)+
  geom_vline(xintercept = median(data_floor1$Floor), color = 7, linetype = "dashed")+
  annotate("text", x = median(data_floor1$Floor), y = 0.03, label = "Медиана", color = 7)

Количество этажей в доме (NFloor)

В ходе предварительного анализа было обнаружено, что в колонке с количеством этажей встречаются ошибочные значения “… kv.m.”. Заменим их на NA:

data$NFloor = ifelse(str_detect(data$NFloor, 'kv.m.')==T, NA, data$NFloor)

Порпробуем рассмотреть количество этажей как числовую переменную и отметить некоторые особенности:

data$NFloor = data$NFloor %>% as.numeric()

stock = data$NFloor%>% na.omit() #сразу уберем все пропущенные значения
stock= describe(stock)  %>% select(-vars, -n, -sd, -trimmed, -mad, -se)%>% rename(assimetria = skew) %>% mutate(firstQu = quantile(stock,0.25)) %>% mutate(thirdQu = quantile(stock,0.75)) %>% mutate(sko = sd(stock)) %>%  mutate_all(funs(ifelse(.<1, round(.,3), ifelse(.<10,round(.,2),ifelse(.<100,round(.,1),round(.,0)))))) 
kable(stock)
mean median min max range assimetria kurtosis firstQu thirdQu sko
11.9 10 1 35 34 0.669 -0.682 6 16 6.77

Минимальное значение - 1 этаж (вероятно, дома в области). Максимальное значение - 35 этажей - вполне допустимое. Медианное значение - 10 этажей, то есть 50% домов в выборке выше 10 этажей, 50% - ниже. Каких-либо ошибок в данных не обнаружено.

Посмотрим, как конкретно распределены наблюдения по количеству этажей

 ggplot(data) +geom_bar(aes(x = NFloor %>% as.factor), fill = 2, color = 1)+
  ggtitle("Распределение наблюдений по количеству этажей в доме")+
  xlab("Кол-во этажей")+
  ylab("Абсолютная частота")

В выборке есть очевидные лидеры - 5-этажные и 9-этажные дома. Это легко объяснимо: 5-этажные дома строились в Петербурге в 19 веке, и в начале 20 века (многие доходные дома высотой именно в 5 этажей), и, конечно, на протяжении советского периода (знаменитые “хрущевки”). А 9 этажей - это самая распространенная высота типовой советской застройки.

Наконец, условно разделим наблюдения на три группы “Малоэтажки”(1-5 этажей), “Среднеэтажки”(6-9 этажей), “Многоэтажки”(больше 9 этажей) и посмотрим, как распределены здания по этим группам:

data$stock = ifelse(data$NFloor<=5, "Малоэтажки", ifelse(data$NFloor<10,"Среднеэтажки", "Многоэтажки"))
data$stock = data$stock %>% ordered(levels = c("Малоэтажки","Среднеэтажки", "Многоэтажки"))
ggplot(data %>% filter(!is.na(stock))) +geom_bar(aes(x = stock), color = 1, fill = 3)+
  ggtitle("Распределение наблюдений по этажности")+
  xlab("Тип здания")+
  ylab("Абсолютная частота")

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

Пункты 4 и 5

Для компактности представления информации мы решили выполнять пункты 4 и 5 (построение графиков рассеяния и вычисление коэффициентов корреляции) подряд по отдельности для каждой переменной, как и в случае с пунктами 2 и 3.

Создание диаграмм рассеяния

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

data$Price=log(data$Price)

1. Диаграмма рассеяния. Взаимосвязь между переменными Floor и Price

ggplot(data,aes(x=Price, y=Floor)) +
  geom_point(color = '#003399')+xlab('Логарифм наёмной цены за жильё') + ylab('Этаж, на котором расположена квартира')+geom_smooth(method = "lm")

cor.test(data$Price,data$Floor,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Floor
S = 4439594919, p-value = 2.191e-11
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.1244531 

На графике мы с трудом можем заметить зависимость цены сдаваемой квартиры от этажа, на котором она расположена. Знак коэффициента корреляции (-0.125) - минус - означает отрицательную взаимосвязь, однако его модуль так мал, что сложно говорить о какой-либо реальной корреляции двух переменных. Тем не менее, специфика собранных данных может привести нас к неправильным выводам. Проверим это, обративишись к независимым исследованиям в интернете. Обнаружим, что рассмотренные на большей выборке квартиры нижних этажей дешевле квратир на последних этажах (в силу большого количества недостатков: шум, плата за не используемый лифт, решетки на окнах и т.д.) “Прежде всего, людей привлекают прекрасные видовые характеристики, в особенности, если окна выходят на лесные массивы или живописные водоемы. Отсюда вытекает ценовая политика застройщиков – квартиры наверху оцениваются дороже, причем разница, по сравнению с нижними этажами, может достигать 10-15%.” Выходит, выводы, которые можно сделать на основе графика, конечно, имеют место быть, однако они довольно специфичны и на большей выборке не применяются.


2. Диаграмма рассеяния. Взаимосвязь между переменными Dist_metro_ad и Price

ggplot(data %>% filter(Dist_metro_ad<4000),aes(x=Price, y=Dist_metro_ad)) + #создание диаграммы рассеивания 
  geom_point(color = 'red')+xlab('Логарифм наёмной цены за жильё') + ylab('Расстояние до ближайшей станции метро')+geom_smooth(method="lm")

cor.test(data$Price,data$Dist_metro_ad,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Dist_metro_ad
S = 5467796161, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.3244877 

На графике можно увидеть, что, в целом, чем ближе метро, чем выше цена сдаваемого жилья. Коэффициент корреляции в этом случае гораздо выше, чем в предыдущем, он равен -0.324, поэтому мы более уверены в суждениях. Данную зависимость можно объяснить тем, что люди, живущие рядом с подземным транспортом, экономят время, затраченное на дорогу, например, на работу, поэтому такие квартиры пользуются большим спросом. Также, надомным бизнесменам (репетиторам, мастерам маникюра и т.д.) выгодно такое расположение жилья, т.к. оно комфортно для потенциальных клиентов. «В среднем квартиры, расположенные непосредственно у метро, на 20–25 % дороже, чем жильё такого же метража и потребительских характеристик, расположенное в 10 минутах езды от метро», — рассказал Дмитрий Котровский, вице-президент девелоперской компании «Химки Групп». То есть, найденная нами корреляция подтверждена. —

3. Диаграмма рассеяния. Взаимосвязь между переменными Area_total и Price

ggplot(data,aes(x=Price, y=Area_total)) + #создание диаграммы рассеивания 
  geom_point(color = 'orange')+xlab('Логарифм наёмной цены за жильё')+theme_minimal() + ylab('Общая площадь сдаваемой квартиры')+geom_smooth(method="lm")

cor.test(data$Price,data$Area_total,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Area_total
S = 730653364, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.8116159 

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


4. Диаграмма рассеяния. Взаимосвязь между переменными Area_living и Price

ggplot(data,aes(x=Price, y=Area_living)) + #создание диаграммы рассеивания 
  geom_point(color = 'cyan4')+xlab('Логарифм наёмной цены за жильё')+theme_minimal() + ylab('Жилая площадь сдаваемой квартиры')+geom_smooth(method="lm")

cor.test(data$Price,data$Area_living,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Area_living
S = 1.089e+09, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.7423431 

Как и с переменной “общая площадь”, на графике зависимости жилой площади и цены выявляется явная взаимосвязь между стоимостью и метражом квартиры: чем он больше, тем цена выше. Коэффициент корреляции в данном случае чуть меньше, чем в предыдущем: 0.742, однако все еще довольно велик, чтобы мы могли говорить о прямой зависимости переменных. Опять же, объяснить это можно характерным для рынка недвижимости указанием цены за один квадратный метр. Найденная взаимосвязь отражает расположение дел в реальности.


5. Диаграмма рассеяния. Взаимосвязь между переменными Area_kitchen и Price

ggplot(data,aes(x=Price, y=Area_kitchen)) + #создание диаграммы рассеяния 
  geom_point(color = 'cyan2')+xlab('Логарифм наёмной цены за жильё')+theme_minimal() + ylab('Площадь кухни сдаваемой квартиры')+geom_smooth(method="lm")

cor.test(data$Price,data$Area_kitchen,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Area_kitchen
S = 1442305970, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.5237478 

Как уже было сказано ранее, положительная корреляция какой-либо площади в сдаваемой квартире с ее ценой объясняется особенностями рынка, а также фактом того, что, чем больше ресурсов затрачено на что-либо, тем оно больше стоит. Поэтому данная взаимосвязь также наблюдается в случае переменной “площадь кухни” исходного датасета и совпадает с реальной жизнью. Однако заметим, что в сфере “площадей” данная корреляция наиболее слабая, коэффициент = 0.524 (по сравнению с раннее рассмотренными 0.812 и 0.742). Тем не менее, мы все еще можем говорить о наличии прямой взаимосвязи между представленными переменными.


6. Диаграмма рассеяния. Взаимосвязь между переменными Year_construction и Price

ggplot(data,aes(x=Price, y=Year_construction)) + #создание диаграммы рассеивания 
  geom_point(color = 'indianred3')+xlab('Логарифм наёмной цены за жильё')+ylab('Год постройки')+theme_minimal()+geom_smooth(method="lm")

cor.test(data$Price,data$Year_construction,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$Year_construction
S = 6548134, p-value = 0.13
alternative hypothesis: true rho is not equal to 0
sample estimates:
        rho 
-0.08339982 

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


7. Диаграмма рассеяния. Взаимосвязь между переменными NFloor и Price

data$NFloor = ifelse(str_detect(data$NFloor, 'kv.m.')==T, NA, data$NFloor)
data$NFloor=as.numeric(data$NFloor)
ggplot(data,aes(x=Price, y=NFloor)) + #создание диаграммы рассеивания 
  geom_point(color = '#D2691E')+xlab('Логарифм наёмной цены за жилье')+ylab('Количество этажей в доме')+theme_minimal()+geom_smooth(method="lm")

cor.test(data$Price,data$NFloor,method="spearman")

    Spearman's rank correlation rho

data:  data$Price and data$NFloor
S = 4959307940, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.2560851 

Анализируя график можно понять, что нет никакой взаимосвязи между этажностью дома и стоимостью квартиры; коэффициент корреляции составляет -0.256. Арендаторы обращают внимание, на каком этаже расположена квартира, но не на саму этажность дома. Однако стоит учитывать отдельные случаи, показывающие разного рода корреляцию. Например, жилье в небоскребах относят к премиум классу недвижимости. Соотвественно, чем больше этажей в таком доме, тем выше стоимость недвижимости - явная позитивная корреляция. Однако в сегменте жилья эконом класса высокая этажность играет против стоимости. Это объясняется высокой плотностью застройки, а также большим количеством соседей. То есть в этом примере можно предполагать наличие отрицательной корреляции. Анализ интернет-ресурсов показал, что ни один из способов расчета индекса стоимости недвижимости не учитывает саму этажность постройки. Тем самым, наша гипотеза об отсутствии корреляции между этажностью дома и стоимости квартир в нем подтвердилась. —

Расстояние до центра города и цена

Создадим новую переменную, в которую запишем расстояние от квартиры до центра города. За центр примем Дворцовую площадь. Координаты: 59.938924, 30.315978. Внесем их в соответствующие переменные:

lat = 59.938924
long = 30.315978

Расстояние будем записывать в новую переменную Dist_pal_sq. Для его рассчета воспользуемся функциями пакета geosphere:

library(geosphere)
data_1 = data %>% filter(!is.na(Longitude)) %>% filter(!is.na(Latitude))

  for(i in 1:nrow(data_1))
  {data_1[i,"Dist_pal_sq"]= distHaversine(c(data_1[i,"Longitude"], data_1[i,"Latitude"]), c(long, lat))/1000}

Построим диаграмму рассеяния для расстояния до центра и цены аренды:

ggplot(data_1) +geom_point(aes(x = Price,y = Dist_pal_sq), color = 2)+
  xlab("Логарифм наёмной цены за жильё")+
  ylab("Расстояние до центра")

Оставим наблюдения только в пределах Петербурга:

data_1 = data_1 %>%  filter(Region == "gorod Sankt-Peterburg")
ggplot(data_1) +geom_point(aes(x = Price,y = Dist_pal_sq), color = 2)+
  xlab("Логарифм наёмной цены за жильё")+
  ylab("Расстояние до центра")

И посчитаем коэффициент корреляции:

cor_dist_pal_sq = cor(data_1$Dist_pal_sq, data_1$Price, method="spearman")

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

Вывод

В ходе выполнения домашней работы был проведен тщательный анализ большого массива данных. Изначальные данные безусловно требовали проверки, сегрегации и дальнейшего редактирования, что и было сделано. Данные были разделены на две группы: номинальные и числовые, с каждой проводилась последовательная работа для их представления в “чистом”, более информативном виде.

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

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

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

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