Описательная статистика данных вакансий, резюме и уровня заработной платы по 6 регионам

В статье проводится процедура анализа выборок данных вакансий, резюме и уровня заработной платы по 6 регионам: Москва, Санкт-Петербург, Новосибирск, республика Татарстан, Калужская и Томская области с помощью описательной статистики.

Дмитрий Берг

Прочтёте за 19 мин.

Созрела необходимость провести статистический анализ данных, которые собираются и обновляются мною ежедневно с декабря 2014 года. Статистический анализ будет состоять из 2-х статей. Первая статья посвящена описательной статистике. Здесь разберём и определим тип данных, а так же такие базовые показатели как максимальные и минимальные значения выборок, медианы, квантили, дисперсии и стандартные отклонения. В следующей статье будут проведены статистические тесты с выборками. Данные представляют собой векторы чисел собранных с сайта hh.ru, собранные в файлах, в формате .csv. Каждое число отражает количество вакансий или резюме по какому-либо критерию. Обработка и визуализация будет производиться с помощью языка R. Цель данной статьи состоит в том, что бы определить с какого рода данными приходится работать, и какие методы обработки данных применимы. Кроме этого надеюсь не просто провести статистические расчёты, но провести интерпритацию результатов. Таким образом сделать ещё один шаг к пониманию природы рынка труда в интернете.

Данные доступны всем желающим в репозитории на GitHub.

Пару слов о самих данных, что я собираюсь обрабатывать и анализировать. После скачивания файлов из репозитория и первичной небольшой обработки в R загрузим 40 файлов в формате .csv, т.е. 40 таблиц. Затем с помощью элементарных команд создадим ещё дополнительно 47 таблиц (data frame) и 44 списка. Таким образом, путём перегруппирования колонок из исходных файлов, объединим данные в новые таблицы по новым признакам. Легко догадаться, что при таком объёме публиковать и визуализировать каждый результат страшно :fearful: не имеет смысла. В статье будет опубликовано только наиболее интересные на мой взгляд результаты.

Типы данных

Начнём с теории и выясним с каким типом данных имеем дело. В дальнейшем это позволит определить какие математические методы допустимы для статистического анализа.

Как я уже писал за каждой цифрой стоит конкретное резюме или вакансия, таким образом числа натуральные, промежуточные значения отсутствуют. Одно резюме или одна вакансия равняется единице, 0.5 или 0.7 резюме или вакансии быть не может. Данные располагаются от 0 до бесконечности, количество вакансий или резюме с отрицательным значением быть не может. Следовательно данные интервальные и дискретны. Исходя из этого данные относятся к непараметрической группе, к которым применяются соответствующие непараметрические математические тесты. Таким образом данные многомерные, натуральные, интервальные и дискретные, относятся к непараметрической группе.

В математике и статистике существуют 3 условия, при соблюдении каждого, данные можно отнести к параметрической группе. И если хоть одно из них не выполняется, данные считаются непараметрическими. Перечислю эти условия:

  • распределение данных близко к нормальному
  • выборка большая, более 30 наблюдений
  • данные - интервальные непрерывные

На самом деле данные, с которыми будем работать не подходят под параметрические по 2-м критериям. Отсутствие нормальности распределения увидим на графиках в следующей статье, сегодня мы сможем догадаться по косвенным признакам.

Сбор данных

Для начала скачаем данные и сформируем необходимые таблицы и списки.

# Этап 1. Собираем данные
# Скачаем данные с GitHub 
setwd("~/Рабочий стол")
system.time(d <- download.file( url = "https://github.com/Dmitryi/statistic/archive/master.zip", destfile = "statistic.zip"))
file.info("statistic.zip")
unzip(zipfile = "statistic.zip")
setwd("statistic-master")
list.files()

# Удалим не нужные файлы и папки
files.to.delete <- dir("~/Рабочий стол/statistic-master", pattern = ".*", recursive=F, full.names=T)
file.remove(files.to.delete)
unlink(c("css", "fonts", "img", "js"), recursive = T)

# Переходим в папку с данными
setwd("data")
list.files()

Далее нам необходимо выгрузить данные из файлов и сформировать data frame и листы. Код получился большой по объёму и для краткости приведу только по 3 примера для формирования каждого data frame. Полный код будет опубликован в репозитории на GitHub, ссылку на файл опубликую в следующей статье.

# Этап 2. Подготовим данные для вычислений
# Извлечём необходимые данные и создадим таблицы и списки по количеству вакансий/резюме и уровню заработной платы
# Количество и сумма вакансий/резюме по каждом региону отдельно
banki <- read.csv("databanki.csv", header=T, sep=",")[905:1346, 2:13]
buhgalter <- read.csv("databuh.csv", header=T, sep=",")[905:1346,2:13]
bulding <- read.csv("databulding.csv", header=T, sep=",")[905:1346,2:13]

# Обьедим данные в один data frame (таблицу)
data_vac_res <- (banki + buhgalter + bulding + consult + culture + admin + gos + house + hr + instal + it + logist + market + medicina + nauka + proizvotstvo + rab + sales + secure + sport + strahovanie + study + tek + top + turizm + urist + auto + zakupki)

# Списки (матрицы), для каждого региона отдельно, количество вакансий/резюме по всем отраслям
data_vac_moscow <- rbind(banki$Вакансии.Москва, buhgalter$Вакансии.Москва, bulding$Вакансии.Москва, consult$Вакансии.Москва, culture$Вакансии.Москва, admin$Вакансии.Москва, gos$Вакансии.Москва, house$Вакансии.Москва, hr$Вакансии.Москва, instal$Вакансии.Москва, it$Вакансии.Москва, logist$Вакансии.Москва, market$Вакансии.Москва, medicina$Вакансии.Москва, nauka$Вакансии.Москва, proizvotstvo$Вакансии.Москва, rab$Вакансии.Москва, sales$Вакансии.Москва, secure$Вакансии.Москва, sport$Вакансии.Москва, strahovanie$Вакансии.Москва, study$Вакансии.Москва, tek$Вакансии.Москва, top$Вакансии.Москва, turizm$Вакансии.Москва, urist$Вакансии.Москва, auto$Вакансии.Москва, zakupki$Вакансии.Москва)
rownames(data_vac_moscow) <- c("banki","buhgalter","bulding","consult","culture","admin","gos","house","hr","instal","it","logist","market","medicina", "nauka","proizvotstvo","rab","sales","secure","sport","strahovanie","study","tek","top","turizm","urist","auto","zakupki")
data_vac_spb <- rbind(banki$Вакансии.Санкт.Петербург, buhgalter$Вакансии.Санкт.Петербург, bulding$Вакансии.Санкт.Петербург, consult$Вакансии.Санкт.Петербург, culture$Вакансии.Санкт.Петербург, admin$Вакансии.Санкт.Петербург, gos$Вакансии.Санкт.Петербург, house$Вакансии.Санкт.Петербург, hr$Вакансии.Санкт.Петербург, instal$Вакансии.Санкт.Петербург, it$Вакансии.Санкт.Петербург, logist$Вакансии.Санкт.Петербург, market$Вакансии.Санкт.Петербург, medicina$Вакансии.Санкт.Петербург, nauka$Вакансии.Санкт.Петербург, proizvotstvo$Вакансии.Санкт.Петербург, rab$Вакансии.Санкт.Петербург, sales$Вакансии.Санкт.Петербург, secure$Вакансии.Санкт.Петербург, sport$Вакансии.Санкт.Петербург, strahovanie$Вакансии.Санкт.Петербург, study$Вакансии.Санкт.Петербург, tek$Вакансии.Санкт.Петербург, top$Вакансии.Санкт.Петербург, turizm$Вакансии.Санкт.Петербург, urist$Вакансии.Санкт.Петербург, auto$Вакансии.Санкт.Петербург, zakupki$Вакансии.Санкт.Петербург)
rownames(data_vac_spb) <- c("banki","buhgalter","bulding","consult","culture","admin","gos","house","hr","instal","it","logist","market","medicina", "nauka","proizvotstvo","rab","sales","secure","sport","strahovanie","study","tek","top","turizm","urist","auto","zakupki")
data_vac_novosib <- rbind(banki$Вакансии.Новосибирск, buhgalter$Вакансии.Новосибирск, bulding$Вакансии.Новосибирск, consult$Вакансии.Новосибирск, culture$Вакансии.Новосибирск, admin$Вакансии.Новосибирск, gos$Вакансии.Новосибирск, house$Вакансии.Новосибирск, hr$Вакансии.Новосибирск, instal$Вакансии.Новосибирск, it$Вакансии.Новосибирск, logist$Вакансии.Новосибирск, market$Вакансии.Новосибирск, medicina$Вакансии.Новосибирск, nauka$Вакансии.Новосибирск, proizvotstvo$Вакансии.Новосибирск, rab$Вакансии.Новосибирск, sales$Вакансии.Новосибирск, secure$Вакансии.Новосибирск, sport$Вакансии.Новосибирск, strahovanie$Вакансии.Новосибирск, study$Вакансии.Новосибирск, tek$Вакансии.Новосибирск, top$Вакансии.Новосибирск, turizm$Вакансии.Новосибирск, urist$Вакансии.Новосибирск, auto$Вакансии.Новосибирск, zakupki$Вакансии.Новосибирск)
rownames(data_vac_novosib) <- c("banki","buhgalter","bulding","consult","culture","admin","gos","house","hr","instal","it","logist","market","medicina", "nauka","proizvotstvo","rab","sales","secure","sport","strahovanie","study","tek","top","turizm","urist","auto","zakupki")

# Data frame (таблица) из суммы вакансий/резюме по каждому региону и по каждой профессиональной деятельности в отдельности 
library(dplyr)
banki1 <- banki %>% summarise_all(funs(sum)) 
rownames(banki1) <- "banki"
buhgalter1 <- buhgalter %>% summarise_all(funs(sum)) 
rownames(buhgalter1) <- "buhgalter"
bulding1 <- bulding %>% summarise_all(funs(sum)) 
rownames(bulding1) <- "bulding"

data_prof <- rbind(banki1, buhgalter1, bulding1, consult1, culture1, admin1, gos1, house1, hr1, instal1, it1, logist1, market1, medicina1, nauka1, proizvotstvo1, rab1,
sales1, secure1, sport1, strahovanie1, study1, tek1, top1, turizm1, urist1, auto1, zakupki1)

Кроме данных по количеству вакансий и резюме в каждой профессиональной области, выгрузим данные для каждого региона отдельно в зависимости от уровня заработной платы. Обращаю ваше внимание на то, что из-за особенностей hh.ru статистика количества вакансий и резюме формируется по разному и отражают различные значения. Для данных по резюме установлен диапазон уровня заработной платы который нас интересуют. Так интервалы начинаются с 0 до 9 999 рублей, от 10 000 до 19 999 рублей, от 20 000 до 29 999 рублей таким образом каждый интервал составляет условно в 10 000 руб. Для данных по вакансиям такой интервал установить не возможно поэтому данные собираются по следующему принципу: от 10 000 руб, от 20 000 руб, от 30 000 руб. Это означает, что количество вакансий от 10 000 руб. будет самой большой по количеству, затем по количеству самой большой будет интервал от 20 000 руб. и т.д. Исходные цифры показывают общее количество вакансий, т.е. вакансий в которых уровень заработной платы больше 10 000 рублей, больше 20 000 рублей и т.д. Кроме этого объём данных сократится на одну колонку, получаемая разница между колонками от 10 000 рублей и от 20 000 рублей результат приписывается колонке от 20 000 рублей.

# Для каждого регина отдельно, данные по уровню заработной платы в вакансиях
moscow_v <- read.csv("datazpvachhmoscow.csv", header = T, sep = ",")[,2:16]
spb_v <- read.csv("datazpvachhspb.csv", header = T, sep = ",")[,2:16]
novosib_v <- read.csv("datazpvachhnovosib.csv", header = T, sep = ",")[,2:16]
kaluga_v <- read.csv("datazpvachhkaluzobl.csv", header = T, sep = ",")[,2:16]
tatarstan_v <- read.csv("datazpvachhtatarstan.csv", header = T, sep = ",")[,2:16]
tomsk_v <- read.csv("datazpvachhtomskobl.csv", header = T, sep = ",")[,2:16]

# Расчитаем разницу между цифрами, построчно, и получим истинные данные о количестве вакансий (аналогично для spb_v, novosib_v, kaluga_v, tatarstan_v, tomsk_v)
dif <- diff(t(moscow_v))
от20000 <- as.integer(gsub("-", "", dif[1,]))
от30000 <- as.integer(gsub("-", "", dif[2,]))
от40000 <- as.integer(gsub("-", "", dif[3,]))

moscow_v <- data.frame(от20000, от30000, от40000, от50000, от60000, от70000, от80000, от90000, от100000, от110000, от120000, от130000, от140000, от150000)

# Сумма чисел по всем регионам в отдельности по уровню заработной платы в вакансиях
data_vac_zp <- (moscow_v + spb_v + novosib_v + kaluga_v + tatarstan_v + tomsk_v)

# Список (матрица) для каждого уровня заработной платы отдельно, по всем регионам, количество вакансий
data_vac_20000 <- rbind(moscow_v$от20000, spb_v$от20000, novosib_v$от20000, kaluga_v$от20000, tatarstan_v$от20000, tomsk_v$от20000)
rownames(data_vac_20000) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")
data_vac_30000 <- rbind(moscow_v$от30000, spb_v$от30000, novosib_v$от30000, kaluga_v$от30000, tatarstan_v$от30000, tomsk_v$от30000)
rownames(data_vac_30000) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")
data_vac_40000 <- rbind(moscow_v$от40000, spb_v$от40000, novosib_v$от40000, kaluga_v$от40000, tatarstan_v$от40000, tomsk_v$от40000)
rownames(data_vac_40000) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")

# Для каждого регина отдельно, данные по уровню заработной платы в резюме
moscow_r <- read.csv("datazpreshhmoscow.csv", header = T, sep = ",")[203:627,2:17]
spb_r <- read.csv("datazpreshhspb.csv", header = T, sep = ",")[203:627,2:17]
novosib_r <- read.csv("datazpreshhnovosib.csv", header = T, sep = ",")[203:627,2:17]
kaluga_r <- read.csv("datazpreshhkaluzobl.csv", header = T, sep = ",")[,2:17]
tatarstan_r <- read.csv("datazpreshhtatarstan.csv", header = T, sep = ",")[,2:17]
tomsk_r <- read.csv("datazpreshhtomskobl.csv", header = T, sep = ",")[,2:17]

# Сумма чисел по всем регионам в отдельности по уровню заработной платы в резюме
data_res_zp <- (moscow_r + spb_r + novosib_r + kaluga_r + tatarstan_r + tomsk_r)

# Список (матрица) для каждого уровня заработной платы отдельно, по всем регионам, количество резюме
data_res_9999 <- rbind(moscow_r$до.9999.руб, spb_r$до.9999.руб, novosib_r$до.9999.руб, kaluga_r$до.9999.руб, tatarstan_r$до.9999.руб, tomsk_r$до.9999.руб)
rownames(data_res_9999) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")
data_res_10000 <- rbind(moscow_r$X10000.19999.руб, spb_r$X10000.19999.руб, novosib_r$X10000.19999.руб, kaluga_r$X10000.19999.руб, tatarstan_r$X10000.19999.руб, tomsk_r$X10000.19999.руб)
rownames(data_res_10000) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")
data_res_20000 <- rbind(moscow_r$X20000.29999.руб, spb_r$X20000.29999.руб, novosib_r$X20000.29999.руб, kaluga_r$X20000.29999.руб, tatarstan_r$X20000.29999.руб, tomsk_r$X20000.29999.руб)
rownames(data_res_20000) <- c("moscow","spb","novosib","kaluga","tatarstan","tomsk")

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

Начнём с самых базовых характеристик выборок, а именно вычисления центра (центральная тенденция) и разброс (размах). В качестве центра чаще всего используются среднее и медиана, а в качестве разброса - стандартное отклонение и квартили. Сравним показатели по вакансиям и резюме из профессиональной области банки, финансы. Однако возьмём не весь вектор полностью а лишь часть за 30 дней, но с разницей 11 дней. Таким образом у нас получится 4 вектора, которые продемонстрируют нам, что базовые характеристики могут меняться во времени. Это означает, что если через некоторое время вы захотите повторить вычисления, то ваши результаты скорее всего будут отличаться.

Таблица №1

Вакансии mean median IQR SD
V1 7739.903 7747 152 109.8837
V2 7709.968 7716 174.5 126.6027
diff 29.935 31 22.5 16.719

Таблица №2

Резюме mean median IQR SD
V3 66377.39 66364 84 59.68175
V4 66458.68 66465 124.5 77.74462
diff 81.29 101 40.5 18.06287

Как вы видите среднее более робастная (устойчива), чем медиана, точно так же как стандартное отклонение более устойчиво, чем межквартильный интервал. Значения между mean и median, а так же между IQR и sd имеют заметные отличия, что может косвенно свидетельствовать об отсутствии нормального распределения количества вакансий и резюме, но проверим данное предположение только в следующей статье.

Визуализация и анализ данных по проф. областям

В первой статье я уже показывал функции, которые позволяют рассчитать среднее арифметическое, медиану, межквартильный интервал, стандартное отклонение, дисперсию и остальные параметры. Давайте сразу визуализируем данные посмотрим закономерности и “артефакты”.

Визуализировать данные буду по порядку обработки данных и создания data frame. Для работы нам потребуется библиотека PerformanceAnalytics, загрузим её и запустим.

install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
chart.Boxplot(t(data_vac_res), main = "Совокупность данных по всем профессиональным областям", xlab = "Кол-во резюме", mean.symbol = 16)
chart.Boxplot(consult, main = "Проф. область - Консультирование, консалтинг и стратегическое развитие", xlab = "Кол-во резюме", mean.symbol = 16)
chart.Boxplot(tek, main = "Проф. область - Добыча сырья, ТЭК", xlab = "Кол-во резюме", mean.symbol = 16)

Для осознанного понимания данных важным является правильная визуализация. В нашей ситуации наиболее удачным является ящик с усами или боксплот, а так же гистограмма. Эти два типа графиков позволяет увидеть одно и тоже, результаты функции summary(), но с разных сторон. Первым делом проанализировал данные по профессиональным областям. Для подавляющего большинства проф. областей картина похожа на то, что изображено на Графике №1 - Совокупность данных по всем профессиональным областям. Сразу бросается в глаза явно выделяющееся боксплот количество резюме по Москве, затем следует боксплот количество резюме по Санкт-Петербургу и третьим следуете боксплот количество резюме по Татарстану. На графике можете заметить, что медиана (вертикальная черта внутри боксплота) среднее (красная точка внутри боксплота) заметно отдалены друг от друга. Межквартильный разброс для векторов резюме почти по всем регионам явно больше по сравнению с разбросом для векторов вакансий. Максимальные и минимальные значения (усы) не велики. Выбросы практически отсутствуют. Боксплоты векторов резюме преобладают в верхней половине графика, а боксплоты вакансий в нижней.

График №1 Совокупность данных по всем профессиональным областям. График боксплот - Совокупность данных по всем профессиональным областям

Как известно в любом правиле есть исключение. Теперь рассмотрим два интересных, на мой взгляд, графика, один из которых можно считать “артефактом”. На втором графике изображены боксплоты проф. области добыча сырья, тэк. Особенность в том, что по всем регионам данные по количеству резюме хорошо представлены явно доминируют в верхней части. Во-первых, разброс очень заметен. Во-вторых, максимальные значения и второй квартиль в каждом боксплоте количества резюме очень близки друг к другу, а минимальные значения наоборот явно выделены и заметны. Последнее говорит о том, что примерно с середины марта 2018 года по настоящее время наблюдается снижение количества вакансий. При этом медианы и средние не изменились. В целом такая картина наталкивает на определённые размышления. Получается, что практически во всех регионах люди хотят работать в данной области и поэтому активно размещают свои резюме. С другой стороны если посмотреть проф. область государственная служба, то в ней соотношение количество резюме на одну вакансию будет одним из самых высоких. Следовательно характеристика результатов различна, но говорят об одном и том же?

График №2 Профессиональная область добыча сырья, энергетика. График боксплот - Профессиональная область добыча сырья, энергетика

График №3 это как раз тот “артефакт”, который отличается по отношению ко всем остальным графикам. Получается, что вектора в проф. области консультирование, консалтинг, стратегическое развитие между собой имеют уникальные характеристики. Обратите внимание, как расположены вектора количества резюме и вакансий по регионам. На мой взгляд в этом есть гармония, т.к. предложения кандидатов более адекватно соотносятся с запросом работодателей на специалистов. В чём секрет такого соотношения количества вакансий и резюме? И можно ли данное соотношение считать оптимальным для рынка труда? Эти вопросы пока открыты.

График №3 Профессиональная область консультирование, консалтинг, стратегическое развитие. График боксплот - Профессиональная область консультирование, консалтинг, стратегическое развитие

Теперь рассмотрим гистограммы и сразу построим кривую частотности. Для того что бы отобразить все векторы выборки, т.е. по всем регионам, нам необходимо выполнить следующий скрипт. В R принято считать, что циклы лучше избегать, особенно при расчётах, но как говорится, чего не сделаешь ради искусства.

par(mfrow=c(3, 4))
colnames <- dimnames(data_vac_res)[[2]]
for (i in 1:12) {
  hist(data_vac_res[,i], main=colnames[i], probability=TRUE, col="gray", border="white")
  d <- density(data_vac_res[,i])
  lines(d, col="red")
}

Для начала посмотрим график совокупности данных по всем профессиональным областям т.к. эти данные отражают общую картину почти в каждой проф. области, за исключением двух, о которых посмотрим и обсудим ниже. Сперва посмотрите на график №4, на нём можно увидеть несколько важных вещей. Во-первых, по всем регионам для векторов резюме гистограммы и плотность явно демонстрируют об отсутствии нормального распределения. Во-вторых, для векторов вакансий по всем регионам близка к нормальному, посмотрите на суб-график вакансии Калужская область, либо имеют смещения в правую или левую стороны. В-третьих, на всех суб-графиках за исключением одного - вакансии Калужская область, характер распределения субмодальный. Это означает, что выборки вакансий формируются из принципиально различных проф. областей, но это вполне логично, тоже самое относится и к резюме.

График №4 Совокупность данных по всем профессиональным областям. График гистограмма и плотность - Совокупность данных по всем профессиональным областям

Что касается отличий, то таковые есть для двух проф. областей: Инсталяция оборудования и Рабочий персонал. Для примера покажу только один график, т.к. общая картина схожа. Самое главное отличие от остальных областей в том, по всем регионам для векторов резюме левая сторона не столь сильно выражена, но при этом растянута и сливается с правой стороной без разрыва. Конечно это не говорит ещё о нормальности распределения, но с практической точки зрения можно сделать следующее предположение. А именно, как я уже писал ранее со второй половины марта 2018 года количество резюме стало сокращаться и в данных проф. областях мы можем видеть, как этот процесс отражается на распределении плотности. Снижение количества вакансий происходит по всем областям, но заметен пока только в двух. Если у вас есть иное объяснение этой особенности, то напишите в комментариях.

График №5 Профессиональная область рабочий персонал. График гистограмма и плотность - Профессиональная область рабочий персонал

Визуализация и анализ данных количество резюме и вакансий в совокупности всех проф. областей

Теперь рассмотрим графики по каждому региону отдельно, опять же отдельно для вакансий и резюме, данные объединены по всем проф. областям. Сам код приводить не буду т.к. для предыдущих примеров он уже есть, вам необходимо только лишь поменять названия data frame. Начну с анализа и сравнения количества вакансий и резюме для Москвы по всем проф. областям. На мой взгляд такое сравнение даёт более полное понимание о специфики каждого региона.

На графике ниже изображены боксплоты которые отражают отношения количество резюме, ось x и профессиональные области, ось y по городу Москва. Проф. области так же отображены в иерархическом порядке самые высокие строчки заняли следующие проф. области: продажи, ит, маркетинг, начало карьеры, строительство. Необходимо отметить, область - продажи лидер для всех наших регионов. Кроме этого, я выделил несколько важных моментов. А именно, размах не большой, а медиана и средняя у всех проф. областей совпадают. Максимальные значения не сильно выражены, за исключением область продаж, а минимальные значения наоборот очень заметны. Выбросы так же очень заметны и выделяются по многим областям. С практической точки зрения эта информация может нам говорить о том, что несмотря на то, что количество резюме иногда могут снижаться, диапазон колебаний не высок и в целом стабилен. Следовательно спрос на специалистов в Москве имеет не большой диапазон колебаний.

График №6 г. Москва, все проф. области, вакансии. График боксплот - Москва, проф. области, вакансии.

Теперь проанализируем График №7 и сравним между собой ситуацию с резюме и вакансиями по всем областям в Москве. Ситуация с резюме выглядит следующим образом. Во-первых, пятёрка лидеров проф. областей по количеству резюме выглядит следующим образом: начало карьеры, продажи, административный персонал, логистика, бухгалтерия. Во-вторых, разброс у большинства областей значительно больше, чем в вакансиях. В-третьих, медиана и среднее не совпадают. Медиана заметно смещена к 3 квартилю. В-четвёртых, максимальные значения заметны, только в области начало карьеры, в остальных проф. областях значимой выраженности нет. В-пятых, минимальные значения более заметны. В-шестых, отсутствуют выбросы. На практике это означает, что в Москве по всем проф областям есть снижение количества резюме, но оно незначительно. Наибольший размах в проф. области производство - это означает, что за всё время наблюдения в данной области количество вакансий увеличилось больше всего.

Сравнивая и анализируя оба графика столкнулся со следующими размышлениями. Вакансии отражают потребность бизнеса в тех или иных специалистах. С резюме ситуация сложнее т.к. кандидат который размещает своё резюме не обязательно заинтересован в смене работы, он может просто “мониторить” рынок. Однако то что рядом с продажами оказалась область маркетинга и строительство говорит о том, что в Москве высок спрос на специалистов интеллектуального труда, т.е. ближе к сфере услуг. Вас не должно смущать относительно высокие позиции вакансий в областях строительство и производство. Инженер-проектировщик или конструктор относятся к области строительство, но как вы понимаете это исключительно интеллектуальная область труда, аналогично и в производстве. Связка областей продажи и маркетинг может свидетельствовать о двух вещах. Первое, Москва является лидером среди всех регионов в области маркетинговой активности и продвижения товаров или услуг. Второе, связка этих двух областей свидетельствует о высокой развитости и зрелости бизнеса. Столичные бизнесмены делают ставку не только на активность и успех менеджеров по продажам, но и на изучение рынка и маркетинговую активность. Ещё хотелось бы дополнить, что область начало карьеры универсальна по своей природе. Молодые специалисты есть в каждой из проф. областей в отдельности, поэтому то, что в совокупности это область оказалась на первом месте вполне объяснимо.

График №7 г. Москва, все проф. области, резюме. График боксплот - Москва, проф. области, резюме.

Кроме Москвы предлагаю сравнить графики боксплоты резюме и вакансий по республике Татарстан. Однако сейчас не буду анализировать каждый график отдельно, покажу их друг за другом и перейду сразу к описанию общей картины.

График №8 р. Татарстан, все проф. области, вакансии. График боксплот - Татарстан, проф. области, вакансии.

График №9 р. Татарстан, все проф. области, резюме. График боксплот - Татарстан, проф. области, резюме.

Связка двух областей производство и рабочий персонал свидетельствует о том, что Татарстан является одним из крупнейших промышленных центров России. И по уровню количества резюме в этих областях можно сказать, что запросы работодателей адекватны ситуации, т.е. кандидаты готовы удовлетворить потребность в соответствующих кадрах. В Татарстане так же высока потребность в менеджерах по продажам, но по сравнению с Москвой потребность и предложений в области маркетинга заметно меньше. С точки зрения бизнеса Татарстан производит, и продаёт, но серьёзной маркетинговой активности не проводит.

Графики гистограмм и плотности распределения пропускаю, вы можете сделать самостоятельно. Картина по регионам схожи между собой по резюме ни для одной проф. области не выявлено нормальности распределения, а по вакансиям необходимо проводить дополнительные измерения. Перейдём к анализу данных по уровню заработной платы вакансий и резюме.

Анализ данных уровня заработной платы в вакансиях

Начнём с анализа уровня заработной платы в вакансиях по каждому региону отдельно. В этот раз и последующие анализы буду проводить только по одному региону. Если вы пожелаете узнать результаты по оставшимся регионам, то вы можете это сделать самостоятельно. Сейчас предлагаю проанализировать и описать данные по городу Новосибирску. Результаты визуализированы и представлены на графиках 10 и 11. Одно важное замечание, на графиках указаны цифры от20000, от30000, от40000 и т.д. - это означает количество вакансий в диапазоне от 20 000 руб. до 29 999 руб., от 30 000 руб. до 39 999 руб. от 40 000 руб. до 49 999 руб. и т.д., расчёты проводились ранее.

График №10 г.Новосибирск, уровень з/пл, вакансии. График боксплот - Новосибирск, уровень з/пл, вакансии.

График №11 г.Новосибирск, уровень з/пл, вакансии. График гистограмма и плотность - Новосибирск, уровень з/пл, вакансии

В Новосибирске среди вакансий пятёрка самых часто встречающихся зарплат:

  1. от 40 000 до 49 999 руб.
  2. от 30 000 до 39 999 руб.
  3. от 60 000 до 69 999 руб.
  4. от 50 000 до 59 999 руб.
  5. от 70 000 до 79 999 руб.

При этом уровень зарплат от 40 000 рублей явно доминирует, и например, превышает уровень зарплат от 70 000 рублей более чем в 3 раза. Для зарплат от 40 000 размах, минимальные и максимальные значения гораздо больше, чем у других уровней зарплаты. Однако характер частотности количества вакансий для уровней зарплат от 40 000 и от 60 000 имеет вид бимодального распределения, а для зарплат от 50 000 - мультимодального. Это означает, что эти выборки не однородны и состоят из двух и более групп. Причиной появления такой разнородности могут быть различные факторы, которые сейчас трудно точно определить. Напоминаю, что в настоящее время запрещается указывать в вакансиях половые и возрастные ограничения. На мой взгляд, одной из причиной разнородности являются проф. области, например область продаж и все остальные области. С другой стороны для следующих уровней зарплат: от 70 000, от 120 000, от 130 000, от 140 000 и от 150 000 руб. характерно унимодальное распределение, которые близки к нормальному. На практике это означает, что для данных уровней зарплат группы вакансий однородны и это удивительно т.к. это может означать, что работодатели одинаковые, либо одинаковые их вакансии, либо при данных диапазонах работодатели ищут определённых специалистов, т.е. вакансии для определённой группы вакансий. Таким образом, в Новосибирске есть выраженный спрос на специалистов определённой категории, при некоторых уровнях зарплат.

Анализ данных уровня заработной платы в резюме

В заключение рассмотрим два графика распределения уровня зарплат по Москве, поэтому без дополнительных введений и “…без предисловий, сей же час позвольте познакомить вас…” (А.С.Пушкин, “Евгений Онегин”).

График №12 г.Москва, уровень з/пл, резюме. График боксплот - Москва, уровень з/пл, резюме.

График №13 г.Москва, уровень з/пл, резюме. График гистограмма и плотность - Москва, уровень з/пл, резюме

На графике №12 вы видите, на первый взгляд странное доминирование уровней зарплат. А именно 5ка уровней зарплат в резюме:

  1. От 30 000 до 39 9999 руб.
  2. От 40 000 до 49 9999 руб.
  3. От 20 000 до 29 9999 руб.
  4. От 50 000 до 59 9999 руб.
  5. От 60 000 до 69 9999 руб.

Возникает очевидный вопрос почему уровень зарплаты в пределах 20 и 30 тысяч рублей в Москве на столько явно преобладают? На мой взгляд этому есть простое объяснение. Посмотрите предыдущие графики, количество резюме в области начало карьеры и продажи значительно преобладают. Со студентами всё понятно они только начинают поэтому на высокие зарплаты не могут претендовать. А специалисты в области продаж так же не всегда заявляют высокие зарплаты, а только оклад, т.к. их основной доход складывается из процентов, бонусов и премий. И ещё одно дополнение график гистограм показывает о преобладании бимодальном характере распределения, что свидетельствует о том, что на данные влияют как минимум две разные проф. области. Кроме этого размах в векторах сразу бросается в глаза. При этом медиана смещена к 3 квартилю. А для уровня зарплат от 40 000 до 49 999 руб. диапазон между минимальными и максимальными значениями оказался самым большим. Таким образом, сайт hh.ru для молодых специалистов является одной из той важных площадок с помощью которой они вливаются в мир взрослых, в профессиональную среду, становясь рабочими и специалистами.

sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Fedora 28 (Workstation Edition)

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=ru_RU.UTF-8       LC_NUMERIC=C               LC_TIME=ru_RU.UTF-8        LC_COLLATE=ru_RU.UTF-8    
 [5] LC_MONETARY=ru_RU.UTF-8    LC_MESSAGES=ru_RU.UTF-8    LC_PAPER=ru_RU.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=ru_RU.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.5.0 tools_3.5.0    yaml_2.2.0
comments powered by Disqus