Выполнили:

Грабкова Виктория
Покровская Валерия
Иванова Светлана
Матарыкина Екатерина
Тарасова София

Группа:

БЭК-192

Пункт 1

Сгруппированные данные

Изменяем типы данных и производим предварительную обработку: В столбце “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 номинальный

Пункт 2

Описательные статистики

Номинальные данные:

# Заменяем пропущенные значения на 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) и то, что значительная часть данных концентрируется левее среднего значения и много значений достаточно меньше среднего.

Пункт 3

Столбиковые диаграммы для номинальных переменных:

  • Регион, где находится сдаваемая квартира:
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()

Описание: По графику можно увидеть, что чаще всего встречаются квартиры в Центральном районе, второй пик приходится на Фрунзенский.

  • Распределение количества объявлений по станциям метро Санкт-Петербурга (топ 10)
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

Пункт 4

Диаграммы рассеивания для наёмной цены квартиры и других переменных:

  • Соотношение цены и площади квартиры(в тыс.руб. и м^2)
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()

Пункт 5

Коэффициенты корреляции для различных переменных

Числовые данные

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), следовательно, между ценой квартиры и типом ванной комнаты существует такая же слабая связь.