Данный отчет состоит из 5 секций:
Код может быть раскрыт при нажатии кнопки “Show”
Итоговая ЗП по вакансии была получена по следующему принципу:
"Зарплата от" указана и "Зарплата до" не указана ~ Итоговая зарплата = "Зарплата от"
"Зарплата от" не указана и "Зарплата до" указана ~ Итоговая зарплата = "Зарплата до"
"Зарплата от" указана и "Зарплата до" указана ~ Итоговая зарплата = среднее значение между зарплатой "от" и "до"
"Зарплата от" не указана и "Зарплата до" не указана ~ Данные не учтены в исследовании
В результате данного действия количество наблюдений в датасете составило 10 889
Курс на момент 28.02.2025:
1 BYR - выведен из обращения, наблюдения удалены из данных
1 EUR = 92.04 RUR
1 KZT = 0.17 RUR
1 USD = 87.70 RUR
1 UZS = 0.01 RUR
1 UAH = 2.11 RUR
1 GEL = 31.16 RUR
Итоговая зарплата была переведена в Гросс, в зависсимости от указания о том была ли ЗП выдана “на руки” или “до вычета НДФЛ”
Оставим только “живые” вакансии 2024 или 2025 года последней публикации. В результате данного действия количество наблюдений в датасете составило 10 372
Отфильтруем внутрирегиональные выбросы с помошью Метода межквартильного размаха (IQR). В результате данного действия количество наблюдений в датасете составило 9 720
Отфильтруем оставшиеся значения, которые ниже МРОТ для каждого из регионов. В результате данного действия количество наблюдений в датасете составило 9 696
Для рассмотрения в разрезе Регионов (смотр. пункт 4) данные были исследованы на предмет распределения вакансий по Регионам. Из Рис.1 следует, что в некоторых регионах было опубликовано недостаточное количество вакансий, что делает невозможным ссылаться на них при формулировке выводов о каждом конкретном Регионе. В связи с этим для исследования по 4 пункту данные были обрезаны по условию: Не менее 50 вакансий на Регион. В результате данного действия были отфильтрованы данные по 33 регионам и итоговое количество наблюдений в датасете составило 9 073
library(dplyr)
library(stringr)
library(ggplot2)
library(readr)
library(scales)
library(plotly)
library(lubridate)
#Скачиваем данные по заработным платам по функциональному направлению "Недвижимость". Данные разделены по ФО и регионам
msc_spb_re = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Real_Estate/csv/msc_mscobl_spb_lenobl_27.01.2025.csv")
all_re = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Real_Estate/csv/Centr_dalnevost_juzhn_SKFO_privolzhsk_uralsk_sibir_27.01.2025.csv")
mrot = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/МРОТ.csv")
mrot = na.omit(mrot)
mrot$Регион = str_squish(mrot$Регион)
#Переименуем регионы г.Санкт-Петербург и г. Москва
msc_spb_re$Регион = if_else(msc_spb_re$Город == "Санкт-Петербург","Санкт-Петербург", msc_spb_re$Регион)
msc_spb_re$Регион = if_else(msc_spb_re$Город == "Москва","Москва", msc_spb_re$Регион)
#msc_spb_re$Регион %>% unique()
#all_re$Регион %>% unique()
#Склеим всё в один большой датасет
real_estate = rbind(msc_spb_re, all_re)
#Избавимся от возможных дупликатов одних и тех же данных
#real_estate$`Страница вакансии на HeadHunter` %>% unique() %>% length()
#Проверим количество регионов
#real_estate$Регион %>% unique() %>% length()
#real_estate$Регион %>% unique() %>% length()
#regions_list_re = real_estate$Регион %>% unique()
#regions_list_re = as.data.frame(regions_list_re)
real_estate = real_estate %>% distinct()
rm(msc_spb_re, all_re)
#Отбираем ценные для нас колонки
real_estate = real_estate[c("Регион","Город","Название вакансии","Страница вакансии на HeadHunter", "Специализации вакансии","Дата создания","Дата последней публикации","Дата архивации","Зарплата от","Зарплата до","Валюта зарплаты","Зарплата указана")]
#Посмотрим не попали ли к нам не относящиеся к исследованию вакансии
#real_estate$`Специализации вакансии` %>% unique()
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Автослесарь, автомеханик")
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Арт-директор, креативный директор")
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Хостес")
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Машинист")
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Механик")
#real_estate %>% filter(real_estate$`Специализации вакансии` == "Врач)
#Очистим данные от лишних строк
real_estate = real_estate %>% filter(str_detect(real_estate$`Название вакансии`, "Земельн|земельн|ЗЕМЕЛЬН|Аренд|аренд|АРЕНД|сервитут|Сервитут|СЕРВИТУТ|Реестр|реестр|РЕЕСТР|Недвижим|недвижим|НЕДВИЖИМ|Кадастр|кадастр|КАДАСТР|Estate|estate|ESTATE|Land|land|LAND|Lease|lease|LEASE|Property|property|PROPERTY"))
real_estate = real_estate %>% filter(!str_detect(real_estate$`Название вакансии`, "Land Rover|LAND ROVER|land rover|продаж|ПРОДАЖ|Продаж|Агент|агент|АГЕНТ|БРОКЕР|Брокер|брокер|МАРКЕТОЛОГ|Маркетолог|маркетолог|SMM|smm|Smm|ОЦЕНЩИК|Оценщик|оценщик|МЕНЕДЖЕР|Менеджер|менеджер|ТАРГЕТОЛОГ|Таргетолог|таргетолог|КОПИРАЙТЕР|Копирайтер|копирайтер|АНАЛИТИК|Аналитик|аналитик|РИЕЛТОР|Риелтор|риелтор|РИЭЛТОР|Риэлтор|риэлтор|ДИЗАЙНЕР|Дизайнер|дизайнер|HR|hr|Hr|MANAGER|manager|Manager|ОПЕРАТОР|Оператор|оператор|CALL|Call|call|АРХИТЕКТОР|Архитектор|архитектор|PR|Pr|pr|ИНВЕСТ|Инвест|инвест|Ассистент|АССИСТЕНТ|ассистент|РЕДАКТОР|Редактор|редактор|МАРКЕТИНГ|Маркетинг|маркетинг|BROKER|Broker|broker|ПОРТФЕЛЬ|Портфель|портфель|Финансовый консультант|ФИНАНСОВЫЙ КОНСУЛЬТАНТ|финансовый консультант|AGENT|Agent|agent|КОММЕРЧЕСКИЙ ДИРЕКТОР|Коммерческий директор|коммерческий директор|ИНЖЕНЕР ПРОЕКТА|Инженер проекта|инженер проекта|УПРАВЛЯЮЩИЙ|Управляющий|управляющий|ОЦЕНК|Оценк|оценк|БОРТПРОВОДНИК|Бортпроводник|бортпроводник|Стюард|СТЮАРД|стюард|ОФИЦИАНТ|Официант|официант|ХОСТЕС|Хостес|хостес|БУХГАЛТЕР|Бухгалтер|бухгалтер|Финансовый директор|ФИНАНСОВЫЙ ДИРЕКТОР|финансовый директор|ПРОРАБ|Прораб|прораб|АДМИНИСТР|Администр|администр|DIGITAL|Digital|digital|RECRUITMENT|Recruitment|recruitment|ОПЕРАЦ|Операц|операц|КЛИЕНТ|Клиент|клиент|ЛИДОГЕН|Лидоген|лидоген|ЗАКУП|Закуп|закуп|СЕКРЕТАР|Секретар|секретар|ФОТОГРАФ|Фотограф|фотограф|ТЕХНИК|Техник|техник|ОНЛАЙН|Онлайн|онлайн|TELEGRAM|Telegram|telegram|РАЗРАБОЧИК|Разработчик|разработчик|ЭНЕРГЕТИК|Энергетик|энергетик|РЕКРУТ|Рекрут|рекрут|ПРОДАВЕЦ|Продавец|продавец|ТРЕНЕР|Тренер|тренер|РУКОВОДИТЕЛЬ|Руководитель|руководитель|Стажер|СТАЖЕР|стажер|КОНТЕНТ|Контент|контент|ПАРТНЕР|Партнер|партнер|АВТО|Авто|авто|РЕМОНТ|Ремонт|ремонт|АУДИТ|Аудит|аудит|CRM|Crm|crm|ARCHITECT|Architect|architect|Copywriter|CEO|Chief|DevOps-инженер|Data Scientist|Marketing|аниматор|Aниматор|АНИМАТОР|ДИРЕКТОР|Директор|директор|МАКЛЕР|Маклер|маклер|КРЕДИТ|Кредит|кредит|МАЛЯР|Маляр|маляр|КОУЧ|коуч|Коуч|Водитель|водитель|ВОДИТЕЛЬ|Реклам|РЕКЛАМ|реклам|Покупател|ПОКУПАТЕЛ|покупател|ЧАТ|Чат|чат|ТРАКТОР|Трактор|трактор|Су-шеф|Супервайзер|Экономист|ОСМОТР|Осмотр|осмотр"))
regions_count = real_estate %>%
group_by(Регион) %>%
summarise(count = n())
regions_count_min = regions_count %>% filter(regions_count$count < 50)
regions_count_min = regions_count_min %>% dplyr::select(Регион)
g1 = ggplot(regions_count, aes(x = reorder(Регион, count), y = count)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
title = "Рис.1 Количество вакансий функции Управление недвижимостью по регионам",
x = "Регион",
y = "Количество вакансий"
) +
theme_minimal() +
theme(
axis.text.y = element_text(size = 12),
axis.text.x = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0),
plot.title.position = "plot"
)
g1
rm(g1)
#Посчитаем среднюю заработную плату по вилке "От" и "До"
real_estate = real_estate %>% mutate(`Итоговая зарплата` = case_when((real_estate$`Зарплата от` == "не указана" & real_estate$`Зарплата до` == "не указана" ) ~ "0", (real_estate$`Зарплата от` == "не указана" & real_estate$`Зарплата до` != "не указана") ~ real_estate$`Зарплата до`, (real_estate$`Зарплата до` == "не указана" & real_estate$`Зарплата от` != "не указана") ~ real_estate$`Зарплата от`, (real_estate$`Зарплата до` != "не указана" & real_estate$`Зарплата от` != "не указана") ~ "1.01"))
#real_estate %>% filter(real_estate$`Итоговая зарплата` == 0) %>% count()
real_estate$`Итоговая зарплата` = as.numeric(real_estate$`Итоговая зарплата`)
real_estate$`Зарплата от` = as.numeric(real_estate$`Зарплата от`)
real_estate$`Зарплата до` = as.numeric(real_estate$`Зарплата до`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Итоговая зарплата` == 1.01, rowMeans(real_estate[9:10]), real_estate$`Итоговая зарплата`)
#real_estate %>% filter(real_estate$`Итоговая зарплата` == 0) %>% count()
#Количество нулей не изменилось с предыдущего шага, можем избавиться от всех нулевых значений
real_estate = real_estate %>% filter(`Итоговая зарплата` != 0)
#
#real_estate$`Валюта зарплаты` %>% unique()
#real_estate %>% filter(real_estate$`Валюта зарплаты` == "KZT")
#1)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "EUR",real_estate$`Итоговая зарплата`*92.04 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "KZT",real_estate$`Итоговая зарплата`*0.17 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "BYR",real_estate$`Итоговая зарплата`*0 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "USD",real_estate$`Итоговая зарплата`*87.70 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "UZS",real_estate$`Итоговая зарплата`*0.01 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "UAH",real_estate$`Итоговая зарплата`*2.11 ,real_estate$`Итоговая зарплата`)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Валюта зарплаты` == "GEL",real_estate$`Итоговая зарплата`*31.16 ,real_estate$`Итоговая зарплата`)
real_estate = real_estate %>% filter(`Итоговая зарплата` != 0)
#2)
real_estate$`Итоговая зарплата` = if_else(real_estate$`Зарплата указана` == "на руки", real_estate$`Итоговая зарплата`/87*100, real_estate$`Итоговая зарплата`)
g2 = ggplot(data = real_estate) +
geom_point(aes(x = reorder(`Название вакансии`, `Итоговая зарплата`), y = `Итоговая зарплата`), alpha = 0.9, size = 1.5, color = "steelblue") +
labs(title = "Распределение зп по функции: Бухгалтер", x = "", y = "ЗП") +
scale_y_continuous(labels = label_number(scale = 1e0, suffix = "")) +
scale_x_discrete(labels = " ") +
theme_minimal()
#g2
rm(g2)
#quantile(real_estate$`Итоговая зарплата`, 0.1)
#real_estate = real_estate %>% filter(`Итоговая зарплата` >= quantile(real_estate$`Итоговая зарплата`, 0.1))
#quantile(real_estate$`Итоговая зарплата`, 0.9)
#real_estate = real_estate %>% filter(`Итоговая зарплата` <= quantile(real_estate$`Итоговая зарплата`, 0.9))
Посмотрим на динамику спроса на труд (по дате последней публикации) в течение года. На Рис.2 представлен график изображающий изменение количества вакансий по месяцам 2024 года. На графике также подписана медианная заработная плата, соответствующая каждому месяцу. Данный грaфик показывает отношение спроса на труд и его стоимости
real_estate$`Дата создания` = dmy(real_estate$`Дата создания`)
real_estate$`Дата последней публикации` = dmy(real_estate$`Дата последней публикации`)
real_estate$`Дата архивации` = dmy(real_estate$`Дата архивации`)
#sum(if_else(year(real_estate$`Дата последней публикации`) == 2024|year(real_estate$`Дата последней публикации`) == 2025, FALSE, TRUE))
real_estate$`Год последней публикации` = year(real_estate$`Дата последней публикации`)
real_estate = real_estate %>% filter(real_estate$`Год последней публикации`== 2024 | real_estate$`Год последней публикации`== 2025)
days_count = real_estate %>% group_by(`Дата последней публикации`) %>% summarise(n = n())
g7 = ggplot(days_count) + geom_line(aes(x = `Дата последней публикации`, y = n), color = "steelblue") +
xlab("") +
ylab("Количество вакансий") +
scale_y_continuous(labels = scales::comma) +
theme_minimal()
#g7
rm(g7)
#krsn = real_estate %>% filter(Регион == "Краснодарский край")
real_estate_outliers = real_estate
real_estate_outliers = real_estate_outliers %>% filter(`Итоговая зарплата` >= quantile(real_estate_outliers$`Итоговая зарплата`, 0.1), `Итоговая зарплата` <= quantile(real_estate_outliers$`Итоговая зарплата`, 0.9))
real_estate_outliers = real_estate_outliers %>% left_join(mrot, by = join_by(Регион))
?left_join()
#is.na(real_estate_outliers$МРОТ) %>% sum()
real_estate_outliers = real_estate_outliers %>% filter(`Итоговая зарплата` >= МРОТ)
#krsn$`Итоговая зарплата` = round(krsn$`Итоговая зарплата`)
#krsn = krsn %>%
# group_by(Регион) %>% mutate(
# Q1 = quantile(`Итоговая зарплата`, 0.25, na.rm = TRUE),
# Q3 = quantile(`Итоговая зарплата`, 0.75, na.rm = TRUE),
# IQR_value = Q3 - Q1,
# lower_bound = Q1 - 1.5 * IQR_value,
# upper_bound = Q3 + 1.5 * IQR_value
# ) %>%
# Фильтруем строки, оставляя только значения, находящиеся в пределах установленных границ
# filter(`Итоговая зарплата` >= lower_bound, `Итоговая зарплата` <= upper_bound) %>%
# ungroup() # Убираем группировку, возвращаясь к исходной структуре данных
# Удаляем вспомогательные столбцы, если они больше не нужны
real_estate$`Итоговая зарплата` = round(real_estate$`Итоговая зарплата`)
real_estate = real_estate %>%
group_by(Регион) %>% mutate(
Q1 = quantile(`Итоговая зарплата`, 0.25, na.rm = TRUE),
Q3 = quantile(`Итоговая зарплата`, 0.75, na.rm = TRUE),
IQR_value = Q3 - Q1,
lower_bound = Q1 - 1.5 * IQR_value,
upper_bound = Q3 + 1.5 * IQR_value
) %>%
# Фильтруем строки, оставляя только значения, находящиеся в пределах установленных границ
filter(`Итоговая зарплата` >= lower_bound, `Итоговая зарплата` <= upper_bound) %>%
ungroup() %>% # Убираем группировку, возвращаясь к исходной структуре данных
# Удаляем вспомогательные столбцы, если они больше не нужны
dplyr::select(-Q1, -Q3, -IQR_value, -lower_bound, -upper_bound)
real_estate = real_estate %>% left_join(mrot, by = join_by(Регион))
real_estate = real_estate %>% filter(`Итоговая зарплата` >= МРОТ)
weeks_count = days_count %>% group_by(year = year(`Дата последней публикации`),week = week(`Дата последней публикации`)) %>% summarise(cnt = sum(n))
weeks_count = weeks_count[1:53,]
g8 = ggplot(weeks_count) + geom_line(aes(x = week, y = cnt, color = factor(year)),show.legend = FALSE,) +
labs(title = "Распределение количества вакансий по неделям, 2024", x = "", y = "Количество вакансий") +
scale_color_discrete(name = "Год") +
scale_y_continuous(labels = scales::comma) +
scale_x_continuous(breaks = c(1, 10, 20, 30, 40, 50),
labels = c("1 нед\n Янв","10 нед\n Мар","20 нед\n Май","30 нед\n Июл","40 нед\n Окт","50 нед\n Дек")) +
theme_minimal()
#g8
rm(g8)
months_count = days_count %>% group_by(year = year(`Дата последней публикации`),month_1 = month(`Дата последней публикации`)) %>% summarise(cnt = sum(n))
months_wage = real_estate %>% group_by(year = year(`Дата последней публикации`),month_1 = month(`Дата последней публикации`)) %>% summarise(wage = median(`Итоговая зарплата`))
months_wage = months_wage[,3]
months_count = months_count %>% cbind(months_wage)
months_count = months_count %>% filter(year == 2024)
g9 = ggplot(months_count) +
geom_line(aes(x = month_1, y = cnt), show.legend = FALSE, color = "steelblue") +
labs(title = " Рис.2 Распределение количества вакансий по месяцам и соответствующая месяцу медианная ЗП, 2024", x = "", y = "Количество вакансий") +
scale_y_continuous(labels = scales::comma) +
scale_x_continuous(breaks = 1:12, labels = c("Янв", "Фев", "Мар","Апр", "Май", "Июн","Июл", "Авг", "Сен","Окт", "Ноя", "Дек")) +
geom_label(aes(x = month_1, y = cnt, label = paste0(round(wage/1000,3), "K RUB")),
size = 3, vjust = -0.5, fill = "white", color = "black") +
theme_minimal() +
theme(
axis.text.y = element_text(size = 12),
axis.text.x = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0),
plot.title.position = "plot"
)
g9
rm(days_count, months_count, weeks_count, g9)
Промежуточный вывод: Из Рис.2 видно, что график имеет волно-образную форму, количество поэтапно растёт и снижается, с верхними пиками в Феврале, Апреле, Октябре и нижними пиками в Январе, Июне, Сентябре, Декабре. Наименьшее число вакансий публикуется в Декабре, что вероятно связано с окончанием года и новогодними праздниками. Стоимость труда неравномерно возрастает, визуально не зависмимо от спроса.
Посмотрим на общий уровень заработной платы по функции “Управление недвижимостью”
#average_regions_accounting = real_estate %>% group_by(Регион) %>% summarise(`Средняя зарплата в регионе` = mean(`Итоговая зарплата`))
#average_regions_accounting = average_regions_accounting %>% arrange(average_regions_accounting$`Средняя зарплата в регионе`)
#average_regions_accounting %>% slice_min(average_regions_accounting$`Средняя зарплата в регионе`, prop = 0.1)
#Точечно проверим верность результатов
#acc_altay = real_estate %>% filter(real_estate$Регион == "Алтайский край")
#median(acc_altay$`Итоговая зарплата`)
#acc_ivanov = real_estate %>% filter(real_estate$Регион == "Ивановская область")
#median(acc_ivanov$`Итоговая зарплата`)
#acc_kostrom = real_estate %>% filter(real_estate$Регион == "Костромская область")
#median(acc_kostrom$`Итоговая зарплата`)
#rm(acc_altay, acc_ivanov, acc_kostrom)
#g3 = ggplot(real_estate, aes(x=`Итоговая зарплата`)) +
# geom_histogram(aes(y=..density..),
# binwidth=.5,
# colour="black", fill="white") +
# geom_density(alpha=.2, fill="#FF6666")
#g3
#rm(g3)
# Вычисляем показатели
mean_val = mean(real_estate$`Итоговая зарплата`, na.rm = TRUE)
median_val = median(real_estate$`Итоговая зарплата`, na.rm = TRUE)
q1 = quantile(real_estate$`Итоговая зарплата`, 0.25, na.rm = TRUE)
q3 = quantile(real_estate$`Итоговая зарплата`, 0.75, na.rm = TRUE)
# Вычисляем плотность для определения максимального значения по y
dens = density(real_estate$`Итоговая зарплата`, na.rm = TRUE)
ymax = max(dens$y)
g4 = ggplot(real_estate, aes(x = `Итоговая зарплата`)) +
geom_density() +
geom_vline(xintercept = mean_val, color = "red4", linetype = "dashed", size = 1) +
geom_vline(xintercept = median_val, color = "navy", linetype = "dashed", size = 1) +
geom_vline(xintercept = q1, color = "forestgreen", linetype = "dashed", size = 1) +
geom_vline(xintercept = q3, color = "forestgreen", linetype = "dashed", size = 1) +
annotate("text", x = mean_val, y = ymax * 0.2,
label = paste("Среднее:", round(mean_val)),
color = "red4", angle = 90, vjust = -0.5, size = 4.5) +
annotate("text", x = median_val, y = ymax * 0.2,
label = paste("Медиана:", round(median_val)),
color = "navy", angle = 90, vjust = -0.5, size = 4.5) +
annotate("text", x = q1, y = ymax * 0.2,
label = paste("1-й квартиль:", round(q1)),
color = "forestgreen", angle = 90, vjust = -0.5, size = 4.5) +
annotate("text", x = q3, y = ymax * 0.2,
label = paste("3-й квартиль:", round(q3)),
color = "forestgreen", angle = 90, vjust = -0.5, size = 4.5) +
labs(title = "Рис.3 Плотность распределения ЗП по функции: Управление недвижимостью",
x = "Итоговая зарплата", y = "Плотность") +
scale_y_continuous(labels = NULL, breaks = NULL) +
theme_minimal() +
scale_x_continuous(labels = function(x) format(x, scientific = FALSE)) +
theme(
axis.text.y = element_text(size = 12),
axis.text.x = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0),
plot.title.position = "plot"
)
g4
rm(g4)
Промежуточный вывод: Данный график показывает, что первые 50% зарплат по функции “Управление недвижимостью” распределены примерно от уровня МРОТ до 98 000 рублей, последующие 25% распределены от 98 000 до 144 000 рублей, а оставшиеся 25% от ~ 144 000 до 600 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “Управление недвижимостью” по всем регионам = 121 689 Руб. На графике хорошо видны свойства медианы, значение которой равно 97 701 Руб., она не восприимчива к выбросам и в отличии от среднего не завысит/занизит нам результаты. Поэтому для рссмотрения зарплат в рамках регионов будем использовать Медиану.
Взглянем на распределение заработных плат по регионам
# Отфильтруем регионы с недостатком данных:
real_estate = real_estate %>% filter(!real_estate$Регион %in% regions_count_min$Регион)
set.seed(88)
palette = sample(c("thistle2", "peachpuff2", "lightblue2", "darkseagreen2"), size = 79, replace = TRUE)
df_medians = real_estate %>%
group_by(Регион) %>%
summarize(med = median(`Итоговая зарплата`, na.rm = TRUE)/1000)
df_medians$med = round(df_medians$med)
df_medians_new = df_medians %>% left_join(regions_count)
g5 = ggplot(real_estate, aes(x = `Итоговая зарплата`, y = reorder(Регион, `Итоговая зарплата`, FUN = median), fill = Регион)) +
labs(title = "Рис.4 Распределение зп по функции: Управление недвижимостью",
x = "Итоговая зарплата", y = "Плотность") +
geom_boxplot(show.legend = FALSE) +
theme_minimal() +
scale_fill_manual(values = palette) +
geom_text(
data = df_medians,
aes(x = med, y = Регион, label = paste(format(med, scientific = FALSE), "т. RUB")),
vjust = 0.5,
hjust = 1,
color = "black",
size = 3.5,
fontface = "bold"
) +
scale_x_continuous(labels = function(x) format(x, scientific = FALSE)) +
theme(
axis.text.y = element_text(size = 12),
axis.text.x = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0),
plot.title.position = "plot"
)
g5
#rm(g5)
Промежуточный вывод: Из графика видно, что в рамках региона разброс зарплат в целом не большой, однако с ростом медианной зарплаты разброс увеличивается. Наибольшие зарплаты принадлежат в основном регионам Южного ФО, Москве и Калининградской области.
#rm(palette, df_medians)
median_regions_accounting = real_estate %>% group_by(Регион) %>% summarise(`Медианная зарплата в регионе` = median(`Итоговая зарплата`))
median_regions_accounting = median_regions_accounting %>% arrange(median_regions_accounting$`Медианная зарплата в регионе`)
#median_regions_accounting %>% slice_min(median_regions_accounting$`Медианная зарплата в регионе`, prop = 0.2)
medians = median_regions_accounting %>% slice_min(median_regions_accounting$`Медианная зарплата в регионе`, prop = 0.2)
medians = medians[,1]
acc_boxplot = real_estate %>% filter(real_estate$Регион %in% medians$Регион | (real_estate$Регион == "Санкт-Петербург"| real_estate$Регион == "Москва"))
df_medians = acc_boxplot %>%
group_by(Регион) %>%
summarize(med = median(`Итоговая зарплата`, na.rm = TRUE)/1000)
Рассмотрим подробней регионы с наименьшей медианной зарплатой (нижние 20%) и сравним их с Москвой и Санкт-Петербургом:
# Определяем порядок уровней (если требуется)
acc_boxplot$Регион = factor(acc_boxplot$Регион, levels = levels(reorder(acc_boxplot$Регион, acc_boxplot$`Итоговая зарплата`, FUN = median)))
# Создаем именованный вектор цветов
region_colors = c(
"Пензенская область" = "thistle2",
"Удмуртская Республика" = "darkseagreen2",
"Томская область" = "thistle2",
"Ставропольский край" = "peachpuff2",
"Липецкаяй область" = "thistle2",
"Чувашская Республика" = "darkseagreen2",
"Пермский край" = "peachpuff2",
"Владимирская область" = "lightblue2",
"Белгородская область" = "darkseagreen2",
"Вологодская область" = "thistle2",
"Санкт-Петербург" = "lightblue2",
"Москва" = "lightblue2"
)
g6 = ggplot(acc_boxplot, aes(x = `Итоговая зарплата`, y = Регион, fill = Регион)) +
labs(title = "Рис.5 Распределение зп по функции: Управление недвижимостью",
x = "Итоговая зарплата", y = "Регион") +
geom_boxplot(show.legend = FALSE) +
theme_minimal() +
scale_fill_manual(values = region_colors) +
geom_text(
data = df_medians,
aes(x = med, y = Регион, label = paste(round(med), "т. RUB")),
vjust = 0.5,
hjust = 0.8,
color = "black",
size = 3.5,
fontface = "bold"
) +
scale_x_continuous(labels = function(x) format(x, scientific = FALSE)) +
theme(
axis.text.y = element_text(size = 12),
axis.text.x = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 16, hjust = 0),
plot.title.position = "plot"
)
g6
Промежуточный вывод: Наименьшие зарплаты принадлежат
регионам: Удмуртская Республика, Пензенская область, Владимирская
область, Белгородская область, Вологодская область, Чувашская
Республика, Ставропольский край, Пермский край, Томская область. Разброс
зарплат по функции “Управление недвижимостью” в большинстве из них не
превышает 30 000 руб, тогда как в Санкт-Петербурге и Москве разброс
достигает 70 000 руб.
#rm(df_medians, acc_boxplot)
rm(g6, medians)
По итогу данного исследования можно сделать следующие выводы:
Вакансии по функции “Управление недвижимостью” публикуются неравномерно в течение года. Большего всего вакансий публикуется в Феврале, Апреле и в Октябре. Меньше всего публикуется в Декабре. Стоимость труда неравномерно возрастает, визуально практически не зависмимо от спроса.
Первые 50% зарплат по функции “Управление недвижимостью” распределены от уровня МРОТ до 98 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “Управление недвижимостью” по всем регионам = 121 689 Руб Медианная заработная плата = 97 701 Руб.
В рамках региона разброс зарплат в целом относительно не большой и с ростом медианной зарплаты разброс увеличивается. Наибольшие зарплаты принадлежат в основном регионам Южного ФО, Москве и Калининградской области. По этой причине рекомендуется исключить данные регионы из рассмотрения
Наименьшие зарплаты принадлежат регионам: Удмуртская Республика, Пензенская область, Владимирская область, Белгородская область, Вологодская область, Чувашская Республика, Ставропольский край, Пермский край, Томская область