В статье представлен метод анализа вакансий по поисковому запросу «Python» с использованием модели кластеризации Gaussian Mixture Model (GMM).
Для каждого выделенного кластера будут указаны наиболее востребованные навыки и диапазон заработной платы.
Почему было проведено это исследование? Я хотел знать:
- В каких областях применения используется Python?
- Какие знания потребуются: базы данных, библиотеки, фреймворки
- Насколько востребованы специалисты в каждой области?
- Какие зарплаты предлагаются?
Загрузка данных
Вакансии скачаны с сайта hh.ru , используя API: dev.hh.ru .По запросу был скачан "Питон" 1994 вакансий (Московская область), которые были разделены на обучающую и тестовую выборки, пропорционально 80% И 20% .
Размер тренировочного набора - 1595 , размер теста - 399 .
Набор тестов будет использоваться только в разделах «Высшие/антитоповые навыки» и «Классификация должностей».
Знаки
На основе текста загруженных вакансий были сформированы две группы наиболее часто встречающихся.н-грамм слова:
- 2-граммы на кириллице и латинице
- 1 грамм на латыни
После отбора n-грамм первая группа содержала 81 2-грамм, а вторая 98 1-грамм:
№ | н | н-грамм | Масса | Вакансии |
1 | 2 | на питоне | 8 | 258 |
2 | 2 | CI компакт-диск | 8 | 230 |
3 | 2 | понимание принципов | 8 | 221 |
4 | 2 | знание sql | 8 | 178 |
5 | 2 | развитие и | 9 | 174 |
.
|
.
|
.
|
.
|
.
|
82 | 1 | sql | 5 | 490 |
83 | 1 | Linux | 6 | 462 |
84 | 1 | PostgreSQL | 5 | 362 |
85 | 1 | докер | 7 | 358 |
86 | 1 | Джава | 9 | 297 |
.
|
.
|
.
|
.
|
.
|
Приоритет | Критерий | Масса |
1 | Область (прикладное направление), должность, опыт n-граммы: «машинное обучение», «администрирование Linux», «отличные знания» | 7-9 |
2 | Инструменты, технологии, программное обеспечение.
n-граммы: «sql», «ОС Linux», «pytest» |
4-6 |
3 | Другие навыки n-граммы: «техническое образование», «английский язык», «интересные задачи» | 1-3 |
Позвольте мне привести вам пару примеров:
- На первый взгляд «Докера» можно отнести ко второй группе критериев с весом от 4 до 6. Но упоминание «Докера» в вакансии, скорее всего, указывает на то, что вакансия будет на должность «DevOps-инженер».
» Поэтому «Докер» попал в первую группу и получил вес 7.
- «Java» также попадает в первую группу, потому что в большинстве рассматриваемых вакансий с наличием слова «Java» Java-разработчика ищут с оговоркой «знание Python будет дополнительным преимуществом».
Также есть вакансии с поиском «оркестр одного человека».
И первая, и вторая вакансии меня не интересуют, поэтому я хочу отделить их от остальных вакансий, соответственно наибольший вес я присваиваю «Яве» 9.
Конверсия данных
Для расчетов каждая вакансия преобразовывалась в вектор размерностью 179 (количество выбранных признаков) целых чисел от 0 до 9, где 0 означает, что i-й n-грамм отсутствует в вакансии, а числа от 1 до 9. означают наличие i-го n -грамм и его вес.Далее в тексте под точка Под вакансией понимается вакансия, представленная таким вектором.
Пример: Допустим, список n-грамм содержит всего три значения:Тогда на вакансию с текстом.
№ н н-грамм Масса Вакансии 1 2 на питоне 8 258 2 2 понимание принципов 8 221 3 1 sql 5 490 Требования:
вектор равен [8, 0, 5].
- Опыт разработки на Python от 3 лет.
- Хорошее знание sql
Метрики
Чтобы работать с данными, нужно иметь о них представление.В нашем случае мы хотели бы посмотреть, есть ли какие-либо кластеры точек, которые мы будем считать кластерами.
Для этого я использовал алгоритм т-СН? преобразовать все векторы в двумерное пространство.
Суть метода заключается в уменьшении размерности данных при максимальном сохранении пропорций расстояний между точками множества.
Из формул довольно сложно понять, как работает t-SNE. Но мне понравился один пример, найденный где-то в Интернете: допустим, у нас есть шарики в трехмерном пространстве.
Каждый шарик соединяем со всеми остальными шариками невидимыми пружинками, которые никак не пересекаются и не мешают друг другу при пересечении.
Пружины действуют в обе стороны, т.е.
сопротивляются как расстоянию, так и приближению шариков друг к другу.
Система находится в устойчивом состоянии, шары неподвижны.
Если мы возьмем один из шариков и потянем его назад, а затем отпустим, то за счет силы пружин он вернется в исходное состояние.
Далее берем две большие тарелки и сжимаем шарики в тонкий пласт, не препятствуя перемещению шариков в плоскости между двумя пластинами.
Силы пружин начинают действовать, шарики движутся и в конце концов останавливаются, когда силы всех пружин уравновесятся.
Пружины будут действовать так, что шарики, которые находились близко друг к другу, останутся относительно близкими и плоскими.
То же самое и с удаленными шариками – они будут удалены друг от друга.
С помощью пружин и пластин мы преобразовали трехмерное пространство в двухмерное, сохранив в той или иной форме расстояния между точками! Я использовал алгоритм t-SNE только для визуализации набора точек.
Он помог выбрать метрику, а также выбрать веса для функций.
Если воспользоваться евклидовой метрикой, которой мы пользуемся в повседневной жизни, расположение вакансий будет выглядеть так:
На рисунке видно, что большая часть точек сосредоточена в центре, а по бокам имеются небольшие ответвления.
При таком подходе алгоритмы кластеризации, использующие расстояния между точками, ничего хорошего не дадут. Существует большое разнообразие метрик (способов определения расстояния между двумя точками), которые хорошо работают с изучаемыми данными.
Я выбрал в качестве меры Расстояние Жаккара , принимая во внимание веса в n-граммах.
Мера Жаккара проста для понимания и хорошо подходит для решения поставленной задачи.
Пример : Задание 1 содержит n-граммы: «python», «sql», «docker».Рассчитывалась матрица расстояний между всеми парами точек; размер матрицы составил 1595 х 1595. Всего 1 271 215 расстояний между уникальными парами.Задача 2 содержит n-граммы: «python», «sql», «php».
Вес: «на питоне» — 8 «sql» - 5 «докер» — 7 «ФП» — 9 Пересечение многих (n-грамм встречается на 1-й и 2-й вакансиях) : "в питоне", "sql" = 8 + 5 = 13 Союз наборов (все n-граммы из 1-й и 2-й вакансий) : «python», «sql», «docker», «php» = 8 + 5 + 7 + 9 = 29 Расстояние =1 – (Пересечение множеств/Объединение множеств) = 1 – (13/29) = 0,55
Среднее расстояние оказалось 0,96, между 619 659 расстояние равно 1 (т.е.
сходства нет вообще).
На следующей диаграмме показано, что в целом эти профессии мало похожи:
Используя метрику Жаккара, наше пространство теперь выглядит так:
Появились четыре отдельные области плотности и два небольших скопления с низкой плотностью.
По крайней мере, это то, что видят мои глаза!
Кластеризация
Модель, выбранная в качестве алгоритма кластеризации Модель гауссовой смеси (GMM) .Алгоритм получает входные данные в виде векторов, а параметр n_comComponents — это количество кластеров, на которые необходимо разбить набор.
Вы можете увидеть, как работает алгоритм Здесь (по-английски).
Я использовал готовую реализацию GMM из библиотеки scikit-learn: sklearn.mixture.GaussianMixture .
Замечу, что GMM не использует метрику, а делит данные только по набору признаков и их весам.
В статье расстояние Жаккара используется для визуализации данных, расчета компактность кластеров (за компактность я взял среднее расстояние между точками кластера), а определение центральная точка кластера (типичная вакансия) — точка с наименьшим средним расстоянием до других точек кластера.
Многие алгоритмы кластеризации используют расстояние между точками.
В разделе «Другие методы» речь пойдет о других видах кластеризации, которые основаны на метриках и тоже дают хорошие результаты.
В предыдущем разделе на глазок было определено, что кластеров, скорее всего, будет шесть.
Вот как выглядят результаты кластеризации при n_comComponents = 6:
На рисунке с выводом кластеров по отдельности кластеры расположены в порядке убывания количества точек слева направо, сверху вниз: кластер 4 — самый большой, кластер 5 — самый маленький.
Для каждого кластера в скобках указана его компактность.
На вид кластеризация получилась не очень хорошей, даже если учесть, что алгоритм t-SNE не идеален.
При анализе кластеров результат также не обрадовал.
Чтобы найти оптимальное количество кластеров n_comComponents, мы используем критерии AIC и BIC вы можете прочитать о Здесь .
Расчет этих критериев встроен в метод sklearn.mixture.GaussianMixture .
Вот как выглядит график критериев:
При n_comComponents = 12 критерий BIC имеет наименьшее (лучшее) значение, критерий AIC также имеет значение, близкое к минимальному (минимум при n_comComponents = 23).
Разобьем вакансии на 12 кластеров:
Кластеры теперь имеют более компактную форму как визуально, так и численно.
В ходе ручного анализа вакансии были разделены на характерные для понимания человека группы.
На рисунке показаны названия кластеров.
Кластеры под номерами 11 и 4 обозначены как :
- В кластере 11 все функции имеют примерно одинаковый общий вес.
- Кластер 4 был идентифицирован на основе Java. Тем не менее, вакансий на должность Java Developer в кластере немного; знание Java часто требуется как «дополнительный плюс».
Кластеры
После удаления двух неинформативных кластеров под номерами 11 и 4 у нас осталось 10 кластеров:Для каждого кластера есть таблица знаков и 2-грамм, которые чаще всего встречаются в вакансиях в кластере.
Обозначения: С — доля вакансий, в которых встречается данная функция, умноженная на вес функции.
% — процент вакансий, в которых встречается знак/2-грамм Типичная вакансия кластера — вакансия с наименьшим средним расстоянием до других точек кластера
Аналитик данных
Количество вакансий: 299 Типичная вакансия: 35805914№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | превосходить | 3.13 | sql | 64.55 | знание sql | 18.39 |
2 | р | 2.59 | превосходить | 34.78 | в разработке | 14.05 |
3 | sql | 2.44 | р | 28.76 | питон р | 14.05 |
4 | знание sql | 1.47 | би | 19.40 | с большим | 13.38 |
5 | анализ данных | 1.17 | картина | 15.38 | развитие и | 13.38 |
6 | картина | 1.08 | 14.38 | анализ данных | 13.04 | |
7 | с большим | 1.07 | ВБА | 13.04 | знание питона | 12.71 |
8 | развитие и | 1.07 | наука | 9.70 | аналитический склад | 11.71 |
9 | ВБА | 1.04 | dwh | 6.35 | опыт разработки | 11.71 |
10 | знание питона | 1.02 | оракул | 6.35 | базы данных | 11.37 |
Разработчик С++
Количество вакансий: 139 Типичная вакансия: 39955360№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | С++ | 9.00 | С++ | 100.00 | опыт разработки | 44.60 |
2 | Джава | 3.30 | Linux | 44.60 | с С++ | 27.34 |
3 | Linux | 2.55 | Джава | 36.69 | С++ питон | 17.99 |
4 | С# | 1.88 | sql | 23.02 | на С++ | 16.55 |
5 | идти | 1.75 | С# | 20.86 | события в области | 15.83 |
6 | события в области | 1.27 | идти | 19.42 | структуры данных | 15.11 |
7 | хорошее знание | 1.15 | Юникс | 12.23 | опыт написания | 14.39 |
8 | структуры данных | 1.06 | тензорный поток | 11.51 | программирование в | 13.67 |
9 | тензорный поток | 1.04 | бить | 10.07 | в разработке | 13.67 |
10 | опыт программирования | 0.98 | PostgreSQL | 9.35 | языки программирования | 12.95 |
Linux/DevOps-инженер
Количество вакансий: 126 Типичная вакансия: 39533926№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | анзибль | 5.33 | Linux | 84.92 | CI компакт-диск | 58.73 |
2 | докер | 4.78 | анзибль | 76.19 | опыт администрирования | 42.06 |
3 | бить | 4.78 | докер | 74.60 | Баш питон | 33.33 |
4 | CI компакт-диск | 4.70 | бить | 68.25 | TCP IP | 39.37 |
5 | Linux | 4.43 | Прометей | 58.73 | опыт настройки | 28.57 |
6 | Прометей | 4.11 | Заббикс | 54.76 | мониторинг и | 26.98 |
7 | nginx | 3.67 | nginx | 52.38 | Прометей графана | 23.81 |
8 | опыт администрирования | 3.37 | графана | 52.38 | системы мониторинга | 22.22 |
9 | Заббикс | 3.29 | PostgreSQL | 51.59 | с докером | 16.67 |
10 | лось | 3.22 | Кубернетес | 51.59 | управление конфигурацией | 16.67 |
Python-разработчик
Количество вакансий: 104 Типичная вакансия: 39705484№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | на питоне | 6.00 | докер | 65.38 | на питоне | 75.00 |
2 | Джанго | 5.62 | Джанго | 62.50 | события в области | 51.92 |
3 | колба | 4.59 | PostgreSQL | 58.65 | опыт разработки | 43.27 |
4 | докер | 4.24 | колба | 50.96 | колба Джанго | 24.04 |
5 | события в области | 4.15 | Redis | 38.46 | отдых API | 23.08 |
6 | PostgreSQL | 2.93 | Linux | 35.58 | питон из | 21.15 |
7 | айоhttp | 1.99 | кроликMQ | 33.65 | базы данных | 18.27 |
8 | Redis | 1.92 | sql | 30.77 | опыт написания | 18.27 |
9 | Linux | 1.73 | монгодб | 25.00 | с докером | 17.31 |
10 | кроликMQ | 1.68 | айоhttp | 22.12 | с PostgreSQL | 16.35 |
Специалист по данным
Количество вакансий: 98 Типичная вакансия: 38071218№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | панды | 7.35 | панды | 81.63 | машинное обучение | 63.27 |
2 | бестолковый | 6.04 | бестолковый | 75.51 | панды | 43.88 |
3 | машинное обучение | 5.69 | sql | 62.24 | анализ данных | 29.59 |
4 | Питорч | 3.77 | Питорч | 41.84 | специалист по данным | 26.53 |
5 | мл | 3.49 | мл | 38.78 | знание питона | 25.51 |
6 | тензорный поток | 3.31 | тензорный поток | 36.73 | тупой, скучный | 24.49 |
7 | анализ данных | 2.66 | искра | 32.65 | панды питона | 23.47 |
8 | scikilearn | 2.57 | scikilearn | 28.57 | на питоне | 21.43 |
9 | специалист по данным | 2.39 | докер | 27.55 | математическая статистика | 20.41 |
10 | искра | 2.29 | хадуп | 27.55 | машинные алгоритмы | 20.41 |
Фронтенд-разработчик
Количество вакансий: 97 Типичная вакансия: 39681044№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | javascript | 9.00 | javascript | 100 | HTML CSS | 27.84 |
2 | Джанго | 2.60 | HTML | 42.27 | опыт разработки | 25.77 |
3 | реагировать | 2.32 | PostgreSQL | 38.14 | в разработке | 17.53 |
4 | nodejs | 2.13 | докер | 37.11 | знание яваскрипта | 15.46 |
5 | внешний интерфейс | 2.13 | CSS | 37.11 | и поддержка | 15.46 |
6 | докер | 2.09 | Linux | 32.99 | питон и | 14.43 |
7 | PostgreSQL | 1.91 | sql | 31.96 | CSS JavaScript | 13.40 |
8 | Linux | 1.79 | Джанго | 28.87 | базы данных | 12.37 |
9 | HTML CSS | 1.67 | реагировать | 25.77 | на питоне | 12.37 |
10 | php | 1.58 | nodejs | 23.71 | дизайн и | 11.34 |
Бэкэнд-разработчик
Количество вакансий: 93 Типичная вакансия: 40226808№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | Джанго | 5.90 | Джанго | 65.59 | питон Джанго | 26.88 |
2 | js | 4.74 | js | 52.69 | опыт разработки | 25.81 |
3 | реагировать | 2.52 | PostgreSQL | 40.86 | знание питона | 20.43 |
4 | докер | 2.26 | докер | 35.48 | в разработке | 18.28 |
5 | PostgreSQL | 2.04 | реагировать | 27.96 | CI компакт-диск | 17.20 |
6 | понимание принципов | 1.89 | Linux | 27.96 | уверенные знания | 16.13 |
7 | знание питона | 1.63 | серверная часть | 22.58 | отдых API | 15.05 |
8 | серверная часть | 1.58 | Redis | 22.58 | HTML CSS | 13.98 |
9 | CI компакт-диск | 1.38 | sql | 20.43 | способность понимать | 10.75 |
10 | внешний интерфейс | 1.35 | MySQL | 19.35 | в чужом | 10.75 |
DevOps-инженер
Количество вакансий: 78 Типичная вакансия: 39634258№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | девопс | 8.54 | девопс | 94.87 | CI компакт-диск | 51.28 |
2 | анзибль | 5.38 | анзибль | 76.92 | Баш питон | 30.77 |
3 | бить | 4.76 | Linux | 74.36 | опыт администрирования | 24.36 |
4 | Дженкинс | 4.49 | бить | 67.95 | и поддержка | 23.08 |
5 | CI компакт-диск | 4.10 | Дженкинс | 64.10 | Докер Кубернетес | 20.51 |
6 | Linux | 3.54 | докер | 50.00 | развитие и | 17.95 |
7 | докер | 2.60 | Кубернетес | 41.03 | опыт написания | 17.95 |
8 | Джава | 2.08 | sql | 29.49 | и настройка | 17.95 |
9 | опыт администрирования | 1.95 | оракул | 25.64 | развитие и | 16.67 |
10 | и поддержка | 1.85 | открытая смена | 24.36 | написание сценариев | 14.10 |
Инженер данных
Количество вакансий: 77 Типичная вакансия: 40008757№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | искра | 6.00 | хадуп | 89.61 | обработка данных | 38.96 |
2 | хадуп | 5.38 | искра | 85.71 | большие данные | 37.66 |
3 | Джава | 4.68 | sql | 68.83 | опыт разработки | 23.38 |
4 | улей | 4.27 | улей | 61.04 | знание sql | 22.08 |
5 | скала | 3.64 | Джава | 51.95 | развитие и | 19.48 |
6 | большие данные | 3.39 | скала | 51.95 | хадоп искра | 19.48 |
7 | этл | 3.36 | этл | 48.05 | Java Скала | 19.48 |
8 | sql | 2.79 | расход воздуха | 44.16 | Качество данных | 18.18 |
9 | обработка данных | 2.73 | Кафка | 42.86 | и обработка | 18.18 |
10 | Кафка | 2.57 | оракул | 35.06 | хадуп улей | 18.18 |
Инженер QA
Количество вакансий: 56 Типичная вакансия: 39630489№ | Знак с весом | С | Знак | % | 2 грамма | % |
1 | автоматизация тестирования | 5.46 | sql | 46.43 | автоматизация тестирования | 60.71 |
2 | опыт тестирования | 4.29 | ка | 42.86 | опыт тестирования | 53.57 |
3 | ка | 3.86 | Linux | 35.71 | на питоне | 41.07 |
4 | на питоне | 3.29 | селен | 32.14 | опыт автоматизации | 35.71 |
5 | разработка |
-
Добавление Видео На Ваш Сайт Или Блог
19 Oct, 24 -
Keyweb.ru Снова Зависает. Куда Идти?
19 Oct, 24 -
Новогодняя Сборка Оперы 10
19 Oct, 24