Analyse von Stellenangeboten mittels Clustering

Dieser Artikel bietet eine Methode zur Analyse von Stellenangeboten für die Suchabfrage "Python" mithilfe des GMM-Clustering-Modells (Gaussian Mixture Model). Für jeden hervorgehobenen Cluster werden die am häufigsten angeforderten Fähigkeiten und Gehaltsbereiche angezeigt.



Was war der Zweck dieser Studie? Ich wollte wissen:



  • In welchen Anwendungen wird Python verwendet?
  • Welche Kenntnisse sind erforderlich: Datenbanken, Bibliotheken, Frameworks
  • Wie viele Spezialisten in jedem Bereich sind gefragt?
  • Welche Gehälter werden angeboten?






Lade Daten



Jobs heruntergeladen von der Website hh.ru unter Verwendung der API: dev.hh.ru . Auf die Anfrage "Python" wurden 1994 offene Stellen (Region Moskau) hochgeladen , die im Verhältnis 80% und 20% in Schulungs- und Testsuiten unterteilt waren . Die Größe des Trainingssatzes beträgt 1595 , die Größe des Testsatzes beträgt 399 . Der Testsatz wird nur in den Abschnitten Top / Antitop-Fähigkeiten und Jobklassifizierung verwendet.



Zeichen



Entsprechend dem Text der hochgeladenen Stellen wurden zwei Gruppen der häufigsten n-Gramm Wörter gebildet :



  • 2 Gramm in Kyrillisch und Latein
  • 1 Gramm in Latein


In IT-Stellenangeboten werden Schlüsselkompetenzen und -technologien normalerweise auf Englisch geschrieben, sodass die zweite Gruppe nur lateinische Wörter enthielt.



Nach der Auswahl von n Gramm enthielt die erste Gruppe 81 2 Gramm und die zweite 98 1 Gramm:

Nein. n n-Gramm Gewicht Stellenangebote
1 2 in Python acht 258
2 2 ci cd acht 230
3 2 Verständnis der Prinzipien acht 221
4 2 Kenntnis von SQL acht 178
fünf 2 Entwicklung und neun 174
... ... ... ... ...
82 1 sql fünf 490
83 1 Linux 6 462
84 1 postgresql fünf 362
85 1 Docker 7 358
86 1 Java neun 297
... ... ... ... ...


Es wurde beschlossen, offene Stellen nach folgenden Kriterien in der Reihenfolge ihrer Priorität in Cluster aufzuteilen:

Eine Priorität Kriterium Gewicht
1 Feld (angewandte Richtung), Position,

n-Gramm- Erfahrung : "Maschinelles Lernen", "Linux-Administration", "exzellentes Wissen"
7-9
2 Werkzeuge, Technologien, Software.

n-Gramm: "sql", "linux os", "pytest"
4-6
3 Andere

n-Gramm- Fähigkeiten : "technische Ausbildung", "Englisch", "interessante Aufgaben"
1-3


Die Bestimmung, zu welcher Gruppe von Kriterien das n-Gramm gehört und welches Gewicht ihm zugewiesen werden soll, erfolgte auf einer intuitiven Ebene. Hier einige Beispiele:

  1. Auf den ersten Blick kann "Docker" der zweiten Kriteriengruppe mit einem Gewicht von 4 bis 6 zugeordnet werden. Die Erwähnung von "Docker" in der Vakanz bedeutet jedoch höchstwahrscheinlich, dass die Vakanz für die Position des "DevOps-Ingenieurs" bestimmt ist. Daher fiel "Docker" in die erste Gruppe und erhielt ein Gewicht von 7.

  2. «Java» , .. «Java» Java- « Python». «-». , , , «Java» 9.



n- — .





Für Berechnungen wurde jede Leerstelle in einen Vektor mit einer Dimension von 179 (der Anzahl ausgewählter Merkmale) von ganzen Zahlen von 0 bis 9 transformiert, wobei 0 bedeutet, dass das i-te n-Gramm in der Leerstelle fehlt, und die Zahlen von 1 bis 9 das Vorhandensein des i-ten n bedeuten - Gramm und sein Gewicht. Weiterhin wird im Text ein Punkt als eine durch einen solchen Vektor dargestellte Leerstelle verstanden.

Beispiel:

Angenommen, eine Liste von n-Gramm enthält nur drei Werte:

Nein. n n-Gramm Gewicht Stellenangebote
1 2 in Python acht 258
2 2 Verständnis der Prinzipien acht 221
3 1 sql fünf 490


Dann für eine Stelle mit Text.



Bedarf:



  • Über 3 Jahre Erfahrung in der Python- Entwicklung .
  • Gute SQL- Kenntnisse


der Vektor ist [8, 0, 5].



Metriken



Um mit Daten arbeiten zu können, müssen Sie diese verstehen. In unserem Fall würde ich gerne sehen, ob es Punktcluster gibt, die wir als Cluster betrachten werden. Dazu habe ich den t-SNE- Algorithmus verwendet , um alle Vektoren in den 2D-Raum zu übersetzen. 



Das Wesentliche der Methode besteht darin, die Dimension der Daten zu reduzieren und gleichzeitig die Proportionen der Abstände zwischen den Punkten der Menge maximal beizubehalten. Es ist ziemlich schwierig zu verstehen, wie t-SNE anhand der Formeln funktioniert. Aber ich mochte ein Beispiel, das irgendwo im Internet zu finden ist: Nehmen wir an, wir haben Bälle im dreidimensionalen Raum. Wir verbinden jeden Ball mit allen anderen Bällen durch unsichtbare Federn, die sich in keiner Weise schneiden und sich beim Überqueren nicht gegenseitig stören. Die Federn wirken in zwei Richtungen, d.h. Sie widerstehen sowohl der Entfernung als auch der Annäherung der Kugeln aneinander. Das System ist in einem stabilen Zustand, die Kugeln sind stationär. Wenn wir eine der Kugeln nehmen und zurückziehen und dann loslassen, kehrt sie aufgrund der Kraft der Federn in ihren ursprünglichen Zustand zurück. Als nächstes nehmen wir zwei große Teller und drücken die Kugeln zu einer dünnen Schicht zusammen.ohne die Kugeln zu stören, um sich in der Ebene zwischen den beiden Platten zu bewegen. Die Kräfte der Federn beginnen zu wirken, die Kugeln bewegen sich und hören schließlich auf, wenn die Kräfte aller Federn ausgeglichen werden. Die Federn wirken so, dass die Kugeln, die nahe beieinander waren, relativ nahe und flach bleiben. Auch bei entfernten Bällen werden diese voneinander entfernt. Mit Hilfe von Federn und Platten haben wir den dreidimensionalen Raum in einen zweidimensionalen Raum umgewandelt, wobei der Abstand zwischen den Punkten in irgendeiner Form erhalten blieb!Auch bei entfernten Bällen werden diese voneinander entfernt. Mit Hilfe von Federn und Platten haben wir den dreidimensionalen Raum in einen zweidimensionalen Raum umgewandelt, wobei der Abstand zwischen den Punkten in irgendeiner Form erhalten blieb!Auch bei entfernten Bällen werden diese voneinander entfernt. Mit Hilfe von Federn und Platten haben wir den dreidimensionalen Raum in einen zweidimensionalen Raum umgewandelt, wobei der Abstand zwischen den Punkten in irgendeiner Form erhalten blieb!



Der t-SNE-Algorithmus wurde von mir nur verwendet, um eine Reihe von Punkten zu visualisieren. Er half bei der Auswahl der Metrik sowie bei der Auswahl der Gewichte für die Features.



Wenn wir die euklidische Metrik verwenden, die wir in unserem täglichen Leben verwenden, sieht der Ort der offenen Stellen folgendermaßen aus:





Die Abbildung zeigt, dass die meisten Punkte in der Mitte konzentriert sind und an den Seiten kleine Äste vorhanden sind. Mit diesem Ansatz erzielen Clustering-Algorithmen, die die Abstände zwischen Punkten verwenden, nichts Gutes.



Es gibt viele Metriken (Möglichkeiten zum Bestimmen des Abstands zwischen zwei Punkten), die für die von Ihnen untersuchten Daten gut geeignet sind. Ich habe den Jaccard-Abstand als Maß gewählt , unter Berücksichtigung der Gewichte von n-Gramm. Jaccards Maßnahme ist leicht zu verstehen, eignet sich jedoch gut zur Lösung des betreffenden Problems.

:

1 n-: « python», «sql», «docker»

2 n-: « python», «sql», «php»

:

« python» — 8

«sql» — 5

«docker» — 7

«php» — 9

(n- 1- 2- ):  « python», «sql» = 8 + 5 = 13

( n- 1- 2- ):  « python», «sql», «docker», «php» = 8 + 5 + 7 + 9 = 29

=1 — ( / ) = 1 — (13 / 29) = 0.55


Die Matrix der Abstände zwischen allen Punktpaaren wurde berechnet, die Größe der Matrix beträgt 1595 x 1595. Insgesamt 1.271.215 Abstände zwischen eindeutigen Paaren. Die durchschnittliche Entfernung betrug 0,96, zwischen 619 und 659 beträgt die Entfernung 1 (d. H. Es gibt überhaupt keine Ähnlichkeit). Die folgende Grafik zeigt, dass es insgesamt wenig Ähnlichkeit zwischen Jobs gibt:





Mit der Jaccard-Metrik sieht unser Raum jetzt folgendermaßen aus:





Es erschienen vier unterschiedliche Dichtebereiche und zwei kleine Cluster niedriger Dichte. Zumindest sehen meine Augen so!



Clustering



Das Gaußsche Mischungsmodell (GMM) wurde als Clustering-Algorithmus gewählt . Der Algorithmus empfängt Daten in Form von Vektoren als Eingabe, und der Parameter n_components gibt die Anzahl der Cluster an, in die die Menge aufgeteilt werden muss. Sie können sehen , wie der Algorithmus funktioniert hier (in englischer Sprache). Ich habe eine vorgefertigte GMM-Implementierung aus der Scikit-Learn-Bibliothek verwendet: sklearn.mixture.GaussianMixture .



Beachten Sie, dass GMM keine Metrik verwendet, sondern Daten nur durch eine Reihe von Features und deren Gewichtung trennt. In diesem Artikel wird der Jaccard-Abstand verwendet, um Daten zu visualisieren, die Kompaktheit von Clustern zu berechnen (ich habe den durchschnittlichen Abstand zwischen Clusterpunkten für die Kompaktheit genommen) und zu bestimmender zentrale Punkt des Clusters (typische Leerstelle) - der Punkt mit dem geringsten durchschnittlichen Abstand zu anderen Punkten des Clusters. Viele Clustering-Algorithmen verwenden genau den Abstand zwischen Punkten. Im Abschnitt Andere Methoden werden andere Arten von Clustering erläutert, die auf Metriken basieren und auch gute Ergebnisse liefern.



Im vorherigen Abschnitt wurde mit dem Auge festgestellt, dass es höchstwahrscheinlich sechs Cluster geben wird. So sehen die Clustering-Ergebnisse mit n_components = 6 aus:







In der Abbildung mit der Ausgabe von Clustern sind die Cluster in absteigender Reihenfolge der Anzahl der Punkte von links nach rechts von oben nach unten angeordnet: Cluster 4 ist der größte, Cluster 5 ist der kleinste. Die Kompaktheit jedes Clusters ist in Klammern angegeben.



Das Clustering erwies sich als nicht sehr gut, auch wenn wir der Ansicht sind, dass der t-SNE-Algorithmus nicht perfekt ist. Bei der Analyse von Clustern war das Ergebnis ebenfalls nicht ermutigend.



Um die optimale Anzahl von Clustern n_components zu finden, verwenden wir die AIC- und BIC- Kriterien , über die Sie hier lesen können . Die Berechnung dieser Kriterien ist in die Methode sklearn.mixture.GaussianMixture integriert . So sieht das Kriteriendiagramm aus:





Wenn n_components = 12 ist, hat das BIC-Kriterium den niedrigsten (besten) Wert, das AIC-Kriterium hat auch einen Wert nahe dem Minimum (Minimum, wenn n_components = 23). Teilen wir die offenen Stellen in 12 Cluster auf:







Cluster sind jetzt kompakter, sowohl optisch als auch numerisch. Während der manuellen Analyse wurden offene Stellen in charakteristische Gruppen unterteilt, um eine Person zu verstehen. Die Abbildung zeigt die Namen der Cluster. Cluster mit den Nummern 11 und 4 sind als <Papierkorb 2> gekennzeichnet:



  1. In Cluster 11 haben alle Features ungefähr die gleichen Gesamtgewichte.
  2. Cluster 4 ist Java gewidmet. Trotzdem gibt es nur wenige offene Stellen für die Position des Java-Entwicklers im Cluster. Java-Kenntnisse sind häufig erforderlich, da dies ein zusätzliches Plus darstellt.


Cluster



Nach dem Entfernen von zwei nicht informativen Clustern mit den Nummern 11 und 4 ergeben sich 10 Cluster:





Für jeden Cluster gibt es eine Tabelle mit Funktionen und 2 Gramm, die am häufigsten in den offenen Stellen des Clusters zu finden sind.



Legende:



S - Der Prozentsatz der offenen Stellen, in denen das Merkmal gefunden wird, multipliziert mit dem Gewicht des Merkmals

% - Der Prozentsatz der offenen Stellen, in denen das Merkmal gefunden wird / 2 Gramm.

Typische Cluster- Leerstelle - Leerstelle mit dem geringsten durchschnittlichen Abstand zu anderen Punkten des Clusters



Daten Analyst



Anzahl der Jobs: 299



Typischer Job : 35.805.914

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 übertreffen 3.13 sql 64,55 Kenntnis von SQL 18.39
2 r 2.59 übertreffen 34,78 in Bearbeitung 14.05
3 sql 2.44 r 28,76 Python r 14.05
4 Kenntnis von SQL 1,47 Bi 19.40 mit großen 13.38
fünf Datenanalyse 1.17 Tableau 15.38 Entwicklung und 13.38
6 Tableau 1,08 Google 14.38 Datenanalyse 13.04
7 mit großen 1,07 vba 13.04 Kenntnis von Python 12.71
acht Entwicklung und 1,07 Wissenschaft 9,70 analytisches Lager 11.71
neun vba 1,04 dwh 6.35 Entwicklungserfahrung 11.71
zehn Kenntnis von Python 1,02 Orakel 6.35 Datenbanken 11.37


C ++ - Entwickler



Anzahl der Jobs: 139

Typischer Job : 39.955.360

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 c ++ 9.00 c ++ 100,00 Entwicklungserfahrung 44,60
2 Java 3.30 Linux 44,60 c c ++ 27.34
3 Linux 2.55 Java 36,69 c ++ Python 17,99
4 c # 1,88 sql 23.02 in c ++ 16.55
fünf gehen 1,75 c # 20.86 Entwicklung auf 15.83
6 Entwicklung auf 1.27 gehen 19.42 Datenstrukturen 15.11
7 gute Kenntnisse 1.15 Unix 12.23 Schreiberfahrung 14.39
acht Datenstrukturen 1,06 Tensorflow 11.51 Programmierung ein 13.67
neun Tensorflow 1,04 Bash 10.07 in Bearbeitung 13.67
zehn Programmiererfahrung 0,98 postgresql 9.35 Programmiersprachen 12,95


Linux / DevOps Engineer



Anzahl der Jobs: 126

Typischer Job : 39.533.926

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 ansible 5.33 Linux 84,92 ci cd 58,73
2 Docker 4.78 ansible 76,19 Verwaltungserfahrung 42.06
3 Bash 4.78 Docker 74,60 Bash Python 33.33
4 ci cd 4,70 Bash 68,25 tcp ip 39,37
fünf Linux 4.43 Prometheus 58,73 Anpassungserfahrung 28,57
6 Prometheus 4.11 zabbix 54,76 überwachen und 26,98
7 Nginx 3.67 Nginx 52,38 prometheus grafana 23.81
acht Verwaltungserfahrung 3.37 grafana 52,38 Überwachungssysteme 22.22
neun zabbix 3.29 postgresql 51,59 mit Docker 16.67
zehn Elch 3.22 kubernetes 51,59 Konfigurationsmanagement 16.67


Python-Entwickler



Anzahl der offenen Stellen : 104

Typischer Job : 39.705.484

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 in Python 6.00 Docker 65,38 in Python 75,00
2 Django 5.62 Django 62,50 Entwicklung auf 51,92
3 Flasche 4.59 postgresql 58,65 Entwicklungserfahrung 43.27
4 Docker 4.24 Flasche 50,96 Django-Flasche 04.24
fünf Entwicklung auf 4.15 redis 38,46 Rest api 23.08
6 postgresql 2.93 Linux 35,58 Python aus 21.15
7 aiohttp 1,99 rabbitmq 33,65 Datenbanken 18.27
acht redis 1,92 sql 30,77 Schreiberfahrung 18.27
neun Linux 1,73 mongodb 25.00 mit Docker 17.31
zehn rabbitmq 1,68 aiohttp 22.12 mit postgresql 16.35


Datenwissenschaftler



Anzahl der offenen Stellen: 98

Typische freie Stelle: 38071218

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Pandas 7.35 Pandas 81,63 maschinelles Lernen 63,27
2 numpy 6.04 numpy 75,51 Pandas numpy 43,88
3 maschinelles Lernen 5.69 sql 62,24 Datenanalyse 29,59
4 Pytorch 3,77 Pytorch 41,84 Datenwissenschaft 26.53
fünf ml 3.49 ml 38,78 Kenntnis von Python 25.51
6 Tensorflow 3.31 Tensorflow 36,73 numpy scipy 24.49
7 Datenanalyse 2.66 Funke 32,65 Python-Pandas 23.47
acht scikitlearn 2.57 scikitlearn 28,57 in Python 21.43
neun Datenwissenschaft 2.39 Docker 27,55 mathematische Statistik 20.41
zehn Funke 2.29 Hadoop 27,55 Algorithmen der Maschine 20.41


Entwickler für Benutzeroberflächen



Anzahl der Jobs: 97

Typischer Job : 39.681.044

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Javascript 9.00 Javascript 100 html css 27,84
2 Django 2,60 html 42,27 Entwicklungserfahrung 25,77
3 reagieren 2.32 postgresql 38.14 in Bearbeitung 17.53
4 nodejs 2.13 Docker 37.11 Kenntnisse in Javascript 15.46
fünf Vorderes Ende 2.13 CSS 37.11 und Unterstützung 15.46
6 Docker 2,09 Linux 32,99 Python und 14.43
7 postgresql 1,91 sql 31,96 CSS-Javascript 13.40
acht Linux 1,79 Django 28,87 Datenbanken 12.37
neun html css 1,67 reagieren 25,77 in Python 12.37
zehn php 1,58 nodejs 23.71 Design und 11.34


Backend-Entwickler



Anzahl der Jobs: 93

Typischer Job : 40.226.808

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Django 5,90 Django 65,59 Python Django 26,88
2 js 4.74 js 52,69 Entwicklungserfahrung 25.81
3 reagieren 2.52 postgresql 40,86 Kenntnis von Python 20.43
4 Docker 2.26 Docker 35,48 in Bearbeitung 18.28
fünf postgresql 2,04 reagieren 27,96 ci cd 17.20
6 Verständnis der Prinzipien 1,89 Linux 27,96 selbstbewusstes Wissen 16.13
7 Kenntnis von Python 1,63 Backend 22.58 Rest api 15.05
acht Backend 1,58 redis 22.58 html css 13.98
neun ci cd 1,38 sql 20.43 Fähigkeit zu verstehen 10.75
zehn Vorderes Ende 1,35 MySQL 19.35 in einem Fremden 10.75


DevOps-Ingenieur



Anzahl der Jobs: 78

Typischer Job : 39634258

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Devops 8.54 Devops 94,87 ci cd 51,28
2 ansible 5.38 ansible 76,92 Bash Python 30,77
3 Bash 4.76 Linux 74,36 Verwaltungserfahrung 24.36
4 Jenkins 4.49 Bash 67,95 und Unterstützung 23.08
fünf ci cd 4.10 Jenkins 64.10 Docker Kubernetes 20.51
6 Linux 3.54 Docker 50.00 Entwicklung und 17,95
7 Docker 2,60 kubernetes 41.03 Schreiberfahrung 17,95
acht Java 2,08 sql 29,49 und Anpassung 17,95
neun Verwaltungserfahrung 1,95 Orakel 25.64 Entwicklung und 16.67
zehn und Unterstützung 1,85 OpenShift 24.36 Skripterstellung 14.10


Dateningenieur



Anzahl der Jobs: 77

Typischer Job : 40.008.757

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Funke 6.00 Hadoop 89,61 Datenverarbeitung 38,96
2 Hadoop 5.38 Funke 85,71 Große Daten 37,66
3 Java 4.68 sql 68,83 Entwicklungserfahrung 23.38
4 Bienenstock 4.27 Bienenstock 61.04 Kenntnis von SQL 22.08
fünf Scala 3.64 Java 51,95 Entwicklung und 19.48
6 Große Daten 3.39 Scala 51,95 Hadoop Funken 19.48
7 etl 3.36 etl 48.05 Java Scala 19.48
acht sql 2.79 Luftstrom 44.16 Datenqualität 18.18
neun Datenverarbeitung 2.73 Kafka 42,86 und Verarbeitung 18.18
zehn Kafka 2.57 Orakel 35.06 Hadoop Bienenstock 18.18


Qualitätssicherungsingenieur



Anzahl der Jobs: 56

Typischer Job : 39630489

Nein. Zeichen mit Gewicht S. Zeichen %. 2 Gramm %.
1 Testautomatisierung 5.46 sql 46.43 Testautomatisierung 60,71
2 Testerfahrung 4.29 qa 42,86 Testerfahrung 53,57
3 qa 3.86 Linux 35,71 in Python 41.07
4 in Python 3.29 Selen 32.14 Automatisierungserfahrung 35,71
fünf Entwicklung und 2.57 Netz 32.14 Entwicklung und 32.14
6 sql 2.05 Docker 30.36 Testerfahrung 30.36
7 Linux 2,04 Jenkins 26.79 Schreiberfahrung 28,57
acht Selen 1,93 Backend 26.79 Testen auf 23.21
neun Netz 1,93 Bash 21.43 automatisierte Tests 21.43
zehn Backend 1,88 ui 19.64 ci cd 21.43




Gehälter



Die Gehälter werden nur in 261 (22%) von 1.167 offenen Stellen in den Clustern angegeben.



Bei der Berechnung der Gehälter:



  1. Wenn der Bereich "von ... bis ..." angegeben wurde, wurde der Durchschnittswert verwendet
  2. Wenn nur "von ..." oder nur "bis ..." angegeben wurde, wurde dieser Wert übernommen
  3. Die Berechnungen verwendeten (oder wurden angegeben) Gehalt nach Steuern (NET)


Auf der Karte:



  1. Cluster rangieren in absteigender Reihenfolge des Durchschnittsgehalts
  2. Vertikaler Balken im Feld - Median
  3. Box - Bereich [Q1, Q3], wobei Q1 (25%) und Q3 (75%) Perzentile sind. Jene. 50% der Gehälter fallen in die Box
  4. Der "Schnurrbart" enthält Gehälter aus dem Bereich [Q1 - 1,5 * IQR, Q3 + 1,5 * IQR], wobei IQR = Q3 - Q1 - Interquartilbereich
  5. Einzelne Punkte - Anomalien, die nicht in den Schnurrbart fielen. (Es gibt Anomalien, die nicht im Diagramm enthalten sind.)




Top / Antitop Fähigkeiten



Die Charts wurden für alle 1994 geladenen offenen Stellen erstellt. Die Gehälter sind in 443 (22%) offenen Stellen angegeben. Für die Berechnung für jedes Merkmal wurden offene Stellen ausgewählt, in denen dieses Merkmal vorhanden ist, und auf ihrer Grundlage wurde das Durchschnittsgehalt berechnet.







Job-Klassifizierung



Clustering könnte viel einfacher gemacht werden, ohne auf komplexe mathematische Modelle zurückzugreifen: die Top-Jobtitel zusammenzustellen und in Gruppen aufzuteilen. Analysieren Sie als Nächstes jede Gruppe auf Top-N-Gramm und Durchschnittsgehälter. Features müssen nicht hervorgehoben und gewichtet werden.



Dieser Ansatz würde (bis zu einem gewissen Grad) für eine "Python" -Abfrage gut funktionieren. Aber für die Anfrage "1C Programmer" wird dieser Ansatz nicht funktionieren, weil Für 1C-Programmierer in den Namen von Stellenangeboten werden 1C-Konfigurationen oder angewandte Bereiche selten angegeben. Und es gibt viele Bereiche, in denen 1C verwendet wird: Buchhaltung, Gehaltsberechnung, Steuerberechnung, Kostenberechnung bei produzierenden Unternehmen, Lagerabrechnung, Budgetierung, ERP-Systeme, Einzelhandel, Management Accounting usw.



Für mich sehe ich zwei Aufgaben für die Analyse von Stellenangeboten:



  1. Verstehen Sie, wo eine Programmiersprache verwendet wird, über die ich wenig weiß (wie in diesem Artikel).
  2. Filtern Sie neu gepostete Jobs.


Clustering eignet sich zur Lösung des ersten Problems und zur Lösung des zweiten Problems - verschiedene Klassifikatoren, zufällige Wälder, Entscheidungsbäume, neuronale Netze. Trotzdem wollte ich die Eignung des gewählten Modells für das Problem der Berufsklassifizierung bewerten.



Wenn Sie die in sklearn.mixture.GaussianMixture integrierte Predict () -Methode verwenden , passiert nichts Gutes. Er führt die meisten offenen Stellen auf große Cluster zurück, und zwei der ersten drei Cluster sind nicht informativ. Ich habe einen anderen Ansatz gewählt: 



  1. Wir nehmen die freie Stelle, die wir klassifizieren möchten. Wir vektorisieren es und bekommen einen Punkt in unserem Raum.
  2. Wir berechnen den Abstand von diesem Punkt zu allen Clustern. Unter der Entfernung zwischen einem Punkt und einem Cluster habe ich die durchschnittliche Entfernung von diesem Punkt zu allen Punkten im Cluster ermittelt.
  3. Der Cluster mit der geringsten Entfernung ist die vorhergesagte Klasse für die ausgewählte Stelle. Die Entfernung zum Cluster zeigt die Zuverlässigkeit einer solchen Vorhersage an.
  4. Um die Genauigkeit des Modells zu erhöhen, habe ich 0,87 als Schwellenabstand gewählt, d.h. Wenn der Abstand zum nächsten Cluster größer als 0,87 ist, klassifiziert das Modell die freie Stelle nicht.


Zur Bewertung des Modells wurden 30 freie Stellen zufällig aus dem Testsatz ausgewählt. In der Urteilsspalte:



N / a: Das Modell hat den Job nicht klassifiziert (Entfernung> 0,87)

+: korrekte Klassifizierung

-: falsche Klassifizierung  

Freie Stelle Nächster Cluster Entfernung Urteil
37637989 Linux / DevOps Engineer 0,9464 N / a
37833719 C ++ - Entwickler 0,8772 N / a
38324558 Dateningenieur 0,8056 +
38517047 C ++ - Entwickler 0,8652 +
39053305 Müll 0,9914 N / a
39210270 Dateningenieur 0,8530 +
39349530 Entwickler für Benutzeroberflächen 0,8593 +
39402677 Dateningenieur 0,8396 +
39415267 C ++ - Entwickler 0,8701 N / a
39734664 Dateningenieur 0,8492 +
39770444 Backend-Entwickler 0,8960 N / a
39770752 Datenwissenschaftler 0,7826 +
39795880 Daten Analyst 0,9202 N / a
39947735 Python-Entwickler 0,8657 +
39954279 Linux / DevOps Engineer 0,8398 - -
40008770 DevOps-Ingenieur 0,8634 - -
40015219 C ++ - Entwickler 0,8405 +
40031023 Python-Entwickler 0,7794 +
40072052 Daten Analyst 0,9302 N / a
40112637 Linux / DevOps Engineer 0,8285 +
40164815 Dateningenieur 0,8019 +
40186145 Python-Entwickler 0,7865 +
40201231 Datenwissenschaftler 0,7589 +
40211477 DevOps-Ingenieur 0,8680 +
40224552 Datenwissenschaftler 0,9473 N / a
40230011 Linux / DevOps Engineer 0,9298 N / a
40241704 Müll 2 0,9093 N / a
40245997 Daten Analyst 0,9800 N / a
40246898 Datenwissenschaftler 0,9584 N / a
40267920 Entwickler für Benutzeroberflächen 0,8664 +


Insgesamt: 12 Stellen haben kein Ergebnis, 2 Stellen - fehlerhafte Klassifizierung, 16 Stellen - korrekte Klassifizierung. Modellvollständigkeit - 60%, Modellgenauigkeit - 89%.



Schwache Seiten



Das erste Problem - nehmen wir zwei freie Stellen:

Stellenangebot 1 - "Lead C ++ Programmer"

"Anforderungen:



  • Über 5 Jahre Erfahrung in der C ++ - Entwicklung.
  • Kenntnisse in Python werden ein zusätzliches Plus sein. "


Vakanz 2 - "Lead Python Programmer"

"Anforderungen:

  • Über 5 Jahre Erfahrung in der Python-Entwicklung.
  • Kenntnisse in C ++ sind ein zusätzliches Plus "
Aus Sicht des Modells sind diese offenen Stellen identisch. Ich habe versucht, die Gewichte der Features in der Reihenfolge ihres Auftretens im Text anzupassen. Dies führte zu nichts Gutem.



Das zweite Problem ist, dass GMM wie viele Clustering-Algorithmen alle Punkte in einer Menge gruppiert. Nicht informative Cluster sind für sich genommen kein Problem. Informative Cluster enthalten aber auch Ausreißer. Dies kann jedoch leicht gelöst werden, indem die Cluster gelöscht werden, indem beispielsweise die atypischsten Punkte entfernt werden, die den größten durchschnittlichen Abstand zu den übrigen Clusterpunkten aufweisen.



Andere Methoden



Die Cluster-Vergleichsseite zeigt die verschiedenen Clustering-Algorithmen gut. GMM ist der einzige, der gute Ergebnisse erzielt hat.

Der Rest der Algorithmen funktionierte entweder nicht oder lieferte sehr bescheidene Ergebnisse.



Von den von mir implementierten waren in zwei Fällen gute Ergebnisse zu verzeichnen:



  1. Punkte mit hoher Dichte wurden in einer bestimmten Nachbarschaft ausgewählt, die in einem entfernten Abstand voneinander angeordnet war. Die Punkte wurden zu Zentren der Cluster. Dann begann auf der Grundlage der Zentren der Prozess der Clusterbildung - das Verbinden benachbarter Punkte.
  2. Agglomeratives Clustering ist eine iterative Zusammenführung von Punkten und Clustern. Die Scikit-Learn-Bibliothek präsentiert diese Art von Clustering, funktioniert aber nicht gut. In meiner Implementierung habe ich die Join-Matrix nach jeder Iteration der Zusammenführung geändert. Der Prozess wurde gestoppt, als einige Grenzparameter erreicht wurden. Tatsächlich helfen Dendrogramme nicht, den Zusammenführungsprozess zu verstehen, wenn 1500 Elemente gruppiert sind.


Fazit



Die Recherchen, die ich durchgeführt habe, gaben mir die Antworten auf alle Fragen am Anfang des Artikels. Ich habe praktische Erfahrungen mit Clustering gesammelt, während ich Variationen bekannter Algorithmen implementiert habe. Ich hoffe wirklich, dass der Artikel den Leser motivieren wird, seine analytischen Untersuchungen durchzuführen, und irgendwie in dieser aufregenden Lektion helfen wird.



All Articles