Данный отчет состоит из 5 секций:
Код может быть раскрыт при нажатии кнопки “Show”
Итоговая ЗП по вакансии была получена по следующему принципу:
"Зарплата от" указана и "Зарплата до" не указана ~ Итоговая зарплата = "Зарплата от"
"Зарплата от" не указана и "Зарплата до" указана ~ Итоговая зарплата = "Зарплата до"
"Зарплата от" указана и "Зарплата до" указана ~ Итоговая зарплата = среднее значение между зарплатой "от" и "до"
"Зарплата от" не указана и "Зарплата до" не указана ~ Данные не учтены в исследовании
В результате данного действия количество наблюдений в датасете составило 136 242
Курс на момент 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
В результате данного действия количество наблюдений в датасете составило 136 242
Итоговая зарплата была переведена в Гросс, в зависсимости от указания о том была ли ЗП выдана “на руки” или “до вычета НДФЛ”
Оставим только “живые” вакансии 2024 или 2025 года последней публикации. В результате данного действия количество наблюдений в датасете составило 131 715
Отфильтруем внутрирегиональные выбросы с помошью Метода межквартильного размаха (IQR). В результате данного действия количество наблюдений в датасете составило 124 496
Отфильтруем оставшиеся значения, которые ниже МРОТ для каждого из регионов. В результате данного действия количество наблюдений в датасете составило 123 881
Для рассмотрения в разрезе Регионов (смотр. пункт 4) данные были исследованы на предмет распределения вакансий по Регионам. Из Рис.1 следует, что в некоторых регионах было опубликовано недостаточное количество вакансий, что делает невозможным ссылаться на них при формулировке выводов о каждом конкретном Регионе. В связи с этим для исследования по 4 пункту данные были обрезаны по условию: Не менее 50 вакансий на Регион. В результате данного действия были отфильтрованы данные по 5 регионам и итоговое количество наблюдений в датасете составило 123 809
library(dplyr)
library(stringr)
library(ggplot2)
library(readr)
library(scales)
library(plotly)
library(lubridate)
#Скачиваем данные по заработным платам по функциональному направлению "HR менеджер". Данные разделены по ФО и регионам
centr_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/centralny_FO_hr_27_01_2025.csv")
dalnev_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/dalnevostochny_FO_hr_27_01_2025.csv")
juzhny_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/juzhny_SKFO_hr_27_01_2025.csv")
msc_acc_1 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/moscow_hr_01_06_2024.csv")
msc_acc_2 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/moscow_hr_01_10_2024.csv")
msc_acc_3 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/moscow_hr_27_01_2025.csv")
mscobl_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/moscow_obl_hr_27_01_2025.csv")
privolzhsk_acc_1 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/privolzhsk_hr_01_07_2024.csv")
privolzhsk_acc_2 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/privolzhsk_hr_27_01_2025.csv")
sibir_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/sibirsky_FO_hr_27_01_2025.csv")
spb_lo_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/SPB_LO_hr_27_01_2025.csv")
uralsk_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/HRs/csv/uralsky_FO_hr_27_01_2025.csv")
#Переименуем регионы г.Санкт-Петербург и г.Москва
spb_lo_acc$Регион = if_else(spb_lo_acc$Город == "Санкт-Петербург","Санкт-Петербург", spb_lo_acc$Регион)
msc_acc_1$Регион = if_else(msc_acc_1$Город == "Москва","Москва", msc_acc_1$Регион)
msc_acc_2$Регион = if_else(msc_acc_2$Город == "Москва","Москва", msc_acc_2$Регион)
msc_acc_3$Регион = if_else(msc_acc_3$Город == "Москва","Москва", msc_acc_3$Регион)
#Склеим всё в один большой датасет
hr = rbind(centr_acc, dalnev_acc, juzhny_acc, msc_acc_1, msc_acc_2, msc_acc_3, mscobl_acc, privolzhsk_acc_1, privolzhsk_acc_2, sibir_acc, spb_lo_acc, uralsk_acc)
mrot = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/МРОТ.csv")
mrot = na.omit(mrot)
mrot$Регион = str_squish(mrot$Регион)
#Избавимся от возможных дупликатов одних и тех же данных
#hr$`Страница вакансии на HeadHunter` %>% unique() %>% length()
#Проверим количество регионов
#hr$Регион %>% unique() %>% length()
hr = hr %>% distinct()
rm(centr_acc, dalnev_acc, juzhny_acc, msc_acc_1, msc_acc_2, msc_acc_3, mscobl_acc, privolzhsk_acc_1, privolzhsk_acc_2, sibir_acc, spb_lo_acc, uralsk_acc)
#Отбираем ценные для нас колонки
hr = hr[c("Регион","Город","Название вакансии","Страница вакансии на HeadHunter", "Специализации вакансии","Дата создания","Дата последней публикации","Дата архивации","Зарплата от","Зарплата до","Валюта зарплаты","Зарплата указана")]
#Посмотрим не попали ли к нам не относящиеся к исследованию вакансии
#hr$`Специализации вакансии` %>% unique()
#hr %>% filter(hr$`Специализации вакансии` == "Автослесарь, автомеханик")
#hr %>% filter(hr$`Специализации вакансии` == "Арт-директор, креативный директор")
#hr %>% filter(hr$`Специализации вакансии` == "Хостес")
#hr %>% filter(hr$`Специализации вакансии` == "Машинист")
#hr %>% filter(hr$`Специализации вакансии` == "Механик")
#hr %>% filter(hr$`Специализации вакансии` == "Врач)
#Очистим данные от лишних строк
hr = hr %>% filter(str_detect(hr$`Название вакансии`, "HR|hr|HUMAN RESOURCES|Human resources|human resources|Рекрут|РЕКРУТ|рекрут|Кадров|КАДРОВ|кадров|Персонал|ПЕРСОНАЛ|персонал|КАДР|Кадр|кадр|Компенс|КОМПЕНС|компенс|ЛЬГОТ|Льгот|льгот|Соцобеспечение|соцобеспечение|СОЦОБЕСПЕЧЕНИЕ|Человеческие ресурсы|ЧЕЛОВЕЧЕСКИЕ РЕСУРСЫ|человеческие ресурсы|Recruit|recruit|RECRUIT|Payroll|payroll|PAYROLL|Benefits|benefits|BENEFITS|Compensat|compensat|COMPENSAT|C&B|c&b|C and B|c and b"))
hr = hr %>% filter(!str_detect(hr$`Название вакансии`, "ФАРМАЦЕВТ|Фармацевт|фармацевт|Фельдшер|ФЕЛЬДШЕР|фельдшер|ФИНАНС|Финанс|финанс|Фитнес|фитнес|ФИТНЕС|ЮРИС|Юрис|юрис"))
#hr_1 = hr %>% anti_join(hr_1)
regions_count = hr %>%
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 Количество вакансий функции HR-менеджер по регионам",
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)
#Посчитаем среднюю заработную плату по вилке "От" и "До"
hr = hr %>% mutate(`Итоговая зарплата` = case_when((hr$`Зарплата от` == "не указана" & hr$`Зарплата до` == "не указана" ) ~ "0", (hr$`Зарплата от` == "не указана" & hr$`Зарплата до` != "не указана") ~ hr$`Зарплата до`, (hr$`Зарплата до` == "не указана" & hr$`Зарплата от` != "не указана") ~ hr$`Зарплата от`, (hr$`Зарплата до` != "не указана" & hr$`Зарплата от` != "не указана") ~ "1.01"))
#hr %>% filter(hr$`Итоговая зарплата` == 0) %>% count()
hr$`Итоговая зарплата` = as.numeric(hr$`Итоговая зарплата`)
hr$`Зарплата от` = as.numeric(hr$`Зарплата от`)
hr$`Зарплата до` = as.numeric(hr$`Зарплата до`)
hr$`Итоговая зарплата` = if_else(hr$`Итоговая зарплата` == 1.01, rowMeans(hr[9:10]), hr$`Итоговая зарплата`)
#hr %>% filter(hr$`Итоговая зарплата` == 0) %>% count()
#Количество нулей не изменилось с предыдущего шага, можем избавиться от всех нулевых значений
hr = hr %>% filter(`Итоговая зарплата` != 0)
#
#hr$`Валюта зарплаты` %>% unique()
#hr %>% filter(hr$`Валюта зарплаты` == "KZT")
#1)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "EUR",hr$`Итоговая зарплата`*92.04 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "KZT",hr$`Итоговая зарплата`*0.17 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "BYR",hr$`Итоговая зарплата`*0 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "USD",hr$`Итоговая зарплата`*87.70 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "UZS",hr$`Итоговая зарплата`*0.01 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "UAH",hr$`Итоговая зарплата`*2.11 ,hr$`Итоговая зарплата`)
hr$`Итоговая зарплата` = if_else(hr$`Валюта зарплаты` == "GEL",hr$`Итоговая зарплата`*31.16 ,hr$`Итоговая зарплата`)
hr = hr %>% filter(`Итоговая зарплата` != 0)
#2)
hr$`Итоговая зарплата` = if_else(hr$`Зарплата указана` == "на руки", hr$`Итоговая зарплата`/87*100, hr$`Итоговая зарплата`)
g2 = ggplot(data = hr) +
geom_point(aes(x = reorder(`Название вакансии`, `Итоговая зарплата`), y = `Итоговая зарплата`), alpha = 0.9, size = 1.5, color = "steelblue") +
labs(title = "Распределение зп по функции: HR-менеджер", x = "", y = "ЗП") +
scale_y_continuous(labels = label_number(scale = 1e0, suffix = "")) +
scale_x_discrete(labels = " ") +
theme_minimal()
#g2
rm(g2)
#quantile(hr$`Итоговая зарплата`, 0.1)
#hr = hr %>% filter(`Итоговая зарплата` >= quantile(hr$`Итоговая зарплата`, 0.1))
#quantile(hr$`Итоговая зарплата`, 0.9)
#hr = hr %>% filter(`Итоговая зарплата` <= quantile(hr$`Итоговая зарплата`, 0.9))
Посмотрим на динамику спроса на труд (по дате последней публикации) в течение года. На Рис.2 представлен график изображающий изменение количества вакансий по месяцам 2024 года. На графике также подписана средняя заработная плата, соответствующая каждому месяцу. Данный грaфик показывает отношение спроса на труд и его стоимости
hr$`Дата создания` = dmy(hr$`Дата создания`)
hr$`Дата последней публикации` = dmy(hr$`Дата последней публикации`)
hr$`Дата архивации` = dmy(hr$`Дата архивации`)
#sum(if_else(year(hr$`Дата последней публикации`) == 2024|year(hr$`Дата последней публикации`) == 2025, FALSE, TRUE))
hr$`Год последней публикации` = year(hr$`Дата последней публикации`)
hr = hr %>% filter(hr$`Год последней публикации`== 2024 | hr$`Год последней публикации`== 2025)
days_count = hr %>% 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)
hr$`Итоговая зарплата` = round(hr$`Итоговая зарплата`)
hr = hr %>%
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)
hr = hr %>% left_join(mrot)
hr = hr %>% 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 = hr %>% 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 видно, что график имеет куполо-образную форму, наименьшее число вакансий публикуется в январе и декабре, что вероятно связано с новогодними праздниками. После января их количество начинает расти, пока не достигает пика в Июле, когда количество вакансий больше чем в 2 раза превышает декабрьское. После достижения пикового значения число вакансий начинает уменьшаться, пока не достигает своего минимума. Стоимость труда неравномерно возрастает, визуально не зависмимо от спроса.
Посмотрим на общий уровень заработной платы по функции “HR менеджер”
average_regions_hr = hr %>% group_by(Регион) %>% summarise(`Средняя зарплата в регионе` = mean(`Итоговая зарплата`))
average_regions_hr = average_regions_hr %>% arrange(average_regions_hr$`Средняя зарплата в регионе`)
#average_regions_hr %>% slice_min(average_regions_hr$`Средняя зарплата в регионе`, prop = 0.1)
#Точечно проверим верность результатов
acc_altay = hr %>% filter(hr$Регион == "Алтайский край")
#median(acc_altay$`Итоговая зарплата`)
acc_ivanov = hr %>% filter(hr$Регион == "Ивановская область")
#median(acc_ivanov$`Итоговая зарплата`)
acc_kostrom = hr %>% filter(hr$Регион == "Костромская область")
#median(acc_kostrom$`Итоговая зарплата`)
rm(acc_altay, acc_ivanov, acc_kostrom)
g3 = ggplot(hr, 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(hr$`Итоговая зарплата`, na.rm = TRUE)
median_val = median(hr$`Итоговая зарплата`, na.rm = TRUE)
q1 = quantile(hr$`Итоговая зарплата`, 0.25, na.rm = TRUE)
q3 = quantile(hr$`Итоговая зарплата`, 0.75, na.rm = TRUE)
# Вычисляем плотность для определения максимального значения по y
dens = density(hr$`Итоговая зарплата`, na.rm = TRUE)
ymax = max(dens$y)
g4 = ggplot(hr, 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 Плотность распределения ЗП по функции: HR-менеджер",
x = "Итоговая зарплата", y = "Плотность") +
scale_y_continuous(labels = NULL, breaks = NULL) +
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"
)
g4
rm(g4)
Промежуточный вывод: Данный график показывает, что первые 50% зарплат по функции “HR-менеджер” распределены от уровня МРОТ до 70 000 рублей, последующие 25% распределены от ~ 70 000 до 92 000 рублей, а оставшиеся 25% от 92 000 до 225 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “HR-менеджер” по всем регионам = 78 496 Руб. Регулярные пики могут быть обусловлены склонностью людей к размещению вакансий с целочисленными, “круглыми” зарплатами. Также на графике хорошо видны свойства медианы, значение которой равно 70 000 Руб., она не восприимчива к выбросам и в отличии от среднего не завысит/занизит нам результаты. Поэтому для рссмотрения зарплат в рамках регионов будем использовать Медиану.
Взглянем на распределение заработных плат по регионам
#Отфильтруем регионы с недостатком данных:
hr = hr %>% filter(!hr$Регион %in% regions_count_min$Регион)
set.seed(88)
palette = sample( c("thistle2", "peachpuff2", "lightblue2", "darkseagreen2"), size = 79, replace = TRUE )
df_medians = hr %>%
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)
#WriteXLS("df_medians", ExcelFileName = "df_medians_HR.xls")
g5 = ggplot(hr, aes(x = `Итоговая зарплата` , y = reorder(Регион,`Итоговая зарплата`, FUN = median), fill = Регион)) +
labs(title = "Рис.4 Распределение зп по функции: HR-менеджер", 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(round(med),"т. RUB")),
vjust = 0.5,
hjust = 0.7,
color = "black",
size = 3.5,
fontface = "bold"
) +
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 = hr %>% 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.1)
medians = medians[,1]
hr_boxplot = hr %>% filter(hr$Регион %in% medians$Регион | (hr$Регион == "Санкт-Петербург"| hr$Регион == "Москва"))
df_medians = hr_boxplot %>%
group_by(Регион) %>%
summarize(med = median(`Итоговая зарплата`, na.rm = TRUE)/1000)
Рассмотрим подробней регионы с наименьшей медианной зарплатой (нижние 10%) и сравним их с Москвой и Санкт-Петербургом:
g6 = ggplot(hr_boxplot, aes(x = `Итоговая зарплата` , y = reorder(Регион,`Итоговая зарплата`, FUN = median), fill = Регион)) +
labs(title = "Рис.5 Распределение зп по функции: HR-менеджер", x = "Итоговая зарплата", y = "Регион") +
geom_boxplot(show.legend = FALSE) + theme_minimal() + scale_fill_manual(values = c("lightblue2", "thistle2","peachpuff2", "peachpuff2", "thistle2","darkseagreen2", "thistle2","lightblue2", "peachpuff2", "lightblue2", "thistle2", "darkseagreen2", "darkseagreen2")) +
geom_text(
data = df_medians,
aes(x = med, y = Регион, label = paste(round(med),"т. RUB")),
vjust = 0.5,
hjust = 0.7,
color = "black",
size = 3.5,
fontface = "bold"
) +
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
Промежуточный вывод: Наименьшие зарплаты принадлежат в
основном регионам: Кабардино-Балкарская республика, республика Калмыкия,
Республика Северная Осетия-Алания, Республика Мордовия, Тамбовская
область, Курская область, Оренбургская область, Орловская область.
Разброс зарплат по функции “HR-менеджер” в них не превышает ~ 20 000
руб, тогда как в Санкт-Петербурге и Москве разброс достигает > 30 000
руб.
#rm(df_medians, acc_boxplot)
rm(g6, medians)
По итогу данного исследования можно сделать следующие выводы:
Вакансии по функции “HR-менеджер” публикуются неравномерно в течение года. Большего всего вакансий публикуется в Июле. Меньше всего публикуется в Декабре. Стоимость труда неравномерно возрастает, визуально практически не зависмимо от спроса.
Первые 50% зарплат по функции “HR-менеджер” распределены от уровня МРОТ до 70 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “HR-менеджер” по всем регионам = 78 496 Руб. Медианная заработная плата = 70 000 Руб.
В рамках региона разброс зарплат в целом относительно небольшой, но с ростом медианной зарплаты разброс увеличивается. Наибольшие зарплаты принадлежат в основном Москве, Санкт-Петербургу и регионам Дальневосточного ФО. По этой причине рекомендуется исключить данные регионы из рассмотрения
Наименьшие зарплаты принадлежат регионам: Кабардино-Балкарская республика, республика Калмыкия, Республика Северная Осетия-Алания, Республика Мордовия, Тамбовская область, Курская область, Оренбургская область, Орловская область