Данный отчет состоит из 5 секций:

  1. Обработка данных
  2. Анализ динамики спроса на труд в течение года
  3. Общий анализ плотности распределения уровня заработных плат
  4. Детальный анализ плотности распределения уровня заработных плат по регионам
  5. Выводы

Код может быть раскрыт при нажатии кнопки “Show”

1. Обработка данных

  1. Данные о вакансиях и их описании были собраны с сервиса баз данных hh.ru “Люди в цифрах” поэтапно для каждого ФО (в силу ограничения объёмов выгрузки)
  2. После приведения всех таблиц к общему виду и объединения, суммарное количество наблюдений составило 442 883
  3. Для очистки данных от нерелевантных вакансий были отобраны только наблюдения в названия вакансий которых входили следующие структуры: “Бухгалтер”, “бухгалтер”, “Бухучет”, “бухучет”,“Бухучёт”, “бухучёт”, “БУХГАЛТЕР”, “Экономист”, “экономист”, “Налог”, “налог”, “Казначей”, “казначей”, “Accountant”, “accountant”, “Accounting”, “accounting”, “Tax”, “tax”, “Budgeting”, “budgeting”, “Economist”, “economist”, “Treasury”, “treasury”. Также далее были отфильтрованы оставшиеся не относящиеся к функции вакансии. В результате данного действия количество наблюдений в датасете составило 406 537
  4. В изначальных данных представлен разброс заработных плат “от” и “до” для каждой из вакансий

Итоговая ЗП по вакансии была получена по следующему принципу:

"Зарплата от" указана и "Зарплата до" не указана ~ Итоговая зарплата = "Зарплата от"
"Зарплата от" не указана и "Зарплата до" указана ~ Итоговая зарплата = "Зарплата до"
"Зарплата от" указана и "Зарплата до" указана ~ Итоговая зарплата = среднее значение между зарплатой "от" и "до"
"Зарплата от" не указана и "Зарплата до" не указана ~ Данные не учтены в исследовании

В результате данного действия количество наблюдений в датасете составило 338 843

  1. Все представленные в данных валюты были переведены в рубли в соответствии с курсом на момент 28.02.2025:

Курс на момент 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

В результате данного действия количество наблюдений в датасете составило **338 840*

  1. Итоговая зарплата была переведена в Гросс, в зависсимости от указания о том была ли ЗП выдана “на руки” или “до вычета НДФЛ”

  2. Оставим только “живые” вакансии 2024 или 2025 года последней публикации. В результате данного действия количество наблюдений в датасете составило 327 595

  3. Отфильтруем внутрирегиональные выбросы с помошью Метода межквартильного размаха (IQR). В результате данного действия количество наблюдений в датасете составило 309 413

  4. Отфильтруем оставшиеся значения, которые ниже МРОТ для каждого из регионов. В результате данного действия количество наблюдений в датасете составило 308 100

  5. Для рассмотрения в разрезе Регионов (смотр. пункт 4) данные были исследованы на предмет распределения вакансий по Регионам. Из Рис.1 следует, что в некоторых регионах было опубликовано недостаточное количество вакансий, что делает невозможным ссылаться на них при формулировке выводов о каждом конкретном Регионе. В связи с этим для исследования по 4 пункту данные были обрезаны по условию: Не менее 50 вакансий на Регион. В результате данного действия были отфильтрованы данные по 3 регионам и итоговое количество наблюдений в датасете составило 308 072

library(dplyr)
library(stringr)
library(ggplot2)
library(readr)
library(scales)
library(plotly)
library(lubridate)

#Скачиваем данные по заработным платам по функциональному направлению "Бухгалтер". Данные разделены по ФО и регионам
centr_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/centralny_FO_accountant_27_01_2025.csv")
dalnev_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/dalnevostochny_FO_accountant_27_01_2025.csv")
juzhny_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/juzhny_SKFO_accountant_27_01_2025.csv")
msc_acc_1 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/moscow_accountant_01_07_2024.csv")
msc_acc_2 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/moscow_accountant_27_01_2025.csv")
mscobl_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/moscow_obl_accountant_27_01_2025.csv")
privolzhsk_acc_1 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/privolzhsk_accountant_01_07_2024.csv")
privolzhsk_acc_2 = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/privolzhsk_accountant_27_01_2025.csv")
sibir_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/sibirsky_FO_accountant_27_01_2025.csv")
spb_lo_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/SPB_LO_accountant_27_01_2025.csv")
uralsk_acc = read_csv("~/Desktop/SSC/Исследование_ЗП_2025/Accountants/Acc_csv/uralsky_FO_accountant_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$Регион)


#Склеим всё в один большой датасет
accounting = rbind(centr_acc, dalnev_acc, juzhny_acc, msc_acc_1, msc_acc_2, 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$Регион)

#Избавимся от возможных дупликатов одних и тех же данных
#accounting$`Страница вакансии на HeadHunter` %>% unique() %>% length()

#Проверим количество регионов
#accounting$Регион %>% unique() %>% length()

accounting = accounting %>% distinct()


rm(centr_acc, dalnev_acc, juzhny_acc, msc_acc, msc_acc_1, msc_acc_2, mscobl_acc, privolzhsk_acc, privolzhsk_acc_1, privolzhsk_acc_2, sibir_acc, spb_lo_acc, uralsk_acc)

#Отбираем ценные для нас колонки
accounting = accounting[c("Регион","Город","Название вакансии","Страница вакансии на HeadHunter", "Специализации вакансии","Дата создания","Дата последней публикации","Дата архивации","Зарплата от","Зарплата до","Валюта зарплаты","Зарплата указана")]

#Посмотрим не попали ли к нам не относящиеся к исследованию вакансии
#accounting$`Специализации вакансии` %>% unique()
#accounting %>% filter(accounting$`Специализации вакансии` == "Швея, портной, закройщик")
#accounting %>% filter(accounting$`Специализации вакансии` == "Врач")
#accounting %>% filter(accounting$`Специализации вакансии` == "Охранник")
#accounting %>% filter(accounting$`Специализации вакансии` == "Парикмахер")
#accounting %>% filter(accounting$`Специализации вакансии` == "Режиссер, сценарист")
#accounting %>% filter(accounting$`Специализации вакансии` == "Токарь, фрезеровщик, шлифовщик")



#Очистим данные от лишних строк
accounting = accounting %>% filter(str_detect(accounting$`Название вакансии`, "Бухгалтер|бухгалтер|Бухучет|бухучет|Бухучёт|бухучёт|БУХГАЛТЕР|Экономист|экономист|Налог|налог|Казначей|казначей|Accountant|accountant|Accounting|accounting|Tax|tax|Budgeting|budgeting|Economist|economist|Treasury|treasury"))

accounting = accounting %>% filter(!str_detect(accounting$`Название вакансии`, "ЮРИСТ|Юрист|юрист|LAWYER|Lawyer|lawyer|разраб|Разраб|РАЗРАБ|Администратор|администратор|АДМИНИСТРАТОР|ТОВАР|Товар|товар"))


regions_count = accounting %>%
  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)
#Посчитаем среднюю заработную плату по вилке "От" и "До"
accounting = accounting %>% mutate(`Итоговая зарплата` = case_when((accounting$`Зарплата от` == "не указана" & accounting$`Зарплата до` == "не указана" ) ~ "0", (accounting$`Зарплата от` == "не указана" & accounting$`Зарплата до` != "не указана") ~ accounting$`Зарплата до`, (accounting$`Зарплата до` == "не указана" & accounting$`Зарплата от` != "не указана") ~ accounting$`Зарплата от`, (accounting$`Зарплата до` != "не указана" & accounting$`Зарплата от` != "не указана") ~ "1.01"))

#accounting %>% filter(accounting$`Итоговая зарплата` == 0) %>% count()

accounting$`Итоговая зарплата` = as.numeric(accounting$`Итоговая зарплата`)
accounting$`Зарплата от` = as.numeric(accounting$`Зарплата от`)
accounting$`Зарплата до` = as.numeric(accounting$`Зарплата до`)

accounting$`Итоговая зарплата` = if_else(accounting$`Итоговая зарплата` == 1.01, rowMeans(accounting[9:10]), accounting$`Итоговая зарплата`)

#accounting %>% filter(accounting$`Итоговая зарплата` == 0) %>% count()

#Количество нулей не изменилось с предыдущего шага, можем избавиться от всех нулевых значений
accounting = accounting %>% filter(`Итоговая зарплата` != 0)
#
#accounting$`Валюта зарплаты` %>% unique()
#accounting %>% filter(accounting$`Валюта зарплаты` == "KZT")



#1)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "EUR",accounting$`Итоговая зарплата`*92.04 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "KZT",accounting$`Итоговая зарплата`*0.17 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "BYR",accounting$`Итоговая зарплата`*0 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "USD",accounting$`Итоговая зарплата`*87.70 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "UZS",accounting$`Итоговая зарплата`*0.01 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "UAH",accounting$`Итоговая зарплата`*2.11 ,accounting$`Итоговая зарплата`)
accounting$`Итоговая зарплата` = if_else(accounting$`Валюта зарплаты` == "GEL",accounting$`Итоговая зарплата`*31.16 ,accounting$`Итоговая зарплата`)


#Количество нулей не изменилось с предыдущего шага, можем избавиться от всех нулевых значений
accounting = accounting %>% filter(`Итоговая зарплата` != 0)

#2)
accounting$`Итоговая зарплата` = if_else(accounting$`Зарплата указана` == "на руки", accounting$`Итоговая зарплата`/87*100, accounting$`Итоговая зарплата`)

g2 = ggplot(data = accounting) + 
  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)

2. Общая динамика спроса на труд

Посмотрим на динамику спроса на труд (по дате последней публикации) в течение года. На Рис.2 представлен график изображающий изменение количества вакансий по месяцам 2024 года. На графике также подписана средняя заработная плата, соответствующая каждому месяцу. Данный грaфик показывает отношение спроса на труд и его стоимости

accounting$`Дата создания` = dmy(accounting$`Дата создания`)
accounting$`Дата последней публикации` = dmy(accounting$`Дата последней публикации`)
accounting$`Дата архивации` = dmy(accounting$`Дата архивации`)

#sum(if_else(year(accounting$`Дата последней публикации`) == 2024|year(accounting$`Дата последней публикации`) == 2025, FALSE, TRUE))

accounting$`Год последней публикации` = year(accounting$`Дата последней публикации`)
accounting = accounting %>% filter(accounting$`Год последней публикации`== 2024 | accounting$`Год последней публикации`== 2025)

days_count = accounting %>% 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)



accounting$`Итоговая зарплата` = round(accounting$`Итоговая зарплата`)
accounting = accounting %>%
  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)



accounting = accounting %>% left_join(mrot)
accounting = accounting %>% 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 = accounting %>% 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 раза превышает декабрьское. После достижения пикового значения число вакансий начинает уменьшаться, пока не достигает своего минимума. Стоимость труда возрастает с каждым месяцем, визуально не зависмимо от спроса.

3. Плотность распределения заработных плат

Посмотрим на общий уровень заработной платы по функции “Бухгалтер”

average_regions_accounting = accounting %>% 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 = accounting %>% filter(accounting$Регион == "Алтайский край")
#median(acc_altay$`Итоговая зарплата`)

acc_ivanov = accounting %>% filter(accounting$Регион == "Ивановская область")
#median(acc_ivanov$`Итоговая зарплата`)

acc_kostrom = accounting %>% filter(accounting$Регион == "Костромская область")
#median(acc_kostrom$`Итоговая зарплата`)

rm(acc_altay, acc_ivanov, acc_kostrom)

g3 = ggplot(accounting, 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(accounting$`Итоговая зарплата`, na.rm = TRUE)
median_val = median(accounting$`Итоговая зарплата`, na.rm = TRUE)
q1         = quantile(accounting$`Итоговая зарплата`, 0.25, na.rm = TRUE)
q3         = quantile(accounting$`Итоговая зарплата`, 0.75, na.rm = TRUE)

# Вычисляем плотность для определения максимального значения по y
dens = density(accounting$`Итоговая зарплата`, na.rm = TRUE)
ymax = max(dens$y)

g4 <- ggplot(accounting, 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() +
  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% зарплат по функции “Бухгалтер” распределены от уровня МРОТ до 70 000 рублей, последующие 25% распределены от 70 000 до 92 000 рублей, а оставшиеся 25% от 90 000 до 250 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “Бухгалтер” по всем регионам = 74 950 Руб. Регулярные пики могут быть обусловлены склонностью людей к размещению вакансий с целочисленными, “круглыми” зарплатами. Также на графике хорошо видны свойства медианы, значение которой равно 68 966 Руб., она не восприимчива к выбросам и в отличии от среднего не завысит/занизит нам результаты. Поэтому для рссмотрения зарплат в рамках регионов будем использовать Медиану.

4. Детальный анализ плотности распределения уровня заработных плат по регионам

Взглянем на распределение заработных плат по регионам

#Отфильтруем регионы с недостатком данных:
accounting = accounting %>% filter(!accounting$Регион %in% regions_count_min$Регион) 

set.seed(88) 
palette = sample( c("thistle2", "peachpuff2", "lightblue2", "darkseagreen2"), size = 84, replace = TRUE )

df_medians = accounting %>%
  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_accountants.xls")

g5 = ggplot(accounting, 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(round(med),"т. RUB")),
    vjust = 0.5,
    hjust = 0.8,
    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)
#rm(palette, df_medians)
median_regions_accounting = accounting %>% 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]

acc_boxplot = accounting %>% filter(accounting$Регион %in% medians$Регион | (accounting$Регион == "Санкт-Петербург"| accounting$Регион == "Москва"))

df_medians = acc_boxplot %>%
  group_by(Регион) %>%
  summarize(med = median(`Итоговая зарплата`, na.rm = TRUE)/1000)

Рассмотрим подробней регионы с наименьшей медианной зарплатой (нижние 10%) и сравним их с Москвой и Санкт-Петербургом:

g6 = ggplot(acc_boxplot, aes(x = `Итоговая зарплата` , y = reorder(Регион,`Итоговая зарплата`, FUN = median), fill = Регион)) +
  labs(title = "Рис.5 Распределение зп по функции: Бухгалтер", x = "Итоговая зарплата", y = "Регион") +
  geom_boxplot(show.legend = FALSE) + theme_minimal() + scale_fill_manual(values = c("thistle2", "thistle2", "peachpuff2", "lightblue2", "darkseagreen2","peachpuff2", "lightblue2", "darkseagreen2", "peachpuff2", "lightblue2")) +
  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

Промежуточный вывод: Наименьшие зарплаты принадлежат в основном регионам: Республика Калмыкия, Астраханская область, Кабардино-Балкарская республика, Оренбургская область, Республика Марий Эл, Тамбовская область, Чеченская республика, Республика Мордовия. Разброс зарплат по функции “Бухгалтер” в большинстве из них не превышает 20 000 руб, тогда как в Санкт-Петербурге и Москве разброс достигает 30 000 руб.

#rm(df_medians, acc_boxplot)
rm(g6, medians)

5. Выводы

По итогу данного исследования можно сделать следующие выводы:

  1. Вакансии по функции “Бухгалтер” публикуются неравномерно в течение года. Большего всего вакансий публикуется в Июле. Меньше всего публикуется в Декабре и Январе. Стоимость труда неравномерно возрастает, визуально практически не зависмимо от спроса.

  2. Первые 50% зарплат по функции “Бухгалтер” распределены от уровня МРОТ до 70 000 рублей. После пика в 1ом квартиле плотность распределения убывает с ростом уровня зарплат. Средняя заработная плата для функции “Бухгалтер” по всем регионам = 74 950 Руб. Медианная заработная плата = 68 966 Руб.

  3. В рамках региона разброс зарплат в целом не большой, однако с ростом медианной зарплаты разброс также увеличивается. Наибольшие зарплаты принадлежат в основном Москве, Санкт-Петербургу и регионам Дальневосточного ФО. По этой причине рекомендуется исключить данные регионы из рассмотрения

  4. Наименьшие зарплаты принадлежат регионам: Республика Калмыкия, Астраханская область, Кабардино-Балкарская республика, Оренбургская область, Республика Марий Эл, Тамбовская область, Чеченская республика, Республика Мордовия