Изменяем типы данных и производим предварительную обработку: В столбце “Rooms” помимо числовых данных есть слова, что мешает производить расчеты, поэтому удаляем текст.То же самое в столбцах “Minimum duration”, “NFlour”.
X = X %>% mutate_if(is.character, as.factor)
X$Rooms = str_remove_all(X$Rooms, '[:punct:]studiya[:punct:]')
X$Rooms = as.integer(X$Rooms)
X$Minimum_duration = str_remove_all(X$Minimum_duration, 'mes.')
X$Minimum_duration = as.integer(X$Minimum_duration)
X$Latitude = round(X$Latitude, 1)
X$Longitude = round(X$Longitude, 1)
X$NFloor = str_remove_all(X$NFloor, 'kv.m.')
X$NFloor = as.integer(X$NFloor)
Группируем данные по виду: номинальные и числовые
nominal = X %>% select(Date_entry, Region, District_ad, Address, Metro, No_agents, Building, Lift, Furnished, Bath, Refurbished, Balcony, Year_construction)
numerical = X %>% select(Dist_metro_ad, Rooms, Price, Minimum_duration, Area_total, Area_living, Area_kitchen, Floor, NFloor, Latitude, Longitude)
D = data.frame('Переменная' = c('Date_entry', 'Region', 'District_ad', 'Address', 'Metro', 'Dist_metro_ad', 'Rooms', 'Price', 'Minimum_duration', 'No_agents', 'Building', 'Area_total', 'Area_living', 'Area_kitchen', 'Floor', 'NFloor', 'Lift', 'Furnished', 'Bath', 'Refurbished', 'Balcony', 'Latitude', 'Longitude', 'Year_construction'), 'Вид данных' = c('номинальный', 'номинальный', 'номинальный', 'номинальный', 'номинальный', 'числовой', 'числовой', 'числовой', 'числовой', 'номинальный', 'номинальный', 'числовой', 'числовой', 'числовой', 'числовой', 'числовой', 'номинальный', 'номинальный', 'номинальный', 'номинальный', 'номинальный', 'числовой', 'числовой', 'номинальный'))
DD = D %>% kbl(caption = "Сгруппированные данные") %>%
kable_material(c("striped", "hover"))
DD
| Переменная | Вид.данных |
|---|---|
| Date_entry | номинальный |
| Region | номинальный |
| District_ad | номинальный |
| Address | номинальный |
| Metro | номинальный |
| Dist_metro_ad | числовой |
| Rooms | числовой |
| Price | числовой |
| Minimum_duration | числовой |
| No_agents | номинальный |
| Building | номинальный |
| Area_total | числовой |
| Area_living | числовой |
| Area_kitchen | числовой |
| Floor | числовой |
| NFloor | числовой |
| Lift | номинальный |
| Furnished | номинальный |
| Bath | номинальный |
| Refurbished | номинальный |
| Balcony | номинальный |
| Latitude | числовой |
| Longitude | числовой |
| Year_construction | номинальный |
# Заменяем пропущенные значения на NA
nominal[nominal == ''] <- NA
# частота для номинальных
reg = nominal %>% group_by(Region) %>% count()
region = reg %>% kbl(caption = "Частота объявлений по регионам", col.names = c('Регион', 'Частота')) %>% kable_material(c("striped", "hover"))
region
| Регион | Частота |
|---|---|
| gorod Sankt-Peterburg | 2849 |
| Leningradskaya oblast’ | 151 |
Описание: Как видно по количеству данных, превалируют предложения аренды квартиры в черте города Санкт-Петербург. Это может быть объяснено большим спросом на жилье недалеко от райцентра.
distr = nominal %>% group_by(District_ad) %>% count()
DT::datatable(distr, options = list(bPaginate = T), colnames = c('Район', 'Частота'), caption = "Частота объявлений по районам ")
Описание: Чем ближе район к центру города, тем больше квартир сдается в аренду: в Центральном, Московском, Приморском, Выборгском и Петроградском районах.Меньше всего объявлений касается Лужского, Кронштадтского, Киришского, Приозерского районов, сильно удаленных от центра.
met = nominal %>% group_by(Metro) %>% count()
DT::datatable(met, options = list(bPaginate = T), colnames = c('Метро', 'Частота'), caption = "Частота объявлений в зависимости от ближайшей станции метро")
Описание: В подтверждение предыдущего комментария здесь мы также наблюдаем большую частоту объявлений о местах, расположенных ближе к центру - это станции метро Приморская, Чернышевская, Площадь Восстания. Меньше всего объявлений касается не станций метро, а станций электричек/автобусов/иного транспорта.
building = nominal %>% group_by(Building) %>% count()
DT::datatable(building, options = list(bPaginate = T), colnames = c('Материал, из которого построено здание', 'Частота'), caption = "Частота объявлений в зависимости от материала из которого построено здание")
Описание: Самые распространенные материалы: Кирпичный, Крип.Монолит, Монолит.Наименее распространеные:Реконструкция, Старый фонд без КР, 121.
l = nominal %>% group_by(Lift) %>% count()
lift = l %>% kbl(caption = "Частота объявлений в зависимости от наличия лифта", col.names = c('Наличие лифта', 'Частота')) %>% kable_material(c("striped", "hover"))
lift
| Наличие лифта | Частота |
|---|---|
| Est’ | 1634 |
| Net | 1197 |
| NA | 169 |
Описание: Большая часть зданий, где сдаются квартиры, отвечает требованиям наличия лифта.И тем не менее, почти в 40% домов его нет. Это может говорить о том, что здания не многоэтажные или относительно старые, в их конструкции не подразумевались шахты лифта. Большая часть таких старинных зданий расположена в центре Санкт-Петербурга, в пригородах больше новостроек, отвечающих всем требованиям удобства.
furn = nominal %>% group_by(Furnished) %>% count()
furnished = furn %>% kbl(caption = "Частота объявлений в зависимости от мебилированности квартиры", col.names = c('Меблирована квартира или нет', 'Частота')) %>% kable_material(c("striped", "hover"))
furnished
| Меблирована квартира или нет | Частота |
|---|---|
| Est’ | 93 |
| Garnit+kuh.nab. | 91 |
| Garnitur 70-80 | 6 |
| Garnitur Sovr. | 301 |
| Minimum | 86 |
| Net | 116 |
| Sbor.+kuh.garn. | 596 |
| Sbornaya 70-80 | 18 |
| Sbornaya Sovr. | 825 |
| Tol’ko kuhnya | 26 |
| NA | 842 |
Описание: Как видно по статистике, о меблированности квартир в весомом количестве объявлений информация отсутствует. Далее по частоте преобладают квартиры современные сборные и с гарнитуром, а также сборная с кухонным гарнитуром. Около 4% квартир не меблированы.
b = nominal %>% group_by(Bath) %>% count()
bath = b %>% kbl(caption = "Частота объявления в зависимости от типа ванной комнаты", col.names = c('Тип ванной', 'Частота')) %>% kable_material(c("striped", "hover"))
bath
| Тип ванной | Частота |
|---|---|
| Bol’shoi | 10 |
| Dush | 57 |
| Est’ | 151 |
| Na kuhne | 2 |
| Net | 4 |
| Otdel’naya | 809 |
| Poperechnaya | 7 |
| Prodol’naya | 12 |
| Sovmeshchennaya | 406 |
| NA | 1542 |
Описание: Интересно, что по большей части информация о типе ванной отсутсвует. Каковы могут быть причины сокрытия информации? Ужасное состояние жилого помещения? Или неосведомленность арендодателей о том, что съемщикам эта информация может быть очень важна? Но успокаевает тот факт, что 27% квартир имеют отдельную ванную комнату. Заметим, что существуют ванна на кухне - возможно это ошибка данных.
refur = nominal %>% group_by(Refurbished) %>% count()
refurbished = refur %>% kbl(caption = "Частота объявлений в зависимости от типа ремонта квартиры", col.names = c('Тип ремонта', 'Частота')) %>% kable_material(c("striped", "hover"))
refurbished
| Тип ремонта | Частота |
|---|---|
| Dush | 1 |
| Evrostandart | 893 |
| Ne trebuetsya | 162 |
| Otdel’naya | 22 |
| Proizveden | 605 |
| Sidyachaya | 1 |
| Sovmeshchennaya | 12 |
| Trebuetsya | 7 |
| NA | 1297 |
Описание: О типе ремонта в квартире большинство объявлений также умалчивает. Но, к счастью, остальная большая доля принадлежит квартирам со следующими характеристиками: с евроремонтом, ремонт не требуется и ремонт произведен. Понятия по типу “Сидячая” и “Душ” сложно отнести к данному контексту и отнесутся к ошибкам данных.
balcony = nominal %>% group_by(Balcony) %>% count()
DT::datatable(balcony, options = list(bPaginate = T), colnames = c('Наличие балкона', 'Частота'), caption = "Частота объявлений в зависимости от наличия балкона(и его типа) ")
Описание: Около трети объявлений не говорят ничего о наличии балкона.Возможно, по ненадобности.И тем не менее, мы видим огромное разнообразие видов и количества балконов, лоджий, эркеров. Объясняется богатством и диверсификацией архитектуры Санкт-Петербурга.
Также заметим, что частоты не всех переменных мы будем считать. Так, нет смысла считать частоту упоминаний адресов, так как они все уникальны.
Обозначения:
Min - минимум; Max - максимум; Q1- первый квартиль ; Q3 - третий квартиль; Mean - среднее; Median - медиана; Mode - мода; Sd - среднеквадратичсекое отклонение; Ra - размах; As - коэффициент асимметрии; Es - куртозис;
# расстояние до ближайшей станции метро, согласно объявлению (м)
min_dist = min(numerical$Dist_metro_ad, na.rm = T)
max_dist = max(numerical$Dist_metro_ad, na.rm = T)
mean_dist = round(mean(numerical$Dist_metro_ad, na.rm = T))
median_dist = median(numerical$Dist_metro_ad, na.rm = T)
q1_dist = unname(quantile(numerical$Dist_metro_ad, 0.25, na.rm = T))
q3_dist = unname(quantile(numerical$Dist_metro_ad, 0.75, na.rm = T))
sd_dist = round(sd(numerical$Dist_metro_ad, na.rm = T)) #среднее квадратическое отклонение
r_dist = max_dist-min_dist #размах
skew_dist = round(skewness(numerical$Dist_metro_ad), 1) #коэф асимметрии
kurtosis_dist = round(kurtosis(numerical$Dist_metro_ad))# куртозис или эксцесс
d1 = density(numerical$Dist_metro_ad, na.rm = T)
m_dist = round(d1$x[which.max(d1$y)]) # мода
dt_d = data.frame(Min = min_dist, Max = max_dist, Mean = mean_dist, Median = median_dist, Q1 = q1_dist, Q3 = q3_dist, Mode = m_dist, Sd = sd_dist, Ra = r_dist, As = skew_dist, Es = kurtosis_dist)
# Цена
min_p = min(numerical$Price, na.rm = T)
max_p = max(numerical$Price, na.rm = T)
mean_p = round(mean(numerical$Price, na.rm = T))
median_p = median(numerical$Price, na.rm = T)
q1_p = unname(quantile(numerical$Price, 0.25, na.rm = T))
q3_p = unname(quantile(numerical$Price, 0.75, na.rm = T))
sd_p = round(sd(numerical$Price, na.rm = T)) #среднее квадратическое отклонение
r_p = max_p-min_p #размах
skew_p = round(skewness(numerical$Price), 2) #коэф асимметрии
kurtosis_p = round(kurtosis(numerical$Price), 1) # куртозис или эксцесс
d2 = density(numerical$Price, na.rm = T)
m_p = round(d2$x[which.max(d2$y)])
dt_p = data.frame(Min = min_p, Max = max_p, Mean = mean_p, Median = median_p, Q1 = q1_p, Q3 = q3_p, Mode = m_p, Sd = sd_p, Ra = r_p, As = skew_p, Es = kurtosis_p)
# Общая площадь
min_at = min(numerical$Area_total, na.rm = T)
max_at = max(numerical$Area_total, na.rm = T)
mean_at = round(mean(numerical$Area_total, na.rm = T), 1)
median_at = median(numerical$Area_total, na.rm = T)
q1_at = unname(quantile(numerical$Area_total, 0.25, na.rm = T))
q3_at = unname(quantile(numerical$Area_total, 0.75, na.rm = T))
sd_at = round(sd(numerical$Area_total, na.rm = T), 1) #среднее квадратическое отклонение
r_at = max_at-min_at #размах
skew_at = round(skewness(numerical$Area_total), 2) #коэф асимметрии
kurtosis_at = round(kurtosis(numerical$Area_total), 1) # куртозис или эксцесс
d3 = density(numerical$Area_total, na.rm = T)
m_at = round(d3$x[which.max(d3$y)])
dt_at = data.frame(Min = min_at, Max = max_at, Mean = mean_at, Median = median_at, Q1 = q1_at, Q3 = q3_at, Mode = m_at, Sd = sd_at, Ra = r_at, As = skew_at, Es = kurtosis_at)
# Количество комнат
min_r = min(numerical$Rooms, na.rm = T)
max_r = max(numerical$Rooms, na.rm = T)
mean_r = round(mean(numerical$Rooms, na.rm = T))
median_r = median(numerical$Rooms, na.rm = T)
q1_r = unname(quantile(numerical$Rooms, 0.25, na.rm = T))
q3_r = unname(quantile(numerical$Rooms, 0.75, na.rm = T))
sd_r = round(sd(numerical$Rooms, na.rm = T), 1) #среднее квадратическое отклонение
r_r = max_r-min_r #размах
skew_r = round(skewness(numerical$Rooms), 2) #коэф асимметрии
kurtosis_r = round(kurtosis(numerical$Rooms), 2) # куртозис или эксцесс
d4 = density(numerical$Rooms, na.rm = T)
m_r = round(d4$x[which.max(d4$y)], 2)
dt_r = data.frame(Min = min_r, Max = max_r, Mean = mean_r, Median = median_r, Q1 = q1_r, Q3 = q3_r, Mode = m_r, Sd = sd_r, Ra = r_r, As = skew_r, Es = kurtosis_r)
# Жилая площадь
min_al = min(numerical$Area_living, na.rm = T)
max_al = max(numerical$Area_living, na.rm = T)
mean_al = round(mean(numerical$Area_living, na.rm = T), 1)
median_al = median(numerical$Area_living, na.rm = T)
q1_al = unname(quantile(numerical$Area_living, 0.25, na.rm = T))
q3_al = unname(quantile(numerical$Area_living, 0.75, na.rm = T))
sd_al = round(sd(numerical$Area_living, na.rm = T), 1) #среднее квадратическое отклонение
r_al = max_al-min_al #размах
skew_al = round(skewness(numerical$Area_living), 2) #коэф асимметрии
kurtosis_al = round(kurtosis(numerical$Area_living), 1) # куртозис или эксцесс
d5 = density(numerical$Area_living, na.rm = T)
m_al = round(d5$x[which.max(d5$y)], 1)
dt_al = data.frame(Min = min_al, Max = max_al, Mean = mean_al, Median = median_al, Q1 = q1_al, Q3 = q3_al, Mode = m_al, Sd = sd_al, Ra = r_al, As = skew_al, Es = kurtosis_al)
# Площадь кухни
min_ak = min(numerical$Area_kitchen, na.rm = T)
max_ak = max(numerical$Area_kitchen, na.rm = T)
mean_ak = round(mean(numerical$Area_kitchen, na.rm = T), 1)
median_ak = median(numerical$Area_kitchen, na.rm = T)
q1_ak = unname(quantile(numerical$Area_kitchen, 0.25, na.rm = T))
q3_ak = unname(quantile(numerical$Area_kitchen, 0.75, na.rm = T))
sd_ak = round(sd(numerical$Area_kitchen, na.rm = T), 1) #среднее квадратическое отклонение
r_ak = max_ak-min_ak #размах
skew_ak = round(skewness(numerical$Area_kitchen), 2) #коэф асимметрии
kurtosis_ak = round(kurtosis(numerical$Area_kitchen), 1) # куртозис или эксцесс
d6 = density(numerical$Area_kitchen, na.rm = T)
m_ak = round(d6$x[which.max(d6$y)], 2)
dt_ak = data.frame(Min = min_ak, Max = max_ak, Mean = mean_ak, Median = median_ak, Q1 = q1_ak, Q3 = q3_ak, Mode = m_ak, Sd = sd_ak, Ra = r_ak, As = skew_ak, Es = kurtosis_ak)
# Этаж, на котором расположена квартира
min_f = min(numerical$Floor, na.rm = T)
max_f = max(numerical$Floor, na.rm = T)
mean_f = round(mean(numerical$Floor, na.rm = T))
median_f = median(numerical$Floor, na.rm = T)
q1_f = unname(quantile(numerical$Floor, 0.25, na.rm = T))
q3_f = unname(quantile(numerical$Floor, 0.75, na.rm = T))
sd_f = round(sd(numerical$Floor, na.rm = T), 2) #среднее квадратическое отклонение
r_f = max_f-min_f #размах
skew_f = round(skewness(numerical$Floor), 2) #коэф асимметрии
kurtosis_f = round(kurtosis(numerical$Floor), 2) # куртозис или эксцесс
d7 = density(numerical$Floor, na.rm = T)
m_f = round(d7$x[which.max(d7$y)], 2)
dt_f = data.frame(Min = min_f, Max = max_f, Mean = mean_f, Median = median_f, Q1 = q1_f, Q3 = q3_f, Mode = m_f, Sd = sd_f, Ra = r_f, As = skew_f, Es = kurtosis_f)
# Количество этажей в доме
min_nf = min(numerical$NFloor, na.rm = T)
max_nf = max(numerical$NFloor, na.rm = T)
mean_nf = round(mean(numerical$NFloor, na.rm = T))
median_nf = median(numerical$NFloor, na.rm = T)
q1_nf = unname(quantile(numerical$NFloor, 0.25, na.rm = T))
q3_nf = unname(quantile(numerical$NFloor, 0.75, na.rm = T))
sd_nf = round(sd(numerical$NFloor, na.rm = T), 2) #среднее квадратическое отклонение
r_nf = max_nf-min_nf #размах
skew_nf = round(skewness(numerical$NFloor), 2) #коэф асимметрии
kurtosis_nf = round(kurtosis(numerical$NFloor), 2) # куртозис или эксцесс
d8 = density(numerical$NFloor, na.rm = T)
m_nf = round(d8$x[which.max(d8$y)], 2)
dt_nf = data.frame(Min = min_nf, Max = max_nf, Mean = mean_nf, Median = median_nf, Q1 = q1_nf, Q3 = q3_nf, Mode = m_nf, Sd = sd_nf, Ra = r_nf, As = skew_nf, Es = kurtosis_nf)
# Широта
min_lt = min(numerical$Latitude, na.rm = T)
max_lt = max(numerical$Latitude, na.rm = T)
mean_lt = round(mean(numerical$Latitude, na.rm = T), 1)
median_lt = median(numerical$Latitude, na.rm = T)
q1_lt = unname(quantile(numerical$Latitude, 0.25, na.rm = T))
q3_lt = unname(quantile(numerical$Latitude, 0.75, na.rm = T))
sd_lt = round(sd(numerical$Latitude, na.rm = T), 2) #среднее квадратическое отклонение
r_lt = max_lt-min_lt #размах
skew_lt = round(skewness(numerical$Latitude), 2) #коэф асимметрии
kurtosis_lt = round(kurtosis(numerical$Latitude), 2) # куртозис или эксцесс
d9 = density(numerical$Latitude, na.rm = T)
m_lt = round(d9$x[which.max(d9$y)], 1)
dt_lt = data.frame(Min = min_lt, Max = max_lt, Mean = mean_lt, Median = median_lt, Q1 = q1_lt, Q3 = q3_lt, Mode = m_lt, Sd = sd_lt, Ra = r_lt, As = skew_lt, Es = kurtosis_lt)
# Долгота
min_ln = min(numerical$Longitude, na.rm = T)
max_ln = max(numerical$Longitude, na.rm = T)
mean_ln = round(mean(numerical$Longitude, na.rm = T), 1)
median_ln = median(numerical$Longitude, na.rm = T)
q1_ln = unname(quantile(numerical$Longitude, 0.25, na.rm = T))
q3_ln = unname(quantile(numerical$Longitude, 0.75, na.rm = T))
sd_ln = round(sd(numerical$Longitude, na.rm = T), 2) #среднее квадратическое отклонение
r_ln = max_ln-min_ln #размах
skew_ln = round(skewness(numerical$Longitude), 2) #коэф асимметрии
kurtosis_ln = round(kurtosis(numerical$Longitude), 2) # куртозис или эксцесс
d10 = density(numerical$Longitude, na.rm = T)
m_ln = round(d10$x[which.max(d10$y)], 1)
dt_ln = data.frame(Min = min_ln, Max = max_ln, Mean = mean_ln, Median = median_ln, Q1 = q1_ln, Q3 = q3_ln, Mode = m_ln, Sd = sd_ln, Ra = r_ln, As = skew_ln, Es = kurtosis_ln)
# Минимальная продолжительность договора
min_md = min(numerical$Minimum_duration, na.rm = T)
max_md = max(numerical$Minimum_duration, na.rm = T) #почему-то максимум 11000
mean_md = round(mean(numerical$Minimum_duration, na.rm = T))
median_md = median(numerical$Minimum_duration, na.rm = T)
q1_md = unname(quantile(numerical$Minimum_duration, 0.25, na.rm = T))
q3_md = unname(quantile(numerical$Minimum_duration, 0.75, na.rm = T))
sd_md = round(sd(numerical$Minimum_duration, na.rm = T)) #среднее квадратическое отклонение
r_md = max_md-min_md #размах
skew_md = round(skewness(numerical$Minimum_duration), 1) #коэф асимметрии
kurtosis_md = round(kurtosis(numerical$Minimum_duration)) # куртозис или эксцесс
d11 = density(numerical$Minimum_duration, na.rm = T)
m_md = round(d11$x[which.max(d11$y)], 1)
dt_md = data.frame(Min = min_md, Max = max_md, Mean = mean_md, Median = median_md, Q1 = q1_md, Q3 = q3_md, Mode = m_md, Sd = sd_md, Ra = r_md, As = skew_md, Es = kurtosis_md)
# Общая таблица
data_1 = full_join(dt_d, dt_r, by = NULL)
data_2 = full_join(data_1, dt_p, by = NULL)
data_3 = full_join(data_2, dt_md, by = NULL)
data_4 = full_join(data_3, dt_at, by = NULL)
data_5 = full_join(data_4, dt_al, by = NULL)
data_6 = full_join(data_5, dt_ak, by = NULL)
data_7 = full_join(data_6, dt_f, by = NULL)
data_8 = full_join(data_7, dt_nf, by = NULL)
data_9 = full_join(data_8, dt_lt, by = NULL)
data_10 = full_join(data_9, dt_ln, by = NULL)
Name = c('Dist_metro_ad', 'Rooms', 'Price', 'Minimum_duration', 'Area_total', 'Area_living', 'Area_kitchen', 'Floor', 'NFloor', 'Latitude', 'Longitude')
dataa = cbind(Name, data_10)
data = dataa %>% kbl(caption = "Таблица с описательными статистиками всех переменных") %>% kable_material(c("striped", "hover"))
data
| Name | Min | Max | Mean | Median | Q1 | Q3 | Mode | Sd | Ra | As | Es |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Dist_metro_ad | 0.0 | 152390.0 | 1578.0 | 770.0 | 320.0 | 1550.0 | 398.00 | 4542.00 | 152390.0 | 19.30 | 544.00 |
| Rooms | 1.0 | 8.0 | 2.0 | 2.0 | 1.0 | 2.0 | 1.01 | 1.00 | 7.0 | 1.23 | 2.06 |
| Price | 18.0 | 750000.0 | 44922.0 | 30000.0 | 22000.0 | 50000.0 | 21910.00 | 45325.00 | 749982.0 | 4.85 | 42.30 |
| Minimum_duration | 1.0 | 11000.0 | 16.0 | 11.0 | 11.0 | 11.0 | 15.70 | 239.00 | 10999.0 | 45.90 | 2109.00 |
| Area_total | 12.0 | 400.0 | 62.0 | 50.0 | 38.0 | 70.0 | 39.00 | 38.10 | 388.0 | 2.81 | 12.40 |
| Area_living | 2.0 | 300.0 | 38.1 | 30.0 | 19.0 | 46.0 | 18.60 | 28.20 | 298.0 | 2.85 | 13.00 |
| Area_kitchen | 1.0 | 210.0 | 14.2 | 10.0 | 8.0 | 15.0 | 9.85 | 13.10 | 209.0 | 4.77 | 36.20 |
| Floor | 1.0 | 31.0 | 7.0 | 5.0 | 3.0 | 9.0 | 3.25 | 4.81 | 30.0 | 1.32 | 1.46 |
| NFloor | 0.0 | 37.0 | 12.0 | 10.0 | 5.0 | 16.0 | 5.14 | 6.82 | 37.0 | 0.65 | -0.55 |
| Latitude | 59.6 | 60.1 | 59.9 | 59.9 | 59.9 | 60.0 | 59.90 | 0.07 | 0.5 | -0.12 | -0.15 |
| Longitude | 30.1 | 30.7 | 30.3 | 30.3 | 30.3 | 30.4 | 30.30 | 0.09 | 0.6 | 0.21 | 0.11 |
Описание: заметим некоторые противоречия и ошибки. Указано, что минимальная цена аренды квартиры - 18, это маловероятно. По условию цены указаны в рублях в месяц, и чаще встречаются пятизначные суммы.Также проанализируем минимальную продолжительность договора, указанную в месяцах. Максимальное значение = 11000, что слишком много, также посчитаем за ошибку.Предположим, что максимальная жилая площадь в 400 кв.метров вполне возможна (допустим, двухэтажные апартаменты). Заметим, что максимальная удаленность от метро - 152390 метров. Значит, это скорее всего пригород. Любопытны наблюдения по площади кухни: минимально 1 кв.м - слишком мало, а максимально 210 кв.м - маловероятно, разве что в доме, а не в квартире. Это не может превышать минимальную жилую площадь, которая по таблице равна 2 кв. м, так что тоже зачтем как ошибку. Следующее противоречие: всего этажей в доме не может быть меньше того этажа, на котором расположена квартира, так что минимальное значение NFlour некорректно.
Очищаем данные от выбросов и ошибок:
Так как площадь кухни не может превышать общей площади помещения, очистим соответсвующие данные.
numerical_clean = numerical %>% filter(Area_total > Area_kitchen | is.na(Area_total) | is.na(Area_kitchen)) # общая площадь не может быть меньше площади кухни
Известно, что цена указана в рублях в месяц, следовательно, минимальные уровни цен в размере 18 и 20 рублей в месяц невозможны.
# Убираем слишком маленькие значения цены
numerical_clean = numerical_clean %>% filter(Price > 30)
Также корректируем значения площадей: устанавливаем фильтр, ориентируясь на то, что площадь кухни в 1 кв.м и выше 125 кв.м не есть норма.То же самое касается жилой площади в 2 кв.м.
# Уберем слишком маленькие и большие площади
numerical_clean = numerical_clean %>% filter(Area_kitchen > 1 & Area_kitchen < 125 | !is.na((Area_kitchen)))
numerical_clean = numerical_clean %>% filter(Area_living > 2 | is.na(Area_living))
При анализе значений минимальной продолжительности договора было замечено, что 11000 месяцев - на практике не применимый срок для договора, поэтому было решено убрать это значение.
numerical_clean = numerical_clean %>% filter( Minimum_duration != 11000 | is.na(Minimum_duration))
Проделаем все то же самое, но только уже для очищенных данных, и получим таблицу:
| Name | Min | Max | Mean | Median | Q1 | Q3 | Mode | Sd | Ra | As | Es |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Dist_metro_ad | 0.0 | 152390.0 | 1646.0 | 790.0 | 320.0 | 1580.0 | 373.00 | 4811.00 | 152390.0 | 18.40 | 492.00 |
| Rooms | 1.0 | 8.0 | 2.0 | 2.0 | 1.0 | 2.0 | 1.00 | 1.00 | 7.0 | 1.16 | 1.76 |
| Price | 1500.0 | 750000.0 | 44230.0 | 30000.0 | 22000.0 | 50000.0 | 21527.00 | 44273.00 | 748500.0 | 5.21 | 49.50 |
| Minimum_duration | 1.0 | 31.0 | 10.0 | 11.0 | 11.0 | 11.0 | 11.10 | 3.00 | 30.0 | 1.30 | 17.00 |
| Area_total | 16.0 | 400.0 | 62.2 | 50.0 | 40.0 | 70.0 | 39.40 | 36.70 | 384.0 | 2.84 | 12.80 |
| Area_living | 9.0 | 280.0 | 37.8 | 31.0 | 18.3 | 45.0 | 18.50 | 27.60 | 271.0 | 2.75 | 11.60 |
| Area_kitchen | 1.0 | 210.0 | 14.1 | 10.0 | 8.0 | 15.0 | 9.85 | 13.00 | 209.0 | 4.82 | 37.30 |
| Floor | 1.0 | 25.0 | 7.0 | 5.0 | 3.0 | 9.0 | 3.18 | 4.75 | 24.0 | 1.29 | 1.31 |
| NFloor | 0.0 | 35.0 | 11.0 | 9.0 | 5.0 | 16.0 | 5.13 | 6.72 | 35.0 | 0.67 | -0.49 |
| Latitude | 59.6 | 60.1 | 59.9 | 59.9 | 59.9 | 60.0 | 59.90 | 0.07 | 0.5 | -0.13 | -0.07 |
| Longitude | 30.1 | 30.7 | 30.3 | 30.3 | 30.3 | 30.4 | 30.30 | 0.09 | 0.6 | 0.20 | 0.09 |
Описание: Полностью откорректированная и очищенная от ошибок, теперь таблица описательных статистик отражает реалистичные данные.Сделаем некоторые наблюдения: заметим, что у данных о расстоянии до станции метро критически большое значение коэффициента эксцесса.Это говорит о том, что значения сосредоточены очень близко к средней величине.То есть большинство квартир, которые сдаются в аренду, удалено от метро на полтора километра. Для потенциальных арендаторов такое расстояние вполне приемлемо. По описательным статистикам данных о количестве комнат видно, что большая часть помещений - это однокомнатные квартиры или студии. Коэффициент асимметрии величины наемной цены достаточно высокий и положительный, это указывает на правостороннюю асимметрию (что характерно для большинства величин, исключая Latitude) и то, что значительная часть данных концентрируется левее среднего значения и много значений достаточно меньше среднего.
ggplot(reg) + geom_bar(aes(x = Region, y = n), fill = '#D2AAE4', stat='identity')+
xlab("Регион")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("gorod Sankt-Peterburg","Leningradskaya oblast'"), labels=c("город Санкт-Петербург", "Ленинградская область"))+
ggtitle("Распределение количества объявлений \n между Санкт-Птербургом и Ленинградской областью ")+geom_label(aes(x = Region, y = n, label = n ), vjust = 0.5)+theme(legend.position="none") +theme_minimal()
Описание: Можно увидеть, что есть лишь два варианта и между ними есть большая разница. Так, квартиры в Ленинградской области встречаются примерно в 19 раз реже.
ggplot(distr) + geom_bar(aes(x = District_ad, y = sort(n)),fill = "#D8E3E9", stat='identity')+
xlab("Район")+
ylab("Количество объявлений")+
ggtitle("Распределение количества объявлений по \n районам Санкт-Петербурга ")+coord_flip()+theme_minimal()
Описание: По графику можно увидеть, что чаще всего встречаются квартиры в Центральном районе, второй пик приходится на Фрунзенский.
met2 = met %>% arrange(-n)
met3 = head(met2, 10)
ggplot(met3) + geom_bar(aes(x = Metro, y = n),fill = "#DFF0D0", stat='identity')+
xlab("Станция метро")+
ylab("Количество объявлений") +scale_x_discrete(breaks=c("Zvezdnaya","Vosstaniya pl.","Veteranov pr.","Staraya Derevnya","Prosveshcheniya pr.","Primorskaya","Petrogradskaya","Moskovskaya","Leninskii pr.","Kupchino","Komendantskii pr.","Chernyshevskaya","Bol'shevikov pr."), labels=c("Звездная", "Площадь Восстания","Проспект Ветеранов","Старая деревня","Проспект просвещения","Приморская","Петроградская","Московская","Ленинский проспект","Купчино","Комендантский проспект","Чернышевская","Проспект большевиков"))+ coord_flip()+
ggtitle("Распределение количества объявлений \n по станциям метро Санкт-Петербурга (топ 10)")+theme_minimal()
Описание: По графику можно увидеть, что чаще всего встречаются квартиры со станцией метро Приморская, остальные квартиры распределены по станциям почти равномерно.
build = building %>% filter(!is.na(Building))
build1 = build %>% arrange(n)
build2 = build %>% arrange(-n)
build12 = head(build1, 11)
build22 = head(build2, 11)
ggplot(build22) + geom_bar(aes(x = Building, y = n),fill = "#CFD1DF", stat='identity')+
xlab("Материл, из которого построено здание")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Staryi fond s KR","Staryi fond","Stalinskii","Panel'nyi","Monolit","Monol.Panel'nyi","Kirpichnyi","Kirp.Monolit","Individual'nyi proekt","Blochnyi","137 seriya"), labels=c("Старый фонд с КР", "Старый фонд","Сталинский","Панельный","Монолит","Монол.Панельный","Кирпичный","Кирп.Монолит","Индивидуальный проект","Блочный","137 серия"))+
ggtitle("Распределение количества объявлений \n в зависимости от материала, из которого \n сделано здание \n (по наибольшему числу объявлений)")+ coord_flip()+theme_minimal()
ggplot(build12) + geom_bar(aes(x = Building, y = n),fill = "pink", stat='identity')+
xlab("Материл, из которого построено здание")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Staryi fond bez KR","Rekonstrukciya","Kottedj","Korabl'","Besshovnaya tehnologiya","606 seriya","602 seriya","600.11 seriya","504D seriya","504 seriya","121(Gatchinskaya)"), labels=c("Старый фонд без КР", "Реконструкция","Коттедж","Корабль","Бесшовная технология","606 серия","602 серия","600.11 серия","504D серия","504 серия","121(Гатчинская)"))+
ggtitle("Распределение количества объявлений \n в зависимости от материала, из которого \n сделано здание \n (по наименьшему числу объявлений)")+ coord_flip()+theme_minimal()
ll = l %>% filter(!is.na(Lift))
ggplot(ll) + geom_bar(aes(x = Lift, y = n), fill= '#ACBAC3', stat='identity')+
xlab(" ")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Est'","Net"), labels=c("Есть лифт", "Нет лифта"))+
ggtitle("Распределение количества объявлений в зависимости \n от наличия лифта в доме ")+geom_label(aes(x = Lift, y = n, label = n), vjust = 0.5)+theme_minimal()
Описание: Можно увидеть, что есть лишь два варианта и между ними есть некоторая разница. Так, квартиры без лифта встречаются примерно в 1,4 раза реже.
furn1 = furn %>% filter(!is.na(Furnished))
ggplot(furn1) + geom_bar(aes(x = Furnished, y = n), fill = '#566471', stat='identity')+
xlab("Уровень мебелированности")+
ylab("Количество объявлений") +scale_x_discrete(breaks=c("Tol'ko kuhnya","Sbornaya Sovr.","Sbornaya 70-80","Sbor.+kuh.garn.","Net","Minimum","Garnitur Sovr.","Garnitur 70-80","Garnit+kuh.nab.","Est'"), labels=c("Только кухня", "Сборная современная","Сборная 70-80","Сборная +кух.гарн.","Нет мебели","Минимум","Гарнитур совр.","Гарнитур 70-80","Гарнитур + кух.наб.","Есть мебель"))+ coord_flip()+
ggtitle("Распределение количества объявлений \n в зависимости от уровня мебелированности квартиры")+theme_minimal()
Описание: Можно увидеть, что наиболее частым вариантом по уровню мебелированности является сборная современная квартира, а второй вариант по частоте-сборная+кухонный гарнитур. Не считая квартир с современным гарнитуром, остальные варианты гораздо менее популярны.Гарнитур 70-80 годов почти не встречается.
b1 = b %>% filter(!is.na(Bath))
b1 = b1 %>% filter(n>7)
ggplot(b1) + geom_bar(aes(x = Bath, y = n), fill='#ACBAC3', stat='identity')+
xlab("Тип ванной")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Sovmeshchennaya","Prodol'naya","Poperechnaya","Otdel'naya","Net","Na kuhne","Est'","Dush","Bol'shoi"), labels=c("Совмещенная", "Продольная","Поперечная","Отдельная","Нет ванны","На кухне","Есть ванна","Душ","Большая ванна"))+ coord_flip()+
ggtitle("Распределение количества объявлений \n в зависимости от типа ванной комнаты")+theme_minimal()
Описание: Наиболее часто встречающийся тип ванной - отдельная ванна. Второе по частоте значение-совмещенная ванна. ОГстальные встречаются сильно реже, квартиры с продольной ванной и с большой ванной встречаются крайне редко.
refur1 = refur %>% filter(!is.na(Refurbished))
refur1 = refur %>% filter(n > 7)
refur1 = refur1 %>% filter(n < 1297)
ggplot(refur1) + geom_bar(aes(x = Refurbished, y = n), fill='#D2AAE4', stat='identity')+
xlab("Тип ремонта")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Sovmeshchennaya","Proizveden","Otdel'naya","Ne trebuetsya","Evrostandart"), labels=c("Совмещенная", "Произведен ","Отдельная","Не требуется","Евростандарт"))+
ggtitle("Распределение количества объявлений \n в зависимости от типа ремонта квартиры ")+theme_minimal()+
coord_flip()
Описание: По графику можно определить, что чаще всего встречаются квартиры с евростандартным ремонтом. Их количество составляет около 880 квартир. Второй пик приходится на квартиры с произведенным ремонтом. Очевидно, что остальные варианты встречаются реже, а квартир с совмещенным ремонтом и отдельным ремонтом крайне мало.
balcony1 = balcony %>% filter(!is.na(Balcony))
balcony1 = balcony %>% filter(n>12)
balcony1 = balcony1 %>% filter(n<1003)
ggplot(balcony1) + geom_bar(aes(x = Balcony, y = n), fill='#C8EAF9', stat='identity')+
xlab("Наличие балкона")+
ylab("Количество объявлений")+scale_x_discrete(breaks=c("Zasteklennyi balkon","Zasteklennaya lodjiya","Net","Lodjiya","est'","Balkon","2 lodjii","2 balkona"), labels=c("Застекленный балкон", "Застекленная лоджия","Без балк./лодж.","Лоджия","Есть лодж.или балк.","1 балкон","2 лоджии","2 балкона"))+
ggtitle("Распределение количества объявлений \n в зависимости от наличия балкона \n (и его типа)")+theme_minimal() +coord_flip()
Описание: По графику видно, что чаще всего в аренду предлагаются квартиры с одним балконом. Второй по популярности вариант, квартиры с лоджией, встречается уже почти в два раза реже по сравнению с квартирами с одним балконом. Следующие три по популярности варианты встречаются не сильно реже, чем второй. И только квартиры с 2 лоджиями и 2 балконами встречаются редко.
# Price отдельно
ggplot(numerical_clean) +geom_histogram(aes(x = Price/1000), color = 'black')+
ggtitle("Распределени цены")+
xlab("Цена аренды, в тыс. руб")+
ylab("")+theme_minimal()
Эмпирическая функция плотности от цены:
ggplot(numerical_clean)+geom_density(aes(x= Price/1000))+
ggtitle("Эмпирическая функция плотности от цены")+
ylab("")+
xlab("Цена аренды, в тыс. руб")+theme_minimal()
Описание: По графику можно определить, что наиболее часто сдаются квартиры стоимостью 21 527 тысяч в месяц.До и после этого варианта популярность цен на квартиры плавно и равномерно снижается. Второй по популярности вариант, примерно 50 000 рублей в месяц, встречается уже в разы реже. Можно увидеть, что квартиры стоимостью больше 180 000 рублей в месяц почти не встречаются.
numeric_clean1=numerical_clean
numeric_clean1=numeric_clean1%>%filter( Dist_metro_ad<20000)
ggplot(numeric_clean1) +geom_histogram(aes(x = Dist_metro_ad/1), fill = "#BAC1AC", color = 'black')+
ggtitle("Распеределения дистанции до ближайшего метро")+
xlab("Дистанция до метро, в м.")+
ylab("")+theme_minimal()
Функция плотности распеределения дистанции:
ggplot(numeric_clean1)+geom_density(aes(x= Dist_metro_ad/1), color = '#586146')+
ggtitle("Функция плотности Распеределения дистанции")+
ylab("")+
xlab("Дистанция до метро, в м.")+theme_minimal()
Описание: Мы видим, что наиболее часто сдаются квартиры c расстоянием до метро равным 373 метра.Далее, отходя от данного пика, популярность квартир плавно снижается. Можно заметить, что, начиная примерно с 5 000 метров, квартиры с данной площадью встречаются очень редко.
#количество комнат
ggplot(numerical_clean) +geom_histogram(aes(x = Rooms/1), fill = '#A6C2D0', color = 'black')+
ggtitle("Распределение количества комнат")+
xlab("Количество комнат")+
ylab("")+theme_minimal()
Функция плотности распределения количества комнат:
ggplot(numerical_clean)+geom_density(aes(x= Rooms/1), color = '#0072A3')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Количество комнат")+theme_minimal()
Описание: По графику видно, что чаще всего встречаются квартиры с одной комнатой, второй пик приходится на две комнаты-их сдают немного реже. Квартиры с 4 комнатами встречаются уже намного режке, а квартиры с 5 и 6 комнатами встречаются крайне редко.
#минимальная продолж договора
ggplot(numerical_clean) +geom_histogram(aes(x = Minimum_duration/1), fill = "#E0E1A8", color = 'black')+
ggtitle("Распределения минимальной продолжительности договора")+
xlab("Продолжительность договора, в месяцах")+
ylab("")+theme_minimal()
Функция плотности распределения минимальной продолжительности договора:
ggplot(numerical_clean)+geom_density(aes(x= Minimum_duration/1), color = '#A5A727')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Продолжительность договора, в месяцах")+theme_minimal()
Описание: По графику видно, что самый популярный по минимальной продолжительности договора вариант-это квартиры с продолжительностью договора 11 месяцев. Остальные варианты встречаются уже гораздо реже, а квартиры со сроком больше 15 месяцев и меньше 5 месяцев встречаются редко, за исключением срока сдачи в один месяц.
Посмотрим на общий график распределния и эмпирической функции:
ggplot(data = numerical_clean, aes(x = Area_total/1)) +
geom_histogram(aes(y = ..density..),
fill = "#C8EAF9") +
geom_density(col = "darkblue")+
ggtitle("Распределение общих площадей квартир")+
ylab("")+
xlab("Общая площадь, в кв.м.") +theme_minimal()
Описание: Можно увидеть, что чаще всего встречаются квартиры с общей площадью 39 кв.метров. Следующие два по популярности варианта охватывают диапазон от 50 до 70 квадратных метров. Площадь кухни более 200 кв.метров встречается очень редко.
Посмотрим на общий график распределния и эмпирической функции:
ggplot(data = numerical_clean, aes(x = Area_living/1)) +
geom_histogram(aes(y = ..density..),
fill = "pink") +
geom_density(col = "darkblue")+
ggtitle("Распределение жилых площадей")+
ylab("")+
xlab("Жилая площадь, в кв.м.") +theme_minimal()
Описание: Мы можем увидеть, что наиболее часто встречаются квартиры, площадь которых составляет 18, 6 кв.метров.Следующие два наиболее встречающиеся значения находятся рядом-в промежутке от данного значения до 40 кв.метров. Так же можно заметить, что, начиная с0 130 кв.метров, квартиры встречаются очень редко.
#площадь кухни
ggplot(numerical_clean) +geom_histogram(aes(x =Area_kitchen/1), fill = '#B3B3B3', color = 'black')+
ggtitle("Распределения площади кухни квартир")+
xlab("Площадь кухни, в кв.м.")+
ylab("")+theme_minimal()
Функция плотности распределения :
ggplot(numerical_clean)+geom_density(aes(x=Area_kitchen/1), color = '#666666')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Площадь кухни, в кв.м.")+theme_minimal()
Описание: По графику видно, что чаще всего встречаются квартиры с размером кухни. Остальные варианты по мере удаления от пика встречаются все реже и реже, а, начиная с размера кухни 60 кв.метров, квартиры встречаются крайне редко. Наиболее часто встречаются кухни с площадью 9.85 кв.метров. Следующее по частоте значение находится в районе 12.5 кв.метров.
#этаж на котором расположена квартира
ggplot(numerical_clean) +geom_histogram(aes(x = Floor/1), fill = '#BFA8C2', color = 'black')+
ggtitle("Распределение по этажу на котором расположена квартира")+
xlab("Этаж расположения квартиры")+
ylab("")+theme_minimal()
Функция плотности распределения:
ggplot(numerical_clean)+geom_density(aes(x= Floor/1), col = '#9E88A2')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Этаж расположения квартиры")+theme_minimal()
Описание: Чаще всего встречаются квартиры на 3 этаже, второй пик приходится на 4 этаж. Далее по возрастанию этажей квартиры встречаются все реже, а квартиры на 23 этаже и выше почти не встречаются.
#распределение по чсилу этажей в доме
ggplot(numerical_clean) +geom_histogram(aes(x = NFloor/1), fill = '#566471', color = 'black')+
ggtitle("Распределение по числу этажей в доме")+
xlab("Число этажей в доме")+
ylab("")+theme_minimal()
Функция плотности распределения:
ggplot(numerical_clean)+geom_density(aes(x= NFloor/1), col = '#566471')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Число этажей в доме")+theme_minimal()
Описание: Чаще всего встречаются дома с 5 этажами. Второй пик приходится на 9 этажные дома. Дома с другим количеством этажей встречаются заметно реже. Функция плотности распределения
#географическая широта
ggplot(numerical_clean) +geom_histogram(aes(x = Latitude/1), fill = '#ACBAC3', color = 'black')+
ggtitle("Распределение по географическим щиротам квартир")+
xlab("Географическая широта квартиры,в градусах")+
ylab("")+theme_minimal()
Функция плотности распределения:
ggplot(numerical_clean)+geom_density(aes(x= Latitude/1), col = '#ACBAC3')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Географическая широта квартиры,в градусах")+theme_minimal()
Описание: Квартиры по широте имеют пик около 300 значения, остальные значения распределены нормально.
ggplot(numerical_clean) +geom_histogram(aes(x = Longitude/1), fill = '#3E436A', color = 'black')+
ggtitle("Распределение по географической долготе квартир")+
xlab("Географическая долгота квартиры,в градусах")+
ylab("")+theme_minimal()
Функция плотности распределения:
ggplot(numerical_clean)+geom_density(aes(x= Longitude/1), col = '#3E436A')+
ggtitle("Функция плотности распределения")+
ylab("")+
xlab("Географическая долгота квартиры,в градусах")+theme_minimal()
Описание: Квартиры по долготе распределены нормально, с пиком в 30,32
ggplot(data=filter(numerical_clean, !is.na(Area_total), Price<250000))+
geom_point(aes(x=Price/1000, y=Area_total), alpha=0.7, color="#DFF0D0", size=3)+
ggtitle("Соотношение цен и площадей квартир")+
xlab("Цена, тыс.руб./месяц")+
ylab("Площадь квартиры")+
theme_minimal()+
geom_smooth(aes(x=Price/1000, y=Area_total), color="#ACBAC3")
Описание: Мы можем увидеть, что есть сильная положительная корреляция между общей площадью и ценой.Даже несмотря на небольшие выбросы, четко видна зависимость.
ggplot(data=filter(numerical_clean, !is.na(Dist_metro_ad), Dist_metro_ad<25000, Price<250000))+
geom_point(aes(x=Price/1000, y=Dist_metro_ad/1000), alpha=0.7, color="#BFA8C2", size=3)+
ggtitle("Соотношение цен квартир и расстояния до метро")+
xlab("Цена, тыс.руб./месяц")+
ylab("Расстояние до метро, км")+
theme_minimal()+
geom_smooth(aes(x=Price/1000, y=Dist_metro_ad/1000), color="#3E436A")
Описание: Нельзя точно сказать, что зависимость наблюдается. Однако, здесь мы исследуем зависимость от цены, смешивая ее возрастание как с ростом объема площади, так и с расстоянием до метро, из-за чего, возможно, отрицательная зависимость с расстоянием до метро не наблюдается. К тому же, на графике сильно выделяются три выброса при движении к возрастанию цен за квартиры, а коэффициент Пирсона к ним чувствителен. Поэтому построим график соотношения цены за кв. м и расстояния до метро.
Теперь построим график соотношения цены за кв. м и расстояния до метро
ggplot(data=filter(numerical_clean, !is.na(Dist_metro_ad), Dist_metro_ad<50000))+
geom_point(aes(x=Price/Area_total, y=Dist_metro_ad/1000), alpha=0.3, color="#566471", size=3)+
ggtitle("Соотношение цены за единицу площади\nи расстояния до метро")+
xlab("Цена за кв.м., руб./месяц")+
ylab("Расстояние до метро, км")+
theme_minimal()
Вывод: Можно заметить слабую отрицательную корреляцию между расстоянием до метро и ценой, так как с увеличением цены за квадратный метр разброс расстояний уменьшается. Бюджетные квартиры могут быть расположены как далеко, так и близко к метро, а почти все дорогие квартиры находятся недалеко от метро.
ggplot(data=filter(numerical_clean, !is.na(Rooms), Price<300000))+
geom_point(aes(x=Price/1000, y=Rooms), alpha=0.4, color="pink", size=3)+
ggtitle("Соотношение цен квартир и\nколичества комнат")+
xlab("Цена, тыс.руб./месяц")+
ylab("Кол-во комнат")+
theme_minimal()
Описание: По графику видно, что зависимость есть. Коэффициент корреляции подтверждает наличие средней положительной корреляции между количеством комнат и ценой. Видно, что, начиная примерно со 180 тыс.руб в месяц, количество комнат становится не меньше трех и, напротив, примерно до 25 тыс.рублей в месяц количество комнат не превышает трех.
ggplot(data=filter(numerical_clean, !is.na(Area_living), Price<300000, Area_living<150))+
geom_point(aes(x=Price/1000, y=Area_living), alpha=0.7, color="#BAC1AC", size=3)+
ggtitle("Соотношение цен квартир и\nплощади жилых комнат")+
xlab("Цена, тыс.руб./месяц")+
ylab("Пл. жилых комнат, м кв.")+
theme_minimal()+
geom_smooth(aes(x=Price/1000, y=Area_living), color="#586146")
ggplot(data=filter(numerical_clean, !is.na(Floor), Price<300000))+
geom_point(aes(x=Price/1000, y=Floor), alpha=0.4, color="#E0E1A8", size=3)+
ggtitle("Соотношение цен квартир и\nномера этажа")+
xlab("Цена, тыс.руб./месяц")+
ylab("Номер этажа")+
theme_minimal()+
geom_smooth(aes(x=Price/1000, y=Floor), color="#3E436A")
Можно заметить отрицательную зависимость.
Изменится ли результат, если разделим цену на площадь?
ggplot(data=filter(numerical_clean, !is.na(Floor)))+
geom_point(aes(x=Price/Area_total, y=Floor), alpha=0.3, color="#ACBAC3", size=3)+
ggtitle("Соотношение цены за единицу площади\nи номера этажа")+
xlab("Цена за кв.м, руб./месяц")+
ylab("Этаж, на котором расположена квартира")+
theme_minimal()+
geom_smooth(aes(x=Price/Area_total, y=Floor), color="#3E436A")
ggplot(data=filter(numerical_clean, !is.na(Minimum_duration),Minimum_duration<30, Price<250000))+
geom_point(aes(x=Price/1000, y=Minimum_duration), alpha=0.4, color="#ACBAC3", size=3)+
ggtitle("Соотношение цены квартиры\nи мин. продолжительности договора")+
xlab("Цена, тыс.руб./месяц")+
ylab("Мин. срок договора, мес.")+
theme_minimal()
Посмотрим теперь на график соотношения цены одного кв. м квартиры и минимальной подолжительности договора
ggplot(data=filter(numerical_clean, !is.na(Minimum_duration),Minimum_duration<30, Price/Area_total<2000))+
geom_point(aes(x=Price/Area_total, y=Minimum_duration), alpha=0.7, color="#B3B3B3", size=3)+
ggtitle("Соотношение цены за единицу площади\nи мин. продолжительности договора")+
xlab("Цена за кв.м, руб./месяц")+
ylab("Мин. срок договора, мес.")+
theme_minimal()
correlation = round(cor(numerical_clean, use = "complete.obs"), 2) %>%
kbl(caption = "Коэффициенты корреляции для числовых переменных") %>%
kable_material(c("striped", "hover"))
correlation
| Dist_metro_ad | Rooms | Price | Minimum_duration | Area_total | Area_living | Area_kitchen | Floor | NFloor | Latitude | Longitude | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Dist_metro_ad | 1.00 | -0.12 | -0.19 | -0.03 | -0.15 | -0.12 | -0.12 | 0.01 | 0.05 | -0.15 | -0.16 |
| Rooms | -0.12 | 1.00 | 0.65 | -0.09 | 0.84 | 0.86 | 0.45 | -0.15 | -0.26 | -0.04 | -0.04 |
| Price | -0.19 | 0.65 | 1.00 | -0.08 | 0.81 | 0.73 | 0.59 | -0.10 | -0.18 | -0.01 | -0.05 |
| Minimum_duration | -0.03 | -0.09 | -0.08 | 1.00 | -0.07 | -0.08 | -0.07 | 0.03 | 0.04 | 0.02 | 0.00 |
| Area_total | -0.15 | 0.84 | 0.81 | -0.07 | 1.00 | 0.91 | 0.66 | -0.08 | -0.16 | 0.00 | -0.05 |
| Area_living | -0.12 | 0.86 | 0.73 | -0.08 | 0.91 | 1.00 | 0.47 | -0.11 | -0.21 | -0.02 | -0.05 |
| Area_kitchen | -0.12 | 0.45 | 0.59 | -0.07 | 0.66 | 0.47 | 1.00 | 0.05 | 0.00 | 0.04 | -0.05 |
| Floor | 0.01 | -0.15 | -0.10 | 0.03 | -0.08 | -0.11 | 0.05 | 1.00 | 0.70 | 0.08 | -0.01 |
| NFloor | 0.05 | -0.26 | -0.18 | 0.04 | -0.16 | -0.21 | 0.00 | 0.70 | 1.00 | 0.11 | -0.02 |
| Latitude | -0.15 | -0.04 | -0.01 | 0.02 | 0.00 | -0.02 | 0.04 | 0.08 | 0.11 | 1.00 | 0.04 |
| Longitude | -0.16 | -0.04 | -0.05 | 0.00 | -0.05 | -0.05 | -0.05 | -0.01 | -0.02 | 0.04 | 1.00 |
Описание:
Очистим весь датасет от ошибок. Для того чтобы определить зависимость, переменная Price должна быть номинальной, поэтому разделим наемную цену на низкую и высокую, операясь на медиану.
x =X %>% filter(X$Area_total > X$Area_kitchen | is.na(Area_total) | is.na(Area_kitchen))
x = x %>% filter(Price > 30 | is.na(Price))
x = x %>% filter(Area_kitchen > 1 & Area_kitchen < 125 | is.na((Area_kitchen)))
x = x %>% filter(Area_living > 2 | is.na(Area_living))
x = x %>% filter( Minimum_duration != 11000 | is.na(Minimum_duration) | is.na(Minimum_duration))
x = x %>% mutate(price_nom = case_when(Price <= 30000 ~ 'низкая', T ~ 'высокая' ))
Определим для начала нулевую гипотезу: H_0 - нет зависимости H_1 - зависимость есть
chi1 = table(x$price_nom, x$Metro)
chisq.test(chi1)
##
## Pearson's Chi-squared test
##
## data: chi1
## X-squared = 1313.9, df = 81, p-value < 2.2e-16
Мы наблюдаем низкое значение p-value < 0.05 (значение веротяности ошибки). Таким образом, можно утверждать, что существует связь между ценой квартиры и станцией метро, на которой находится эта квартира, то есть нулевая гипотеза отвергается. Действительно, на центральных станциях метро(Площадь Восстания, Петроградская, Невский проспект) наемные цены на квартиры в разы выше.
Посмотрим на коэффициент сопряженности:
c1 = cont.coef(x[, c('price_nom', 'Metro')])
## Contingency Coefficient
##
## Estimate: 0.56
Вывод: Коэффициент отличен от нуля и составляет 0.56, следовательно, между ценой и станцией метро существует средняя по значимости связь.
chi2 = table(x$price_nom, x$District_ad)
chisq.test(chi2)
##
## Pearson's Chi-squared test
##
## data: chi2
## X-squared = 1185.8, df = 24, p-value < 2.2e-16
Здесь виден точно такой же результат, что и с метро.
Посмотрим на коэффициент сопряженности:
c2 = cont.coef(x[, c('price_nom', 'District_ad')])
## Contingency Coefficient
##
## Estimate: 0.54
Вывод: Коэффициент отличен от нуля и составляет 0.54, следовательно, между ценой квартиры и районом, в котором нахоится квартира, существует средняя по значимости связь.
chi3 = table(x$price_nom, x$Building)
chisq.test(chi3)
##
## Pearson's Chi-squared test
##
## data: chi3
## X-squared = 437.25, df = 24, p-value < 2.2e-16
Опять получили низкое значение p-value, поэтому будем считать, что связь между типом здания и ценой есть.
Посмотрим на коэффициент сопряженности:
c3 = cont.coef(x[, c('price_nom', 'Building')])
## Contingency Coefficient
##
## Estimate: 0.36
Вывод: Коэффициент отличен от нуля и составляет 0.36, следовательно, между ценой квартиры и типом здания, в котором нахоится квартира, существует слабая по значимости связь.
chi4 = table(x$price_nom, x$Lift)
chisq.test(chi4)
##
## Pearson's Chi-squared test
##
## data: chi4
## X-squared = 25.616, df = 2, p-value = 2.739e-06
Значение веротяности ошибки снова получилось низким, то есть нулевая гипотеза отвергается. Таким образом, наличие лифта в доме оказывает влияние на наемную цену квартиры.
Посмотрим на коэффициент сопряженности:
c4 = cont.coef(x[, c('price_nom', 'Lift')])
## Contingency Coefficient
##
## Estimate: 0.09
Вывод: Коэффициент отличен от нуля, но составляет всего 0.09, следовательно, между ценой квартиры и наличием лифта в доме, в котором сдается квартира, существует очень слабая связь.
chi5 = table(x$price_nom, x$Furnished)
chisq.test(chi5)
##
## Pearson's Chi-squared test
##
## data: chi5
## X-squared = 123.77, df = 10, p-value < 2.2e-16
Ошибочно не отвергать нулевую гипотезу, так как p-value принимает очень низкое значением, поэтому будем утверждать, что связь между ценой и налчиием мебели в квратире существует.
Посмотрим на коэффициент сопряженности:
c5 = cont.coef(x[, c('price_nom', 'Furnished')])
## Contingency Coefficient
##
## Estimate: 0.20
Вывод: Коэффициент отличен от нуля, но составляет всего 0.20, следовательно, между ценой квартиры и наличием мебели в квратире, существует слабая связь.
chi6 = table(x$price_nom, x$Bath)
chisq.test(chi6)
##
## Pearson's Chi-squared test
##
## data: chi6
## X-squared = 121.86, df = 9, p-value < 2.2e-16
Тест снова показалась низкое значение веротяности ошибки, следовательно, зависимость между ценой и типом ванны есть.
Посмотрим на коэффициент сопряженности:
c6 = cont.coef(x[, c('price_nom', 'Bath')])
## Contingency Coefficient
##
## Estimate: 0.20
Вывод: Коэффициент сопряженности здесь получился такой же, что и у коэффициента для цены и мебелированности квартиры (0.20), следовательно, между ценой квартиры и типом ванной комнаты существует такая же слабая связь.