Rのグラフを使用したスキルの関係の分析

興味深いことですが、専門的な開発などの分野は、データサイエンスによるノイズから少し離れたままです。 HRtechのスタートアップは勢いを増し、シェアを増やし始めたばかりであり、プロやプロになりたい人と仕事をするという従来のアプローチに取って代わりました。







HRtechの分野は非常に多様で、従業員の雇用、開発およびコーチングの自動化、内部HR手順の自動化、市場給与の追跡、候補者、従業員の追跡などが含まれます。 この調査は、データ分析方法を使用して、スキルの相互接続方法、専門分野とは何か、どのスキルがより人気があり、どのスキルを次のように研究すべきかという質問に答えるのに役立ちます。







問題ステートメントと入力データ



最初は、よく知られた分類に従ってスキルを共有したくありませんでした。 たとえば、平均給与を通じて、「高価な」スキルと「安い」スキルを区別することができました。 市場の要件に基づいた数学と統計に基づく「専門化」を強調したかったのです。 雇用者。 そのため、この研究では、スキルをグループにまとめるために、教師なし学習のタスクが発生しました。 そして、最初の職業はプログラマーを選びました。







分析のために、 data.gov.ruで入手可能なWork in Russiaポータルからデータを取得しました。 説明、給与、地域、その他の詳細とともに、ポータルで利用可能なすべての空席を次に示します。 次に、説明を解析し、それらからスキルを特定しました。 これは別の調査であり、この記事では取り上げません。 ただし、 hh.ru APIを使用して、既にタグ付けされたデータを取得することもできます。







したがって、初期データは値0/1のマトリックスで表されます。Xはスキルであり、オブジェクトは空席です。 合計164個の標識と841個のオブジェクト。







スキルグループの検索方法の選択



方法を選択するとき、1つの空席が複数の専門化を持つことができるという仮定に基づいていました。 また、特定のスキルは1つの専門分野のみに関連しているという仮定からも進んでいます。 マップを明らかにします;この仮定は、この研究の結果を使用するアルゴリズムの動作に必要でした。







問題を真正面から解くと、1つのスキルグループが1つの空室グループで見つかり、別のグループのスキルが別の空室グループで見つかった場合、このスキルグループは専門分野であると想定できます。 また、メトリック手法(k-meansと修正)を使用してスキルを共有できます。 しかし、問題は、1つの空席が複数の専門分野を持つことができるということでした。 そして最後に、アルゴリズムがどのように変化しても、彼はスキルの90%を1つのクラスターに割り当て、別のクラスターにはそれぞれ1〜2のスキルを割り当てました。 熟考すると、彼らはタスクのk-meansを書き直し始め、古典的なユークリッド距離の代わりに、スキルの隣接性、つまり2つのスキルの発生頻度の尺度を検討しました。







library(data.table) grid<-as.data.table(expand.grid(skill_1=names(skills_clust),skill_2=names(skills_clust))) grid<-grid[grid$skill_1 != grid$skill_2,] for (i in c(1:nrow(grid))){ grid$value[i]<-sum(skills_clust[,grid$skill_1[i]]*skills_clust[,grid$skill_2[i]]) }
      
      





しかし、幸いなことに、アイデアはやがて、タスクをグラフでコミュニティを見つけるタスクとして提示するようになりました。 そして、大学の2年後に安全に忘れられたグラフの理論を思い出す時が来ました。







スキルグラフの作成と分析



グラフを作成するには、 igraph



パッケージを使用します(PythonとC / C ++にも同じものがあります)。まず、テーブルから隣接行列を作成します。これはk-means( grid



)のカウントを開始します。 次に、スキルの隣接を0〜1の範囲で正規化します。







 grid_clean<-grid[grid$value>1,] #    <=1   grid_cast<-dcast(grid_clean,skill_1~skill_2) grid_cast[,skill_1:=NULL] grid_cast_norm<-grid_cast/colSums(grid_cast,na.rm=T) grid_cast_norm[is.na(grid_cast_norm)]<-0 grid_cast_norm<-as.matrix(grid_cast_norm) grid_cast_norm[grid_cast_norm<=0.02] <-0 #    <=2% 
      
      





スキルi



とスキルj



の隣接関係は、スキルi



出現全体の一部として正規化されます。 最初は、すべてのスキルの最大出現数の一部としてマトリックスを正規化しましたが、この式に進みました。 たとえば、スキルi



はスキルj



10回発生し、他のスキルでは発生しません。 このような関係は、この発生をこの行列の最大値(たとえば、100〜10%)から見た場合よりも重要(たとえば、100%)になると想定できます。







また、ランダムな接続から隣接行列を消去するために、このスキルの合計発生の2倍または2%未満で発生するペアを削除しました。 残念ながら、これによりスキルセットが164から87に減少しましたが、セグメントがより論理的で理解しやすくなりました。







次に、隣接行列から無向の重み付きグラフを作成します。







 library(igraph) library(RColorBrewer) skills_graph<-graph_from_adjacency_matrix(grid_cast_norm, mode = "undirected",weighted=T) E(skills_graph)$width <- E(skills_graph)$weight plot(skills_graph, vertex.size=7,vertex.label.cex=0.8, layout=layout.auto, vertex.label.color="black",vertex.color=brewer.pal(max(V(skills_graph)$group),"Set3")[1])
      
      





skills_no_cluster

igraph



では、頂点の主要な統計を計算することもできます。







 closeness(skills_graph) #         betweenness(skills_graph) #    ,    degree(skills_graph) #      
      
      





次に、各スキルの隣接シートを表示できます。 このシートは、後で新しいスキルを選択するための推奨システムの基礎になります。







 get.adjlist(skills_graph)
      
      





マルチレベルコミュニティハイライト



グラフでコミュニティを見つけるというトピックについては、 Konstantin Slavnovによる優れた研究があります。 この記事では、コミュニティの強調表示の品質に関する主要な指標、コミュニティを強調表示する方法、およびこれらの方法の結果を集約する方法について説明します。







真のコミュニティの内訳がわからない場合は、モジュール機能の価値を使用して品質を評価します。 これは、このタスクで最も一般的で広く認められている品質の尺度です。 この機能は、グラフの頂点をクラスタリングするためのアルゴリズムの開発中にNewmanとGirvanによって提案されました。 簡単に言えば、このメトリックは、コミュニティ内およびコミュニティ間の結合密度の差を推定します。 この機能の主な欠点は、小さなコミュニティが表示されないことです。 2-3のピークの組み合わせがコミュニティになる可能性のある専門分野を強調するタスクでは、この問題は重大になる可能性がありますが、最適化された機能に追加のスケールパラメーターを追加することで解決できます。







モジュール性の機能を最適化するには、この記事で提案されているマルチレベルアルゴリズム最もよく使用されます。 第一に、最適化の質が優れているため、第二に、速度のため(このタスクでは必要ではありませんでしたが)、第三に、アルゴリズムは非常に直感的です。







データに基づいて、このアルゴリズムは最良の結果の1つも示しました。







N アルゴリズム モジュール性 コミュニティの数
1 ビトネス 0.223 6
2 ファストグリーディ 0.314 8
3 マルチレベル 0.331 8
4 LabelPropogation 0.257 15
5 ウォークトラップ 0.316 10
6 インフォマップ 0.315 13
7 固有ベクトル 0.348 8


igraph



igraph



アルゴリズムはcluster_louvain()



関数によって実装されます:







 fit_cluster<-cluster_louvain(skills_graph) V(skills_graph)$group <- fit_cluster$membership
      
      





結果



skills_cluster







ご覧のとおり、8つの専門分野を特定することができました(名前は記事の著者によって主観的に与えられています)。









専門分野はかなり密接に関連しています。 これは、1つの空席が複数の専門分野を持つことができるという基本的な仮定によって説明されています。 したがって、たとえば、専門分野「モバイルアプリケーション開発者」では、「ネットワークプロトコルの知識」(71)が必要であり、専門分野「サーバーおよびネットワークメンテナンス」から「ローカルネットワークの管理」(32)と相互接続されます。







また、データソースはポータル「Jobs in Russia」であり、hh.ruまたはsuperjob.ruとは異なる欠員の選択であり、欠員は資格の低い欠員に偏っているということも理解しておく必要があります。 さらに、サンプルは841の空席に制限されます(そのうち585のみがスキルに関するマークがあります)。このため、多数のスキルが分析されず、専門化されませんでした。







ただし、全体として、提案されたアルゴリズムはかなり論理的な結果を提供し、定量化できる専門職の自動ジョブを許可します(当然、トップマネージャーのスキルをスペシャライゼーションとして区別することはできません)。スキルは次のように研究する必要があります。







最後まで読んだ人は全員ボーナスです。 このリンクを使用すると、グラフのインタラクティブな視覚化をいじって、調査の結果とともに最終表をダウンロードできます。








All Articles