К номинальным переменным мы решили отнести те, для которых мы не можем никак посчитать никакие числовые характеристики Все остальные переменные были отнесены к числовым
Таким образом:
Номинальные:
Числовые:
Ошибки в номинальных переменных:
Metro — в Гатчинском районе вместо станции метро указано название железнодорожных станций (Antropshino, Suida, Gatchina-Varsh., Kuz’molovo, Sestroreck, Shushary, Carskoe selo, Repino). Мы их удалили, так как они не соответствуют описанию переменной, данному в задании. Кроме того, мы удаляем соответствующее значение в переменной Dist_metro_ad.
Rooms — у некоторых переменных между 1 и (studio) двойной пробел, а не одинарный.
Furnished — в переменной может быть только значения Est’ или Net, поэтому все остальные варианты мы заменяем на Est’. Мы решили, что квартира оборудована, если в ней есть какая-то мебель. Также добавили значение Chastichno, к которому отнесли значения Tol’ko kuhnya и Minimum.
Bath — в переменной должен быть указан тип ванной, а не просто ее наличие или отсутствие. Соответственно, «Est’» и «Net» мы заменили на «Neukazano». Таким образом, оставили значения: Dush, Otdel’naya, Poperechnaya, Prodol’naya, Sovmeshchennaya и Neukazano.
Refurbished — некоторые значения должны относиться к столбцу «Bath», мы их переместили, а в столбце «Refurbished» в соответствующих строчках указали, что нет значений. Значение «Proizveden» заменили на «Ne trebuetsya», так как они несут в себе одинаковый смысл.
Balcony — в переменной может быть только значения есть или нет, поэтому на них мы заменили остальные варианты. Ercer не является балконом, поэтому его мы относли к Net, также net написанный с маленькой буквы заменили на Net аналогично поступил с est’.
Ошибки в числовых переменных:
Dist_metro_ad — мы удалили значение переменных в тех строчках, где не указано название станции метро.
Price — значение 2 явно нерелевантно, поэтому мы заменяем на более правдоподобную переменную 2000.
Minimum_duration — удалили «mes.» во всех строчках, потому что они не позволяют производить матиматические операции с переменными.
Area_total — значение 70000 кв.метров явно нерелевантно, поэтому мы заменяем на более правдоподобную переменную 70. Кроме того, 32,83 должно быть округлено до 32,8.
Area_living — значение 1 кв.м явно нерелевантно, поэтому мы заменяем на более правдоподобную переменную 10. Все значения округлили до 1 знака после запятой, так как округления требовали только значения больше 10.
Area_kitchen — все значения округлили до 0-2 знаков после запятой по правилам, указанным в задании.
NFloor — все значения, где написаны kv.m. заменяем на «нет значения», так как данные значения скорее всего ошибочно попали в данные.
Latitude и Longitude — мы приняли решение в данном случае не производить округление, так как географические координаты крайне чувствительны к сокращением и теряют точность из-за них.
#Исправление ошибок
#Метро
orders$Dist_metro_ad[orders$Metro == "Antropshino"|orders$Metro == "Kuz'molovo"|orders$Metro == "Suida"|orders$Metro == "Gatchina-Varsh."|orders$Metro == "Sestroreck"|orders$Metro == "Carskoe selo"|orders$Metro == "Repino"] <- NA
orders$Metro[orders$Metro == "Antropshino"|orders$Metro == "Kuz'molovo"|orders$Metro == "Suida"|orders$Metro == "Gatchina-Varsh."|orders$Metro == "Sestroreck"|orders$Metro == "Carskoe selo"|orders$Metro == "Repino"] <- "Net"
#Rooms
orders$Rooms = str_replace(orders$Rooms,"[ (studiya)]+","")
orders$Rooms[is.na(orders$Rooms)] <- "Neukazano"
#No_agents
orders$No_agents[is.na(orders$No_agents)] <- "Neukazano"
#Building
orders$Building[is.na(orders$Building)] <- "Neukazano"
#Lift
orders$Lift[is.na(orders$Lift)] <- "Neukazano"
#Furnished
orders$Furnished = str_replace(orders$Furnished, "Garnit\\+", "Gar")
orders$Furnished = str_replace(orders$Furnished, "Garkuh.nab.", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Garnitur 70-80", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Garnitur Sovr.", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Minimum", "Chastichno")
orders$Furnished = str_replace(orders$Furnished, "Sbor.+kuh.garn.", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Sbornaya 70-80", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Sbornaya Sovr.", "Est'")
orders$Furnished = str_replace(orders$Furnished, "Tol'ko kuhnya", "Chastichno")
orders$Furnished[is.na(orders$Furnished)] <- "Neukazano"
#Bath
orders$Bath[orders$Bath == "Est'"] <- NA
orders$Bath[orders$Bath == "Net"] <- NA
orders$Bath[orders$Bath == "Bol'shoi"] <- NA
orders$Bath[is.na(orders$Bath)] <- "Neukazano"
#Refurbished
orders$Bath[orders$Refurbished == "Dush"] <- "Dush"
orders$Refurbished[orders$Refurbished == "Dush"] <- NA
orders$Bath[orders$Refurbished == "Otdel'naya"] <- "Otdel'naya"
orders$Refurbished[orders$Refurbished == "Otdel'naya"] <- NA
orders$Bath[orders$Refurbished == "Poperechnaya"] <- "Poperechnaya"
orders$Refurbished[orders$Refurbished == "Poperechnaya"] <- NA
orders$Bath[orders$Refurbished == "Sovmeshchennaya"] <- "Sovmeshchennaya"
orders$Refurbished[orders$Refurbished == "Sovmeshchennaya"] <- NA
orders$Refurbished[orders$Refurbished == "Proizveden"] <- "Ne trebuetsya"
orders$Refurbished[is.na(orders$Refurbished)] <- "Neukazano"
#Balcony
orders$Balcony[orders$Balcony == "Erker"] <- "Net"
orders$Balcony[orders$Balcony == "net"] <- "Net"
orders$Balcony[orders$Balcony != "Net"] <- "Est'"
orders$Balcony[is.na(orders$Balcony)] <- "Neukazano"
#Dist_metro_ad
orders$Dist_metro_ad[is.na(orders$Metro)] <- NA
#Price
orders$Price[orders$Price == 2] <- 2000
#Minimum_duration
orders$Minimum_duration = orders$Minimum_duration %>% str_remove("\\s+") %>% str_remove("[:punct:]+") %>% str_remove("[:alpha:]+") %>% str_remove("[:punct:]+")
#Area_total
orders$Area_total[orders$Area_total == 70000] <- 70
orders$Area_total = orders$Area_total %>% round(digits = 1)
#Area_living
orders$Area_living[orders$Area_living == 1] <- 10
orders$Area_living = orders$Area_living %>% round(digits = 1)
#Area_kitchen
orders = orders %>% mutate(Moreten = case_when(Area_kitchen > 10 ~ T, T ~ F))
orders$Area_kitchen[orders$Moreten == T] <- round(orders$Area_kitchen, digits = 1)
orders = orders %>% dplyr::select(-Moreten)
#NFloor
orders$NFloor[str_detect(orders$NFloor,"kv.m")] <- NA
#Metro
orders$Metro[is.na(orders$Metro)] <- "Neukazano"
#Split
orders_1 = orders %>% select(Region, District_ad, Address, Metro, No_agents, Building, Lift, Furnished, Bath, Refurbished, Balcony)
orders_2 = orders %>% select(Date_entry, Dist_metro_ad, Rooms, Price, Minimum_duration, Area_total, Area_living, Area_kitchen, Floor, NFloor, Latitude, Longitude, Year_construction)Мы решили построить таблицы, показывающие частоту различных значений для всех номинальных перменных, кроме Address, так как данное значение уникально для каждого дома. Для каждой из переменной мы взяли топ-10 значений, так как это наилучшим образом отражает статистику и не нагромождает итоговый отчет.
#Посчитаем количество наблюдений разных значений каждого признака
table_nominal_1 = orders_1 %>% group_by(Region) %>% summarise(n()) %>% top_n(10)
table_nominal_2 = orders_1 %>% group_by(District_ad) %>% summarise(n())%>% top_n(10)
table_nominal_3 = orders_1 %>% group_by(Metro) %>% summarise(n()) %>% top_n(10)
table_nominal_4 = orders_1 %>% group_by(No_agents) %>% summarise(n())%>% top_n(10)
table_nominal_5 = orders_1 %>% group_by(Building) %>% summarise(n())%>% top_n(10)
table_nominal_6 = orders_1 %>% group_by(Lift) %>% summarise(n())%>% top_n(10)
table_nominal_7 = orders_1 %>% group_by(Furnished) %>% summarise(n())%>% top_n(10)
table_nominal_8 = orders_1 %>% group_by(Bath) %>% summarise(n())%>% top_n(10)
table_nominal_9 = orders_1 %>% group_by(Refurbished) %>% summarise(n())%>% top_n(10)
table_nominal_10 = orders_1 %>% group_by(Balcony) %>% summarise(n())%>% top_n(10)Количество предлагаемых квартир в СПб и Ленобласти
#Сделаем названия столбцов и выведем таблицу
colnames(table_nominal_1) <- c("Region", "quantity")
formattable(table_nominal_1, align = c("l", rep("c", NCOL(table_nominal_1) - 1))) | Region | quantity |
|---|---|
| gorod Sankt-Peterburg | 2870 |
| Leningradskaya oblast’ | 130 |
Описание: Мы можем заметить, что квартир в черте города намного больше, чем квартир в области.
Количество предлагаемых квартир по району расположения
| District_ad | quantity |
|---|---|
| Центральный | 385 |
| Московский | 316 |
| Приморский | 310 |
| Выборгский | 278 |
| Петроградский | 247 |
| Калининский | 232 |
| Невский | 209 |
| Василеостровский | 180 |
| Красносельский | 144 |
| Кировский | 136 |
Описание: В топ-10 районов по сдаче квартир входят: Центральный, Московский, Приморский, Выборгский, Петроградский, Калининский, Невский, Василеостровский, Красносельский и Кировский. Удивительно, что девять из десяти районов находятся в черте города, только Кировский район расположен и в области, и в городе одновременно. Максимальное число квартир сдается в Центральном районе, 385 штук.
Количество предлагаемых квартир по ближайшему метро
| Metro | quantity |
|---|---|
| Primorskaya | 119 |
| Veteranov pr. | 118 |
| Chernyshevskaya | 116 |
| Komendantskii pr. | 116 |
| Moskovskaya | 104 |
| Zvezdnaya | 98 |
| Leninskii pr. | 94 |
| Akademicheskaya | 91 |
| Prosveshcheniya pr. | 91 |
| Neukazano | 90 |
Описание: В топ-10 метро, рядом с которыми сдаются квартиры, входят: Приморская, пр-т Ветеранов, Коменданский пр-т, Чернышевская, Московская, Звездная, Ленинский пр-т, пр-т Просвещения, Академическая. Самое большое число квартир (119) сдается рядом с метро Приморская.
Количество предлагаемых квартир по сдаче через посредника или без
| No_agents | quantity |
|---|---|
| Da | 407 |
| Neukazano | 2593 |
Описание: Относительно большинства квартир, не указано, сдаются они через посредника или без посредника, и всего 407 квартир точно сдаются с посредником.
Количество предлагаемых квартир по материалу, из которого построено здание
| Building_type | quantity |
|---|---|
| Kirpichnyi | 1034 |
| Kirp.Monolit | 555 |
| Monolit | 321 |
| Neukazano | 320 |
| Panel’nyi | 204 |
| Blochnyi | 102 |
| Monol.Panel’nyi | 87 |
| Staryi fond | 82 |
| Stalinskii | 52 |
| Individual’nyi proekt | 40 |
Описание: Больше всего квартир сдается в кирпичных зданиях.
Количество предлагаемых квартир по наличию лифта
| Lift | quantity |
|---|---|
| Est’ | 1649 |
| Net | 1218 |
| Neukazano | 133 |
Описание: Квартир, находящихся в здании с лифтом ненамного больше, чем квартир, расположенных в зданиях без лифта.
Количество предлагаемых квартир по меблировке квартиры или ее отсутствию
| Furnished | quantity |
|---|---|
| Est’ | 1918 |
| Neukazano | 850 |
| Net | 118 |
| Chastichno | 114 |
Описание: Можем заметить, что больше всего квартир продается с полной мебилировкой и всего чуть-чуть - с частичной.
Количество предлагаемых квартир по типу ванной
| Bath | quantity |
|---|---|
| Neukazano | 1675 |
| Otdel’naya | 843 |
| Sovmeshchennaya | 411 |
| Dush | 52 |
| Prodol’naya | 10 |
| Poperechnaya | 9 |
Описание: В большей части квартир не указан тип ванной, но из указанных можно увидеть, что больше всего квартир сдается с совмещенной ванной.
Количество предлагаемых квартир по типу ремонта
| Refurbishing | quantity |
|---|---|
| Neukazano | 1301 |
| Evrostandart | 869 |
| Ne trebuetsya | 822 |
| Trebuetsya | 8 |
Описание: В большинстве квартир ремонт уже произведен и не требуется, и только 8 квартир сдаются без ремонта.
Количество предлагаемых квартир по наличию балкона
| Balcony | quantity |
|---|---|
| Est’ | 1624 |
| Net | 292 |
| Neukazano | 1084 |
Описание: В большинстве квартир балкон есть в том или ином виде (один, два, лоджия, терасса), но при этом про многие квартиры нет никакой информации о наличие в них балкона.
Для Числовых переменных мы построили единую таблицу, в которой рассмотрели числовые характеристики всех переменных, кроме Date_entry, Latitude, Longitude, Year_construction. Latitude и Longitude должны рассматриваться вместе, а по отдельности они дают неточную информацию.
Описательные статистики для числовых переменных:
#Посчитаем описательные статистики отдельно для каждой переменной и будем записывать их в вектора
orders_2$Minimum_duration = as.numeric(orders_2$Minimum_duration)
orders_2$NFloor = as.numeric(orders_2$NFloor)
orders_2$Rooms = as.numeric(orders_2$Rooms)
name = c("Dist_metro_ad","Rooms", "Price", "Minimum_duration", "Area_total", "Area_living", "Area_kitchen", "Floor", "NFloor")
min = c(min(na.omit(orders_2$Dist_metro_ad)),min(na.omit(orders_2$Rooms)),min(na.omit(orders_2$Price)), min(na.omit(orders_2$Minimum_duration)), min(na.omit(orders_2$Area_total)), min(na.omit(orders_2$Area_living)), min(na.omit(orders_2$Area_kitchen)), min(na.omit(orders_2$Floor)), min(na.omit(orders_2$NFloor)))
q1 = c(quantile(na.omit(orders_2$Dist_metro_ad),0.25), quantile(na.omit(orders_2$Rooms),0.25), quantile(na.omit(orders_2$Price),0.25), quantile(na.omit(orders_2$Minimum_duration),0.25), quantile(na.omit(orders_2$Area_total),0.25), quantile(na.omit(orders_2$Area_living),0.25), quantile(na.omit(orders_2$Area_kitchen),0.25), quantile(na.omit(orders_2$Floor),0.25), quantile(na.omit(orders_2$NFloor),0.25))
median = c(quantile(na.omit(orders_2$Dist_metro_ad),0.5),quantile(na.omit(orders_2$Rooms),0.5), quantile(na.omit(orders_2$Price),0.5), quantile(na.omit(orders_2$Minimum_duration),0.5), quantile(na.omit(orders_2$Area_total),0.5), quantile(na.omit(orders_2$Area_living),0.5), quantile(na.omit(orders_2$Area_kitchen),0.5), quantile(na.omit(orders_2$Floor),0.5), quantile(na.omit(orders_2$NFloor),0.5))
mean = c(mean(na.omit(orders_2$Dist_metro_ad)),mean(na.omit(orders_2$Floor),0.5), mean(na.omit(orders_2$Price)), mean(na.omit(orders_2$Minimum_duration)), mean(na.omit(orders_2$Area_total)), mean(na.omit(orders_2$Area_living)), mean(na.omit(orders_2$Area_kitchen)), mean(na.omit(orders_2$Floor)), mean(na.omit(orders_2$NFloor)))
x = na.omit(orders_2$Dist_metro_ad)
moda1 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Rooms)
moda2 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Price)
moda3 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Minimum_duration)
moda4 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Area_total)
moda5 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Area_living)
moda6 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Area_kitchen)
moda7 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$Floor)
moda8 = density(x)$x[which.max(density(x)$y)]
x = na.omit(orders_2$NFloor)
moda9 = density(x)$x[which.max(density(x)$y)]
moda = c(moda1, moda2, moda3, moda4, moda5, moda6, moda7, moda8, moda9)
q3 = c(quantile(na.omit(orders_2$Dist_metro_ad),0.75),quantile(na.omit(orders_2$Rooms),0.75), quantile(na.omit(orders_2$Price),0.75), quantile(na.omit(orders_2$Minimum_duration),0.75), quantile(na.omit(orders_2$Area_total),0.75), quantile(na.omit(orders_2$Area_living),0.75), quantile(na.omit(orders_2$Area_kitchen),0.75), quantile(na.omit(orders_2$Floor),0.75), quantile(na.omit(orders_2$NFloor),0.75))
max = c(max(na.omit(orders_2$Dist_metro_ad)),max(na.omit(orders_2$Rooms)), max(na.omit(orders_2$Price)), max(na.omit(orders_2$Minimum_duration)), max(na.omit(orders_2$Area_total)), max(na.omit(orders_2$Area_living)), max(na.omit(orders_2$Area_kitchen)), max(na.omit(orders_2$Floor)), max(na.omit(orders_2$NFloor)))
sd = c(sd(na.omit(orders_2$Dist_metro_ad)),sd(na.omit(orders_2$Rooms)), sd(na.omit(orders_2$Price)), sd(na.omit(orders_2$Minimum_duration)), sd(na.omit(orders_2$Area_total)), sd(na.omit(orders_2$Area_living)), sd(na.omit(orders_2$Area_kitchen)), sd(na.omit(orders_2$Floor)), sd(na.omit(orders_2$NFloor)))
razmah = max - min
skew = c(skewness(na.omit(orders_2$Dist_metro_ad)),skewness(na.omit(orders_2$Rooms)), skewness(na.omit(orders_2$Price)), skewness(na.omit(orders_2$Minimum_duration)), skewness(na.omit(orders_2$Area_total)), skewness(na.omit(orders_2$Area_living)), skewness(na.omit(orders_2$Area_kitchen)), skewness(na.omit(orders_2$Floor)), skewness(na.omit(orders_2$NFloor)))
kurtosis = c(kurtosis(na.omit(orders_2$Dist_metro_ad)),kurtosis(na.omit(orders_2$Rooms)), kurtosis(na.omit(orders_2$Price)), kurtosis(na.omit(orders_2$Minimum_duration)), kurtosis(na.omit(orders_2$Area_total)), kurtosis(na.omit(orders_2$Area_living)), kurtosis(na.omit(orders_2$Area_kitchen)), kurtosis(na.omit(orders_2$Floor)), kurtosis(na.omit(orders_2$NFloor)))
#Создадим датафрейм из всех векторов
table_numeric_1 <- data.frame(Name = name, Min = min, Q1 = q1, Median = median, Mean = mean, Moda = moda, Q3 = q3, Max = max, Sd = sd, Razmah = razmah, Skew = skew, Kurtosis = kurtosis)
#Округлим все значения таблицы по заданным правилам
for (i in 2:ncol(table_numeric_1)){
for (j in 1:nrow(table_numeric_1)){
if (table_numeric_1[j,i]<10){
table_numeric_1[j,i] <- round(table_numeric_1[j,i], digits=2)}
else if (table_numeric_1[j,i]<99){
table_numeric_1[j,i] <- round(table_numeric_1[j,i], digits=1)}
else if (table_numeric_1[j,i]>99){
table_numeric_1[j,i] <- as.integer(table_numeric_1[j,i])}
}}
#Выведем таблицу
formattable(table_numeric_1, align = c("l", rep("c", NCOL(table_numeric_1) - 1))) | Name | Min | Q1 | Median | Mean | Moda | Q3 | Max | Sd | Razmah | Skew | Kurtosis |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Dist_metro_ad | 0 | 312 | 750.0 | 1447.0 | 182.00 | 1520 | 37390 | 2754.00 | 37390 | 6.20 | 53.80 |
| Rooms | 1 | 1 | 2.0 | 5.0 | 1.01 | 2 | 9 | 0.96 | 8 | 1.21 | 4.86 |
| Price | 1500 | 21500 | 30000.0 | 44004.0 | 22402.00 | 50000 | 700000 | 44603.00 | 698500 | 4.90 | 42.10 |
| Minimum_duration | 1 | 11 | 11.0 | 10.4 | 11.00 | 11 | 31 | 3.17 | 30 | 0.79 | 18.60 |
| Area_total | 18 | 38 | 49.5 | 60.7 | 38.60 | 70 | 514 | 36.80 | 496 | 3.23 | 22.70 |
| Area_living | 9 | 18 | 30.0 | 36.8 | 18.70 | 44 | 333 | 27.80 | 324 | 3.43 | 23.60 |
| Area_kitchen | 1 | 7 | 9.0 | 10.1 | 10.00 | 10 | 127 | 8.22 | 126 | 7.04 | 76.40 |
| Floor | 1 | 3 | 5.0 | 6.7 | 3.05 | 9 | 31 | 4.91 | 30 | 1.37 | 4.79 |
| NFloor | 1 | 6 | 10.0 | 12.1 | 5.06 | 17 | 36 | 6.85 | 35 | 0.65 | 2.35 |
Описание: Анализируя таблицу, мы заметили, что мода и медиана всех показателей кроме minimum duration меньше, чем среднее арифметическое. Например, среднее арифметическое и медиана расстояния до метро различается практически в два раза (1447 и 750 метров, соответственно). Из этого можно сделать вывод, что немногочисленные, но наиболее большие значения смещают выборку, сильно увеличивая среднее арифметическое. Наиболее популярны двухкомнатные квартиры площадью около 50 метров, которые находятся меньше чем в километре от метро, находящиеся на 3-7 этаже. Квартиры, расположенные выше 10 этажа, встречаются крайне редко. Наиболее часто квартиры сдаются в десятиэтажках, при этом, в самом высоком доме из представленных 31 этаж.
Номинальные переменные
#Построим столбчатую диаграмму указав по y количество наблюдений
ggplot(data = table_nominal_1) + geom_bar(aes(x = Region, y = quantity), stat = "identity", color = "#069587", alpha = 0.9, fill = "#069587") +
ggtitle("Количество предлагаемых квартир в СПб и Ленобласти") +
xlab('Регион') +
ylab('шт.')+
theme_minimal() Описание: Большинство квартир находятся в Санкт-Петербурге, а не в области. Вероятно, город имеет более высокую плотность застройки.
Описание: Больше всего квартир находится в Центральном районе, на втором и третьем месте находятся Московской и Приморский район, количество квартир в которых практически одинаково. Интересно, что наименьшее количество квартир находится в Кировском районе, который одновременно является единственным районом, находящимся в черте города и в области одновременно.
Описание: Наибольшее количество квартир находится рядом со станциями метро Приморская, пр-т Ветеранов, Комендантский пр-т и Чернышевская. При этом количество квартир около этих станций метро практически одинаково. Можно предположить, что большое число квартир возле ст.Приморская обусловлено тем, что это единственная станция метро на оконечности Васильевского острова.
Описание: Про большинство квартир не указано, была ли использована помощь посредника. При сдаче небольшого количества квартир их хозяева воспользовались услугами посредника, данных о квартирах, сдаваемых самостоятельно, нет.
Описание: Большинство квартир сдается в кирпичных домах, на втором месте монолитно-кирпичные дома. При этом, кирпичных домов практически в два раза больше, чем кирпично-монолитных. Поскольку подавляющее большинство советских домов были построены из плит (хрущёвки, брежневки), можно предположить, что много квартир сдаётся в новых кирпичных домах.
Описание: Больше чем половина сдаваемых квартир находится в домах с лифтами. Нет информации в меньшинстве случаев. Дома без лифта - это, скорее всего, старые дома. Это означает, что довольно много квартир сдаётся в старых малоэтажных домах. Вероятно, собственники переселяются в более новые квартиры, а старые квартиры сдают.
Описание: Примерно в двух третях квартир есть мебель, в трети случаев нет информации об этом. Это свидетельствует о том, что большинство владельцев предпочитают иметь контроль над меблированием квартиры и не перепоручать это арендаторам.
Описание: В большинстве случаев неизвестен тип ванной. Из тех объявлений, где тип ванной указан, можно сделать вывод, что самый популярный вид ванной – отдельная. Провести интерпретацию затруднительно, поскольку более половины наблюдений не содержат информации о типе ванной.
Описание: В большинстве случаев тип ремонта не указан, количество квартир с евростандартом и квартир, в которых ремонт не требуется практически одинаково. Очень малое (8) количество квартир, которые требуют ремонта, говорит нам о том, что потребители не хотят снимать квартиры в аварийном состоянии.
Описание: В большинстве квартир есть балкон. Про достаточное большое количество квартир нет информации. Экономическую интерпретацию осуществить невозможно.
Числовые переменные
Для каждой из числовых переменных мы построили по два графика: столбчатую диаграмму и эмпирическую функцию плотности. Поэтому в дальнейшем интерпретация будет даваться по двум графикам сразу, так как каждый из них показывает примерно одно и тоже.
#Построим гистограмму распределения
ggplot(data = orders_2) + geom_histogram(aes(x = Date_entry), fill = "#069587", color = "#069587", alpha = 0.9) +
ggtitle('Количество размещённых объявлений по времени') +
ylab('шт.') +
xlab('Года')+
theme_minimal() #Построим эмпирическую функцию плотности
ggplot(data = orders_2) + geom_density(aes(x = Date_entry), color = "#069587") +
ggtitle('Эмпирическая функция плотности \n количества объявлений по времени') +
ylab('Плотность') +
xlab('Года')+
theme_minimal() Описание: До 2016 года количество объявлений крайне незначительно. При этом пик объявлений приходится на середину 2017 года. Многие квартиры не могут найти съёмщика более полугода. Вероятно, это связано с тем, что многие собственники делают неадекватное предложение по цене и качеству.
Описание: В основном квартиры сдаются на расстоянии 1000 метров от метро по логарифмической шкале, близко и совсем далеко от метро квартирв сдаются достаточно редко. Большинство квартир находятся в пределах 3 км от метро. Это позволяет нам оценить плотность расположения станций метро в Санкт-Петербурге.
Описание: Больше всего квартир продаются по цене 30000р. Поскольку девиация от медианы невелика, то можно сделать вывод, что большинство сдаваемых квартир одного качества.
Описание: Абсолютное большинство квартир сдается сроком на 11 месяцев. Остальные сроки сдачи используются крайне редко. Можно предположить, что собственники сдают квартиру на почти год, а после в течение месяца приводят квартиру в порядок, пока ищут новых съёмщиков.
Описание: Средняя общая площадь сдаваемой квартиры составляет около 40 метров. Большой разброс значений говорит нам о том, что существуют предложения квартир с разнообразной планировкой.
Описание: Мы видим, что наиболее часто арендуют квартиры, жилая площадь которых составляет 16-17 кв.м. Второй пик приходится на 32-34 квадратных метра. Очевидно, что предложения квартир меньше 10 и больше 240 квадратных метров практически нет.
Описание: По графику можно определить, что наиболее часто кухня сдаваемых квартир составляет 7,5 и 10 квадратных метров. Остальные варианты метража гораздо менее популярны. Примерно в 100 случаях метраж кухни равен 1 метру, можно заключить, что это ошибка в данных или же кухонная зона входит в пространство одной из жилых комнат.
Описание: Больше всего квартир сдается на 3 этаже. После 3 этажа мы видим нисходящий тренд: в среднем с каждым этажом уменьшается количество квартир, которые можно снять на этом этаже. Квартиры, расположенные выше 25 этажа практически отсутствуют. Опять-таки, это указывает на то, что многие квартиры расположены в старых малоэтажных домах.
Описание: Наибольшее количество квартир сдается в трехэтажных и шестиэтажных домах. На это также указывали другие данные. Сдаётся много квартир в старых малоэтажных домах, поскольку они менее привлекательны для собственников, которые, вероятно, относятся к более старой возрастной группе, и более привлекательны для съёмщиков, большинство из которых принадлежат к молодёжи и учатся, работают и развлекаются ближе к центру, в то время как собтсвенники переселяются в спальные районы.
Описание: У многих домов год постройки был не указан. Другие данные свидетельствуют о том, что значительная доля домов - это малоэтажные дома старой постройки. Они не отражены на этом графике, поскольку год их постройки не указан, возможно, потому, что собственники попросту не знают года постройки старого дома, или не хотят раскрывать насколько старо сдаваемое жильё.
Посмотрим какие переменные могут влиять на цену аренды.
В нашем распоряжении есть Номинальные и Числовые переменные. В каждой из данных категорий присутствует свой набор переменных, описанный в первом пункте.
Для номинальных переменных невозможно построить точечные диаграммы рассеяния. Мы не хотели отказываться от их анализа, поэтому построили для них диаграммы размаха, которые являются аналогом диаграмм рассеяния для номинальных переменных.
Если подумать логически, то на цену (Price) из номинальных переменных могут влиять все кроме Address (уникальное значение для каждой квартиры), также не будем рассматривать переменную No_agents, поскольку нам не хватает информации. Из числовых переменных на цену не могут влиять Date_entry, потому что не имеет значения, в какой момент было размещено объявление, Area_living и Area_kitchen, так как цена, как правило, указывается за общую площадь квартиры, и NFloor, потому что на цену влияет этаж, на котором находится квартира, но никак не общее число этажей в доме.
Сильное влияние на цену сдачи квартиры оказывает площадь. Поэтому для более адекватного анализа влияния других переменных на цену, мы высчитали цену аренды за квадратный метр и использовали здесь её.
Для построения диаграмм размаха будем брать топ-10 номинальных переменных с наибольшим медианным значением, в целях удобства представления графика.
Итак, первая категория Номинальные переменные. Как от них будет зависеть цена?
Взглянем на зависимость цены от каждой из переменных:
#Создадим переменную цены за кв.м.
orders_nominal_region = orders %>% mutate(Pricepermetr = Price/Area_total) %>% select(Region, Pricepermetr) %>% na.omit()
#Упорядочим переменные по убыванию медианного значения и возьмём топ-10
orders_nominal_region = orders_nominal_region %>% group_by(Region)
orders_nominal_region1 = orders_nominal_region %>% group_by(Region) %>% summarise(median = median(Pricepermetr)) %>% arrange(desc(median)) %>% top_n(10)
#Построим график распределения цены в виде боксплотов для различных значений переменной
ggplot(data = orders_nominal_region, aes(x = Region, y = Pricepermetr))+
geom_boxplot(alpha = 0.6, color = "#069587")+
xlim(orders_nominal_region1$Region) +
labs(title = "Диаграмма распределения цены в зависимости от региона") +
xlab("Регион") +
ylab("Цена за кв.м., руб.") +
theme_minimal()Описание: Нетрудно заметить, что средняя цена за жилье в области меньше, чем в городе — большинство цен на дома в ней ниже медианного значения в городе. Хотя разброс цен в черте города намного больше, чем в области, этому также способствует меньшее количество наблюдений в области. Дома в самом Санкт-Петербурге ценятся выше из-за развитости инфраструктуры и полноты возможностей.
Описание: Интресный факт, что квартиры в Петроградском районе стоят намного дороже, чем в Центральном, хотя он и занимает второе место по средней цене. Этот район славится своим исторической значимостью, развитой инфраструктурой, в отличии от того же центрального района, там меньший уровень преступности и поэтому те, кто хотят жить в Санкт-Петербурге на долгий срок выбирают квартиры именно в этом районе, так что спрос на него высокий. остальные же районы стоят в порядке близости от центра и развитости.
Описание: Самые дорогие квартиры находятся рядом со станцией метро Крестовский остров, который находится в Петроградском районе. Большинство квартир у этого метро дороже медианных цен квартир в у остальных станций. На острове проживает класс состоятельных людей, его можно назвать “элитным”, рядом множество парков, остров стоит обособленно, но в то же время относительно близко к центру. Так что не удивительно, что цены достаточно высокие и есть большой разброс вверх. У остальных станций медианные значений примерно одинаковы и сосредоточены вокруг 1000 руб. за кв. метр
Описание: Самый дорогой тип здания - это реконструированное, но в данных всего 4 дома такого типа, поэтому о нем много судить нельзя. Отсальные все примерно сконцентрированы примерно на 750-600 руб. за кв. метр, но кирпичный и кирпично-монолитный дом имеют больший разброс по цене вверх. При этом интересный факт, что самая высокая цена была предложена за кирпично-монолитный дом. В итоге можно сказать, что рапсределение цены не сильно зависимо от типа здания.
Описание: Медианные цены за квартиры в зданиях с лифтом и без него примерно одинаковы, но разброс вверх у домов с лифтами больше. 50% значений у обоих типов расположены между 500 и 800 руб. за кв. метр. Не уидивительно, так как наличие лифта лучше чем его отсутствие.
Описание: Если не брать в расчет те показания, которые не были указаны, то чуть более дорогими являются квартиры, в которых есть мебилировка, так же разброс вверх у него большой — т.к. оснащение мебелью может быть разное и при одинаковых квартирах, квартира обставленная дорогой мебелью будет ценнее. При этом медианная цена за частично мебилированные квартиры равна медианной цене за квартиры без мебели.
Описание: На первый взгляд кажется, что средние цены за жилье не зависят от типа ванны, но все же они распределены в порядке убывания.
Описание: Самым дорогим ремонтом является евростандарт, при этом квартиры, в которых требуется ремонт, стоят намного дешевле, но он них тоже мало чего можно точно сказать, т.к. наблюдений всего 8. Видно, что тип ремонта может разниться в цене и внутри себя, потому что разброс по цене вверх достаточно большой у всех.
Описание: Если отбросить неуказанные значения, тогда большинство цен на квартиры при наличии балкона и его отсутствии не сильно различаются, но есть несколько дорогих квартир с балконом. В принципе, если дом сам по себе дорогой было бы странно, что он не имеет балкона.
Вторая категория Числовые переменные. Посмотрим как зависит цена от данных переменных:
Некоторые из данных переменных являются дискретными, поэтому графики распределения для них выглядят также, как и для номинальных переменных.
#Создадим переменную цены за кв.м.
orders = orders %>% mutate(Pricepermetr = Price/Area_total)
#Построим диаграмму рассеяния по x - растояние до метро, по y - цена за кв.м.
ggplot(data = orders %>% select(Dist_metro_ad, Pricepermetr) %>% na.omit(), aes(x = Dist_metro_ad, y = Pricepermetr))+
geom_point(size = 1, color = "#069587")+
labs(title = "Диаграма рассеяния цены в зависимости от расстояния до метро")+
xlab("Растояние до метро, м.") +
ylab("Цена за кв.м., руб.") +
theme_minimal()Описание: На данной диаграмме можно увидеть обратную зависимость - чем меньше расстояние до метро, тем выше цена. При этом разброс цен за квартиры вблизи метро очень большой. Скорее всего, это связано с тем, что часть квартир сдается рядом с метро в центральных районах, а часть - около метро на окраине города. Потребители предпочитают квартиры поближе к метро, которое является важнейшим из общественных транспортов. Поэтому цены на квартиры рядом с метро выше.
Описание: Интересный факт, что девятикомнатная квартира в среднем стоит дешевле, чем шестикомнатная, но это единичный случай, так что может этой квартире просто не повезло с районом. При этом самая дорогая цена была предложена за трехкомнатную квартиру. Скорее всего, это также обусловлено сторонними факторами. В целом цены за кв. метр сконцетрированы на одном значении и разбросы достаточно большие, так что нельзя судить о цене за кв. метр по количеству комнат в нем.
Описание: Если судить по диаграмме, то можно сделать вывод о том, что съем квартиры на меньший срок стоит дороже, чем на продолжительный. Из этой картины выбивается только минимальная продолжительность 1 месяц, средняя цена за который практически самая низкая. Можно обусловить это избеганием издержек на нового арендателя, возможные дни, ктогда квартира может стоять просто так, издержками на клининговые услуги и так далее.
Описание: На данной диаграмме четко показана зависимость между общей площадью жилья и цены: чем больше площадь, тем больше цена. Потребители ценят более просторные квартиры выше.
Описание: Медианная цена за квартиру в зависимости от этажа, на котором она расположена, особо не меняется при изменении самого этажа. Архитектурные особенности Петербурга, можно увидеть через боксплоты с большим разбросом — большим количеством наблюдений на квартирах на 3, 4, 5 этажах.
#Создадим переменную цены за кв.м.
orders = orders %>% mutate(Pricepermetr = Price/Area_total)
#Построим диаграмму рассеяния для широты и долготы, цветом выделим цену за кв.м.
ggplot(data = orders %>% select(Longitude, Latitude, Pricepermetr) %>% na.omit(), aes(x = Longitude, y = Latitude, color = Pricepermetr))+
geom_point(size = 1)+
labs(title = "Диаграма рассеяния цены в зависимости \n от местоположения квартиры")+
labs(color = "Цена за кв.м., руб.") +
scale_color_gradient(low="#000000", high="#06FFE7")+
xlab("Долгота") +
ylab("Широта") +
coord_fixed(ratio = 1)+
theme_minimal()Описание: Если приглядется, то можно заметить, что данная диаграмма рассеяния очень напоминает карту Санкт-Петербурга. Самые дорогие квартиры расположены в районе Крестовского острова, что и следовало из диаграмм, представленных выше. Дороговизна кварир в центре обусловлена сосредоточением жизни города - досуга, работы, учёбы, - в центре города. А на Крестовском острове расположено элитное жильё.
Описание: Интересно заметить, что цена квартиры возрастает с годом постройки здания. Соответственно, съем квартиры в новом здании обычно дороже, чем в старом. Это может быть обусловлено тем, что в старых домах обычно сдаются комнаты в коммунальных квартирах, а в новых - целые квартиры.
После того, как мы вычислили коэффициенты корреляции относительно цены, мы провели статистические тесты для каждой переменной относительно цены, чтобы понять, является ли полученная зависимость случайной для данной выборки или же она постоянна.
#Разделим цену на Низкую, Среднюю и Высокую
orders_price = orders
orders_price$Price = na.omit(orders_price$Price)
orders_price$Price_text[orders_price$Price <= quantile(na.omit(orders_2$Price),1/3)] <- "Низкая цена"
orders_price$Price_text[orders_price$Price > quantile(na.omit(orders_2$Price),1/3) & orders_price$Price < quantile(na.omit(orders_2$Price),2/3)] <- "Средняя цена"
orders_price$Price_text[orders_price$Price >= quantile(na.omit(orders_2$Price),2/3)] <- "Высокая цена"
#Запишем функцию которая будет счтать коэффициент сопряжённости для номинальных переменных
Cor_nominal = function(arg){
NObs = sum(arg)
NRow = nrow(arg)
NCol = ncol(arg)
Chi_2 = 0
for(i in 1:NRow)
{
for(j in 1:NCol)
{
Chi_2 = Chi_2 + (arg[i,j]^2) / (sum(arg[i,]) * sum(arg[,j]))
}
}
Chi_2 = NObs * (Chi_2 - 1)
C = sqrt(Chi_2 / (Chi_2 + NObs))
min_KL = min(NRow, NCol)
C_max = sqrt((min_KL-1) / min_KL)
C_P = C / C_max
return(C_P)
}Для переменной Region:
#Создадим таблицу с количеством наблюдений каждого значения переменной для каждого уровня цены
region1 = orders_price %>% filter(Price_text == "Низкая цена") %>% group_by(Region) %>% summarise(Низкая_цена = n())
region2 = orders_price %>% filter(Price_text == "Средняя цена") %>% group_by(Region) %>% summarise(Средняя_цена = n())
region3 = orders_price %>% filter(Price_text == "Высокая цена") %>% group_by(Region) %>% summarise(Высокая_цена = n())
region4 = inner_join(inner_join(region1,region2, by = "Region"),region3, by = "Region")
region5 = data.frame(region4[2],region4[3],region4[4])
rownames(region5) = c(region4$Region[1:nrow(region4)])
#Выведем текстом коэффициент сопряжённости
cat("Коэффициент сопряжённости:", Cor_nominal(region5))## Коэффициент сопряжённости: 0.3209285
#Проведёт стат тест и узнаем насколько полученная зависимость случайна
orders_nominal_region$Region = as.factor(orders_nominal_region$Region)
regiontest = independence_test(Pricepermetr ~ Region, data = orders_nominal_region)
cat("Вероятность случайности:", pvalue(regiontest))## Вероятность случайности: 1.438778e-09
Вывод: Корреляция между ценой и регионом слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность ошибки достаточно мала. Это говорит о том, что в одном из регионов цены несколько выше, но, в целом, регионы не так уж сильно различны в цене.
Для переменной District_ad
## Коэффициент сопряжённости: 0.6970249
## Вероятность случайности: 0
Вывод: Можно заметить, что присутствует корреляция между ценой и районом, в котором расположена квартира. Сам коэффицент корреляции достаточно высок, а вероятность допустить ошибку нулевая. Из этого можно сделать вывод, что существуют районы с сильно отличающейся ценой от остального города. Вероятно, это районы центра и Крестовский остров.
Для переменной Metro
## Коэффициент сопряжённости: 0.6490822
## Вероятность случайности: 0
Вывод: Можно заметить, что присутствует корреляция между ценой и ближайшей станцией метро. Сам коэффицент корреляции больше 0.5, а вероятность допустить ошибку нулевая. Связь обусловлена тем же, чем обусловлена связь цены с районами: жить в центре более престижно и более дорого.
Для переменной Building
## Коэффициент сопряжённости: 0.4018549
## Вероятность случайности: 1.413413e-09
Вывод: Корреляция между ценой и типом здания, в котором располагается квартира, слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность допустить ошибку достаточно мала. Если посмотреть на таблицу частот, можно заметить, что более дорогими являются кирпичные дома - вероятно, опять-таки, расположенные в центре.
Для переменной Lift
## Коэффициент сопряжённости: 0.1567779
## Вероятность случайности: 0.4538082
Вывод: Скорее всего, корреляция между ценой и наличием в доме лифта стремится к нулю, потому что сам коэффицент близок к нулю, а вероятность допустить ошибку достаточно высока.
Для переменной Furnished
## Коэффициент сопряжённости: 0.1929635
## Вероятность случайности: 0.0007211856
Вывод: Корреляция между ценой и наличием мебели слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность ошибки достаточно мала. Можно предположить, что квартиры без мебели дешевле, поскольку от арендатора ожидается дополнительное вложение средств в обустройку квартиры.
Для переменной Bath
## Коэффициент сопряжённости: 0.2937296
## Вероятность случайности: 0.00930319
Вывод: Корреляция между ценой и наличием ванны слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность ошибки достаточно мала. Можно предположить, что квартиры с раздельной ванной дороже. Поскольку они объективно лучше.
Для переменной Refurbished
## Коэффициент сопряжённости: 0.3059893
## Вероятность случайности: 1.013835e-06
Вывод: Корреляция между ценой и наличием ремонта слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность ошибки достаточно мала. Проблема состоит в том, что во многих наблюдениях тип ремонта не указан. Это затрудняет анализ.
Для переменной Balcony
## Коэффициент сопряжённости: 0.2404145
## Вероятность случайности: 0.3436372
Вывод: Скорее всего, корреляции между ценой и наличием в квартире балкона нету, потому что сам коэффицент практически равен 0.25, а вероятность допустить ошибку высока (почти 35%). Можно сделать вывод, что наличие балкона не так важно для потребителя.
Для переменной Dist_metro_ad
#Вычислим коэффициент корреляции для двух числовых велечин
cororders = orders %>% mutate(Pricepermetr = Price/Area_total) %>% select(Dist_metro_ad, Pricepermetr) %>% na.omit()
x=cororders$Dist_metro_ad
y=cororders$Pricepermetr
cat("Коэффициент корреляции:", cor(x, y, method="pearson"))## Коэффициент корреляции: -0.1894167
## Вероятность случайности: 2.63244e-23
Вывод: Корреляции между ценой и расстоянием от квартиры до метро нет, потому что сам коэффицент меньше нуля, а вероятность допустить ошибку мала. Это интересный вывод, но, скорее всего, он обусловлен тем, что большинство квартир находятся на примерно одном и том же расстоянии до метро.
Для переменной Rooms
## Коэффициент корреляции: NA
## Вероятность случайности: 1.170758e-07
Вывод: Можно заметить, что присутствует корреляция между ценой и количеством комнат в квартире. Сам коэффицент корреляции достаточно высок, а вероятность допустить ошибку нулевая. Можно сделать вывод, что чем больше комнат, тем выше цена за метр, так как многоквартирные дома как правило элитные.
Для переменной Minimum_duration
## Коэффициент корреляции: -0.0442332
## Вероятность случайности: 0.05439696
Вывод: Корреляции между ценой и минимальной продолжительностью снятия жилья нету, потому что сам коэффицент близок к нулю, а вероятность допустить ошибку мала.
Для переменной Area_total
## Коэффициент корреляции: 0.7729564
## Вероятность случайности: 0
Вывод: Из данных чисел видно, что присутствует корреляция между ценой и общей площадью жилья. Сам коэффицент корреляции достаточно высок, а вероятность допустить ошибку нулевая. Опять-таки, дома с большей общей площадью более элитные.
Для переменной Floor
## Коэффициент корреляции: 0.2707191
## Вероятность случайности: 0.002547961
Вывод: Корреляция между ценой и этажем, на котором расположена квартира, слабо выражена, так как сам коэффицент меньше 0.5, но при этом вероятность ошибки достаточно мала. Многие считают квартиры на верхних этажах более престижными, чем квартиры на нижних этажах, и цена на них, как следствие, больше.
Для переменной Year_construction
## Коэффициент корреляции: 0.006102869
## Вероятность случайности: 0.912527
Вывод: Из наблюдений следует, что корреляции между ценой и годом постройки нету, потому что сам коэффицент близок к нулю, а вероятность допустить ошибку высока. Это вызвано тем, что огромное число наблюдений не имеет указанного года постройки.